Browse Source

minor refactoring of view resolving code.

tags/2.0.0-beta
Qiang Xue 11 years ago
parent
commit
155e9c6cba
  1. 12
      framework/yii/base/View.php
  2. 14
      framework/yii/base/ViewContextInterface.php
  3. 6
      framework/yii/base/Widget.php

12
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.");
}
}

14
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 <klimov.paul@gmail.com>
* @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);
}
}

6
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;
}
}

Loading…
Cancel
Save