render()内容;

  1. public function render($view,$data=null,$return=false)
  2. {
  3. if($this->beforeRender($view))
  4. {
  5. $output=$this->renderPartial($view,$data,true);
  6. if(($layoutFile=$this->getLayoutFile($this->layout))!==false)
  7. $output=$this->renderFile($layoutFile,array('content'=>$output),true);
  8.  
  9. $this->afterRender($view,$output);
  10.  
  11. $output=$this->processOutput($output);
  12.  
  13. if($return)
  14. return $output;
  15. else
  16. echo $output;
  17. }
  18. }

调用render()时首先调用renderPartial();

  1. public function renderPartial($view,$data=null,$return=false,$processOutput=false)
  2. {
  3. if(($viewFile=$this->getViewFile($view))!==false)
  4. {
  5. $output=$this->renderFile($viewFile,$data,true);
  6. if($processOutput)
  7. $output=$this->processOutput($output);
  8. if($return)
  9. return $output;
  10. else
  11. echo $output;
  12. }
  13. else
  14. throw new CException(Yii::t('yii','{controller} cannot find the requested view "{view}".',
  15. array('{controller}'=>get_class($this), '{view}'=>$view)));
  16. }

renderPartial()则调用getViewFile()

真正发现问题从这里开始

  1. public function getViewFile($viewName)
  2. {
  3.  
  4. // 检查是否使用theme,如果存在theme且可以在主题目录找到文件,则返回
  5. if(($theme=Yii::app()->getTheme())!==null && ($viewFile=$theme->getViewFile($this,$viewName))!==false)
  6. return $viewFile;
  7.  
  8. // 当未使用theme时
  9. // $moduleViewPath,$basePath 默认视图路径,即根目录下的views路径
  10.  
  11. $moduleViewPath=$basePath=Yii::app()->getViewPath();
  12.  
  13. // 如果是模块,则返回resolveViewFile()
  14.  
  15. // '$this->getViewPath()'是控制器对应的默认视图路径
  16.  
  17. // 如果在模块下,就会指向模块的views目录
  18.  
  19. if(($module=$this->getModule())!==null)
  20. $moduleViewPath=$module->getViewPath();
  21. return $this->resolveViewFile($viewName,$this->getViewPath(),$basePath,$moduleViewPath);
  22. }

ok,开始调用resolveViewFile()

  1. public function resolveViewFile($viewName,$viewPath,$basePath,$moduleViewPath=null)
  2. {
  3.  
  4. // 没有视图文件名
  5. if(empty($viewName))
  6. return false;
  7. // 没有模块的视图路径 ???
  8.  
  9. // 没遇到过
  10. if($moduleViewPath===null)
  11. $moduleViewPath=$basePath;
  12.  
  13. // 没有写扩展名,则使用默认扩展名"php"
  14. if(($renderer=Yii::app()->getViewRenderer())!==null)
  15. $extension=$renderer->fileExtension;
  16. else
  17. $extension='.php';
  18.  
  19. if($viewName[0]==='/')
  20. {
  21.  
  22. // 如果视图名是以双反斜杠开头
  23.  
  24. if(strncmp($viewName,'//',2)===0)
  25.  
  26. // '默认视图路径 . 视图文件名'
  27.  
  28. $viewFile=$basePath.$viewName;
  29. else
  30.  
  31. // '模块视图路径. 视图文件名'
  32.  
  33. // 根据 getViewFile()传递的参数来看,两者是一样的 ???
  34.  
  35. $viewFile=$moduleViewPath.$viewName;
  36. }
  37.  
  38. // 也就是说以双反斜杠开头表示以根目录下的views为基础路径
  39.  
  40. // 如果文件名包含'.'
  41. elseif(strpos($viewName,'.'))
  42.  
  43. 表示使用Yii的路径别名
  44. $viewFile=Yii::getPathOfAlias($viewName);
  45.  
  46. // 没有双反斜杠开头和'.'的情况,
  47.  
  48. else
  49.  
  50. // 控制器的对应的视图路径中的文件
  51.  
  52. // 这个应该是通常最频繁使用的情况---直接写视图名称
  53. $viewFile=$viewPath.DIRECTORY_SEPARATOR.$viewName;
  54.  
  55. if(is_file($viewFile.$extension))
  56. return Yii::app()->findLocalizedFile($viewFile.$extension);
  57. elseif($extension!=='.php' && is_file($viewFile.'.php'))
  58. return Yii::app()->findLocalizedFile($viewFile.'.php');
  59. else
  60. return false;
  61. }

