forked from NEKOGET/FuelPHP_docs_jp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
presenters.html
231 lines (178 loc) · 10.9 KB
/
presenters.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="./../assets/css/combined.css">
<link rel="shortcut icon" href="./../favicon.ico" />
<script src="http://www.google.com/jsapi" type="text/javascript"></script>
<script type="text/javascript">
var path = './../';
</script>
<script src="./../assets/js/combined.js"></script>
<title>プレゼンタ - 概要 - FuelPHP ドキュメント</title>
</head>
<body>
<div id="container">
<header id="header">
<div class="table">
<h1>
<a href="http://fuelphp.com"><img height="37px" width="147px" src="./../assets/img/fuel.png" /></a>
<strong>Documentation</strong>
</h1>
<form id="google_search">
<p>
<span id="search_clear"> </span>
<input type="submit" name="search_submit" id="search_submit" value="検索" />
<input type="text" value="" id="search_input" name="search_input" />
</p>
</form>
</div>
<nav>
<div class="clear"></div>
</nav>
<a href="#" id="toc_handle">目次</a>
<div class="clear"></div>
</header>
<div id="cse">
<div id="cse_point"></div>
<div id="cse_content"></div>
</div>
<div id="main">
<article>
<h2>プレゼンタ</h2>
<h3 id="what_is_a_presenter">プレゼンタとは?</h3>
<p>プレゼンタはビューの生成に必要なロジックを含むクラスです。
コントローラがユーザ入力を処理し、必要なアクションを処理すると、
プレゼンタにビューに必要なデータを取得するように処理を引き継ぎます。
プレゼンタはデータの操作を一切すべきではありませんが、データベースの呼び出しや他のデータの取得、
ビューの生成に必要な準備の操作を含めます。</p>
<p class="note">プレゼンタはオプションです。必要ない場合は、<a href="views.html">ビュー</a> を直接使用し、表示の前処理のロジックをコントローラに含めることができます。</p>
<h3 id="creating_presenters">プレゼンタの作成</h3>
<p>最初は <code>APPPATH/classes/presenter/index.php</code> で、空のプレゼンタを作成します:</p>
<pre><code>class Presenter_Index extends Presenter
{
}</code></pre>
<p>そして、<code>app/views/index.php</code> に対応するビューを作成します:</p>
<pre><code><h1><?php echo $title; ?></h1>
<ul>
<?php
foreach ($articles as $a)
{
echo '<li>'.$a->title.'</li>';
}
?>
</ul></code></pre>
<p class="note"><strong>ビューの名前</strong><br />
プレゼンタとそのビューはデフォルトでは同じ名前を共有します。
プレゼンタ <code>Presenter_Index</code> のビューは <code>app/views/index.php</code> になります。
アンダースコアはクラスと同じように、つまり、ビュー <code>Presenter_Some_Thing</code> は、
<code>app/views/some/thing.php</code> になります。<br />
このデフォルトの動作は、そのビューを使うプレゼンタの中で、静的でない <code>$_view</code> プロパティにプレゼンタの中でビュー名 (サフィックスなしで) 設定するか、プレゼンタの生成時に独自のビュー名を渡すことで
オーバーライトできます。</p>
<p>最後に、プレゼンタをコントローラから生成します:</p>
<pre class="php"><code>$presenter = Presenter::forge('index');</code></pre>
<p>これですべてを設定しました; しかし、まだデータがビューに渡されていません。
<code>$title</code> の文字列と <code>$articles</code> の配列を渡す必要があります。
プレゼンタにこのデータを与える <code>view()</code> メソッドを追加します:</p>
<pre><code>class Presenter_Index extends Presenter
{
public function view()
{
$this->title = 'Testing this Presenter thing';
$this->articles = Model_Articles::find('all');
}
}</code></pre>
<p>これで完了です。</p>
<p class="note">
コードの中でビューとプレゼンタは交換可能です。コントローラのアクションからプレゼンタを返すことも、
テーマのパーシャルとしてプレゼンタをセットし、ページテンプレートのセクションにアサインすることもできます。プレゼンタの基本的な API は
ビューと互換性があります。これは、大きなコードのオーバーホールなしに、
ビューとプレゼンタを簡単に交換することを可能にします。.
</p>
<h3 id="functions">関数をビューに渡す</h3>
<p>プレゼンタからビューに特定の関数を渡すには、匿名関数または <a href="http://www.php.net/manual/functions.anonymous.php">クロージャ</a> を使います:</p>
<pre class="php"><code>// プレゼンタの中
class Presenter_Index extends Presenter
{
public function view()
{
// 値を返すクロージャをセット
$this->somevar = function() { return "somevalue"; };
// これも同様に機能します
$this->set('othervar', function() { return "othervalue"; });
// 引数付きのクロージャには、エンコーディングを避けるために set_safe を使います
$this->set_safe('echo_upper', function($string) { echo strtoupper($string); });
}
}
// presenter view の中で使える:
echo $somevar, $othervar; // 出力: "somevalue" "othervalue"
$echo_upper('this string'); // 出力: "THIS STRING"</code></pre>
<p class="note">
クロージャはフィルタリングに関して値と同様に扱われます。
値を返すクロージャの場合、<code>set()</code> メソッドを使えば、
その値はフィルタリングの設定に従ってエンコードされます。
もし、上記の例のような修飾子の場合や、
返される値がエンコードされるべきでないクロージャの場合は、 <code>set_safe()</code> メソッドを使うか、
<code>set()</code> メソッドの第 3 引数に <code>false</code> を指定して下さい。
</p>
<p>
クロージャがフィルタされないことを期待しているレガシーアプリケーションでは、
アプリケーションの設定ファイル <strong>config.php</strong> を編集し、次のキーを追加します:
</p>
<pre class="php"><code>/**
* クロージャをフィルタするかどうか
*/
'filter_closures' => false,</code></pre>
</article>
<article>
<h3 id="security">セキュリティ</h3>
<p>ビューと同じように動作します。プレゼンタでセットされたものはすべて、オフにしない限り、出力エンコードされます。
ビューで使うのと同じようにプレゼンタでも <code>set($name, $value, $encode)</code> メソッドが使えます。
詳細は、
<a href="views.html#security">ビューのセキュリティのセクション</a> にあります。</p>
</article>
<article>
<h3 id="advanced">高度な使い方</h3>
<h4 id="more_methods">他のメソッド</h4>
<p>同じビューを解析する別の方法がある場合は、デフォルトの <code>view()</code> メソッド以外に複数のメソッドをプレゼンタに追加することができます。
そうするためには、第 2 パラメータにメソッド名を指定した
<code>Presenter::forge()</code> メソッドを追加します:</p>
<pre class="php"><code>// 上記の例からプレゼンタ上の other_method() メソッドを呼ぶ
$presenter = Presenter::forge('index', 'other_method');</code></pre>
<h4 id="before_after">before と after メソッド</h4>
<p>いくつかのデータをプレゼンタのすべてのメソッドで使う必要がある場合、<code>before()</code>
または <code>after()</code> メソッドをコントローラと同様に追加します。</p>
<h4 id="changing_view">ビューの変更</h4>
<p>デフォルトでは <code>$this->_view</code> にビューオブジェクトがアサインされます。
プレゼンタに独自の <code>set_view()</code> メソッドを作成し、
<code>$this->_view</code> にオブジェクトをセットすることで置き換えることができます。<br />
しかし、そのオブジェクトはプロパティを設定でき (テンプレートのデータとして使われます)、解析されたコンテンツをレンダリングし返す
<code>__toString()</code> マジックメソッドを持たなくてはなりません。
言い換えると、View クラスの振る舞いとの互換性が必要です。<br />
ビューの名前は <code>$this->_view</code> プロパティから取得できます。</p>
<h4 id="alternative_view">別のビューファイル、または既存のビューオブジェクトを使う</h4>
<p>forge() メソッドの第 4 引数を指定すると、プレゼンタのインスタンスに対して別のビューを使い、
どのビューを読み込むかを決定する自動機構を使わないように指示することもできます:</p>
<pre class="php"><code>// 'index' ビューの代わりに 'other/index' ビューを使う
$presenter = Presenter::forge('index', 'other_method', null, 'other/index');
// ビューオブジェクトを直接渡すこともできる
$view = View::forge('other/index');
$presenter = Presenter::forge('index', 'other_method', null, $view);</code></pre>
<h4 id="access_to_view">ビューへのアクセス</h4>
<p>プレゼンタの外部からビューオブジェクトにアクセスするには、 <code>get_view()</code> メソッドを使用します。</p>
<h4>他の名前空間から、または Presenter_ 接頭辞のつかないプレゼンタを使う</h4>
<p>これらを使用する場合、名前空間を含む、完全なクラス名で <code>forge()</code> を使う必要があります。
その場合、デフォルトの命名規則はしばしば期待したように動作しませんので、
<code>$_view</code> プロパティまたはまたはカスタムビュー名を渡すことが推奨されます。</p>
</article>
</div>
<footer>
<p>
© FuelPHP Development Team 2010-2016 - <a href="http://fuelphp.com">FuelPHP</a> is released under the MIT license.
[ <a href="https://github.com/fuel/docs/commits/1.8/develop/general/presenters.html">原文コミット履歴</a> | <a href="https://github.com/NEKOGET/FuelPHP_docs_jp/commits/1.8/develop_japanese/general/presenters.html">翻訳コミット履歴</a> | <a href="https://github.com/NEKOGET/FuelPHP_docs_jp/blob/1.8/develop_japanese/general/presenters.html">GitHubで修正</a> ]
</p>
</footer>
</div>
</body>
</html>