CakePHP 2.1の場合:
Javascriptのスニペットをレイアウト(つまりブロック)に
一度だけView->addScript()
追加するのに最適な方法は何ですか?
編集:
$this->Html->script()
(JSファイルへのリンク)は重複したスクリプトを追跡しているようです
が、$this->Html->scriptBlock()
(インラインJS)は追跡していません。:-(
CakePHP 2.1の場合:
Javascriptのスニペットをレイアウト(つまりブロック)に
一度だけView->addScript()
追加するのに最適な方法は何ですか?
編集:
$this->Html->script()
(JSファイルへのリンク)は重複したスクリプトを追跡しているようです
が、$this->Html->scriptBlock()
(インラインJS)は追跡していません。:-(
$this->Html->script('scriptname');
そして、スクリプトがwebrootのjsフォルダーにあることを確認してください
あなたができることがいくつかあります:
1.宣言された変数を探します(汚い回避策)
コードを本当に入れたい場合は$this->Html->scriptBlock()
、グローバル変数を定義/チェックして、コードがすでに定義されているかどうかを確認できます。例えば:
if (!DEFINED('someVarName')) {
// define the variable from now on
DEFINE('someVarName', true);
// add your block
$this->Html->scriptBlock(...);
}
2.カスタムJSルートとファイルを作成します(ケーキの方法)
最善の方法は、ビューに含めることができる実際のJSファイルを作成すること$this->Html->script()
ですが、PHPコードをJSに統合する場合は、煩わしくなります。Cakeには、ビュー固有のJSスクリプトを作成するための優れた方法がありますが、あまり話されていないようです(理由はわかりません)。
Config/routes.php
これをファイルに追加するだけです。
Router::parseExtensions('js');
これにより、URLの末尾に「.js」を追加するだけで、CakeはコントローラーアクションのJSビューを自動的に検索します。例えば:
$this->Html->script('/users/profile.js')
探すView/Users/js/profile.ctp
次に、JSレイアウトでそれを提供します。コントローラに設定されたすべての変数とデータに引き続きアクセスできるため、これはすばらしいことです。
さて...ただ一つの問題。デフォルトのJSレイアウトは、コンテンツをタグでラップします。次のように、スクリプトを外部に含めようとしている場合、これは適切ではありません<script type="text/javascript" src="/users/profile.js"></script>
。
私はこの方法でJSレイアウトをあまり使用していませんが、ある時点で可能性があるので、レイアウトファイルを編集して適応可能にしました。
// app/View/Layouts/js/default.ctp
<?
if (isset($this->request->params['ext']) && $this->request->params['ext']=='js') {
echo $this->fetch('content');
} else {
?>
<? echo $scripts_for_layout; ?>
<script type="text/javascript"><?php echo $this->fetch('content'); ?></script>
<? } ?>
詳細については(ただし、それほど多くはありません):http: //book.cakephp.org/2.0/en/development/routing.html#file-extensions