1 <?xml version="1.0" encoding="UTF-8"?>
3 <!-- EN-Revision: 19432 -->
4 <sect3 id="zend.view.helpers.initial.headscript">
5 <title>HeadScript ヘルパー</title>
8 HTML の <code><script></code> 要素を使用して、
9 クライアントサイトのスクリプトをインラインで指定したり
10 外部のリソースからスクリプトのコードを読み込んだりします。
11 <code>HeadScript</code> ヘルパーは、この両方の方式に対応しています。
15 <code>HeadScript</code> ヘルパーは、
16 以下のメソッド群によってスクリプトの設定や追加をサポートします。
20 <listitem><para><code>appendFile($src, $type = 'text/javascript',
21 $attrs = array())</code></para></listitem>
22 <listitem><para><code>offsetSetFile($index, $src, $type = 'text/javascript',
23 $attrs = array())</code></para></listitem>
24 <listitem><para><code>prependFile($src, $type = 'text/javascript',
25 $attrs = array())</code></para></listitem>
26 <listitem><para><code>setFile($src, $type = 'text/javascript',
27 $attrs = array())</code></para></listitem>
28 <listitem><para><code>appendScript($script, $type = 'text/javascript',
29 $attrs = array())</code></para></listitem>
30 <listitem><para><code>offsetSetScript($index, $script, $type = 'text/javascript',
31 $attrs = array())</code></para></listitem>
32 <listitem><para><code>prependScript($script, $type = 'text/javascript',
33 $attrs = array())</code></para></listitem>
34 <listitem><para><code>setScript($script, $type = 'text/javascript',
35 $attrs = array())</code></para></listitem>
39 <code>*File()</code> 系のメソッドでは、<varname>$src</varname>
40 は読み込みたいリモートスクリプトの場所となります。
41 通常は、<acronym>URL</acronym> あるいはパスの形式となります。<code>*Script()</code>
42 系のメソッドでは、<varname>$script</varname>
43 はその要素に使用したいクライアント側のスクリプトとなります。
47 <title>条件コメントの設定</title>
50 <code>HeadScript</code> では、script タグを条件コメントで囲むことができます。
51 そうすれば、特定のブラウザでだけスクリプトを実行しないこともできます。
52 これを使用するには conditional タグを設定し、条件をメソッドコール時の
53 <varname>$attrs</varname> パラメータで渡します。
56 <example id="zend.view.helpers.initial.headscript.conditional">
57 <title>Headscript で条件コメントを使う例</title>
58 <programlisting language="php"><![CDATA[
60 $this->headScript()->appendFile(
63 array('conditional' => 'lt IE 7')
70 <code>HeadScript</code> はスクリプトのキャプチャも行います。
71 これは、クライアント側スクリプトをプログラム上で作成してから
77 <methodname>headScript()</methodname> メソッドを使うと、
80 <methodname>headScript($mode = 'FILE', $spec, $placement = 'APPEND')</methodname>
81 です。<varname>$mode</varname> は 'FILE' あるいは 'SCRIPT' のいずれかで、
82 スクリプトへのリンクを指定するのかスクリプト自体を定義するのかによって切り替えます。
83 <varname>$spec</varname> は、リンクするスクリプトファイルあるいはスクリプトのソースとなります。
84 <varname>$placement</varname> は 'APPEND'、'PREPEND' あるいは 'SET'
89 <code>HeadScript</code> は <methodname>append()</methodname> や
90 <methodname>offsetSet()</methodname>、<methodname>prepend()</methodname>、そして <methodname>set()</methodname>
91 をそれぞれオーバーライドして、上にあげた特別なメソッドを使用させるようにします。
92 内部的には、各項目を <code>stdClass</code> のトークンとして保管し、
93 あとで <methodname>itemToString()</methodname> メソッドでシリアライズします。
94 これはスタック内の項目についてチェックを行い、
99 <code>HeadScript</code> ヘルパーは、
100 <link linkend="zend.view.helpers.initial.placeholder">Placeholder
105 <title>HTML Body スクリプトでの InlineScript の使用</title>
108 HTML の <code>body</code> 部にスクリプトを埋め込みたい場合は、
109 <code>HeadScript</code> の姉妹版である <link
110 linkend="zend.view.helpers.initial.inlinescript">InlineScript</link>
112 スクリプトをドキュメントの最後のほうに配置するようにすると、
114 サードパーティのアクセス解析用スクリプトを使用する場合などにこの効果が顕著にあらわれます。
119 <title>すべての属性はデフォルトで無効</title>
122 デフォルトでは、<code>HeadScript</code> がレンダリングする
123 <code><script></code> の属性は W3C
125 'type' や 'charset'、'defer'、'language' そして 'src' が該当します。
126 しかし、Javascript のフレームワーク
127 (<ulink url="http://www.dojotoolkit.org/">Dojo</ulink> など)
128 では独自の属性を用いることでその挙動を変更しています。
130 <methodname>setAllowArbitraryAttributes()</methodname> メソッドを使用します。
133 <programlisting language="php"><![CDATA[
134 $this->headScript()->setAllowArbitraryAttributes(true);
138 <example id="zend.view.helpers.initial.headscript.basicusage">
139 <title>HeadScript ヘルパーの基本的な使用法</title>
142 上で説明したように、新しい script タグを、好きなときに指定できます。
147 <programlisting language="php"><![CDATA[
149 $this->headScript()->appendFile('/js/prototype.js')
150 ->appendScript($onloadScript);
154 クライアント側のスクリプトでは並び順が重要となります。
155 指定した並び順で出力させる必要が出てくることでしょう。
156 そのために使用するのが、append、prepend そして offsetSet
160 <programlisting language="php"><![CDATA[
163 // 特定の位置を指定し、確実に最後に読み込まれるようにします
164 $this->headScript()->offsetSetFile(100, '/js/myfuncs.js');
166 // scriptaculous のエフェクトを使用します (次のインデックスである 101 に追加されます)
167 $this->headScript()->appendFile('/js/scriptaculous.js');
169 // でも、もととなる prototype スクリプトは常に最初に読み込まれるようにします
170 $this->headScript()->prependFile('/js/prototype.js');
174 すべてのスクリプトを出力する準備が整ったら、
175 あとはレイアウトスクリプトでそれを出力するだけです。
178 <programlisting language="php"><![CDATA[
179 <?php echo $this->headScript() ?>
183 <example id="zend.view.helpers.initial.headscript.capture">
184 <title>HeadScript ヘルパーによるスクリプトのキャプチャ</title>
187 時にはクライアント側のスクリプトをプログラムで生成しなければならないこともあるでしょう。
188 文字列の連結やヒアドキュメント等を使っても構いませんが、
189 ふつうにスクリプトを作成してそれを <acronym>PHP</acronym> のタグに埋め込めればより簡単です。
190 <code>HeadScript</code> は、スタックにキャプチャすることでこれを実現します。
193 <programlisting language="php"><![CDATA[
194 <?php $this->headScript()->captureStart() ?>
195 var action = '<?php echo $this->baseUrl ?>';
196 $('foo_form').action = action;
197 <?php $this->headScript()->captureEnd() ?>
206 スクリプトは、スタックの末尾に追加されていきます。
207 既存のスタックを上書きしたりスタックの先頭に追加したりしたい場合は、
208 それぞれ 'SET' あるいは 'PREPEND' を
209 <methodname>captureStart()</methodname> の最初の引数として渡します。
213 スクリプトの <acronym>MIME</acronym> タイプは 'text/javascript' を想定しています。
215 <methodname>captureStart()</methodname> の 2 番目の引数として渡します。
219 <code><script></code> タグに追加の属性を指定したい場合は、
220 <methodname>captureStart()</methodname> の 3 番目の引数に配列形式で渡します。