コントローラーとビュー間のデータの受け渡し
シングルページとコントローラーの間で、コントローラーからビューにデータを受け渡したいことがあると思いますが、 $this->set('key', $value); を使うことで簡単に実現可能です。
サンプル
media ページで写真アルバムの一覧を表示したいとします。そして、PHPクラス Foo\Media\Album を使ってアルバムオブジェクトの一覧を取得し、media ページで表示したいとします。
http://www.yoursite.com/media/
コントローラーは次のようになります。
namespace Application\Controller\SinglePage;
use Concrete\Core\Page\Controller\PageController;
class Media extends PageController
{
public function view()
{
$list = \Foo\Media\Album::getList();
$this->set('albums', $list);
}
}
これだけです。テンプレートファイル application/single_pages/media/view.php 内の set() メソッドの最初の引数で指定した、ローカル変数 $albums としてアクセスできるようになります。
それでは、 view.php ファイルを見てみましょう。アルバムのメソッドにアクセスしている例です。
<ul> <?php foreach($albums as $album) { ?> <li><a href="<?=URL::to('/media', 'view_album', $album->getAlbumID())?>"><?=$album->getAlbumName()?></a></li> <? } ?> </ul>
ここで何が起きているかをもう少し詳しく見てみましょう。配列内のアルバムのそれぞれのエントリーでリンクを表示しています。リンクは次の3つのパートに分かれています。
- リンクされたシングルページのパス
- シングルページコントローラーで実行したいメソッド
- そのメソッドに渡したいパラメーター。メソッドでは、渡されたパラメーターの数と対応する引数が宣言されている必要があります。渡すパラメーターの数は、カンマ区切りによってさらに追加することもできます。
これらのリンクをクリックすると、URLは次のようになるはずです。
http://www.yoursite.com/media/view_album/4
コントローラーに view_album() メソッドがなかったり、パラメーターの指定がなかった場合、結果は404になります。
public function view_album($albumID = null)
{
$selectedAlbum = \Foo\Media\Album::getByID($albumID);
$this->set('albumID', $albumID);
$this->set('album', $selectedAlbum);
}
このコードによって、$albumID と $album 変数は、ページのビューテンプレートで利用可能になります。次のページでは、view メソッドではなく view_album メソッドでページを表示する際にどうやって違う表示をレンダリングするのかを解説します。
現在のページに送信するには Controller::action
もし現在のページの特定のメソッドを実行したい場合は、URL::to メソッドでわざわざシングルページのパスw−指定する必要はありません。$controller の action() メソッドを使って指定することで、自動的に判別されます。次のコードは、現在のページのコントローラーの "submit()" メソッドにデータを送る例です。
<form method="post" action="<?=$controller->action('submit')?>"> </form>