ユーザ登録時や退会時にメールで連絡するようにしているのですが、それぞれの処理内に「Yiiでメール周りの設定をする」で書いたようなスクリプトを書くのは見通しが悪そうなので、メール配送部分はイベント経由で行うことにしました。
手順としては
- イベントクラスを作成する
- イベントを定義する
- ハンドラを作成する
- イベントを組み込む
という感じです。
イベントクラスを作成する
ユーザ登録時のイベントクラスとしてUserAddEventクラスを protected/components/UserAddEvent.phpに作成します。
<?php
class UserAddEvent extends CModelEvent
{
public $user;
}イベントを定義する
ユーザ登録時に利用しているUserモデル内のaddUser関数にイベントに関する処理を追加します。
public function addUser()
{
//ユーザ登録に関する処理があります。
//UserAddEventクラスのインスタンスを作成
$event=new UserAddEvent($this);
$event->user=$this;
//トリガ
$this->onUserAdd($event);
return $event->isValid;
}
//onUserAddイベントの定義
public function onUserAdd($event)
{
$this->raiseEvent('onUserAdd',$event);
}ハンドラを作成する
ハンドラとしてNotifierクラスをprotected/components/Notifier.phpに用意します。
<?php
class Notifier
{
private function sendMail($to,$view,$vars=array(),$subject=null,$replyto=null,$cc=null,$from=null,$fromname=null,$layout=null)
{
$charset='iso-2022-jp';
$encoding='7bit';
mb_language('Japanese');
mb_internal_encoding('UTF-8');
$layout=empty($layout) ? 'main' : $layout;
$from=empty($from) ? Yii::app()->params['adminEmail'] : $from;
$fromname=empty($fromname) ? Yii::app()->params['adminName'] : $fromname;
$replyto=empty($replyto) ? $from : $replyto;
$mailer = Yii::createComponent('application.extensions.mailer.EMailer');
$mailer->CharSet = $charset;
$mailer->Encoding = $encoding;
$mailer->addAddress($to);
if(!empty($cc))
$mailer->addCC($cc);
$mailer->From=$from;
$fromname=mb_convert_encoding($fromname,$charset,mb_internal_encoding());
$mailer->FromName=mb_encode_mimeheader($fromname);
$mailer->addReplyTo($replyto);
$request=Yii::app()->getRequest();
$vars=array_merge($vars,array(
'sitename'=>Yii::app()->name,
'siteurl'=>Yii::app()->createAbsoluteUrl('/'),
'ip'=>$request->getUserHostAddress(),
'ua'=>$request->getUserAgent(),
'refer'=>$request->getUrlReferrer(),
));
$mailer->getView($view,$vars,$layout);
$subject=empty($subject) ? $mailer->Subject : $subject;
$subject=mb_convert_encoding($subject,$charset,mb_internal_encoding());
$mailer->Subject=mb_encode_mimeheader($subject);
$mailer->Body=mb_convert_encoding($mailer->Body,$charset,mb_internal_encoding());
$mailer->send();
}
public function userAdd($event)
{
$this->sendMail($event->user->email, 'userAdd', array(
'email'=>$event->user->email,
));
}
}sendMail関数は、「Yiiでメール周りの設定をする」のメール配信部分を少し修正したものです。
userAdd関数がonUserAddの際に呼び出されるハンドラです。
イベントを組み込む
ユーザ登録を処理しているUserコントローラのcreateアクションにイベントの設定を行います。
public function actionCreate()
{
$model=new User('create');
if(isset($_POST['User']))
{
$model->attributes=$_POST['User'];
if($model->validate())
{
//ハンドラを設定する
$notifier=new Notifier();
$model->onUserAdd=array($notifier, 'userAdd');
$model->addUser();
Yii::app()->user->setFlash('success','登録完了。');
$this->refresh();
}
}
$this->render('create',array(
'model'=>$model,
));
}以上で、ユーザ登録あった際は、ユーザに登録完了メールが配送されるようになります。
1件のコメント
コメントは受け付けていません。