Help us understand the problem. What is going on with this article?

[baserCMS]プラグインを用意せずにイベント処理を発動させる方法例

More than 3 years have passed since last update.

baserCMS(CakePHP)には、プラグイン側から、処理途中に別の処理を割り込ませるイベント処理を手軽に作って利用することができます。
そのイベント処理ですが、たまーにプラグインを作るまでもなく実行したい場面があります。
そんなときの方法をシェア。

環境

  • baserCMS 3.0.6.1
  • PHP 5.4.19

イベント処理の作成

イベント処理自体がないのに、先にイベントを呼び出そうとするともちろんエラーになります。
そのため、先ずは先に利用したい処理を作成しておきます。

とりあえず startup() とか作って、適当な文字列をエコーさせておくとかのテスト書いて、処理が通ることから確認すると良いです。

ここでは以下にサンプル例載せておきます。
ブログコンテンツIDが1のカテゴリアーカイブを表示し、そのカテゴリ名が info の場合は、1ページの表示件数を強制的に1,000件にしてみました。
というサンプルです。

/app/Event/HogeControllerEventListener.php
<?php
/**
 * [ControllerEventListener]
 *
 */
class HogeControllerEventListener extends BcControllerEventListener {
/**
 * 登録イベント
 *
 * @var array
 */
    public $events = array(
        'Blog.Blog.startup',
    );

/**
 * blogBlogStartup
 * ブログのカテゴリアーカイブ表示の際、指定カテゴリではページ分割を無効化する
 * 
 * @param CakeEvent $event
 */
    public function blogBlogStartup(CakeEvent $event) {
        // 管理側では無効
        if (BcUtil::isAdminSystem()) {
            return;
        }

        $Controller = $event->subject();
        // 対象とするブログコンテンツID以外では無効
        if (!in_array(Hash::get($Controller->blogContent, 'BlogContent.id'), array('1'))) {
            return;
        }
        // archives アクション以外では無効
        if (!in_array(Hash::get($Controller->request->params, 'action'), array('archives'))) {
            return;
        }
        // カテゴリに属する記事一覧表示画面以外では無効
        if (!in_array(Hash::get($Controller->request->params, 'pass.0'), array('category'))) {
            return;
        }
        // ブログカテゴリが info の場合に表示件数を切替える
        if (Hash::get($Controller->request->params, 'pass.1') == 'info') {
            $Controller->blogContent['BlogContent']['list_count'] = 1000;
        }
    }

}

イベント処理の追加

イベントが発動できるように、処理したいイベントリスナーをアタッチ(取り付け)します。
記述箇所は「/app/Config/bootstrap.php」が良さそうです。
「Attach Events」以下が追記した内容。

/app/Config/bootstrap.php
<?php
// Attach Events
App::uses('HogeControllerEventListener', 'Event');
App::uses('CakeEventManager', 'Event');
CakeEventManager::instance()->attach(new HogeControllerEventListener());

参考記事

materializing
Cakeをもぐもぐ。。。 https://github.com/materializing
http://www.materializing.net/
e-catchup
国産オープンソース baserCMS を世に送り出したWeb技術のプロフェッショナル集団です。
https://catchup.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away