概要
jQueryを使い始めてからだんだんヘッダに書き出すjavascriptのメソッドが増えてきて収拾がつかなくなってきたので編み出したControllerに応じて出力するスクリプトを変える方法です。恐らく一般にバッドノウハウと呼ばれる代物になっているかと思いますので、参考にするしないは自己責任でお願いします。
方法
/app/views/elements/jsにスクリプトを出力したいコントローラ名.ctpというファイルを作成します。
例:/app/views/elements/js/posts.ctp
で、このエレメントファイルにヘッダに書き出すスクリプトをそのまま移植。
例:/app/views/elements/js/posts.ctp
<script type="text/javascript"> function hoge() { return "hoge"; } </script>
次に使用するレイアウトファイルの
内に次のような記述を追加。例:/app/views/layouts/default.ctp
?省略? <head> ?省略? // javascriptヘルパーがセットされていれば読み出す if (array_search("Javascript", $this->helpers) !== false) { // 普通にjsスクリプトを呼ぶ場合 echo $javascript->link("jquery.js"); // コントローラ名に応じたjsスクリプトを呼ぶ場合 echo $javascript->link($this->name); // $this->nameでコントローラ名取得 echo $this->renderElement("js/" . $this->name); } ?省略? </head> ?省略?
とこんな感じで実装しました。
もっとスマートな方法がありましたらぜひ教えてください。
あとがき
こういう場合、皆さんはどうしているんでしょう?
たぶん普通ならスクリプトが必要なコントローラだけ別のレイアウトを呼ぶ方法をとるか、前述のソースにも書いたようにコントローラ名に応じたjsスクリプトを呼ぶんじゃないかな?と思うわけですが、二つ問題点があるわけです。
- レイアウトファイルで分けるとファイルが多くなってウザい。共通部分を切り分けないようにレイアウトの中身を無駄に細かくエレメントで分ける必要があったり。
- 僕だけかもしれませんがjsのソースによくHtmlHelper::url()メソッドを使うので*1 、.jsスクリプトに分けてJavascriptHelper::link()で呼ぶとHtmlHelperが効かないんですよ。(たぶん)
というわけで、今回のバッドノウハウにたどり着いたわけですが、もっとスマートな方法をご存知の方ぜひともご教示くださいm_ _m
- フォームのurlの指定とかに使ってるんですが、この使い方が間違っているんですかね?ちなみに僕javascriptはじめたばかりでわからない事だらけなのです。 [↩]