接上篇,为什么index 模版里没有任何有关require,inculde类型关键字,却任然有我们认为“多余”的字符出现。因为在至少我的认知里html的结构该是<html><head></head><body></body></html>这样的,而index.php模版中存在这样的结构,而如果那里采用特殊技术的话会不会存在html标签在包含html标签,那就不是一个标准的html文档了。而我们查看源码生成的html源码时也发现了该html源码内容为:

    <div id="content"><html>
<head>
</head>
<body>
<center>这是我自己的第一个页面,虽然将原来的大段内容删除了。不在是一个博客</center>
<a href="/admin/post/index/">指向admin/post/index.php的内容</a>
</body>
</html></div><!-- content --><div class="clear"></div>

即现在生成的页面是由一些其他页面加上我们自己的index.php结合生成的!

但是,他是在那里实现的呢?

先看我们的控制器:

class SiteController extends Controller
{public function actions(){return array(// captcha action renders the CAPTCHA image displayed on the contact page'captcha'=>array('class'=>'CCaptchaAction','backColor'=>0xFFFFFF,),// page action renders "static" pages stored under 'protected/views/site/pages'// They can be accessed via: index.php?r=site/page&view=FileName'page'=>array('class'=>'CViewAction',),);}/*** This is the default 'index' action that is invoked* when an action is not explicitly requested by users.*/public function actionIndex(){$this->render('index');}

这里的actionIndex就是我们访问localhost/index.php要调用的方法。但是我们的除了自己编写的那点代码外,其他的模版呢?

可以查看父类,有没有一种可能,在做控制器实例化或者其他操作时调用了那个其他模版的程序,然后,index.php的内容作为一个运行后的string参数传入进去最终得到我们想要的页面?

class Controller extends CController
{/*** @var string the default layout for the controller view. Defaults to '//layouts/column1',* meaning using a single column layout. See 'protected/views/layouts/column1.php'.*/public $layout='//layouts/column1';

这里可以注意到有$layout。

最终我们定位到layout文件夹,如下图:

column1.php的内容有:

<?php $this->beginContent('//layouts/main'); ?>
<div id="content"><?php echo $content; ?>
</div><!-- content -->
<?php $this->endContent(); ?>

这里已经有一些眉目了,可以看到<div id="content">了,因为我们知道id属性在html中的单一页面是唯一的,而我们刚才查看html页面也有一个<div id="content">,那么肯定是在调用actionIndex这个控制器方法的时候会将返回的字符串作为变量名为$content的变量赋值给另外一个作用模块,而这个作用模块主要是页面布局。由此,可以分析出protected/component/Controller.php的类我们也可以模拟编写出来一个其他的页面布局,让我们的逻辑控制器(如SiteController.php)来继承,达到更换布局,而展示内容不变的目的,此为推断,后面我会给出示例。

  由上面一些推断,总结出yii的装饰功能。

  要完成只显示我们自己的页面。可以将column1.php文件修改为

<?php //$this->beginContent('//layouts/main'); ?>
<div id="content"><?php echo $content; ?>
</div><!-- content -->
<?php //$this->endContent(); ?>

当然编码问题也要注意,在index.php中加入<meta content="text/html;charset=utf-8" http-equiv="Content-Type"/>就会如愿看到:

现在看$this->beginContent和$this->endContent()到底为我们做了什么工作。

1. 首先需要明确这里的$this指的是什么,这个变量当然指的是控制器。

  修改columns.php的内容为:

  

<?php //$this->beginContent('//layouts/main'); ?>
<div id="content"><?php print_r($this) ?><?php echo $content; ?>
</div><!-- content -->
<?php //$this->endContent(); ?>

  有图为证:

  也就是说,beginContent和endContent也是我们的SiteController的一个方法,查看没有,那么一定是父类方法了。

2. 分析/frameworks/web/CBaseController.php的内容。

  

    public function beginContent($view=null,$data=array()){$this->beginWidget('CContentDecorator',array('view'=>$view, 'data'=>$data));}

  查看到这个罪魁祸首了。追根溯源,通过一堆工厂实现类方法调用可以查看到最终会汇集到/framework/web/CContentDecorator.php文件。

  CContentDecorator.php核心:

  

    protected function decorate($content){$owner=$this->getOwner();if($this->view===null)$viewFile=Yii::app()->getController()->getLayoutFile(null);else$viewFile=$owner->getViewFile($this->view);if($viewFile!==false){$data=$this->data;$data['content']=$content;return $owner->renderFile($viewFile,$data,true);}elsereturn $content;}

即$this->beginContent("layout_path"),这里可以看到一个关键点是'content',即为什么我们要使用$content在模版中进行展示了。

那么更重要的main.php中控制的数据该展示在何处?

原来的main.php中的内容:

    <?php endif?><?php echo $content; ?><div class="clear"></div><div id="footer">Copyright &copy; <?php echo date('Y'); ?> by My Company.<br/>All Rights Reserved.<br/><?php echo Yii::powered(); ?></div><!-- footer --></div><!-- page --></body>
</html>

注意main.php中也存在这个$content

所以,将该内容移动到Copyright下,查看页面已经出现变化了。

  即在main.php中也是通过$content来进行控制。

但是在这里除了页面的调试布局外,当我们想查看某个类的某个方法是否存在时,有没有更好的处理方法呢?下篇处理该问题吧。

转载于:https://www.cnblogs.com/CLTANG/p/2650741.html

一周试用yii开发一个带各种该有功能的web程序(三)相关推荐

  1. 一周试用yii开发一个带各种该有功能的web程序(二)

    上篇随笔写完的是yii能使用简单的命令创建出一个基本的架构,我们只需要在这个架构上进行代码编写,扩展功能.而生成的一个小型系统是可以操作的,但是不是我们想要的,所以,这篇结合源码讲如何创建出我们自己的 ...

  2. 用Qt在Iinux上开发一个带UI的工业控制系统,应该用C++还是QML

    用Qt在Iinux上开发一个带UI的工业控制系统,应该用C++还是QML? 之前有人推荐说要用QML,QtQuick来开发.可是学习了一段时间对于QML和C++的混合编程还是不甚理解,觉得还是应该用C ...

  3. 利用css transition属性实现一个带动画显隐的微信小程序部件

    我们先来看效果图 像这样的一个带过渡效果的小部件在我们实际开发中的应用几率还是比较大的,但是在开发微信小程序的过程中可能有的小伙伴发现transition这个属性它不好使(下面说明)所以我们这个时候会 ...

  4. 稳扎稳打Silverlight(18) - 2.0视频之详解MediaElement, 开发一个简易版的全功能播放器...

    [索引页] [×××] 稳扎稳打Silverlight(18) - 2.0视频之详解MediaElement, 开发一个简易版的全功能播放器 作者:webabcd 介绍 Silverlight 2.0 ...

  5. 一个带新闻,天气的时钟Widget(三)---Webservices篇

    三.新闻和天气是通过webservice来实现 1,天气是请求公共的webservice,新闻自己搭了webservices 关于webservices的请求部分 public static List ...

  6. 用python开发一个背单词软件-python实现屏保程序(适用于背单词)

    今天要给大家分享的是一款自己写的屏保程序,大学大家最头疼的就是四六级的考试了,上次考试做阅读的时候,情不自禁的发呆,想着如果我能在电脑上写一个屏保程序,那么就可以天天记单词了! 开始 首先:我们使用的 ...

  7. html搜索区域选择框,设计一个带选择和提示功能的检索框(分步介绍)

    好多网站的搜索输入框设计的很漂亮,接下来笔者将逐步介绍如何设置自己的搜索输入框. 设计效果图: 该效果主要采用CSS样式与Javascript进行实现.不得不说CSS样式功能很强大,而且效果很炫,笔者 ...

  8. 动手开发一个名为“微天气”的微信小程序(下)

    摘要: 上期我们介绍了"微天气"的API与界面代码编写,今天我们继续介绍逻辑层代码以及查询代码的编写. 本文选自<从零开始学微信小程序开发>. 编写逻辑层代码 由于在i ...

  9. javascript实现的一个带下拉框功能的文本框

    我们需要一个可选的下拉框来选取内容,但是但是又有可以自定义输入的需求.对于这种需求,大部分网站使用的都是一个下拉框和一个 input text ,并列或分行给出选择.那么,我们希望它看上去像一个可以输 ...

  10. 用IDEA开发一个简单的Spring MVC的Hello World程序,表单程序

    1.下载Tomcat,并添加如下用户环境变量,并添加CLASSPATH变量 ### CATALINA_BASE F:\apache-tomcat-7.0.90 ### CATALINA_HOME F: ...

最新文章

  1. pokemon 下载 android,宝可梦pokemon home
  2. led显示屏背景墙设计_全彩LED显示屏比例设计因素都有哪些?
  3. WPF 故事板动画示例
  4. Java 洛谷 P1085 不高兴的津津
  5. libsvm 数据预处理 模块化程序
  6. 行驶在傍山的道路上_进藏线上那些唯美弯道,行驶中却充满风险,自驾游要注意几个事项...
  7. ySQL挑战搭建一个简易的成绩管理系统的数据库
  8. 风变编程课 囚徒困境 答案_当您对所有这些有用的在线编程课程感到不知所措时,如何摆脱困境...
  9. 图的存储结构之邻接表(详解)
  10. Ax 2012批量部署报表
  11. R语言:关于我国各地区消费水平的聚类分析
  12. 基于朴素贝叶斯的鸢尾花数据集分类
  13. PS图片上传图片 同时生成微缩图
  14. ubuntu安装nividia驱动
  15. Apche OFBiz 反序列化漏洞复现
  16. C++函数的递归调用
  17. 实验二 Linux系统用户与组的管理
  18. Linux运维后台进程管理之Supervisor配置和常用命令常见问题案例和管理odoo后台进程
  19. 机考怎么作弊_电脑考试怎么作弊
  20. python01python的基础知识点(一)

热门文章

  1. 关于时间、日期的一些应用
  2. linux中安装typecho的pathinfo配置
  3. [Data]Link cut tree
  4. openstack使用openvswitch实现vxlan组网
  5. Android酷炫有用的开源框架
  6. 美图秀秀美化图片之【增强】模块界面与功能设计
  7. 在微软平台上运行 SAP 应用程序
  8. Spring Security基本原理
  9. Spring Cloud Alibaba系列教程-03-搭建生产可用的Nacos集群
  10. 这种情况,支付宝转账可撤回了!一定要会