结论:

1.控制器中的视图路径以themes最为优先

2.其次是根目录下的views

3.然后是别名

4.最后是控制器对应的views

Yii框架怎么寻找对应视图的更多相关文章

  1. Yii框架2.0的视图和widgets表单的使用

    2.0的控制器的创建和action方法的添加和1.0的基本是一样的.但我发现他的widgets 的ActiveForm和1.1版本有些不一样的地方. 对于视图基本也是一样的,有render 和 ren ...

  2. Yii框架(一)

    这里接触了 MVC 设计模式中的控制器和视图部分. 创建了一个操作作为控制器的一部分去处理特定请求. 然后又创建了一个视图去构造响应内容. 在这个小例子中,没有模型调用,唯一涉及到数据的地方是 mes ...

  3. Yii框架(二)Model处理数据

    熟悉php的autoload机制,自己实现一个autoload函数 一.复习框架: basic/ 应用根目录 composer.json Composer 配置文件, 描述包信息 config/ 包含 ...

  4. Yii框架2.0的安装过程

    Yii框架是个不错的php开发框架,大型项目上都可以使用.和大多框架一样他也是开源,而且采用了mvc结构的. Yii1.*,直接下载然后用脚步可以创建自己的项目了,最近看了下Yii2.0版本的,他推荐 ...

  5. YII框架源码分析(百度PHP大牛创作-原版-无广告无水印)

           YII 框架源码分析    百度联盟事业部——黄银锋 目 录 1. 引言 3 1.1.Yii 简介 3 1.2.本文内容与结构 3 2.组件化与模块化 4 2.1.框架加载和运行流程 4 ...

  6. 与《YII框架》不得不说的故事—5篇目录

    与<YII框架>不得不说的故事—基础篇 第1章 课程目标 1-1 课程目标 (00:54) 第2章 课前知识准备 2-1 YII的启动和安装 (05:12) 2-2 YII请求处理流程 ( ...

  7. 使用Yii框架完整搭建网站流程入门

    下载地址: http://www.yiiframework.com/ http://www.yiichina.com/ 由美籍华人薛强研究而出, Yii 这个名字(读作易(Yee))代表 简单(eas ...

  8. 三级联动(在YII框架中)

    //三级联动 //数据库代码过多就不上传了 //视图 <div class="area">    <table class="table"&g ...

  9. Yii 框架学习--01 框架入门

    Yii 是一个高性能的,适用于开发 WEB2.0 应用的 PHP 框架. Yii目前有两个主要的版本: 2.0 和 1.1.本文以YII 2.0.7为例. 环境需求 Yii2.0 框架有一些系统上的需 ...

随机推荐

  1. paste - 合并文件各行

    总览 (SYNOPSIS) ../src/paste [OPTION]... [FILE]... 描述 (DESCRIPTION) 连续 依次 从 各个 文件 FILE 中 读取 一行 然后 合并成 ...

  2. Debug to add expression

    Debug expression

  3. sass @import 规则

    @import 根据文件名引入. 默认情况下,它会寻找 Sass 文件并直接引入, 但是,在少数几种情况下,它会被编译成 CSS 的 @import 规则: 如果文件的扩展名是 .css. 如果文件名 ...

  4. [python 学习] 编码

    一.源文件编码(encoding: utf-8) 1. python 2.x 默认按ascii编码读取源文件,源码中出现了ascii不能表示的字符 "的",所以报错(3.x版本不报 ...

  5. jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)

    现实企业级Java开发中,有时候我们会碰到下面这些问题: OutOfMemoryError,内存不足 内存泄露 线程死锁 锁争用(Lock Contention) Java进程消耗CPU过高 运用jv ...

  6. thinkphp数据库连接

    https://www.kancloud.cn/manual/thinkphp5/118059 一.配置文件定义 常用的配置方式是在应用目录或者模块目录下面的database.php中添加下面的配置参 ...

  7. hashlib模块subprocess模块

    '''通过一种算法,将字符串得出一种编码内容相同则hash运算结果相同,内容稍微改变则hash值改变不可逆推相同算法,无论校验多长的数据,得到的hash值长度固定'''# import hashlib ...

  8. Python---基础-运算符int和range函数

    这行代码是什么意思 if not (money<100) money >= 100 -------------------------------假设有x = 1, y = 2, z = ...

  9. [洛谷 P1013] NOIP1998 提高组 进制位

    问题描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: L K V E L L K V E K K V E KL V V E KL KK E E K ...

  10. LeetCode--039--组合总和(java)

    给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制重复被选 ...