Templatevariablen mit Listener javascriptInit@wysiwyg verwenden

  • Hallo,
    für den Redactor-Editor habe ich einen Formeleditor als Plugin erstellt, mit dem man speziellen BBCode einfügen kann. Im ACP besteht zusätzlich die Möglichkeit, weitere Menüs und Schaltflächen für den Editor zu erstellen, deren Eigenschaften (Label, Tooltip-Text, Code usw.) in der Datenbank hinterlegt werden.
    Nun müssen die Werte der Eigenschaften an das Javascript des Formeleditors übergeben werden. Mit meinem Template __redactorTexEqnEditPlugin übergebe ich per TemplateListener javascriptInit@wysiwyg derzeit schon bestimmte Optionen aus dem ACP an das Javascript des Editors.

    XML
    <templatelistener name="pluginInit">
    	<environment>user</environment>
    	<templatename>wysiwyg</templatename>
    	<eventname>javascriptInit</eventname>
    	<templatecode><![CDATA[{include file="__redactorTexEqnEditPlugin"}]]></templatecode>
    </templatelistener>

    Das klappt soweit ganz gut.

    Code
    $config.plugins.push('texeqnedit');
    // plugin configuration
    $.extend($config, {
    	texeqnedit: {
    		s_example: '{TEXEQNEDIT_SHOW_EXAMPLE}',
    		example: '{TEXEQNEDIT_EXAMPLE|encodeJS}'
    	}
    });

    Ich habe nun folgenden EventListener erstellt, um über Templatevariablen (aus TexEqnEditListener) zusätzlich die Werte aus der Datenbank zu übergeben.

    XML
    <eventlistener>
    	<eventclassname><![CDATA[wcf\page\AbstractPage]]></eventclassname>
    	<environment>user</environment>
    	<eventname>readParameters</eventname>
    	<listenerclassname><![CDATA[wcf\system\event\listener\TexEqnEditListener]]></listenerclassname>
    	<inherit>1</inherit>
    </eventlistener>

    Die Templatevariablen wollte ich im obigen Template __redactorTexEqnEditPlugin benutzen, um so die Werte an das Javascript zu übergeben. Nun ja, angezeigt werden sie im Quelltext schon, rufe ich den Editor auf (bspw. Beitrag bearbeiten), gibt es eine Fehlermeldung, die sagt, dass die Werte nicht vorhanden sind. Hoffe, es ist einigermaßen verständlich :huh: .
    Hätte vielleicht jemand einen Tipp für mich, was ich da falsch mache?

    • Official Post

    Zum einen ist $.extend total überflüssig, mit $config.texeqnedit = { … } erreichst du das gleiche. Zweitens stellst sich noch die Frage, wie du im Editor auf die Optionen zugreifst?

  • Ok, vielen Dank. Im Editor greife ich bspw. auf example mit var examples = self.wutil.getOption('texeqnedit').example; zu.

    • Official Post

    Hast du mal mit console.debug(this.opts); geschaut, ob die Übergabe überhaupt funktioniert? Ansonsten kannst du auch mal einen Blick in den Quellcode werfen, dein Code müsste dort korrekt auftauchen (Tipp: Suche nach var $config, damit findest du es am schnellsten).

  • Im Templatelistener habe ich mal der Templatevariablen dummy den String 'test' zugewiesen

    PHP
    public function execute($eventObj, $className, $eventName) {
    	$this->objectType = CategoryHandler::getInstance()->getObjectTypeByName('de.wollzi.redactor.texeqnedit');
    	$this->buildCategoryNodeTree();
    	WCF::getTPL()->assign(array(
    		'texButtonGroup' => $this->categoryNodeTree->getIterator(),
    		'dummy' => 'test'
    	));
    }

    und in das obige Template mit $config.texeqnedit = { test: {$dummy}, ...} eingebaut. Im Quelltext wird es korrekt angezeigt, beim Bearbeiten des Beitrags gibt es dann die Fehlermeldung. console.debug(this.opt); gibt nichts aus.
    Ich habe noch einen weiteren Listener:

    XML
    <templatelistener name="mathjaxJSInclude">
    	<environment>user</environment>
    	<templatename>headInclude</templatename>
    	<eventname>javascriptInclude</eventname>
    	<templatecode><![CDATA[{include file="__mathjaxJavaScript"}]]></templatecode>
    </templatelistener>

    Benutze ich die Variable im Template __mathjaxJavaScript, das per javascriptInclude eingefügt wurde, kann ich problemlos von meinem Script darauf zugreifen. Ich weise bspw. den Wert der Templatevariablen im Template einer Javascriptvariablen zu, die nun allerdings auf allen Seiten verfügbar ist (durch den EventListener). Das wollte ich umgehen, so dass die Javascriptvariable nur dann erstellt wird, wenn sie auch gebraucht wird (beim Laden des Editors).

  • Sorry, ich habe auch this.opts verwendet, mich nur hier im Beitrag verschrieben. Der Syntaxfehler entsteht dadurch, weil statt des Wertes der Templatevariablen jetzt die Fehlermeldung in das Template geschrieben wurde:

    JavaScript
    test: '{"code":503,"message":"Es ist ein Fehler bei der Verarbeitung aufgetreten, bitte versuchen Sie es sp\u00e4ter erneut.","returnValues":[],"exceptionID":"89fc986f31c02bd9667a2afe0667a3215adfb984"}</p></div>

    Prüfe ich bspw. vorher mit test: '{if $dummy|isset}{$dummy}{else}nichts{/if}', wird mit this.opts nach dem Laden des Plugins [object Object] ausgegeben.


    Nach dem Laden der eigentlichen Seite ist die Templatevariable gesetzt. Soweit ich das richtig verstanden habe, entsteht mein Fehler erst dann, wenn per Ajax das Plugin nachgeladen wird. Dann ist die Variable nicht mehr verfügbar.

    Edited 2 times, last by WollZi ().

    • Official Post

    Das Problem dürfte eher sein, dass dein Event-Listener nicht auf das passende Event horcht. Beim Laden des Editors über AJAX wird das gesamte Template für den Editor neu gerendert, das schließt auch alle zugewiesenen Variablen ein, du musst sie an dieser Stelle auch bereitstellen.

  • Vielen Dank für die Antworten. Mittlerweile bin ich auch davon überzeugt, dass es das falsche Event ist. Hast du vielleicht einen Tipp, welches Event dafür geeignet wäre?

  • Alles klar, danke. Ich habe gerade initializeAction@wcf\data\AbstractDatabaseObjectAction probiert. Damit scheint es zu funktionieren. Es bleibt also spannend ;) .

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!