it-swarm.com.de

So fügen Sie den Alias ​​dem Body in einem Plugin hinzu

Ich versuche, JavaScript zu verwenden, um dem Text eine Klasse hinzuzufügen, die dem aktuellen Alias ​​für Menüelemente entspricht.

Ich habe $prefix und es ist richtig. Ich weiß also, dass dieser Teil funktioniert.

Ich habe den JS in die Konsole geschrieben (abzüglich der dynamischen Variablen) und das funktioniert. Ich denke, das funktioniert auch.

Nun scheint es, dass es in diesem Plugin einfach nicht funktioniert. Aber ich habe das Plugin von einem anderen kopiert, das ich erstellt habe, und das funktioniert.

Kann jemand erklären, warum dies den Alias ​​nicht zur Körperklasse hinzufügt?

jimport( 'joomla.plugin.plugin' );

class plgSystemKouAliasAsBodyClass extends JPlugin
{   
    function __construct( $subject, $params )
    {
        parent::__construct($subject, $params);

    }

    function onBeforeCompileHead()
    {

        $app            = JFactory::getApplication();

        // If we are on admin don't process.
        if (!$app->isClient('site'))
        {
            return;
        }

        $document       = JFactory::getDocument();
        $menu           = $app->getMenu();
        $active         = $menu->getActive();
        $alias          = ucfirst($active->alias);      

        if (!empty($prefix))
        {
            $alias = $prefix . $alias;
        }

// Does not work, although $alias is correct when echoed.
        $document->addScriptDeclaration('
            document.addEventListener("DOMContentLoaded", function() {
                document.body.classList.add("' . $alias  . '");
            });
        ');

// Does not work, although document.body.classList.add("EoinsClass");
// works when used in the console.  And the rest works when 
// used in a different plugin.
        $document->addScriptDeclaration('
            document.addEventListener("DOMContentLoaded", function() {
                document.body.classList.add("EoinsClass");
            });
        ');     
    }
}
1
Eoin

Ich bin mir nicht sicher, warum Sie onBeforeCompileHead verwenden. Gemäß den Dokumenten https://docs.joomla.org/Plugin/Events/System wird dies ausgelöst, bevor der Kopf überhaupt erstellt wird. Vielleicht dachten Sie, dies wäre der beste Zeitpunkt, um Ihre Inhalte hinzuzufügen, aber es wird nicht funktionieren, es gibt nichts, was Sie hinzufügen könnten.

Versuchen Sie, Ihren Trigger auf onBeforeRender zu ändern. Dies ist der Punkt, an dem Ihre App (Seite) erstellt, aber noch nicht angezeigt wurde.

1
BodgeIT

Sie möchten den Ereignis-Listener OnAfterRender im Gegensatz zu onBeforeCompileHead verwenden.

Grundsätzlich versuchen Sie, dem Tag <body> Eine Klasse hinzuzufügen, bevor es gerendert wurde. Daher funktioniert es nicht.

OnAfterRender wird ausgelöst, sobald das Framework die Anwendung gerendert hat, dh sobald das DOM gerendert wurde.

0
Lodder