WordPressユーザーのbaserCMS覚え書き


関数 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 に対して

  1. ページIDが {id} で('Page.id' => {id})
  2. 記事が公開されているか($MyPageClass->getConditionAlllowPublish())をチェックして
  3. urlを取得して('fields' => 'url')
  4. $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