diff --git a/framework/base/View.php b/framework/base/View.php index 709b761..86020ad 100644 --- a/framework/base/View.php +++ b/framework/base/View.php @@ -119,7 +119,9 @@ class View extends Component } $oldContext = $this->context; - $this->context = $context; + if ($context !== null) { + $this->context = $context; + } if ($this->renderer !== null) { $output = $this->renderer->render($this, $viewFile, $params); @@ -276,6 +278,7 @@ class View extends Component * @param boolean $renderInPlace whether to render the clip content in place. * Defaults to false, meaning the captured clip will not be displayed. * @return \yii\widgets\Clip the Clip widget instance + * @see \yii\widgets\Clip */ public function beginClip($id, $renderInPlace = false) { @@ -294,6 +297,31 @@ class View extends Component $this->endWidget(); } + /** + * Begins the rendering of content that is to be decorated by the specified view. + * @param string $view the name of the view that will be used to decorate the content enclosed by this widget. + * Please refer to [[View::findViewFile()]] on how to set this property. + * @param array $params the variables (name=>value) to be extracted and made available in the decorative view. + * @return \yii\widgets\ContentDecorator the ContentDecorator widget instance + * @see \yii\widgets\ContentDecorator + */ + public function beginContent($view, $params = array()) + { + return $this->beginWidget('yii\widgets\ContentDecorator', array( + 'view' => $this, + 'viewName' => $view, + 'params' => $params, + )); + } + + /** + * Ends the rendering of content. + */ + public function endContent() + { + $this->endWidget(); + } + // // /** // * Begins fragment caching. @@ -336,33 +364,4 @@ class View extends Component // $this->endWidget(); // } // - /** - * Begins the rendering of content that is to be decorated by the specified view. - * @param mixed $view the name of the view that will be used to decorate the content. The actual view script - * is resolved via {@link getViewFile}. If this parameter is null (default), - * the default layout will be used as the decorative view. - * Note that if the current controller does not belong to - * any module, the default layout refers to the application's {@link CWebApplication::layout default layout}; - * If the controller belongs to a module, the default layout refers to the module's - * {@link CWebModule::layout default layout}. - * @param array $params the variables (name=>value) to be extracted and made available in the decorative view. - * @see endContent - * @see yii\widgets\ContentDecorator - */ - public function beginContent($view, $params = array()) - { - $this->beginWidget('yii\widgets\ContentDecorator', array( - 'view' => $view, - 'params' => $params, - )); - } - - /** - * Ends the rendering of content. - * @see beginContent - */ - public function endContent() - { - $this->endWidget(); - } } \ No newline at end of file diff --git a/framework/widgets/ContentDecorator.php b/framework/widgets/ContentDecorator.php index 0087698..4c3ae70 100644 --- a/framework/widgets/ContentDecorator.php +++ b/framework/widgets/ContentDecorator.php @@ -1,81 +1,59 @@ * @link http://www.yiiframework.com/ - * @copyright 2008-2013 Yii Software LLC + * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */ +namespace yii\widgets; + +use Yii; +use yii\base\InvalidConfigException; +use yii\base\Widget; +use yii\base\View; + /** - * CContentDecorator decorates the content it encloses with the specified view. - * - * CContentDecorator is mostly used to implement nested layouts, i.e., a layout - * is embedded within another layout. {@link CBaseController} defines a pair of - * convenient methods to use CContentDecorator: - *
- * $this->beginContent('path/to/view'); - * // ... content to be decorated - * $this->endContent(); - *- * - * The property {@link view} specifies the name of the view that is used to - * decorate the content. In the view, the content being decorated may be - * accessed with variable
$content
.
- *
* @author Qiang Xue $content
- * The decorated content will be displayed directly.
- * @param string $content the content to be decorated
- * @return string the decorated content
+ * Ends recording a clip.
+ * This method stops output buffering and saves the rendering result as a named clip in the controller.
*/
- protected function decorate($content)
+ public function run()
{
- $owner=$this->getOwner();
- if($this->view===null)
- $viewFile=Yii::app()->getController()->getLayoutFile(null);
- else
- $viewFile=$owner->getViewFile($this->view);
- if($viewFile!==false)
- {
- $data=$this->data;
- $data['content']=$content;
- return $owner->renderFile($viewFile,$data,true);
- }
- else
- return $content;
+ $params = $this->params;
+ $params['content'] = ob_get_clean();
+ $view = $this->view !== null ? $this->view : Yii::$app->getView();
+ echo $view->render($this->viewName, $params);
}
}