web-dev-qa-db-fra.com

Le plugin onAfterRender ne se déclenche que sur le backend

J'ai créé un plugin système pour l'événement onAfterRender mais je ne peux pas le faire exécuter. Je suis sur Joomla 3.9

Voici l'exemple de code du plugin


    <?xml version="1.0" encoding="utf-8"?>
    <!--
    /**
     * @copyright   Copyright (c) 2018 myvendorcustomscripts. All rights reserved.
     * @license     http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
     */
    -->
    <extension type="plugin" version="1.0" group="content" method="upgrade">
        <name>plg_system_myvendorcustomscripts</name>
        <author>myvendor</author>
        <creationDate>October 2018</creationDate>
        <copyright>Copyright (c) 2018 myvendorcustomscripts. All rights reserved.</copyright>
        <license>http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL</license>
        <authorEmail></authorEmail>
        <authorUrl></authorUrl>
        <version>1.0.0</version>
        <description>
        <![CDATA[

        ]]>
        </description>

        <files>
            <filename plugin="myvendorcustomscripts">myvendorcustomscripts.php</filename>
            <filename>index.html</filename>
        </files>

        <languages>
            <language tag="en-GB">en-GB.plg_system_myvendorcustomscripts.ini</language>
            <language tag="en-GB">en-GB.plg_system_myvendorcustomscripts.sys.ini</language>
        </languages>

        <config>
            <fields name="params">
                <fieldset name="basic">

                </fieldset>
            </fields>
        </config>
    </extension>

Et


        <?php
        /**
         * @copyright    Copyright (c) 2018 myvendorcustomscripts. All rights reserved.
         * @license        http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
         */

    // no direct access
        defined('_JEXEC') or die;

        jimport('joomla.plugin.plugin');

        /**
         * content - MyVendorCustomScripts Plugin
         *
         * @package        Joomla.Plugin
         * @subpakage    myvendorcustomscripts.MyVendorCustomScripts
         * @since
         */
        class plgSystemMyVendorCustomScripts extends JPlugin
        {
            /**
             * Constructor.
             *
             * @param    $subject
             * @param    array $config
             * @since
             */
            public function __construct(&$subject, $config = array())
            {
                // call parent constructor
                parent::__construct($subject, $config);
            }


            public function onAfterRender()
            {
                $app = JFactory::getApplication();

            }


            public function onBeforeCompileHead()
            {
                $app = JFactory::getApplication();
                $document = $app->getDocument();

                foreach ($document->_styleSheets as $index => $value) {
                    if (strpos($index, 'fonts.googleapis.com')) {
                        unset($document->_styleSheets[$index]);
                    }

                    if (strpos($index, 'simple-line-icons')) {
                        unset($document->_styleSheets[$index]);
                    }

    //                $styleSheet = $styleSheet;
                }
            }
        }

Cependant, les fonctions ne sont jamais exécutées lorsque je navigue sur le frontend, mais elles sont exécutées lors de la navigation sur le backend. C'est vraiment étrange et je ne comprends pas la raison. Il semble sur la documentation que cela devrait même se déclencher toujours

1
gabtzi

Le code que vous avez actuellement fonctionne. Vous avez juste besoin d'effacer le cache de page et de revoir la page. Tu verras fonts.googleapis.com les liens sont supprimés. Cela peut ou peut ne pas être correct selon le reste de votre code.

Lorsque le plug-in System - Page Cache est activé, la première page de chargement (déterminée par l'URL) est rendue normalement avec tous les événements de plug-in attendus déclenchés et stockés dans le cache pendant l'événement onAfterRespond. Sur la page suivante, le plugin récupère la page du cache, la pousse vers l'application et ferme l'application. Cela se produit lors de l'événement onAfterInitialise. Aucun autre événement n'est déclenché. Sauf onAfterRespond si le débogage est activé.

Le code que vous avez actuellement dans onBeforeCompileHead fonctionne en fait très bien car vos modifications sont appliquées avant que la page ne soit stockée dans le cache.

Cependant, dans le cas où vous souhaitez ajouter du code qui n'est pas sûr pour le cache, par exemple code qui change d'un visiteur à l'autre ou d'un code généré de manière aléatoire, vous pouvez désactiver sélectivement le cache à l'aide de l'événement onPageCacheSetCaching.

2
Sharky