Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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

本当にこの方は神。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした