From 269ce903bdfb3a41e2a5b2cfc8e47bb898e54481 Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Sun, 15 Apr 2012 23:26:42 -0400 Subject: [PATCH] view. --- framework/base/View.php | 162 +++++++++++++++++++++++++++++++----------- framework/util/FileHelper.php | 10 +-- 2 files changed, 126 insertions(+), 46 deletions(-) diff --git a/framework/base/View.php b/framework/base/View.php index 001e0e1..48890e6 100644 --- a/framework/base/View.php +++ b/framework/base/View.php @@ -17,62 +17,142 @@ use yii\util\FileHelper; */ class View extends Component { - public $file; - public $name; /** - * @var string|array + * @var Object the owner of this view */ - public $basePath; public $owner; - public $locale; + /** + * @var string|array the base path where the view file should be looked for using the specified view name. + * This can be either a string representing a single base path, or an array representing multiple base paths. + * If the latter, the view file will be looked for in the given base paths in the order they are specified. + * This property must be set before calling [[render()]]. + */ + public $basePath; + /** + * @var string the language that the view should be rendered in. If not set, it will use + * the value of [[Application::language]]. + */ + public $language; + /** + * @var string the language that the original view is in. If not set, it will use + * the value of [[Application::sourceLanguage]]. + */ + public $sourceLanguage; + + /** + * Renders a view. + * + * The method first identifies the actual view file corresponding to the specified view. + * It then calls [[renderFile()]] to render the view file. The rendering result is returned + * as a string. If the view file does not exist, an exception will be thrown. + * + * To determine which view file should be rendered, the method calls [[findViewFile()]] which + * will search in the directories as specified by [[basePath]]. + * + * View name can be a path alias representing an absolute file path (e.g. `@app/views/layout/index`), + * or a path relative to [[basePath]]. The file suffix is optional and defaults to `.php` if not given + * in the view name. + * + * @param string $view the view to be rendered. This can be a path alias or a path relative to [[basePath]]. + * @param array $params the parameters that should be made available in the view. The PHP function `extract()` + * will be called on this variable to extract the variables from this parameter. + * @throws Exception + */ + public function render($view, $params = array()) + { + $file = $this->findViewFile($view); + if ($file !== false) { + return $this->renderFile($file, $params); + } else { + throw new Exception("Unable to find the view file for view '$view'."); + } + } + + public function renderFile($file, $params = array()) + { + $this->renderFileInternal($file, $params); + } + + public function widget($class, $properties = array(), $returnOutput = false) + { + + } + + public function beginWidget($class, $properties = array()) + { + + } + + public function endWidget($returnOutput = false) + { + + } + + public function beginClip($id, $properties = array()) + { + + } - public function render($_params_ = array()) + public function endClip() + { + + } + + public function beginCache($id, $properties = array()) + { + + } + + public function endCache() + { + + } + + public function beginContent() + { + + } + + public function endContent() + { + + } + + protected function renderFileInternal($_file_, $_params_ = array()) { - $this->resolveViewFile(); extract($_params_, EXTR_OVERWRITE); ob_start(); ob_implicit_flush(false); - require($this->file); + require($_file_); return ob_get_clean(); } - public function resolveViewFile() + public function findViewFile($view) { - if ($this->file !== null) { - return $this->file; + if ($view[0] === '/') { + throw new Exception('The view name "$view" should not start with a slash "/".'); } - if ($this->name === null || $this->basePath) { + if (($extension = FileHelper::getExtension($view)) === '') { + $view .= '.php'; } - - if(empty($viewName)) - return false; - - if($moduleViewPath===null) - $moduleViewPath=$basePath; - - if(($renderer=Yii::app()->getViewRenderer())!==null) - $extension=$renderer->fileExtension; - else - $extension='.php'; - if($viewName[0]==='/') - { - if(strncmp($viewName,'//',2)===0) - $viewFile=$basePath.$viewName; - else - $viewFile=$moduleViewPath.$viewName; + if ($view[0] === '@') { + $file = \Yii::getAlias($view[0]); + } elseif (!empty($this->basePath)) { + $basePaths = is_array($this->basePath) ? $this->basePath : array($this->basePath); + $found = false; + foreach ($basePaths as $basePath) { + $file = $basePath . DIRECTORY_SEPARATOR . $view; + if (is_file($file)) { + $found = true; + break; + } + } + if (!$found) { + return false; + } } - else if(strpos($viewName,'.')) - $viewFile=Yii::getPathOfAlias($viewName); - else - $viewFile=$viewPath.DIRECTORY_SEPARATOR.$viewName; - - if(is_file($viewFile.$extension)) - return Yii::app()->findLocalizedFile($viewFile.$extension); - else if($extension!=='.php' && is_file($viewFile.'.php')) - return Yii::app()->findLocalizedFile($viewFile.'.php'); - else - return false; - + $file = FileHelper::localize($file, $this->language, $this->sourceLanguage); + return is_file($file) ? $file : false; } } \ No newline at end of file diff --git a/framework/util/FileHelper.php b/framework/util/FileHelper.php index 93186d4..c7b7bb3 100644 --- a/framework/util/FileHelper.php +++ b/framework/util/FileHelper.php @@ -46,22 +46,22 @@ class FileHelper * in lower case and in the format of LanguageID_RegionID (e.g. "en_us"). * * @param string $file the original file - * @param string $targetLanguage the target language that the file should be localized to. + * @param string $language the target language that the file should be localized to. * If not set, the value of [[\yii\base\Application::language]] will be used. * @param string $sourceLanguage the language that the original file is in. * If not set, the value of [[\yii\base\Application::sourceLanguage]] will be used. * @return string the matching localized file, or the original file if the localized version is not found. * If the target and the source language codes are the same, the original file will be returned. */ - public static function localize($file, $targetLanguage = null, $sourceLanguage = null) + public static function localize($file, $language = null, $sourceLanguage = null) { - if ($targetLanguage === null) { - $targetLanguage = \Yii::$application->getLanguage(); + if ($language === null) { + $language = \Yii::$application->getLanguage(); } if ($sourceLanguage === null) { $sourceLanguage = \Yii::$application->sourceLanguage; } - if ($targetLanguage === $sourceLanguage) { + if ($language === $sourceLanguage) { return $file; } $desiredFile = dirname($file) . DIRECTORY_SEPARATOR . $sourceLanguage . DIRECTORY_SEPARATOR . basename($file);