it-swarm.dev

テンプレートの-> addScriptDeclaration()によってヘッドデータに追加されたJavaScriptの設定を解除する

ドキュメントヘッド内のすべてのJavaScript宣言の設定を解除しようとしています。

これは、サードパーティの拡張機能によって-> addScriptDeclaration()を使用して追加されるインラインJavaScriptを意味し、-> addScript()を使用して追加されるJavaScriptファイルを意味しません。

捨てたら

$doc = JFactory::getDocument();
var_dump($doc->_scripts);

次に、Joomlaコアとサードパーティの拡張機能によって追加されたすべてのJavascriptファイルが表示されます。

捨てたら

$doc = JFactory::getDocument();
var_dump($doc->_script['text/javascript']);

次に、コアJavaScriptのみが表示されます。例:

string(79) "jQuery(window).on('load',  function() {
            new JCaption('img.caption');
        });"

サードパーティの拡張機能によって追加されたものは含まれず、ヘッドに出力されます。

テンプレートでサードパーティのスクリプトを傍受することは可能ですか、それとも後日追加され、特定のイベントでプラグインによってのみ実行できますか?

5
Robert Went

この回答は非常に長く、多くの方法がありますが、一番下にあるのが最適です

unset($doc->_scripts[JUri::base(true)'/path/to/file.js'])

主にそれを行う方法ですが、スクリプトによっては完全なURLを追加するものとそうでないものがあります。

したがって、すべてを削除したい場合は、これを回避するためのより良い方法があります。

$doc->_scripts = array();
//if you need to re include libraries
JHtml::_('jquery.framework');
JHtml::_('behavior.framework');

//if the array trick does not work you could do
for($i=0;$i<count($doc->_scripts);$i++){
   //in here you could stop it from removing specific files by looking for specific file names
   $get_file = explode('/',$doc->_scripts[$i]);
   $get_file = end($get_file);

   //many more ways to do this, chains of if statements can get messy
   switch($get_file){
      case 'jquery.js':
      case 'boostrap.js';
         break;
      default:
         unset($doc->_scripts[$i]);
         break;
   }
}

編集:

スクリプト宣言の場合、ほとんどのスクリプトを1つに結合するのではなく分離します。また、テンプレートは、ページがレンダリングされる前に実行する最後の場所ではないため、スクリプト配列にさらに追加することができます。私はこれについて100%ではありませんが、モジュールはテンプレートの後にレンダリングされてから挿入され、コンポーネントはメニュー項目に基づいて読み込まれるため、前に読み込まれると思います。また、プラグインはスクリプトにあとがきを追加できます。

したがって、必要に応じてスクリプトを完全に調整できることを保証する唯一の方法は、プラグインを使用することです。それを行うことができるonBeforeCompileHeadというシステムイベントがあります。

http://docs.joomla.org/Plugin/Events/System#onBeforeCompileHead

プラグインを作成する必要がありますが、プラグインはすべての拡張機能の中で最も簡単です。ここに参考資料を示します。

http://docs.joomla.org/J3.x:Creating_a_Plugin_for_Joomla

要約では、それが追加された場所によっては、テンプレートで使用できない場合があります。プラグインが唯一の方法である可能性があります。

更新私が言ったように、それはテンプレートだけで行うことはできませんが、私はそれをあらゆるサイトで許可するために使用できるシンプルなシステムプラグインでそれを回避する方法を見つけました。これはコアで役立つものであり、プルリクエストを実行して追加することもできますが、どなたでも大歓迎です。ただし、「次のリリース」に追加される可能性は低い

class PlgSystemHooks extends JPlugin
{
    public function onAfterDispatch(){
        $app = JFactory::getApplication();
        $template = $app->getTemplate();

        if ($app->isSite())
        {
            if (file_exists(JPATH_THEMES.DIRECTORY_SEPARATOR.$template.DIRECTORY_SEPARATOR.'functions.php'))
            {
                $dispatcher = JDispatcher::getInstance();
                require_once JPATH_THEMES.DIRECTORY_SEPARATOR.$template.DIRECTORY_SEPARATOR.'functions.php';
            }
        }
    }
}

これはwordpressに触発されたものですが、ソースコードを見ると、基本的にコアで完全にサポートされていることがわかり、テンプレートでファイルを定義する最後のステップがこんな便利な機能!

使い方は次のとおりです。

まず、テンプレートにfunctions.phpファイルを作成します。

次に、そのファイルで次のようなものを使用します。

$dispatcher->register('onBeforeCompileHead',function(){
   //your code to remove the unneeded scripts.
});

注:これはメモリから実行したため、100%正確ではない可能性があります。JDispatcherクラスを調べても機能しない場合は、良い考えかもしれません。これは非常に便利です。そのサイト専用の単純なプラグイン機能を必要とする多くのプロジェクトでは、カスタムプラグインを作成することは、必要な作業よりもはるかに多くの作業が必要です。

5
Jordan Ramstad

それを行うもう1つの方法と、私が好む方法は、拡張機能のオーバーライドを作成し、そこでスクリプトの呼び出しをコメント化することです。

私が使用しているほぼすべての拡張機能で、スクリプトとcss呼び出しの両方を削除して、常にこれを行っています。唯一の問題は、拡張機能の開発者が呼び出しをビューファイルに配置しなかった場合、テンプレートのオーバーライドを作成できず、代わりに拡張機能をハックする必要があることです。

3
Seth Warburton