concrete5 でページテンプレートからブロックテンプレートに値を受け渡す

#

コンクリートファイブジャパン 菱川です。

今日は concrete5 の技術ネタです。

テーマのページテンプレートから、ブロックのテンプレートに値を受け渡す方法を調べてみました。用途としては、今回ご紹介するサンプルコードのように、エリア内のブロックに連番を振りたい場合などがあるかと思います。それでは、早速サンプルコードです。

まず、ページテンプレートから、ブロックのインスタンスのプロパティに値を設定します。

/**
 * 現在のページのインスタンスを取得します
 * @var \Concrete\Core\Page\Page $c
 */
$c = Page::getCurrentPage();

/**
 * Main エリアのインスタンスを作成します
 * @var \Concrete\Core\Area\Area $a
 */
$a = new Area('Main');

/**
 * ページを指定して、Main エリア内のブロックを取得します
 */
$blocks = $a->getAreaBlocksArray($c);

/** @var \Concrete\Core\Block\Block $b */
foreach ($blocks as $i => $b) {
    // ブロックインスタンスに新たなプロパティ値を設定します
    $b->blockAreaPosition = $i;
}

/**
 * 改変したブロックインスタンスを使ってエリアをレンダリングします
 */
$a->display($c, $blocks);

ここで、ブロックコントローラーインスタンスを使用していないのがポイントです。ブロックコントローラーは、ブロックキャッシュを使わないブロックの場合、都度クリアされてしまいインスタンスが保持されません。

// うまく動かない例
foreach ($blocks as $i => $b) {
    $b->getInstance()->blockAreaPosition = $i;
}

では、ブロックテンプレートからブロックインスタンスに設定した値を取り出しましょう。ブロックの view.php またはカスタムテンプレートで、次のように記述します。

/** @var \Concrete\Core\Block\BlockController $controller */
$pos = $controller->getBlockObject()->blockAreaPosition;

このように、concrete5 ではブロックを表示する際に、個々のブロックインスタンスに該当する Block クラスと、BlockController クラス、BlockView クラスが連携して動いていますので、値の受け渡しには一工夫が必要です。


コメント欄を読み込み中