• Yii框架怎么寻找对应视图


    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

  • 相关阅读:
    php://input,$_POST,$HTTP_RAW_POST_DATA区别
    使用print2flash开发在线文档
    [转] 一百本名著中的一百句话
    [转]PHP经验——PHPDoc PHP注释的标准文档
    .htaccess是什么?.htaccess几个简单应用
    帝国CMS系统结合项图文教程
    帝国cms文章内容tags关键词设置调用方法以及tags静态化
    如何在Apache中配置多端口访问
    USER-AGENT是什么
    关于js的几道经典题(作用域、原型链等)自己做的
  • 原文地址:https://www.cnblogs.com/dest/p/3810182.html
Copyright © 2020-2023  润新知