シングルページコントローラーからカスタムビューを表示する
簡易な方法
シングルページコントローラーによって異なるビューを表示する簡単な方法は、何もしないことです。その代わり、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() を呼び出すこともできます。現在のコントローラーメソッドの実行は中断され、コントローラーとビューは指定されたパスのものに置き換わります。