シングルページコントローラーからカスタムビューを表示する
簡易な方法
シングルページコントローラーによって異なるビューを表示する簡単な方法は、何もしないことです。その代わり、if文やswitch文を使って、アクティブなコントローラーメソッドによって分岐する必要があります。このコードが application/single_pages/media/view.php にあるとした場合のサンプルです。
<?php
if ($view->controller->getTask() == 'view_album') { ?>
<?php t('The selected album is %s', $albumID);?>
<?php } else { ?>
<ul>
<?php
foreach($albums as $album) { ?>
<li><a href="<?=URL::to('/media', 'view_album', $album->getAlbumID())?>"><?=$album->getAlbumName()?></a></li>
<? } ?>
</ul>
<?php } ?>
アクティブなコントローラーメソッドが view_album の場合は、上半分が実行されます。そうでない場合は、下半分の一覧が表示されます。
よりエレガントな方法
if文の代わりに、"view_album" タスク用に完全に分離したビューテンプレートを作成する方法があります。 single_pages/media/albums.php ファイルを作成し、コントローラーの view_album() メソッドの最後で render() を使って、新しく作成した albums.php を表示テンプレートとして使うように宣言しています。
public function view_album($albumID = null)
{
$selectedAlbum = \Foo\Media\Album::getByID($albumID);
$this->set('albumID', $albumID);
$this->set('album', $selectedAlbum);
$this->render('/media/albums');
}
albums はインストールされたシングルページではないことが重要です。
重要な注意:この機能は concrete5 5.7.4 以降でのみ有効です。
Replace vs. Render
上のサンプルでは、シングルページのビューが view.php から albums.php に変更されました。コントローラーの view_album() メソッドでセットされた値は残りますし、コントローラーの on_before_render() メソッドも実行されます。テンプレートのみが変更されます。
render() の代わりに replace() を呼び出すこともできます。現在のコントローラーメソッドの実行は中断され、コントローラーとビューは指定されたパスのものに置き換わります。