CakePHPのコードブロックを使うと、ビューの中にjsコードを書いて、layoutの管轄上にある末尾(body閉じタグの直前など)に吐き出すことができるので、画面に依存する処理などでよく使う。
しかし不便なこともある。
<?php $this->Html->scriptStart(array('inline' => false));?>
…JavaScriptのコード…
<?php $this->Html->scriptEnd();?>
といった感じで書くのだが、Netbeansなどのエディタではこの中身がJavaScriptだと認識することができない。そのため補完が行われないので、生産効率が悪い。
scriptタグで囲めればよいのだが、CakePHPのヘルパーがscriptタグを生成するので、二重になってしまう。(当然動かない)
そこで若干卑怯ではあるが、独自のヘルパーを作って、scriptタグを除去する仕組みを作ってみる。
class ScriptwrapHelper extends AppHelper {
var $helpers = array('Html');
protected $_scriptBlockOptions = array();
public function scriptStart($options = array()) {
$options += array('safe' => true, 'inline' => true);
$this->_scriptBlockOptions = $options;
ob_start();
return null;
}
public function scriptEnd() {
$buffer = preg_replace('/<script>(.*?)<\/script>/s', '\1', ob_get_clean());
$options = $this->_scriptBlockOptions;
$this->_scriptBlockOptions = array();
return $this->Html->scriptBlock($buffer, $options);
}
}
基本的には、元々のHtmlヘルパーの中にあるものをそのまま頂いてきて、自分が書いたscriptタグを除去するようにする。
ヘルパーではscriptBlockメソッドを使って処理をしているが、これはHelper内でHtmlヘルパーを使えるようにすることで、$this->Html->scriptBlockでアクセスできるので、移してはこなかった。これで、
<?php $this->Html->scriptStart(array('inline' => false));?>
<script>
…JavaScriptのコード…
</script>
<?php $this->Html->scriptEnd();?>
こういう書き方をすることで、自分が書いたscriptタグは除去され、ソースコードでは(少なくともNetbeansは)Javascriptと認識してくれるので、生産性は向上。
ちなみに、HtmlHelper自体を改変しなかったのは、第一に面倒臭い。
そして、これはどう考えても正しい対策ではないので、Netbeansなどで正しく認識できるようになったら、使うのを辞めたい。そうすると、ビュー上で正規版と改造版の違いが分からないと困るので、独立したヘルパーにしておいた方が区別がつきやすい。
ちなみに、Netbeans用にすばらしいCakePHPプラグインを作って下さっている @junichi_11 さんが取り組んでは下さっているそうです。
@macchaka NBの場合はプラグインで該当箇所をjsのmimeを埋め込んでいるのですが、残念ながら上手くいきません。。。(補完の候補は微妙に表示されたかと思います) いつになるかはわかりませんが、中の人に聞いてみます。
— じゅん (@junichi_11) 2014, 1月 13
本当にこの方は神。