Browse Source

added mail events before/after send

tags/2.0.0-beta
Mark 11 years ago
parent
commit
c0316a10dd
  1. 11
      framework/yii/base/ActionEvent.php
  2. 5
      framework/yii/base/Event.php
  3. 30
      framework/yii/base/MailEvent.php
  4. 8
      framework/yii/base/ModelEvent.php
  5. 11
      framework/yii/base/ViewEvent.php
  6. 48
      framework/yii/mail/BaseMailer.php

11
framework/yii/base/ActionEvent.php

@ -11,7 +11,10 @@ namespace yii\base;
* ActionEvent represents the event parameter used for an action event.
*
* By setting the [[isValid]] property, one may control whether to continue running the action.
*
* @property boolean $isValid Event handlers of
* [[Controller::EVENT_BEFORE_ACTION]] may set this property to decide whether
* to continue running the current action.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
*/
@ -25,12 +28,6 @@ class ActionEvent extends Event
* @var mixed the action result. Event handlers may modify this property to change the action result.
*/
public $result;
/**
* @var boolean whether to continue running the action. Event handlers of
* [[Controller::EVENT_BEFORE_ACTION]] may set this property to decide whether
* to continue running the current action.
*/
public $isValid = true;
/**
* Constructor.

5
framework/yii/base/Event.php

@ -46,6 +46,11 @@ class Event extends Object
*/
public $data;
/**
* @var boolean whether to continue execution of process or not.
*/
public $isValid = true;
private static $_events = [];
/**

30
framework/yii/base/MailEvent.php

@ -0,0 +1,30 @@
<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace yii\base;
/**
* ActionEvent represents the event parameter used for an action event.
*
* By setting the [[isValid]] property, one may control whether to continue running the action.
*
* @author Mark Jebri <mark.github@yandex.ru>
* @since 2.0
*/
class MailEvent extends Event
{
/**
* @var \yii\mail\MessageInterface mail message being send
*/
public $message;
/**
*
*/
public $isSuccessful;
}

8
framework/yii/base/ModelEvent.php

@ -11,15 +11,11 @@ namespace yii\base;
* ModelEvent class.
*
* ModelEvent represents the parameter needed by model events.
*
* @property boolean $isValid A model is in valid status if it passes validations or certain checks.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
*/
class ModelEvent extends Event
{
/**
* @var boolean whether the model is in valid status. Defaults to true.
* A model is in valid status if it passes validations or certain checks.
*/
public $isValid = true;
}

11
framework/yii/base/ViewEvent.php

@ -10,6 +10,11 @@ namespace yii\base;
/**
* ViewEvent represents events triggered by the [[View]] component.
*
* @property boolean $isValid whether to continue rendering the view file. Event handlers of
*[[View::EVENT_BEFORE_RENDER]] may set this property to decide whether
* to continue rendering the current view file.
*
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
*/
@ -26,12 +31,6 @@ class ViewEvent extends Event
* @var string the view file path that is being rendered by [[View::renderFile()]].
*/
public $viewFile;
/**
* @var boolean whether to continue rendering the view file. Event handlers of
* [[View::EVENT_BEFORE_RENDER]] may set this property to decide whether
* to continue rendering the current view file.
*/
public $isValid = true;
/**
* Constructor.

48
framework/yii/mail/BaseMailer.php

@ -12,6 +12,7 @@ use yii\base\Component;
use yii\base\InvalidConfigException;
use yii\base\ViewContextInterface;
use yii\web\View;
use yii\base\MailEvent;
/**
* BaseMailer serves as a base class that implements the basic functions required by [[MailerInterface]].
@ -28,6 +29,16 @@ use yii\web\View;
*/
abstract class BaseMailer extends Component implements MailerInterface, ViewContextInterface
{
/**
* @event ActionEvent an event raised right before executing a controller action.
* You may set [[ActionEvent::isValid]] to be false to cancel the action execution.
*/
const EVENT_BEFORE_SEND = 'beforeSend';
/**
* @event ActionEvent an event raised right after executing a controller action.
*/
const EVENT_AFTER_SEND = 'afterSend';
/**
* @var string directory containing view files for this email messages.
* This can be specified as an absolute path or path alias.
@ -206,6 +217,10 @@ abstract class BaseMailer extends Component implements MailerInterface, ViewCont
*/
public function send($message)
{
if (!$this->beforeSend($message)) {
return false;
}
$address = $message->getTo();
if (is_array($address)) {
$address = implode(', ', array_keys($address));
@ -213,10 +228,12 @@ abstract class BaseMailer extends Component implements MailerInterface, ViewCont
Yii::info('Sending email "' . $message->getSubject() . '" to "' . $address . '"', __METHOD__);
if ($this->useFileTransport) {
return $this->saveMessage($message);
$isSuccessful = $this->saveMessage($message);
} else {
return $this->sendMessage($message);
$isSuccessful = $this->sendMessage($message);
}
$this->afterSend($message, $isSuccessful);
return $isSuccessful;
}
/**
@ -297,4 +314,31 @@ abstract class BaseMailer extends Component implements MailerInterface, ViewCont
{
return Yii::getAlias($this->viewPath) . DIRECTORY_SEPARATOR . $view;
}
/**
* This method is invoked right before mail send.
* You may override this method to do last-minute preparation for the message.
* If you override this method, please make sure you call the parent implementation first.
* @param MessageInterface $message
*/
public function beforeSend($message)
{
$event = new MailEvent(['message' => $message]);
$this->trigger(self::EVENT_BEFORE_SEND, $event);
return $event->isValid;
}
/**
* This method is invoked right after mail was send.
* You may override this method to do some postprocessing or logging based on mail send status.
* If you override this method, please make sure you call the parent implementation first.
* @param MessageInterface $message
* @param boolean $isSuccessful
*/
public function afterSend($message, $isSuccessful)
{
$event = new MailEvent(['message' => $message, 'isSuccessful' => $isSuccessful]);
$this->trigger(self::EVENT_AFTER_SEND, $event);
}
}

Loading…
Cancel
Save