From ad4cf9e8fa36b65ffaebd30dfdebf530cf3a2d90 Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Fri, 5 Apr 2013 21:12:49 -0400 Subject: [PATCH] Added beforeRender and afterRender to View. --- framework/base/ActionEvent.php | 4 ++- framework/base/View.php | 55 ++++++++++++++++++++++++++++++++++++++---- framework/base/ViewEvent.php | 44 +++++++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 6 deletions(-) create mode 100644 framework/base/ViewEvent.php diff --git a/framework/base/ActionEvent.php b/framework/base/ActionEvent.php index 7c5a40c..9507b12 100644 --- a/framework/base/ActionEvent.php +++ b/framework/base/ActionEvent.php @@ -22,7 +22,9 @@ class ActionEvent extends Event */ public $action; /** - * @var boolean whether to continue running the action. + * @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; diff --git a/framework/base/View.php b/framework/base/View.php index d3d9339..9f382c6 100644 --- a/framework/base/View.php +++ b/framework/base/View.php @@ -22,6 +22,15 @@ use yii\helpers\FileHelper; class View extends Component { /** + * @event Event an event that is triggered by [[renderFile()]] right before it renders a view file. + */ + const EVENT_BEFORE_RENDER = 'beforeRender'; + /** + * @event Event an event that is triggered by [[renderFile()]] right after it renders a view file. + */ + const EVENT_AFTER_RENDER = 'afterRender'; + + /** * @var object the object that owns this view. This can be a controller, a widget, or any other object. */ public $context; @@ -47,7 +56,7 @@ class View extends Component public $clips; /** * @var Widget[] the widgets that are currently being rendered (not ended). This property - * is maintained by [[beginWidget()]] and [[endWidget()]] methods. Do not modify it directly. + * is maintained by [[beginWidget()]] and [[endWidget()]] methods. Do not modify it. */ public $widgetStack = array(); /** @@ -140,10 +149,14 @@ class View extends Component $this->context = $context; } - if ($this->renderer !== null) { - $output = $this->renderer->render($this, $viewFile, $params); - } else { - $output = $this->renderPhpFile($viewFile, $params); + $output = ''; + if ($this->beforeRender($viewFile)) { + if ($this->renderer !== null) { + $output = $this->renderer->render($this, $viewFile, $params); + } else { + $output = $this->renderPhpFile($viewFile, $params); + } + $this->afterRender($viewFile, $output); } $this->context = $oldContext; @@ -152,6 +165,38 @@ class View extends Component } /** + * This method is invoked right before [[renderFile()]] renders a view file. + * The default implementation will trigger the [[EVENT_BEFORE_RENDER]] event. + * If you override this method, make sure you call the parent implementation first. + * @param string $viewFile the view file to be rendered + * @return boolean whether to continue rendering the view file. + */ + public function beforeRender($viewFile) + { + $event = new ViewEvent($viewFile); + $this->trigger(self::EVENT_BEFORE_RENDER, $event); + return $event->isValid; + } + + /** + * This method is invoked right after [[renderFile()]] renders a view file. + * The default implementation will trigger the [[EVENT_AFTER_RENDER]] event. + * If you override this method, make sure you call the parent implementation first. + * @param string $viewFile the view file to be rendered + * @param string $output the rendering result of the view file. Updates to this parameter + * will be passed back and returned by [[renderFile()]]. + */ + public function afterRender($viewFile, &$output) + { + if ($this->hasEventHandlers(self::EVENT_AFTER_RENDER)) { + $event = new ViewEvent($viewFile); + $event->output = $output; + $this->trigger(self::EVENT_AFTER_RENDER, $event); + $output = $event->output; + } + } + + /** * Renders a view file as a PHP script. * * This method treats the view file as a PHP script and includes the file. diff --git a/framework/base/ViewEvent.php b/framework/base/ViewEvent.php new file mode 100644 index 0000000..cac7be4 --- /dev/null +++ b/framework/base/ViewEvent.php @@ -0,0 +1,44 @@ + + * @since 2.0 + */ +class ViewEvent extends Event +{ + /** + * @var string the rendering result of [[View::renderFile()]]. + * Event handlers may modify this property and the modified output will be + * returned by [[View::renderFile()]]. This property is only used + * by [[View::EVENT_AFTER_RENDER]] event. + */ + public $output; + /** + * @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. + * @param string $viewFile the view file path that is being rendered by [[View::renderFile()]]. + * @param array $config name-value pairs that will be used to initialize the object properties + */ + public function __construct($viewFile, $config = array()) + { + $this->viewFile = $viewFile; + parent::__construct($config); + } +} \ No newline at end of file