2011-01-17 14 views
3

CakePHP elementファイル内にナビゲーションメニューがあります(views/elements/nav_default.ctp)。CakePHP内部の要素からaddScript()を呼び出す方法は?

ファイルは、レイアウトファイル(views/layouts/default.ctp)に含まれるヘッダ(views/elements/header_default.ctp)である別の要素の中に含まれています。

私はそうのようなのnav要素内からJSファイル(ウェブルート/ JS/mega_drop.js)をロードするためにケーキを教えしようとしています:

<?php 
$this->addScript('mega_drop'); 
?> 

それは含まれません。

は内部スクリプト バッファにコンテンツを追加します:私はちょうど言うaddScriptのドキュメントを見ました。このバッファは、$ scripts_for_layoutとしてレイアウトに で利用可能になります。 このメソッドは、 ヘルパー(javascriptまたは cssをレイアウトに直接追加する必要がある)を作成するときに役立ちます。 レイアウトから追加されたスクリプト、またはレイアウト内の要素が$ scripts_for_layoutに追加されないことに気をつけてください。 このメソッドは、JavaScriptの やHtmlヘルパーのように、ヘルパー内で からよく使用されます。

キーパーツ:

レイアウトから追加されたスクリプト、またはレイアウト内の要素は$ scripts_for_layoutに追加されないことに注意してください。

どうすればいいですか?

私は<script src="/js/mega_drop.js"></script>default.ctpのレイアウトに追加できると思います。それは、レイアウトと要素を緊密に結びつけるためにはうってつけです。

CakePHPのベストプラクティス方法は何ですか?

答えて

4

addScript()ファイルをロードしません。変数$scripts_for_layoutに実際のコードを追加します。レイアウトは、JavaScriptファイルとコードを読み込むための良い場所です。こうすることで、すべてのコードを1つの場所(ヘッドブロック内または最後に)で出力することができます。したがって、インラインで出力するのではなく、ビューでJavaScriptコードを取得している場合は、レイアウトに渡すことができます。

スクリプトファイルをロードする最も良い方法は、HTMLヘルパー-であることを念頭に置いて、要素内で$this->set('scripts', 'mega_drop');を実行してから、その$ scripts変数を使用してHTMLヘルパーをレイアウトから呼び出すことができます。

問題があります:あなたのnav_default.ctpがレイアウトから呼び出されても問題はありません。 $ this-> set()は、レイアウトの前にビューがレンダリングされるため、ビュー(またはビューから呼び出された要素)の内部で動作します。レイアウトから要素を呼び出す場合は、レイアウトで使用するためにviewVarsを設定するのが遅すぎます。 最も良いことは、コントローラからスクリプト変数を設定し()、レイアウトにif(isset($scripts)) { echo $this->Html->script($scripts); }を使用することです。

1

はエコーなしであなたの要素で

$this->Html->script('mega_drop', $inline=false); 

を試してみてください。

2番目のパラメータは、それを$ scripts_for_layout変数に追加することを示します。

あなたの要素でこれを行うことができるはずです。そうすれば、要素があるときにのみjavascriptが組み込まれます。

$this->addScript($this->Javascript->link('tab_enabler')); 
$this->addScript($this->Html->css('jquery.tabs')); 

これが正しく表示からCSSやJSファイルを含める方法の一例であり、生成されないために、変数$scripts_for_layoutに追加:

3

正しく、有効1.3.xのCakePHPの2.0のDevがexample.ctpファイルからですCSSファイルへのリンクを追加するのが正しくないため、W3Cの検証エラー<BODY></BODY>

関連する問題