C3: TinyMCE in einem Formular eines eigenen Frontend-Moduls verwenden
Hallöchen,
hab mal wieder ein Problem... es geht um eine Erweiterung (Contao 3), die im Frontend Formulare erzeugt und dabei auch den TinyMCE verwenden soll.
Die Formulare selbst erzeuge ich so wie es die Erweiterung "comments" macht, d.h. ich erstelle mir ein Array mit meinen Feldern und verwende dann in einer Schleife die Methode "prepareForWidget", um daraus meine Widget-Objekte zu erstellen, die ich dann dem Template übergebe. Das funktioniert auch einwandfrei.
Mein Felder-Array sieht so aus (reduziert auf das eine Feld um das es geht):
PHP-Code:
$arrFields = array
(
'text' => array
(
'name' => 'cetext',
'label' => 'Text',
'value' => $element->text,
'inputType' => 'textarea',
'eval' => array('mandatory'=>true, 'rte'=>'tinyMCE', 'allowHtml'=>true, 'helpwizard'=>true),
'explanation' => 'insertTags',
)
)
Das habe ich mir bei Backend-Modulen abgeguckt, dort scheint es so zu sein, dass eine TextArea mit dem RTE-Editor angezeigt wird, wenn in 'eval' im Feld 'rte' die Konfigurationsdatei angegeben wird.
Im Frontend aber scheint das nicht zu genügen, es wird nur eine normale HTML-Textarea ausgegeben. Ich hab darum noch 'allowHtml' hinzugefügt, was aber auch nichts bewirkt hat.
Also hab ich mal gegoogelt und im Forum gesucht. Dabei stiess ich vor allem auf diese Threads (in denen ich nicht nachfragen wollte, weil ich zum einen nicht sicher bin, ob es in diesem Forum gern gesehen wird, wenn man alte Threads wieder hervorholt und zum anderen ob ich dort mit meiner Frage überhaupt richtig bin):
RTE bei Widgets möglich?
Hier wird von der Erweiterung von GLOBALS['TL_RTE'] gesprochen, die aber scheinbar auch nicht geholfen hat. Ich weiss nicht, ob so eine Erweiterung nun nötig ist oder nicht und wenn ja, was da wie erweitert werden soll, was ich da eintragen sollte.
Dann kommt der Hinweis, mal zu gucken, wie es die Erweiterung "formrte" macht. Die betrifft den Formular-Generator, ob das dann auch für eigene (also per Code erzeugte) Formulare gilt, weiss ich nicht. Im Quelltext finde ich dann in der Klasse "FormRTE" in der Methode "loadFormField()" diesen Code:
PHP-Code:
if ($objWidget instanceof FormTextArea && strlen($objWidget->rte) && $GLOBALS['TL_CONFIG']['useRTE'])
{
$GLOBALS['TL_RTE']['type'] = $objWidget->rte;
$GLOBALS['TL_RTE']['fields'][] = 'ctrl_' . $objWidget->id;
}
Das sieht mir doch nach einer entscheidenden Stelle aus, jedoch frage ich mich, wo die Eigenschaft "rte" von $objWidget herkommt und was dort drin stehen müsste? (edit: wo sie herkommt hab ich grad gesehen, aus der database.sql, und es muss der Name der tiny-Configdatei drinstehen ...)
TinyMCE im Frontend nicht möglich
Hier geht es wohl um die Erweiterung xtmembers und ich weiss nicht, ob das, was dort steht, auch für eigene Formulare relevant ist. Ich habe aber dann versucht, eine Datei "tinyFrontend.php" unter "system/config" anzulegen mit dem im Thread genannten Inhalt und dann in meiner Felddefinition oben das 'rte'=>'tinyMCE' durch 'rte'=>'tinyFrontend' ersetzt, aber das hat nicht geholfen (keine sichtbare Veränderung).
Katalog: Kein TinyMCE im Frontend-Editing
Hier gehts um die Erweiterung Katalog und es wird auf die oben schon genannte angepasste tinyFrontend.php hingewiesen, was ich ja aber schon ausprobiert habe.
Tja langer Rede kurzer Sinn, ich bin mir gerade nicht sicher, ob es überhaupt möglich ist, den TinyMCE in eigenen Frontend-Formularen zu verwenden. Es gibt ja die Klassen TextArea und FormTextArea, und wenn ich das richtig verstehe wird erstere bei Backend-Formularen verwendet und letztere bei Frontend-Formularen, und nur erstere scheint TinyMCE zu unterstützen. Wobei wohl genau das durch die Erweiterung "formrte" geändert wird?
Sollte es doch möglich sein, frage ich mich, welche Schritte dazu nötig sind. Möglicherweise sehe ich ja auch den Wald vor lauter Bäumen nicht und es reicht eine leichte Anpassung meiner Felddefinition. Oder vielleicht gibt es irgendwo eine Anleitung dazu, oder jemand kann mir sagen, dass ich mit den Hinweisen aus einem der genannten Threads auf der richtigen Spur bin, dann weiss ich wenigstens, dass es sich lohnt, da weiter in den Quellcode einzusteigen.
Wäre für jeden noch so kleinen Hinweis sehr dankbar :-)
edit: Nachdem ich mir die formrte-Erweiterung näher angesehen habe, hab ich festgestellt, dass diese neben der Erweiterung der Tabelle mit den Formular-Feldern vor allem einen LoadFormField-Hook definiert, wo dann der TineMCE eingebunden und konfiguriert wird. Nun verwende ich ja nicht den Formular-Generatur und die zugehörigen Datenbanktabellen und auch nicht die Klasse Form ,in der der LoadFormField-Hook aufgerufen wird. Also hab ich mir gedacht, dass ich den entsprechenden Code leicht abgeändert einfach an der Stelle einbinde, wo mein Widget erzeugt wird. Das ist bei mir die Schleife, die aus den Einträgen in arrFields die Widgets konstruiert und die ich mir aus der comments-Erweiterung abgeguckt hat. Das Ergebnis sieht so aus (der if-Bereich mit dem Kommentar "// ggf. RTE-Editor aktivieren:" ist das, was ich zugefügt habe):
PHP-Code:
foreach ($arrFields as $arrField)
{
$strClass = $GLOBALS['TL_FFL'][$arrField['inputType']];
// Continue if the class is not defined
if (!class_exists($strClass))
{
continue;
}
$arrField['eval']['required'] = $arrField['eval']['mandatory'];
$objWidget = new $strClass($this->prepareForWidget($arrField, $arrField['name'], $arrField['value']));
// ggf. RTE-Editor aktivieren:
if ($objWidget instanceof FormTextArea /*&& strlen($objWidget->rte) && $GLOBALS['TL_CONFIG']['useRTE']*/)
{
$GLOBALS['TL_RTE']['type'] = 'tinyFrontend'; // $objWidget->rte;
$GLOBALS['TL_RTE']['fields'][] = 'ctrl_' . $objWidget->id;
$this->base = $this->Environment->base;
$this->brNewLine = $GLOBALS['TL_CONFIG']['pNewLine'] ? false : true;
$this->rteFields = implode(',', $GLOBALS['TL_RTE']['fields']);
$strFile = sprintf('%s/system/config/%s.php', TL_ROOT, $GLOBALS['TL_RTE']['type']);
if (!file_exists($strFile))
{
throw new Exception(sprintf('Cannot find rich text editor configuration file "%s.php"', $GLOBALS['TL_RTE']['type']));
}
ob_start();
include($strFile);
$GLOBALS['TL_HEAD']['rte'] = ob_get_contents();
ob_end_clean();
$GLOBALS['TL_JAVASCRIPT']['rte'] = 'typolight/typolight.js';
}
// Validate the widget
if (\Input::post('FORM_SUBMIT') == $strFormId)
{
$objWidget->validate();
if ($objWidget->hasErrors())
{
$this->doNotSubmit = true;
}
}
$arrWidgets[$arrField['name']] = $objWidget;
}
return $arrWidgets;
Die "tinyFrontend.php" liegt im system/config-Ordner. Im Layout habe ich das TinyMCE-CSS eingebunden (und testweise auch jquery bzw. mootools). Hat alles nichts gebracht, im Formular wird immer noch die normale Textarea angezigt.
Tschüss,
fluppi