標籤:style class blog code ext color
render()內容;
public function render($view,$data=null,$return=false){ if($this->beforeRender($view)) { $output=$this->renderPartial($view,$data,true); if(($layoutFile=$this->getLayoutFile($this->layout))!==false) $output=$this->renderFile($layoutFile,array(‘content‘=>$output),true); $this->afterRender($view,$output); $output=$this->processOutput($output); if($return) return $output; else echo $output; }}
調用render()時首先調用renderPartial();
public function renderPartial($view,$data=null,$return=false,$processOutput=false){ if(($viewFile=$this->getViewFile($view))!==false) { $output=$this->renderFile($viewFile,$data,true); if($processOutput) $output=$this->processOutput($output); if($return) return $output; else echo $output; } else throw new CException(Yii::t(‘yii‘,‘{controller} cannot find the requested view "{view}".‘, array(‘{controller}‘=>get_class($this), ‘{view}‘=>$view)));}
renderPartial()則調用getViewFile()
真正發現問題從這裡開始
public function getViewFile($viewName){ // 檢查是否使用theme,如果存在theme且可以在主題目錄找到檔案,則返回 if(($theme=Yii::app()->getTheme())!==null && ($viewFile=$theme->getViewFile($this,$viewName))!==false) return $viewFile; // 當未使用theme時 // $moduleViewPath,$basePath 預設視圖路徑,即根目錄下的views路徑 $moduleViewPath=$basePath=Yii::app()->getViewPath(); // 如果是模組,則返回resolveViewFile() // ‘$this->getViewPath()‘是控制器對應的預設視圖路徑 // 如果在模組下,就會指向模組的views目錄 if(($module=$this->getModule())!==null) $moduleViewPath=$module->getViewPath(); return $this->resolveViewFile($viewName,$this->getViewPath(),$basePath,$moduleViewPath);}
ok,開始調用resolveViewFile()
public function resolveViewFile($viewName,$viewPath,$basePath,$moduleViewPath=null){ // 沒有視圖檔案名稱 if(empty($viewName)) return false; // 沒有模組的視圖路徑 ??? // 沒遇到過 if($moduleViewPath===null) $moduleViewPath=$basePath; // 沒有寫副檔名,則使用預設副檔名"php" if(($renderer=Yii::app()->getViewRenderer())!==null) $extension=$renderer->fileExtension; else $extension=‘.php‘; if($viewName[0]===‘/‘) { // 如果視圖名是以雙反斜線開頭 if(strncmp($viewName,‘//‘,2)===0) // ‘預設視圖路徑 . 視圖檔案名稱‘ $viewFile=$basePath.$viewName; else // ‘模組視圖路徑. 視圖檔案名稱‘ // 根據 getViewFile()傳遞的參數來看,兩者是一樣的 ??? $viewFile=$moduleViewPath.$viewName; } // 也就是說以雙反斜線開頭表示以根目錄下的views為基礎路徑 // 如果檔案名稱包含‘.‘ elseif(strpos($viewName,‘.‘)) 表示使用Yii的路徑別名 $viewFile=Yii::getPathOfAlias($viewName); // 沒有雙反斜線開頭和‘.‘的情況, else // 控制器的對應的視圖路徑中的檔案 // 這個應該是通常最頻繁使用的情況---直接寫視圖名稱 $viewFile=$viewPath.DIRECTORY_SEPARATOR.$viewName; if(is_file($viewFile.$extension)) return Yii::app()->findLocalizedFile($viewFile.$extension); elseif($extension!==‘.php‘ && is_file($viewFile.‘.php‘)) return Yii::app()->findLocalizedFile($viewFile.‘.php‘); else return false;}
結論:
1.控制器中的視圖路徑以themes最為優先
2.其次是根目錄下的views
3.然後是別名
4.最後是控制器對應的views