web-dev-qa-db-ja.com

JHtml:script()と$ doc-> addScriptの違いは何ですか?

最近、特定のJSおよびCSSファイルを各ページの<head>に挿入する必要があるモジュールを開発しました。最初は、私は使用しました:

$doc =& JFactory::getDocument();
$doc->addScript(JURI::base(true).'/modules/mod_x/js/mod_x.js');

ただし、キャッシュを有効にすると、サイトが/cacheのキャッシュバージョンと/modules/mod_x/js/の非キャッシュバージョンの両方をロードし、JSエラーが発生することに気付きました。

これを次のように変更した場合:

JHtml::script(Juri::base().'modules/mod_x/js/mod_x.js');

スクリプトは、これらのエラーを解決するために、キャッシュから1回だけロードされました。

ドキュメントで読むaddScriptメソッドはJHtml:scriptメソッドよりも「低レベル」でしたが、それ以上に...

もちろん、上記の[JHtml:scriptメソッド]を使用して自動的に実行されるいくつかの手順[JHtml:scriptが実行する]も手動でコーディングする必要があります[addScriptを使用する場合]。

...これ以上の詳細はありません。

違いは何ですか?私はJHtml:scriptがいずれかの時点でドキュメントオブジェクトに対してaddScriptを最終的に呼び出すと想定しますが、他の中間ステップが最初に行われますか?

10
codinghands

_JHtml::script_には、追加のロジックが含まれています。 APIリファレンスについては http://api.joomla.org/cms-3/classes/JHtml.html#method_script を参照してください

デフォルトでは、デバッグ設定と使用されているブラウザを検出し、一致するスクリプトをロードします。たとえば、デバッグが有効になっている場合、ファイルの非圧縮バージョンが存在する場合はロードされます。

テンプレートレベルなどでファイルを上書きできるオプションの設定があります。

Michael BabkerがJHtml::script()を使用してオーバーライドを許可する方法についての良いガイドを書きました: http://www.babdev.com/blog/139-use-the-media-folder-allow-overridable-メディア

参照用のリポジトリ内の関数: https://github.com/joomla/joomla-cms/blob/staging/libraries/cms/html/html.php#L659

現在Georgeによって更新されている公式のドキュメントページ: http://docs.joomla.org/J3.3:Adding_JavaScript_and_CSS_to_the_page

8
Bakual

2つの言葉で:

  • JHtml::script()-特定のスクリプト(すでにJDocumentにアタッチされているものを除く)をオーバーライドできるようにします。いくつかの要因に依存します(@Bakualの回答を参照)。
  • $doc->addScript()-上書きを確認せずに、スクリプトをドキュメントに直接添付します。

拡張機能の開発者は、スクリプトを追加するときにJHtml::script()を使用することを強くお勧めします。これにより、ユーザーは必要に応じて、特定のスクリプトを上書きできます。
cssにも同様の方法があります。

4
Fedik