[GENERIC] Zend_Translate:
[zend.git] / documentation / manual / ja / module_specs / Zend_View-Scripts.xml
blobb57c662caa59b7e050326ac5101616cfdbf32c59
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- Reviewed: no -->
3 <!-- EN-Revision: 20799 -->
4 <sect1 id="zend.view.scripts">
6     <title>ビュースクリプト</title>
8     <para>
9         コントローラが変数を代入して <methodname>render()</methodname> をコールすると、
10         指定されたビュースクリプトを <classname>Zend_View</classname> が読み込み、<classname>Zend_View</classname>
11         インスタンスのスコープでそれを実行します。したがって、
12         ビュースクリプトの中で $this を参照すると、
13         実際には <classname>Zend_View</classname> のインスタンスを指すことになります。
14     </para>
16     <para>
17         コントローラからビューに代入された変数は、
18         ビューインスタンスのプロパティとして参照できます。例えば、
19         コントローラで変数 'something' を代入したとすると、
20         ビュースクリプト内ではそれを $this->something で取得できます
21         (これにより、どの値がコントローラから代入されたもので、
22         どの値がスクリプト内部で作成されたものなのかを追いかけられるようになります)。
23     </para>
25     <para>
26         <classname>Zend_View</classname> の導入の部分で示したビュースクリプトの例を思い出してみましょう。
27     </para>
29     <programlisting language="php"><![CDATA[
30 <?php if ($this->books): ?>
32     <!-- 本の一覧 -->
33     <table>
34         <tr>
35             <th>著者</th>
36             <th>タイトル</th>
37         </tr>
39         <?php foreach ($this->books as $key => $val): ?>
40         <tr>
41             <td><?php echo $this->escape($val['author']) ?></td>
42             <td><?php echo $this->escape($val['title']) ?></td>
43         </tr>
44         <?php endforeach; ?>
46     </table>
48 <?php else: ?>
50     <p>表示する本がありません。</p>
52 <?php endif;?>
53 ]]></programlisting>
55     <sect2 id="zend.view.scripts.escaping">
57         <title>出力のエスケープ</title>
59         <para>
60             ビュースクリプトで行うべき仕事のうち最も重要なもののひとつは、
61             出力を適切にエスケープすることです。これは、
62             クロスサイトスクリプティング攻撃を防ぐのを助けます。
63             それ自身がエスケープを行ってくれるような関数、メソッド、
64             あるいはヘルパーを使用しているのでない限り、
65             変数を出力する際には常にそれをエスケープしなければなりません。
66         </para>
68         <para>
69             <classname>Zend_View</classname> の escape() というメソッドが、このエスケープを行います。
70         </para>
72         <programlisting language="php"><![CDATA[
73 // ビュースクリプトの悪い例
74 echo $this->variable;
76 // ビュースクリプトのよい例
77 echo $this->escape($this->variable);
78 ]]></programlisting>
80         <para>
81             デフォルトでは、escape() メソッドは <acronym>PHP</acronym> の htmlspecialchars()
82             関数でエスケープを行います。しかし環境によっては、
83             別の方法でエスケープしたくなることもあるでしょう。
84             コントローラから setEscape() メソッドを実行することで、
85             エスケープに使用するコールバックを <classname>Zend_View</classname> に通知できます。
86         </para>
88         <programlisting language="php"><![CDATA[
89 // Zend_View のインスタンスを作成します
90 $view = new Zend_View();
92 // エスケープに htmlentities を使用するように通知します
93 $view->setEscape('htmlentities');
95 // あるいは、クラスの静的メソッドを使用するように通知します
96 $view->setEscape(array('SomeClass', 'methodName'));
98 // あるいは、インスタンスメソッドを指定することもできます
99 $obj = new SomeClass();
100 $view->setEscape(array($obj, 'methodName'));
102 // そして、ビューをレンダリングします
103 echo $view->render(...);
104 ]]></programlisting>
106         <para>
107             コールバック関数あるいはメソッドは、
108             エスケープする値を最初のパラメータとして受け取ります。
109             それ以外のパラメータはオプションとなります。
110         </para>
112     </sect2>
114     <sect2 id="zend.view.scripts.templates">
115         <title>別のテンプレートシステムの使用</title>
117         <para>
118             <acronym>PHP</acronym> 自身も強力なテンプレートシステムではありますが、
119             開発者の多くは、デザイナにとっては高機能すぎる/複雑すぎる
120             と感じており、別のテンプレートエンジンをほしがっているようです。
121             <classname>Zend_View</classname> では、そのような目的のために二種類の仕組みを提供します。
122             ビュースクリプトを使用することによるものと、
123             <classname>Zend_View_Interface</classname> 実装することによるものです。
124         </para>
126         <sect3 id="zend.view.scripts.templates.scripts">
127             <title>ビュースクリプトを使用したテンプレートシステム</title>
129             <para>
130                 ビュースクリプトを使用して、PHPLIB 形式のテンプレートのような
131                 別のテンプレートオブジェクトのインスタンスを作成し、
132                 それを操作できます。ビュースクリプトをこのように使用する方法は、
133                 以下のようになります。
134             </para>
136             <programlisting language="php"><![CDATA[
137 include_once 'template.inc';
138 $tpl = new Template();
140 if ($this->books) {
141     $tpl->setFile(array(
142         "booklist" => "booklist.tpl",
143         "eachbook" => "eachbook.tpl",
144     ));
146     foreach ($this->books as $key => $val) {
147         $tpl->set_var('author', $this->escape($val['author']);
148         $tpl->set_var('title', $this->escape($val['title']);
149         $tpl->parse("books", "eachbook", true);
150     }
152     $tpl->pparse("output", "booklist");
153 } else {
154     $tpl->setFile("nobooks", "nobooks.tpl")
155     $tpl->pparse("output", "nobooks");
157 ]]></programlisting>
159             <para>
160                 関連するテンプレートファイルは、このようになります。
161             </para>
163             <programlisting language="html"><![CDATA[
164 <!-- booklist.tpl -->
165 <table>
166     <tr>
167         <th>著者</th>
168         <th>タイトル</th>
169     </tr>
170     {books}
171 </table>
173 <!-- eachbook.tpl -->
174     <tr>
175         <td>{author}</td>
176         <td>{title}</td>
177     </tr>
179 <!-- nobooks.tpl -->
180 <p>表示する本がありません。</p>
181 ]]></programlisting>
183         </sect3>
185         <sect3 id="zend.view.scripts.templates.interface">
186             <title>Zend_View_Interface を使用したテンプレート</title>
188             <para>
189                 <classname>Zend_View</classname> 互換のテンプレートエンジンを使用するほうが簡単だという人もいるでしょう。
190                 <classname>Zend_View_Interface</classname> では、
191                 互換性を保つために最低限必要なインターフェイスを定義しています。
192             </para>
194             <programlisting language="php"><![CDATA[
196  * テンプレートエンジンオブジェクトを返します
197  */
198 public function getEngine();
201  * ビュースクリプト/テンプレートへのパスを設定します
202  */
203 public function setScriptPath($path);
206  * すべてのビューリソースへのベースパスを設定します
207  */
208 public function setBasePath($path, $prefix = 'Zend_View');
211  * ビューリソースへのベースパスを追加します
212  */
213 public function addBasePath($path, $prefix = 'Zend_View');
216  * 現在のスクリプトのパスを取得します
217  */
218 public function getScriptPaths();
221  * テンプレート変数をオブジェクトのプロパティとして代入するためのオーバーロードメソッド
222  */
223 public function __set($key, $value);
224 public function __isset($key);
225 public function __unset($key);
228  * テンプレート変数を手動で代入したり、複数の変数を
229  * 一括設定したりします
230  */
231 public function assign($spec, $value = null);
234  * 代入済みのテンプレート変数を削除します
235  */
236 public function clearVars();
239  * $name というテンプレートをレンダリングします
240  */
241 public function render($name);
242 ]]></programlisting>
244             <para>
245                 このインターフェイスを使用すると、
246                 サードパーティのテンプレートエンジンをラップして
247                 <classname>Zend_View</classname> 互換のクラスを作成することが簡単になります。
248                 例として、Smarty 用のラッパーはこのようになります。
249             </para>
251             <programlisting language="php"><![CDATA[
252 class Zend_View_Smarty implements Zend_View_Interface
254     /**
255      * Smarty object
256      * @var Smarty
257      */
258     protected $_smarty;
260     /**
261      * コンストラクタ
262      *
263      * @param string $tmplPath
264      * @param array $extraParams
265      * @return void
266      */
267     public function __construct($tmplPath = null, $extraParams = array())
268     {
269         $this->_smarty = new Smarty;
271         if (null !== $tmplPath) {
272             $this->setScriptPath($tmplPath);
273         }
275         foreach ($extraParams as $key => $value) {
276             $this->_smarty->$key = $value;
277         }
278     }
280     /**
281      * テンプレートエンジンオブジェクトを返します
282      *
283      * @return Smarty
284      */
285     public function getEngine()
286     {
287         return $this->_smarty;
288     }
290     /**
291      * テンプレートへのパスを設定します
292      *
293      * @param string $path パスとして設定するディレクトリ
294      * @return void
295      */
296     public function setScriptPath($path)
297     {
298         if (is_readable($path)) {
299             $this->_smarty->template_dir = $path;
300             return;
301         }
303         throw new Exception('無効なパスが指定されました');
304     }
306     /**
307      * 現在のテンプレートディレクトリを取得します
308      *
309      * @return string
310      */
311     public function getScriptPaths()
312     {
313         return array($this->_smarty->template_dir);
314     }
316     /**
317      * setScriptPath へのエイリアス
318      *
319      * @param string $path
320      * @param string $prefix Unused
321      * @return void
322      */
323     public function setBasePath($path, $prefix = 'Zend_View')
324     {
325         return $this->setScriptPath($path);
326     }
328     /**
329      * setScriptPath へのエイリアス
330      *
331      * @param string $path
332      * @param string $prefix Unused
333      * @return void
334      */
335     public function addBasePath($path, $prefix = 'Zend_View')
336     {
337         return $this->setScriptPath($path);
338     }
340     /**
341      * 変数をテンプレートに代入します
342      *
343      * @param string $key 変数名
344      * @param mixed $val 変数の値
345      * @return void
346      */
347     public function __set($key, $val)
348     {
349         $this->_smarty->assign($key, $val);
350     }
352     /**
353      * empty() や isset() のテストが動作するようにします
354      *
355      * @param string $key
356      * @return boolean
357      */
358     public function __isset($key)
359     {
360         return (null !== $this->_smarty->get_template_vars($key));
361     }
363     /**
364      * オブジェクトのプロパティに対して unset() が動作するようにします
365      *
366      * @param string $key
367      * @return void
368      */
369     public function __unset($key)
370     {
371         $this->_smarty->clear_assign($key);
372     }
374     /**
375      * 変数をテンプレートに代入します
376      *
377      * 指定したキーを指定した値に設定します。あるいは、
378      * キー => 値 形式の配列で一括設定します
379      *
380      * @see __set()
381      * @param string|array $spec 使用する代入方式 (キー、あるいは キー => 値 の配列)
382      * @param mixed $value (オプション) 名前を指定して代入する場合は、ここで値を指定します
383      * @return void
384      */
385     public function assign($spec, $value = null)
386     {
387         if (is_array($spec)) {
388             $this->_smarty->assign($spec);
389             return;
390         }
392         $this->_smarty->assign($spec, $value);
393     }
395     /**
396      * 代入済みのすべての変数を削除します
397      *
398      * Zend_View に {@link assign()} やプロパティ
399      * ({@link __get()}/{@link __set()}) で代入された変数をすべて削除します
400      *
401      * @return void
402      */
403     public function clearVars()
404     {
405         $this->_smarty->clear_all_assign();
406     }
408     /**
409      * テンプレートを処理し、結果を出力します
410      *
411      * @param string $name 処理するテンプレート
412      * @return string 出力結果
413      */
414     public function render($name)
415     {
416         return $this->_smarty->fetch($name);
417     }
419 ]]></programlisting>
421             <para>
422                 この例では、<classname>Zend_View</classname> ではなく
423                 <classname>Zend_View_Smarty</classname> クラスのインスタンスを作成し、
424                 それを使用して <classname>Zend_View</classname> と同じようなことをしています。
425             </para>
427             <programlisting language="php"><![CDATA[
428 //例 1. InitializerのinitView()で
429 $view = new Zend_View_Smarty('/path/to/templates');
430 $viewRenderer =
431     Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
432 $viewRenderer->setView($view)
433              ->setViewBasePathSpec($view->_smarty->template_dir)
434              ->setViewScriptPathSpec(':controller/:action.:suffix')
435              ->setViewScriptPathNoControllerSpec(':action.:suffix')
436              ->setViewSuffix('tpl');
438 //例 2. アクションコントローラでも同様に...
439 class FooController extends Zend_Controller_Action
441     public function barAction()
442     {
443         $this->view->book   = 'Zend PHP 5 Certification Study Guide';
444         $this->view->author = 'Davey Shafik and Ben Ramsey'
445     }
448 //例 3. アクションコントローラでのビューの初期化
449 class FooController extends Zend_Controller_Action
451     public function init()
452     {
453         $this->view   = new Zend_View_Smarty('/path/to/templates');
454         $viewRenderer = $this->_helper->getHelper('viewRenderer');
455         $viewRenderer->setView($this->view)
456                      ->setViewBasePathSpec($view->_smarty->template_dir)
457                      ->setViewScriptPathSpec(':controller/:action.:suffix')
458                      ->setViewScriptPathNoControllerSpec(':action.:suffix')
459                      ->setViewSuffix('tpl');
460     }
462 ]]></programlisting>
463         </sect3>
464     </sect2>
465 </sect1>
466 <!--
467 vim:se ts=4 sw=4 et: