May 10

Wenn man seine Extensions (zumindest das Gründgerüst) mit dem Kickstarter erzeugt, kann man etwa nur einen einfachen double-Wert mit zwei Dezimalstellen evaluieren – sieht in etwa so aus:

        "field" => Array (
            "exclude" => 1,
            "label" => "LLL:EXT:extensionkey/locallang_db.xml:tx_extensionkey_plugin.field",
            "config" => Array (
                "type" => "input",
                "size" => "30",
                "eval" => "double2,nospace",
            )
        ),

Möchte man nun beispielsweise vier anstelle von nur zwei Dezimalstellen haben, kann man dies sehr einfach ändern. Alle Änderungen beziehen sich auf Dateien, die man im Ordner des erstellten Plugins findet.

Eigene eval-Funktion registrieren:

In der Datei ext_localconf.php fügt man die folgende Zeile ein:

$TYPO3_CONF_VARS['SC_OPTIONS']['tce']['formevals']['tx_extensionkey_evalfunc'] = 'EXT:extension_key/class.tx_extensionkey_evalfunc.php';

Wichtig hierbei ist, dass die eval-Funktion mit “tx_” beginnt, sonst kann man diese nicht verwenden. Der Extensionkey muss ohne “_” geschrieben werden: Wurde als Extensionkey etwa “extension_key” gewählt, so muss man hier trotzdem “extensionkey” eintragen. “evalfunc” kann beliebig genannte werden, z.B. auch “round” oder “double4″.

eval-Funktion anlegen und schreiben:

Die soeben registrierte eval-Funktion muss nun auch geschrieben werden. Hierfür wird nun die Datei “class.tx_extensionkey_evalfunc.php” angelegt und mit folgendem Inhalt gefüllt:

<?php
class tx_extensionkey_evalfunc {
    function returnFieldJS() {
        return "
            var theVal = ''+value;
            var dec=0;
            if (!value)    return 0;
            for (var a=theVal.length; a>0; a--)    {
                if (theVal.substr(a-1,1)=='.' || theVal.substr(a-1,1)==',')    {
                    dec = theVal.substr(a);
                    theVal = theVal.substr(0,a-1);
                    break;
                }
            }
            dec = evalFunc.getNumChars(dec)+'0000';
            theVal=evalFunc.parseInt(evalFunc.noSpace(theVal))+TS.decimalSign+dec.substr(0,4);
            return theVal;
        ";
    }
    function evaluateFieldValue($value, $is_in, &$set) {
        $theDec = 0;
        for ($a=strlen($value); $a>0; $a--)    {
            if (substr($value,$a-1,1)=='.' || substr($value,$a-1,1)==',')    {
                $theDec = substr($value,$a);
                $value = substr($value,0,$a-1);
                break;
            }
        }
        $theDec = ereg_replace('[^0-9]','',$theDec).'0000';
        $value = intval(str_replace(' ','',$value)).'.'.substr($theDec,0,4);
        return $value;
    }
}
?>

Bei diesen Funktionen handelt es sich um die originalen TYPO3-Eval-Funktionen für die Validierung von double2, allerdings etwas abgewandelt und für die Verwendung von vier Dezimalstellen. Die Funktion returnFieldJS() stellt die JavaScript-Validierungsfunktion, evaluateFieldValue die entsprechende Funktion in PHP bereit.

TCA anpassen:

Nun muss noch das TCA (TYPO3 Content Array) angepasst werden:

        "field" => Array (
            "exclude" => 1,
            "label" => "LLL:EXT:extensionkey/locallang_db.xml:tx_extensionkey_plugin.field",
            "config" => Array (
                "type" => "input",
                "size" => "30",
                "eval" => "double2,nospace",
            )
        ),

ändert man beispielsweise zu

        "field" => Array (
            "exclude" => 1,
            "label" => "LLL:EXT:extensionkey/locallang_db.xml:tx_extensionkey_plugin.field",
            "config" => Array (
                "type" => "input",
                "size" => "30",
                "eval" => "tx_extensionkey_evalfunc,nospace",
            )
        ),

Tabellen anpassen:

Vergessen darf man auch nicht auf die Änderungen der Tabellen in ext_tables.sql bzw. im Datenbank Management System selbst (z.B. mit phpMyAdmin), anderfalls gibt es Probleme beim Speichern. ext_tables.sql ändert man z.B. von

CREATE TABLE tx_extensionkey_plugin (
    uid int(11) NOT NULL auto_increment,
    pid int(11) DEFAULT '0' NOT NULL,
    tstamp int(11) DEFAULT '0' NOT NULL,
    crdate int(11) DEFAULT '0' NOT NULL,
    cruser_id int(11) DEFAULT '0' NOT NULL,
    deleted tinyint(4) DEFAULT '0' NOT NULL,
    hidden tinyint(4) DEFAULT '0' NOT NULL,
    starttime int(11) DEFAULT '0' NOT NULL,
    endtime int(11) DEFAULT '0' NOT NULL,
    fe_group int(11) DEFAULT '0' NOT NULL,
    header varchar(255) DEFAULT '' NOT NULL,
    field double(11,2) DEFAULT '0.00' NOT NULL,
    PRIMARY KEY (uid),
    KEY parent (pid)
);

auf

CREATE TABLE tx_extensionkey_plugin (
    uid int(11) NOT NULL auto_increment,
    pid int(11) DEFAULT '0' NOT NULL,
    tstamp int(11) DEFAULT '0' NOT NULL,
    crdate int(11) DEFAULT '0' NOT NULL,
    cruser_id int(11) DEFAULT '0' NOT NULL,
    deleted tinyint(4) DEFAULT '0' NOT NULL,
    hidden tinyint(4) DEFAULT '0' NOT NULL,
    starttime int(11) DEFAULT '0' NOT NULL,
    endtime int(11) DEFAULT '0' NOT NULL,
    fe_group int(11) DEFAULT '0' NOT NULL,
    header varchar(255) DEFAULT '' NOT NULL,
    field double(11,4) DEFAULT '0.0000' NOT NULL,
    PRIMARY KEY (uid),
    KEY parent (pid)
);


Verwandte Beiträge

1 Kommentar to “Eigene eval-Funktion in TYPO3-TCA”

  1. Lina:


    Wer Interesse an einem weiteren Beispiel rund um das Anlegen einer eigenen eval Funktion im TCA Array hat, hier: http://typo3-blog.net/blog/eval-funktion-tca-array.html habe ich eines veröffentlicht.

    Liebe Grüße Lina

Kommentar schreiben