concrete5をウェブサービスのベースとして使ったとき、ユーザー登録時に処理を行いたかったので、そのメモです。
イベント機能
concrete5では、システムが何か処理を行ったときに、オリジナルな処理を追加する仕組みがあります。
たとえば、
- ユーザー登録したとき、ページを追加し、そのユーザーをページ所有者にする
- ユーザーがPayPalで支払いしたとき、そのユーザーを特定のグループに追加する
などです。これを実現するのが、イベントと呼ばれる機能です。(このような仕組みは、concrete5以外のCMSでも用意されていることが多いです。たとえばWordPressでは、アクションフックがこれに相当します。)
イベント機能を使うには
イベント機能を使うには、大雑把に以下の手順が必要になります。
- イベントを実行できる場所を探す
- イベント実行時に受け取るデータを調べる
- イベント実行時に実行する処理を記述する
- 実行する処理を登録する
では実際に、「ユーザー登録したとき、ページを追加し、そのユーザーをページ所有者にする」というモデルケースで、どのように行ったかを見てみます。自動見積もりフォーム「マイ見積」のユーザー登録時に、実際に行っているものです。
イベントを実行できる場所を探す
まず、イベントを実行できる場所を探します。concrete5 ではイベント一覧がドキュメントとして用意されているので、ここから探すと楽だと思います。(ただし、最新版のコードにあるイベントで、このページに記載されていないものもあるようです。)
もちろん、コアのソースを読んでいき、Events::dispatchを探す、という方法もあります。
今回はユーザー登録時に処理を行いたいので、ドキュメントから、on_user_add だ、と分かります。
イベント実行時に受け取るデータを調べる
イベント実行時に受け取るデータも、上述のドキュメントに記載されています。on_user_add の場合は、Concrete\Core\User\Event\UserInfoWithPassword と分かります。実際にこのクラスの定義を見てみると、
class UserInfoWithPassword extends UserInfo { ... }
となっているので、UserInfoを継承したクラスだな、と分かります。
イベント実行時に実行する処理を記述する
一番重要な箇所、実行する処理を記述します。
public function addUserPage($ue) { // ユーザー情報を取得する $ui = $ue->getUserInfoObject(); // ユーザーID取得する $uID = $ui->getUserID(); // 新規ページの親ページを決める $parentPage = \Page::getByPath('/estimation'); // 新規ページのページタイプを決める $pageType = \PageType::getByHandle('estimate'); // 新規ページのページテンプレートを決める $pageTemplate = \PageTemplate::getByHandle('Blanc'); // 新規ページの情報を設定する $pageData = array( 'cName' => '見積もりフォームのページ', 'uID' => $uID, 'cDescription' => '説明を入力してください。', 'cvIsApproved' => false, ); // 新規ページを追加する $parentPage->add($pageType, $pageData, $pageTemplate); }
上のようなコードを作成しています。ページ追加に関するドキュメントが用意されていますので、詳細はリンク先をごらんください。
実行する処理を登録する
最後に、この処理をどこで実行するか、を登録します。
// 起動時に実行 public function on_start() { // on_user_addイベントが実行された時に、addUserPageメソッドが実行されるように、登録する Events::addListener('on_user_add',array($this, 'addUserPage')); }
上のように、パッケージのコントローラーに記述します。こうすることで、イベント実行時に処理を追加できました。
マイ見積だけでなく、ユーザー登録型のポータルサイトなどでは役に立つと思います。例えば、
お店ポータルサイトで、ユーザー(お店)登録時に、お店情報ページ、予約ページ、求人ページ、の3ページを追加する、などです。
記事公開日: 2017年11月06日