web-dev-qa-db-ja.com

onAfterRenderプラグインはバックエンドでのみトリガーされます

OnAfterRenderイベントのシステムプラグインを作成しましたが、実行できません。私はJoomla 3.9にいます

プラグインのサンプルコードは次のとおりです


    <?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>

そして


        <?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;
                }
            }
        }

ただし、フロントエンドを参照しているときに関数が実行されることはありませんが、バックエンドを参照しているときには実行されます。それは本当に奇妙で、理由がわかりません。これは常にトリガーする必要があるようにドキュメントにあるようです

1
gabtzi

あなたが現在持っているコードは動作します。ページキャッシュをクリアして、ページをもう一度表示するだけです。わかるでしょ fonts.googleapis.comリンクが削除されます。残りのコードによっては、これで問題ない場合もあります。

システム-ページキャッシュプラグインが有効になっている場合、最初の読み込みページ(URLによって決定される)が正常にレンダリングされ、予想されるすべてのプラグインイベントがトリガーされ、onAfterRespondイベント中にキャッシュに保存されます。次のページをロードすると、プラグインはキャッシュからページをフェッチし、アプリケーションにプッシュして、アプリケーションを閉じます。これはonAfterInitialiseイベント中に発生します。それ以上のイベントはトリガーされません。デバッグが有効になっている場合はonAfterRespondを除きます。

現在onBeforeCompileHeadにあるコードは、ページがキャッシュに保存される前に変更が適用されるため、実際には問題なく機能します。

ただし、キャッシュセーフではないコードを追加する場合は、たとえば訪問者ごとに変化するコード、またはランダムに生成されたコードの場合、onPageCacheSetCachingイベントを使用してキャッシュを選択的に無効にすることができます。

2
Sharky