LoginSignup
3
3

More than 5 years have passed since last update.

CakePHPでscriptStart/Endで囲まれたところでjs補完をする不完全な方法

Posted at

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 さんが取り組んでは下さっているそうです。

本当にこの方は神。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3