diff --git a/framework/yii/base/View.php b/framework/yii/base/View.php index 66b3be8..222f94b 100644 --- a/framework/yii/base/View.php +++ b/framework/yii/base/View.php @@ -225,8 +225,8 @@ class View extends Component * on how to specify this parameter. * @param object $context the context that the view should be used to search the view file. If null, * existing [[context]] will be used. - * @throws InvalidCallException if [[context]] is required and invalid. * @return string the view file path. Note that the file may not exist. + * @throws InvalidCallException if [[context]] is required and invalid. */ protected function findViewFile($view, $context = null) { @@ -236,9 +236,13 @@ class View extends Component } elseif (strncmp($view, '//', 2) === 0) { // e.g. "//layouts/main" $file = Yii::$app->getViewPath() . DIRECTORY_SEPARATOR . ltrim($view, '/'); - } elseif (strncmp($view, '/', 1) === 0 && Yii::$app->controller !== null) { + } elseif (strncmp($view, '/', 1) === 0) { // e.g. "/site/index" - $file = Yii::$app->controller->module->getViewPath() . DIRECTORY_SEPARATOR . ltrim($view, '/'); + if (Yii::$app->controller !== null) { + $file = Yii::$app->controller->module->getViewPath() . DIRECTORY_SEPARATOR . ltrim($view, '/'); + } else { + throw new InvalidCallException("Unable to locate view file for view '$view': no active controller."); + } } else { // context required if ($context === null) { @@ -247,7 +251,7 @@ class View extends Component if ($context instanceof ViewContextInterface) { $file = $context->findViewFile($view); } else { - throw new InvalidCallException('Current context is not supported.'); + throw new InvalidCallException("Unable to locate view file for view '$view': no active view context."); } } diff --git a/framework/yii/base/ViewContextInterface.php b/framework/yii/base/ViewContextInterface.php index 4237eca..94f6751 100644 --- a/framework/yii/base/ViewContextInterface.php +++ b/framework/yii/base/ViewContextInterface.php @@ -8,13 +8,9 @@ namespace yii\base; /** - * ViewContextInterface represents possible context for the view rendering. - * It determines the way the non-global view files are searched. - * This interface introduces method [[findViewFile]], which will be used - * at [[View::render()]] to determine the file by view name, which does - * not match default format. + * ViewContextInterface is the interface that should implemented by classes who want to support relative view names. * - * @see View + * The method [[findViewFile()]] should be implemented to convert a relative view name into a file path. * * @author Paul Klimov * @since 2.0 @@ -22,9 +18,9 @@ namespace yii\base; interface ViewContextInterface { /** - * Finds the view file based on the given view name. - * @param string $view the view name. + * Finds the view file corresponding to the specified relative view name. + * @param string $view a relative view name. The name does NOT start with a slash. * @return string the view file path. Note that the file may not exist. */ public function findViewFile($view); -} \ No newline at end of file +} diff --git a/framework/yii/base/Widget.php b/framework/yii/base/Widget.php index b6e0cd0..c47a89d 100644 --- a/framework/yii/base/Widget.php +++ b/framework/yii/base/Widget.php @@ -8,6 +8,7 @@ namespace yii\base; use Yii; +use ReflectionClass; /** * Widget is the base class for widgets. @@ -189,8 +190,7 @@ class Widget extends Component implements ViewContextInterface */ public function getViewPath() { - $className = get_class($this); - $class = new \ReflectionClass($className); + $class = new ReflectionClass($this); return dirname($class->getFileName()) . DIRECTORY_SEPARATOR . 'views'; } @@ -202,6 +202,6 @@ class Widget extends Component implements ViewContextInterface */ public function findViewFile($view) { - return $this->getViewPath() . DIRECTORY_SEPARATOR . ltrim($view, '/'); + return $this->getViewPath() . DIRECTORY_SEPARATOR . $view; } }