-
eigenes Widget erstellen
Hi,
ich bin dabei ein eigenes Widget zu erstellen:
es sollen 2 Eingabefelder dargestellt werden,
eins für ein Startdatum und das zweite für ein Enddatum eines Events,
PHP-Code:
$arrFields = array (
...
'date' => array
(
'name' => 'date',
'label' => $GLOBALS['TL_LANG']['tl_module_eventmanager_events'['date'],
'inputType' => 'event_date',
'eval' => array('mandatory'=>true, 'maxlength'=>10, 'rgxp'=>'date' )
), ....
im Widget (EventDate.php) :
PHP-Code:
generate(){
return sprintf('<input type="text" name="%s" id="ctrl_%s" class="text%s"value="%s"/>',
$this->strName . '_start',
$this->strId . '_start',
(strlen($this->strClass . '_start') ? ' ' . $this->strClass . '_start' : ''),
specialchars($start_date),
$this->getAttributes()) . $this->addSubmit().
sprintf("<script type=\"text/javascript\">...</script>",
$this->strId . '_start' ,
$GLOBALS['TL_CONFIG'['dateFormat'],utf8_encode('ä'))
.sprintf('<input type="text" name="%s" id="ctrl_%s" class="text%s" value="%s"%s />',
$this->strName . '_end',
$this->strId . '_end',
(strlen($this->strClass . '_end') ? ' ' . $this->strClass . '_end' : ''),
specialchars($end_date),
$this->getAttributes()) . $this->addSubmit().
sprintf("<script type=\"text/javascript\">...</script>",
$this->strId . '_end',
$GLOBALS['TL_CONFIG'] ['dateFormat'],utf8_encode('ä'));
}
Wie kann ich Prüfen, ob Richtige Daten eingegeben wurden
/wie kann ich auf die Eigenschaften zugreifen?
Bzw. sind in einem Field überhabt zwei Eingabefelder möglich?
-
Hallo Kati,
wo würdest du dieses Widget denn verwenden? Frontend/Backend? Formulargenerator/eigenes Modul?
Das Standard-Textfeld kann auch zwei Felder anzeigen, indem du eval->multiple = true und eval->size = 2 setzt.
-
ich würde es im Frontend als eigenes Modul anwenden
-
Nun wäre noch die Frage was du validieren möchtest. Sicherlich müsste im Feld ein Datum stehen, oder? Das ginge ja mit rgxp=date. Allerdings wird damit nicht geprüft ob es zwei verschiedene Daten sind und das letztere später ist.
Du kannst entweder mit einem eigenen rgxp und dem addCustomRegexp Hook arbeiten, oder vermutlich besser ein neues Widget erstellen, welches auf dem FormTextField basiert. Ich hatte leo einst ein Ticket geschrieben das FormTextField sollte auch mehrere Felder unterstützen (nicht nur sein Backend-Äquivalent "TextField"), aber ich weis nicht ob das schon drin ist.
Falls nicht, müsstest du die generate()-Funktion überschreiben sowie den validator(). Hier ein Beispiel:
PHP-Code:
class FormEventDate extends FormTextField
{
protected function validator($varInput)
{
$objDate = new Date($varInput['start']);
$intStart = $objDate->tstamp;
$objDate = new Date($varInput['end']);
$intStop = $objDate->tstamp;
if ($intStart >= $intStop)
{
// $GLOBALS['TL_LANG']['ERR']['eventDate'] = 'Das erste Datum muss kleiner sein als das zweite Datum!
$this->addError($GLOBALS['TL_LANG']['ERR']['eventDate']);
}
return $varInput;
}
public function generate()
{
// Zwei Textfelder zurückgeben, wie im Beispiel. Allerdings darf der Name der Felder nicht _start und _end sein, denn sonst werden diese nicht übernommen!
// Feldnamen: $this->strName . '[start]' bzw. $this->strName . '[end]';
}
}
-
Ich habe auch ein eigenes Widget für das Frontend erstellt. Wie kann ich jetzt einen Submit Button machen der meine Daten in eine Tabelle einträgt, eine Bestätigungsemail versendet und und mich anschließend auf eine "Erfolgreich" Seite weiterleitet?
-
Ein Widget für's Frontend kannst du im Formulargenerator verwenden. Dort sollte das alles möglich sein, oder?
-
Das ist richtig. Und es geht auch wenn man ein tl_form_field hat.
Danke ;)
-
Hallo, ich möchte auch ein Widget erstellen. Zu Testzwecken habe ich folgendes gemacht:
1) ein neues Modul angelegt.
2) dort in der config.php: $GLOBALS['BE_FFL']['myTest'] = "MyTest"; hinzugefügt
3) Klasse MyTest erstellt, die Widget erweitert (also extends Widget)
4) generateMethode angepasst. Ausgabe eines <input type="text" ... />
Resultat war, das alles von der Anzeige her super geklappt hat. Allerdings wollte ich nun den Wert, der in das Feld geschreiben wird speichern. Das hat nicht geklappt.
5) Bin auf diese Thread gestoßen und habe nicht mehr direkt von Widget geerbt, sondern von FormTextField => ALLES funktioniert!
Meine Frage: Wieso funktioniert es wenn ich von FormTextField erbe, aber nicht direkt von Widget? Habe mir FormTextField angeschaut, und nichts gefunden/erkannt, was jetzt diese Veränderung ausmacht? Kann mir jemand sagen warum das so ist, bzw. wie der Wert spezifiziert wird, der gespeichert werden soll. Wo finde ich den Code, wo die Daten in die Datenbank geschrieben werden?
-
Du musst die Klassenvariable $blnSubmitInput auf true setzen (siehe Widget.php und TextField.php).
PS: "FormTextField" ist für's Frontend! "TextField" ist das Backend.