どうもです・ω・
昨年の 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の内容も、特定の条件に絞った内容にできます。
せっかくなのでプラグイン形式で作ってみて、簡単に動作を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で楽しい開発ライフを送りましょう。