concrete5のイベント機能

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'));
}

上のように、パッケージのコントローラーに記述します。こうすることで、イベント実行時に処理を追加できました。

記事公開日: 2017年11月06日
#

弊社で無償公開しているconcrete5アドオンRescuework's ... 詳細はこちら

#

アクセシブルなconcrete5テーマflowerを使ってみました。日本... 詳細はこちら

#

レスキューワーク株式会社では、新春お年玉企画として、「con... 詳細はこちら