baserCMS4系でフォームの受信一覧表示をカスタマイズする

どうもです・ω・
昨年の baserCMS Advent Calendar 2018に続き、今年もbaserCMS Advent Calendar 2019が始まってます。
さてその10日担当です。=[ 'ω' ] トウフー

baserCMS4のご紹介

baserCMSとは、CMSです。
世の中には、WordpressとかMovableTypeとかSHIRASAGIとかWordpress(2回目)とか、いろんなCMSがありまして、その中で、PHPのフレームワークであるCakePHPを用いてできてるCMSです。

baserCMS(ベーサーシーエムエス)とは、Webサイト制作プラットフォームとして最適な国産CMSです。

です。
baserCMS - 国産オープンソース!フリー(無料)でコンテンツ管理に強いCMS

プラグインとかテーマの配布・販売やってます。
baserマーケット

導入事例いっぱいあります。着々と増加中です。
baserCMS導入事例 | baser CMS』

この記事で紹介すること

この記事では、baserCMSを利用する中で良く使う、イベント処理+メールフォームの受信一覧について紹介します。
どちらかと言えば開発者さん向けの記事です。

管理側の受信メール一覧表示をカスタマイズする

baserCMSでは、メールフォームを超簡単に複数作成できる機能があって、その受信データ一覧画面も、各フォーム毎に表示することができます。
その受信データの表示を、ある特定の条件にそった内容だけ表示するようにしてみます。
CSVダウンロード機能で落ちてくるCSVの内容も、特定の条件に絞った内容にできます。

お問い合わせ|受信メール一覧|お問い合わせ_管理|コンテンツ一覧|baserCMS_inc_

せっかくなのでプラグイン形式で作ってみて、簡単に動作をON/OFFできるようにしてみます。
できるようになることはこんな感じです。

  • ユーザーIDが2のユーザでログインし、受信一覧画面を開いた場合、メールフィールドとして name_1 フィールド(例えば名前)が存在しているとき、受信データ内の name_1 フィールに「ほげ」と入ってるデータのみを一覧表示できる
  • ユーザーIDが2のユーザでログインし、受信一覧画面からダウンロードするCSVデータが、受信データ内の name_1 フィールドに「ほげ」と入ってるデータのみとなる

ファイルを作る

以下の内容でファイルを作ります。

  • /app/Plugin/CustomMailMessage/Event/CustomMailMessageModelEventListener.php
<?php
/**
 * [ModelEventListener] CustomMailMessage
 */
class CustomMailMessageModelEventListener extends BcModelEventListener {
	/**
	 * 登録イベント
	 *
	 * @var array
	 */
	public $events = [
		'MailMessage.beforeFind',
		'Mail.MailMessage.beforeFind',
	];

	/**
	 * mailMessageBeforeFind
	 * - 管理側受信一覧画面の受信一覧を指定条件で絞り込んで表示する
	 *
	 * @param CakeEvent $event
	 */
	public function mailMessageBeforeFind (CakeEvent $event) {
		if (!BcUtil::isAdminSystem()) {
			return;
		}

		$user = BcUtil::loginUser();
		if (in_array($user['id'], ['2'])) {
			$Model = $event->subject();
			// 存在しないフィールドを検索条件に指定することで起こるエラーを防止するため
			if ($Model->hasField('name_1')) {
				if (empty($event->data[0]['conditions'])) {
					$conditions = [];
				} else {
					$conditions = $event->data[0]['conditions'];
				}
				$event->data[0]['conditions'] = Hash::merge($conditions, [$Model->alias . '.name_1' => 'ほげ']);
			}
		}
	}

	/**
	 * mailMailMessageBeforeFind
	 * - 管理側受信一覧CSVを指定条件で絞り込んでダウンロードする
	 *
	 * @param CakeEvent $event
	 */
	public function mailMailMessageBeforeFind (CakeEvent $event) {
		if (!BcUtil::isAdminSystem()) {
			return;
		}

		$user = BcUtil::loginUser();
		if (in_array($user['id'], ['2'])) {
			$Model = $event->subject();
			// 存在しないフィールドを検索条件に指定することで起こるエラーを防止するため
			if ($Model->hasField('name_1')) {
				if (empty($event->data[0]['conditions'])) {
					$conditions = [];
				} else {
					$conditions = $event->data[0]['conditions'];
				}
				$event->data[0]['conditions'] = Hash::merge($conditions, [$Model->alias . '.name_1' => 'ほげ']);
			}
		}
	}

}


。。。。。終わり。
なんとたったの1ファイルで終わっちゃいました。
あとは管理側のプラグイン一覧画面から CustomMailMessage プラグインを有効化するだけです。

動作について説明

何をしてるのかを少し説明。
受信一覧表示とCSVダウンロード側でのやってる内容はほぼ同じですが、2つに分けているのには理由があります。

MailMessageモデルのbeforeFindに対して差し込んでいるイベント処理ですが、CSVダウンロードのときは、イベント名が「MailMessage.beforeFind」では引っかかりません。
これはなんでかなぁ?と探っていたのですが、CSVダウンロードの処理時は、モデルのエイリアス名が受信テーブル名となっていたので、モデルイベントに引っかからないようです。
(例: テーブル名が mysite_mail_message_1 のときは、モデルエイリアス名は mailMessage1 となる)
管理側の受信一覧表示のときは、反対にイベント名が「Mail.MailMessage.beforeFind」で引っ掛けることができませんでした。

なので、
管理側受信一覧表示のとき: MailMessage.beforeFind で、
管理側受信一覧CSVダウンロードのとき: Mail.MailMessage.beforeFind
と分ける形になってます。

他ポイントとしては以下です。
・BcUtil::isAdminSystem() で管理側のアクセスであることを判定
・BcUtil::loginUser() でログイン中のユーザ情報を取得
・$Model->hasField('name_1') でテーブル内のフィールドの存在チェック
・$event->data[0]['conditions'] でデータの検索条件を指定

最後に。。。

baserCMSでは、このように簡単にプラグインを作ることができます。
サンプルのプラグインの内容はあくまで例ですので、他にもログインしているユーザグループでの判定や、複数フィールドに対する検索条件の指定等を、目的に応じていろいろできると思います。

ではでは、baserCMSで楽しい開発ライフを送りましょう。

▲ to Top

▲ to Top