接上篇,为什么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);
}
else
return $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来进行控制。

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

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

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

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

  2. 用Vue开发一个实时性时间转换功能,看这篇文章就够了

    前言 最近有一个说法,如果你看见某个网站的某个功能,你就大概能猜出背后的业务逻辑是怎么样的,以及你能动手开发一个一毛一样的功能,那么你的前端技能算是进阶中高级水平了.比如咱们今天要聊的这个话题:如何用 ...

  3. 快速入门PaddleOCR,并试用其开发一个搜题小工具

    介绍 PaddleOCR 是一个基于百度飞桨的OCR工具库,包含总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别.竖排文本识别.长文本识别.同时支持多种文本检测.文本识别的训练算法. ...

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

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

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

    引言:在智能手机软件的装机量中,天气预报类的APP排在比較靠前的位置.说明用户对天气的关注度非常高.由于人们不管是工作还是度假旅游等各种活动都须要依据自然天气来安排.跟着本文开发一个"微天气 ...

  6. yii开发一个web程序的基本流程

    1. 创建目录结构.在前面的章节Creating First Yii Application写的yiic工具可以帮助我们快速完成这步. 2. 配置 application.就是修改applicatio ...

  7. 开发一个带UI的库(asp.net core 3.0)

    在GitHub上有个项目,本来是作为自己研究学习.net core的Demo,没想到很多同学在看,还给了很多星,所以觉得应该升成3.0,整理一下,写成博分享给学习.net core的同学们. 项目名称 ...

  8. 使用ionic2开发一个二维码扫描功能

    界面添加一个按钮: <button ion-button block color="secondary" class="Scan-button" (cli ...

  9. 使用nodejs的wxmnode模块,开发一个微信自动监控提醒功能,做个天气预报。

    这个模块是一个公众号的模块,名字叫"帮你看着". 原本这个公众号是做股票监控提醒的,我也没炒股.因为接口支持写入任何内容,所以可以有其他的用处.比如做成天气预报定时提醒. 我们去n ...

随机推荐

  1. USACO翻译:USACO 2014 MARCH Silver三题

    USACO 2014 MARCH 一.题目概览 中文题目名称 农田灌溉 懒牛 牛叫 英文题目名称 irrigation lazy mooomoo 可执行文件名 irrigation lazy mooo ...

  2. Win7 下安装VirtualBox 没有Ubuntu 64bit 选项问题

    参考: win7安装virtualbox遇到的问题 基于VirtualBox虚拟机安装Ubuntu图文教程 问题 在安装VirtualBox之后,选择虚拟机进行安装的时候发现没有Ubuntu 64bi ...

  3. GCC编译C代码

    C程序的编译过程       常用文件的后缀名: gcc编译c代码 1.gcc 常用编译选项: 2.gcc编译方法 testc.c: #include <stdio.h> int main ...

  4. [Maven]初次实践

    都说Maven好,以前一直用ant,这次体验一下. 开始之前,maven给我的印象有2个,一是库依赖管理做得比较好,二是规范了构建编译过程,说白了就是什么目录都规定好了. 好开始安装,解压缩,设置m2 ...

  5. 【转】监听按钮除OnClick外其他事件的方法,附简易改编的UIButton类

    http://lib.csdn.net/article/unity3d/38463 作者:IceFantasyLcj 大家好,我是雨中祈雨.一直以来,CSDN都是我最好的编程助手.这是我在CSDN的第 ...

  6. ThinkCmfX模板常量

    一.public文件: 1.各种js文件,包括cookie.js.ajaxFrom.js等系统自带的js文件 2.simpleboot:bootstrap.图标font文件 二.themes:前端模板 ...

  7. 月四 周2 iii

    同样发生于今天 今天做的一道题引起了我对<电波女与青春男>的回忆 如果说光鸟鸟和电波女对我来说有什么共同之处, 那应该是体验过程我都很认真吧 我还是很喜欢入间人间的书, 不过那本妹主题的新 ...

  8. angularJS实现可编辑的下拉框

    将angularJS与插件select2结合使用即可 <!DOCTYPE html><html lang="en"><head>    < ...

  9. 移动到web整理

    meta基础知识 H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 <meta name="viewport" content="width=device-wid ...

  10. centos7 使用systemd 自定义关机前脚本

    systemd (centos7) 需求,关机前执行脚本 关机脚本vi /usr/bin/shutdown_cust.sh#!/bin/bashecho "zhengchangguanji& ...