forked from fuel/docs
-
Notifications
You must be signed in to change notification settings - Fork 118
/
viewmodels.html
178 lines (137 loc) · 7.55 KB
/
viewmodels.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
<!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>
<strong>FuelPHP, a PHP 5.3 Framework</strong>
Documentation
</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>
<p>ビューモデルはオプションです。必要ない場合は、<a href="views.html">ビュー</a> を使用することができます。</p>
<h3 id="what_is_a_viewmodel">ビューモデルとは?</h3>
<p>ビューモデルはビューの生成に必要なロジックを含むクラスです。
コントローラがユーザ入力を処理し、必要なアクションを処理すると、
ビューモデルにビューに必要なデータを取得するように処理を引き継ぎます。
ビューモデルはデータの操作を一切すべきではありませんが、データベースの呼び出しや他のデータの取得、
ビューの生成に必要な準備の操作を含めます。</p>
<h3 id="creating_viewmodels">ビューモデルの作成</h3>
<p>最初は <code>app/classes/view/index.php</code> で、空のビューモデルを作成します:</p>
<pre><code>class View_Index extends ViewModel {}</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>View_Index</code> のビューは <code>app/views/index.php</code> になります。
アンダースコアはクラスと同じように、つまり、ビュー <code>View_Some_Thing</code> は、
<code>app/views/some/thing.php</code> になります。<br />
このデフォルトの動作は、そのビューを使うビューモデルの中で、静的でない <code>$_view</code> プロパティを設定することで、
オーバーライトできます。</p>
<p>最後に、ビューモデルをコントローラから呼び出します:</p>
<pre class="php"><code>ViewModel::forge('index');</code></pre>
<p>これですべてを設定しました; しかし、まだデータがビューに渡されていません。
<code>$title</code> の文字列と <code>$articles</code> の配列を渡す必要があります。
ビューモデルにこのデータを与える <code>view()</code> メソッドを追加します:</p>
<pre><code>class View_Index extends ViewModel
{
public function view()
{
$this->title = 'Testing this ViewModel thing';
$this->articles = Model_Articles::find('all');
}
}</code></pre>
<p>これで完了です。</p>
<h3 id="functions">関数をビューに渡す</h3>
<p>ビューモデルから、特定の関数をビューに渡すには、<a href="http://www.php.net/manual/functions.anonymous.php">クロージャ</a> を使用します。</p>
<pre class="php"><code>// ビューモデルの中
class View_Index extends ViewModel
{
public function view()
{
$this->echo_upper = function($string) { echo strtoupper($string); };
}
}
// ビューの中で使える:
$echo_upper('this string'); // 出力: "THIS STRING"</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>ViewModel::forge()</code> メソッドを追加します:</p>
<pre class="php"><code>// will call other_method() upon the ViewModel from the above example
ViewModel::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> にオブジェクトをセットすることで置き換えることができます。
しかし、そのオブジェクトはプロパティを設定でき (テンプレートのデータとして使われます)、解析されたコンテンツをレンダリングし返す
<code>__toString()</code> マジックメソッドを持たなくてはなりません。
ビューの名前は <code>$this->_view</code> プロパティから取得できます。</p>
<h4>他の名前空間や接頭辞 View_ なしでのビューモデルの使用</h4>
<p>これらを使用する場合、名前空間を含む、完全なクラス名で <code>forge()</code> を使う必要があります。
その場合、デフォルトの命名規則はしばしば期待したように動作しませんので、
<code>$_view</code> プロパティをセットすることが推奨されます。</p>
</article>
</div>
<footer>
<p>
© FuelPHP Development Team 2010-2013 - <a href="http://fuelphp.com">FuelPHP</a> is released under the MIT license.
[ <a href="https://github.com/fuel/docs/commits/1.6/develop/general/viewmodels.html">原文コミット履歴</a> | <a href="https://github.com/NEKOGET/FuelPHP_docs_jp/commits/1.6/develop_japanese/general/viewmodels.html">翻訳コミット履歴</a> | <a href="https://github.com/NEKOGET/FuelPHP_docs_jp/blob/1.6/develop_japanese/general/viewmodels.html">GitHubで修正</a> ]
</p>
</footer>
</div>
</body>
</html>