ビューモデル

ビューモデルはオプションです。必要ない場合は、ビュー を使用することができます。

ビューモデルとは?

ビューモデルはビューの生成に必要なロジックを含むクラスです。 コントローラがユーザ入力を処理し、必要なアクションを処理すると、 ビューモデルにビューに必要なデータを取得するように処理を引き継ぎます。 ビューモデルはデータの操作を一切すべきではありませんが、データベースの呼び出しや他のデータの取得、 ビューの生成に必要な準備の操作を含めます。

ビューモデルの作成

最初は app/classes/view/index.php で、空のビューモデルを作成します:

class View_Index extends ViewModel {}

そして、app/views/index.php でこれが属するビューを作成します:

<h1><?php echo $title; ?></h1>

<ul>
<?php
	foreach ($articles as $a)
	{
		echo '<li>'.$a->title.'</li>';
	}
?>
</ul>

ビューの名前
ビューモデルとそのビューは同じ名前を共有します。 ビューモデル View_Index のビューは app/views/index.php になります。 アンダースコアはクラスと同じように、つまり、ビュー View_Some_Thing は、 app/views/some/thing.php になります。
このデフォルトの動作は、そのビューを使うビューモデルの中で、静的でない $_view プロパティを設定することで、 オーバーライトできます。

最後に、ビューモデルをコントローラから呼び出します:

ViewModel::forge('index');

これですべてを設定しました; しかし、まだデータがビューに渡されていません。 $title の文字列と $articles の配列を渡す必要があります。 ビューモデルにこのデータを与える view() メソッドを追加します:

class View_Index extends ViewModel
{

	public function view()
	{
		$this->title = 'Testing this ViewModel thing';

		$this->articles = Model_Articles::find('all');
	}
}

これで完了です。

関数をビューに渡す

ビューモデルから、特定の関数をビューに渡すには、クロージャ を使用します。

// ビューモデルの中
class View_Index extends ViewModel
{

	public function view()
	{
		$this->echo_upper = function($string) { echo strtoupper($string); };
	}
}

// ビューの中で使える:
$echo_upper('this string'); // 出力: "THIS STRING"

セキュリティ

ビューと同じように動作します。ビューモデルでセットされたものはすべて、オフにしない限り、出力エンコードされます。 ビューで使うのと同じようにビューモデルでも set($name, $value, $encode) メソッドが使えます。 詳細は、 ビューのセキュリティのセクション にあります。

高度な使い方

追加のメソッド

同じビューを解析する別の方法がある場合は、デフォルトの view() メソッド以外に複数のメソッドを追加することができます。 そうするためには、第 2 パラメータにメソッド名を指定した ViewModel::forge() メソッドを追加します:

// 上記の例からビューモデル上の other_method() メソッドを呼ぶ
ViewModel::forge('index', 'other_method');

before と after メソッド

いくつかのデータをビューモデルのすべてのメソッドで使う必要がある場合、before() または after() メソッドをコントローラと同様に追加します。

ビューの変更

デフォルトでは $this->_view にビューオブジェクトがアサインされます。 ビューモデルに独自の set_view() メソッドを作成し、 $this->_view にオブジェクトをセットすることで置き換えることができます。 しかし、そのオブジェクトはプロパティを設定でき (テンプレートのデータとして使われます)、解析されたコンテンツをレンダリングし返す __toString() マジックメソッドを持たなくてはなりません。 ビューの名前は $this->_view プロパティから取得できます。

別のビューファイル、つまり既存のビューオブジェクトを使う

forge() メソッドの第 4 引数を指定すると、ビューモデルのインスタンスに対して別のビューを使い、 どのビューを読み込むかを決定する自動機構を使わないように指示することもできます:

// 'index' ビューの代わりに 'other/index' ビューを使う
ViewModel::forge('index', 'other_method', null, 'other/index');

// ビューオブジェクトを直接渡すこともできる
$view = View::forge('other/index');
ViewModel::forge('index', 'other_method', null, $view);

ビューへのアクセス

ビューモデルの外部からビューオブジェクトにアクセスするには、 get_view() メソッドを使用することができます。

ほかの名前空間から、または View_ 接頭辞のつかないビューモデルを使う

これらを使用する場合、名前空間を含む、完全なクラス名で forge() を使う必要があります。 その場合、デフォルトの命名規則はしばしば期待したように動作しませんので、 $_view プロパティまたはまたはカスタムビュー名を渡す事が推奨されます。