Yii架構怎麼尋找對應視圖

來源:互聯網
上載者:User

標籤: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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.