web-dev-qa-db-ja.com

ロードされたスクリプトの順序を制御する

残念ながらjoomlaフォーラムに登録できないので、ここで最善を尽くします。
助けてください、ロードされたスクリプトの順序を制御する方法はありますか?.

例:テンプレートのindex.phpで次のようにします。

$doc->addScript('my/script_a.js');

最初のaddScript();そのため、すべてのページに対してそのスクリプトをグローバルに読み込みます。

次に、カスタムコンポーネントのdefault.phpで次のようにします。

$doc->addScript('my/script_b.js');

具体的には、そのコンポーネントビューの動作を追加します。

論理的には、index.phpのaddScriptsが最初に$ docオブジェクトに追加され、その後、コンポーネントビューのaddScriptsに$ docオブジェクトが追加されると想定します。
しかし、私が頭の中で終わるのは:

<script src="my/script_b.js"></script>
<script src="my/script_a.js"></script>

My/script_a.jsはmy/script_b.jsが依存する計算を実行するので、これはかなり大変なバグです。したがって、順序は重要です。

スクリプトをロードする順序を制御する方法がなければなりません。そうしないと、この機能はほとんど意味がありませんね。

6
antimatter
  1. JDocumentのaddScriptメソッドには、順序付けのオプションはありません(たとえば、優先順位またはWPなど)。
  2. 問題を解決する方法はたくさんあります。

まず、あなたがしていることが問題の原因である理由を理解するには、Joomlaのライフサイクルを知る必要があります。

  1. ブートストラップフレームワークとアプリケーション
  2. ルート
  3. 成分
  4. モジュール
  5. テンプレート
  6. レンダリングして応答

テンプレートでaddScriptを呼び出すと、コンポーネントによって追加されたスクリプトの後にドキュメントに追加されます。

2番目、ソリューションへ...

  1. テンプレートによって読み込まれたスクリプトに依存関係がない場合は、スクリプトをインラインで上に記述します

    <jdoc:include type="head" />
    
  2. カスタムヘッドタグはスクリプトの後に読み込まれるため、コンポーネントではaddScriptを使用せず、代わりにaddCustomTagを使用します。例えば。

    $doc->addCustomTag('<script src="my/script_b.js"></script>');
    
  3. システムプラグインを記述し、onAfterRouteメソッドで最初にグローバルスクリプトをロードしてから、JInputのオプションがコンポーネントであるかどうかを確認し、コンポーネントスクリプトである場合はそれをロードします(または既に実行しているので、コンポーネントtmplにロードするだけです)。 )。

  4. テンプレートでは、JDocumentからヘッドデータを取得し、好きなようにざわめきます。

参考文献:

https://github.com/joomla/joomla-cms/blob/staging/libraries/src/Document/HtmlDocument.php

6
jamesgarrett

同じ問題があり、あなたの投稿に出くわしました。私はそれを自分のテンプレートで修正し、3.9までのすべてのJoomlaバージョンで動作します。

$doc = JFactory::getDocument();
foreach ($doc->_scripts AS $script => $options) {
    if (strpos($script, 'com_your_component') === false) break;
    $doc->_scripts[$script] = array_shift($doc->_scripts);
}
0
Thalueng