シングルページコントローラーからカスタムビューを表示する

簡易な方法

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

原文:Rendering Custom Views from a Single Page Controller