関数 page() の引数にページIDを使う方法
baserCMSには、特定ページのコンテンツをエレメントとして読み込む page() という関数があります。「サイドバーの表示内容を管理画面で編集できるようにしておきたいけど、わざわざウィジェットを定義するのもなー」というようなとき、その内容を固定ページとして保持する使い道が考えられますね。編集画面の「公開状態」欄にある「サイト内検索の検索結果より除外する」にチェックを入れればバッチリでしょう。
ところでこの関数には、ちょっとした不便さがあったりします。
それは、エレメントの呼び出しがページ名(URL)でしか指定できないという点です。ページ名は任意で設定できるため、何らかの事情でページ名が変わることを想定するとページIDでも指定できた方がよいのかもしれません。
……というような書き込みを公式フォーラムで見かけたので、ページIDでエレメントを呼び出す方法を試してみました。
特定のページの内容をテーマやウィジェットに表示する|フォーラム|baserCMSユーザーズ
<?php $MyPageClass = ClassRegistry::init('Page'); $options = array( 'conditions' => am( array( 'Page.id' => {id} // {id} はページID ), $MyPageClass->getConditionAllowPublish() ), 'fields' => 'url', 'recursive' => -1 ); $myPage = $MyPageClass->find('first', $options); $this->BcBaser->page($myPage['Page']['url']); ?>
固定ページのデータをまるっと格納した $MyPageClass に対して
- ページIDが {id} で('Page.id' => {id})
- 記事が公開されているか($MyPageClass->getConditionAlllowPublish())をチェックして
- urlを取得して('fields' => 'url')
- $this->BcBaser->page() の引数として渡す
という処理を行っています。私の環境ではうまくいきましたが、もしうまくいかないようでしたら @tecking までお知らせください。一緒に格闘していきましょう :)
複数箇所で使い回しするようなら、オレオレヘルパー化してしまってもいいでしょうね。
<?php /* * $this->BcBaser->page() をページID指定で呼び出すヘルパー * * [使い方] * 1. /app/View/Helper 内 または * /app/webroot/theme/{使用中のテーマ}/Helper 内に * FooHelper.php として保存 * 2. テーマ内で $this->Foo->pageById({id}) {id} はページID * * Foo を別の名前にする場合、class 名も同様に書き換える * */ class FooHelper extends AppHelper { public $helpers = array('BcBaser'); public function pageById($id = null, $params = array(), $options = array()) { if (empty($id)) { return; } $PageClass = ClassRegistry::init('Page'); $options = array( 'conditions' => am( array( 'Page.id' => $id ), $PageClass->getConditionAllowPublish() ), 'fields' => 'url', 'recursive' => -1 ); $page = $PageClass->find('first', $options); if (!empty($page)) { $this->BcBaser->page($page['Page']['url'], $params, $options); } } }
ちなみに page() 関数、バージョン2系のときはページIDで指定できてたんですが、3.0リリースに伴ってURL指定になっちゃったんですよね。上記のコード例では 2.1.2 時代のコードを一部参考にしています。
basercms/bc_baser.php at basercms-2.1.2 · baserproject/basercms