第一部分:MVC模型
1 用户发出了访问 URL http://www.example.com/index.php?r=post/show&id=1 的请求,Web 服务器通过执行入
口脚本 index.php 处
理此请求。
2 入口脚本创建了一个 应用 实例并执行。
3 应用从一个叫做 request 的 应用组件 中获得了用户请求的详细信息。
4 应用在一个名叫 urlManager 的应用组件的帮助下,决定请求的 控制器 和 动作 。在这个例子中,控制器是
post,它代表
PostController 类;动作是 show ,其实际含义由控制器决定。
5 应用创建了一个所请求控制器的实例以进一步处理用户请求。控制器决定了动作 show 指向控制器类中的一个
名为 actionShow 的方法。然后它创建并持行了与动作关联的过滤器(例如访问控制,基准测试)。如果过滤器
允许,动作将被执行。
6 动作从数据库中读取一个 ID 为 1 的 Post 模型。
7 动作通过 Post 模型渲染一个名为 show 的 视图。
8 视图读取并显示 Post 模型的属性。
9 视图执行一些 小物件。
10 视图的渲染结果被插入一个 布局。
11 动作完成视图渲染并将其呈现给用户。
第二部分:创建模型
>>>model Post tbl_post
在protected/models下创建名为Post.php的文件,关联数据表是tbl_post。
Post.php是AR类
每个 AR 类代表一个数据表(或视图),数据表(或视图)的列在 AR 类中体现为类的属性,一个 AR 实例则表
示表中的一行。
模型继承自CModel
---------------------------
tbl_post
id title content tags status create_timeupdate_time author_id
1 Welcome! This blog system is developed using Yii. It is meant
yii, blog 2 1230952187 12309521871
2 A Test Post Lorem ipsum dolor sit amet, consectetur adipisicing elit,
test 2 1230952187 12309521871
===========================================
向tbl_post表中插入一行
-------------------------------
$post=new Post; //Post实例,代表一行
$post->title='sample post'; //赋值
$post->content='post body content';
$post->save();
-------------------------------
创建控制器
>>>crud Post
在protected/controllers下生成PostController.php文件,关联类Post
控制器继承自:CController
工作流程
----------------
1 用户请求访问这个 URL http://www.example.com/blog/index.php?r=post;
2 入口脚本 被Web服务器执行,它创建并实例化了一个 应用 实例来处理此请求;
3 应用创建并执行了 PostController 实例;
4 PostController 实例通过调用它的 actionIndex() 方法执行了 index 动作。注意,如果用户没有在URL中指
定执行一个动作,则
index 就是默认的动作;
5 actionIndex() 方法查询数据库,带回最新的日志列表;
6 actionIndex() 方法使用日志数据渲染 index 视图。
-----------------
用户通过链接将数据传给控制器,控制器通过模型来获得数据,通过视图来包含数据。
-----------------
PostController.php
public function actionCreate()
{
$model=new Post;
if(isset($_POST['Post']))
{
$model->attributes=$_POST['Post'];
if($model->save())
$this->redirect(array('view','id'=>$model->id));
}
$this->render('create',array(
'model'=>$model,
));
}
CModel定义了魔术getter()和setter():getAttributes(),setAttributes(),用来自动读取,设置attributes
属性的值。
参考: 关于多继承层次的set魔术方法解析
render()加载protected/views/post/create.php视图,传递相应的值。
-------------------
create.php
<?php
$this->breadcrumbs=array(
'Posts'=>array('index'),
'Create',
);
$this->menu=array(
array('label'=>'List Post', 'url'=>array('index')),
array('label'=>'Manage Post', 'url'=>array('admin')),
);
?>
<h1>Create Post</h1>
<?php echo $this->renderPartial('_form', array('model'=>$model)); ?>
视图的属性是控制器定义的。
=================================================================
第三部分:视图
视图分两部分:布局和内容
-------------------------------------------
布局:protected/views/layouts
控制器载入布局
public $layout='//layouts/column2';
column2.php
<?php $this->beginContent('/layouts/main'); ?>
<div class="container">
<div class="span-18">
<div id="content">
<?php echo $content; ?>
</div><!-- content -->
</div>
<div class="span-6 last">
<div id="sidebar">
<?php if(!Yii::app()->user->isGuest) $this->widget('UserMenu'); ?> //如果是guest,不现实菜单
<?php $this->widget('TagCloud', array(
'maxTags'=>Yii::app()->params['tagCloudCount'],
)); ?>
<?php $this->widget('RecentComments', array(
'maxComments'=>Yii::app()->params['recentCommentCount'],
)); ?>
</div><!-- sidebar -->
</div>
</div>
<?php $this->endContent(); ?>
-------------------------------------------
内容:protected/views/post/
控制器加载视图,并把数据嵌入视图
public function actionIndex()
{
$dataProvider=new CActiveDataProvider('Post');
$this->render('index',array(
'dataProvider'=>$dataProvider,
));
}protected/views/post/index.php
<?php
$this->breadcrumbs=array( //breadcrumbs
'Posts',
);
$this->menu=array( //菜单项
array('label'=>'Create Post', 'url'=>array('create')),
array('label'=>'Manage Post', 'url'=>array('admin')),
);
?>
<h1>Posts</h1>
<?php $this->widget('zii.widgets.CListView', array(
'dataProvider'=>$dataProvider, //控制器的数据
'itemView'=>'_view', //显示具体项的方式
)); ?>
==============================
widget
protected/components
放全局的widget,widget是小块内容,显示在边栏,header等,非$content的材料。
-------------------------------
菜单项
protected/components/UserMenu.php
<?php
Yii::import('zii.widgets.CPortlet');
class UserMenu extends CPortlet
{
public function init()
{
$this->title=CHtml::encode(Yii::app()->user->name);
parent::init();
}
protected function renderContent()
{
$this->render('userMenu'); //widget使用的样式
}
}
-------------------------------
widget的样式
protected/components/views/userMenu.php
<ul>
<li><?php echo CHtml::link('Create New Post',array('post/create')); ?></li>
<li><?php echo CHtml::link('Manage Posts',array('post/admin')); ?></li>
<li><?php echo CHtml::link('Approve Comments',array('comment/index')) . ' (' . Comment::model()->pendingCommentCount . ')'; ?></li>
<li><?php echo CHtml::link('Logout',array('site/logout')); ?></li>
</ul>
1 用户发出了访问 URL http://www.example.com/index.php?r=post/show&id=1 的请求,Web 服务器通过执行入
口脚本 index.php 处
理此请求。
2 入口脚本创建了一个 应用 实例并执行。
3 应用从一个叫做 request 的 应用组件 中获得了用户请求的详细信息。
4 应用在一个名叫 urlManager 的应用组件的帮助下,决定请求的 控制器 和 动作 。在这个例子中,控制器是
post,它代表
PostController 类;动作是 show ,其实际含义由控制器决定。
5 应用创建了一个所请求控制器的实例以进一步处理用户请求。控制器决定了动作 show 指向控制器类中的一个
名为 actionShow 的方法。然后它创建并持行了与动作关联的过滤器(例如访问控制,基准测试)。如果过滤器
允许,动作将被执行。
6 动作从数据库中读取一个 ID 为 1 的 Post 模型。
7 动作通过 Post 模型渲染一个名为 show 的 视图。
8 视图读取并显示 Post 模型的属性。
9 视图执行一些 小物件。
10 视图的渲染结果被插入一个 布局。
11 动作完成视图渲染并将其呈现给用户。
第二部分:创建模型
>>>model Post tbl_post
在protected/models下创建名为Post.php的文件,关联数据表是tbl_post。
Post.php是AR类
每个 AR 类代表一个数据表(或视图),数据表(或视图)的列在 AR 类中体现为类的属性,一个 AR 实例则表
示表中的一行。
模型继承自CModel
---------------------------
tbl_post
id title content tags status create_timeupdate_time author_id
1 Welcome! This blog system is developed using Yii. It is meant
yii, blog 2 1230952187 12309521871
2 A Test Post Lorem ipsum dolor sit amet, consectetur adipisicing elit,
test 2 1230952187 12309521871
===========================================
向tbl_post表中插入一行
-------------------------------
$post=new Post; //Post实例,代表一行
$post->title='sample post'; //赋值
$post->content='post body content';
$post->save();
-------------------------------
创建控制器
>>>crud Post
在protected/controllers下生成PostController.php文件,关联类Post
控制器继承自:CController
工作流程
----------------
1 用户请求访问这个 URL http://www.example.com/blog/index.php?r=post;
2 入口脚本 被Web服务器执行,它创建并实例化了一个 应用 实例来处理此请求;
3 应用创建并执行了 PostController 实例;
4 PostController 实例通过调用它的 actionIndex() 方法执行了 index 动作。注意,如果用户没有在URL中指
定执行一个动作,则
index 就是默认的动作;
5 actionIndex() 方法查询数据库,带回最新的日志列表;
6 actionIndex() 方法使用日志数据渲染 index 视图。
-----------------
用户通过链接将数据传给控制器,控制器通过模型来获得数据,通过视图来包含数据。
-----------------
PostController.php
public function actionCreate()
{
$model=new Post;
if(isset($_POST['Post']))
{
$model->attributes=$_POST['Post'];
if($model->save())
$this->redirect(array('view','id'=>$model->id));
}
$this->render('create',array(
'model'=>$model,
));
}
CModel定义了魔术getter()和setter():getAttributes(),setAttributes(),用来自动读取,设置attributes
属性的值。
参考: 关于多继承层次的set魔术方法解析
render()加载protected/views/post/create.php视图,传递相应的值。
-------------------
create.php
<?php
$this->breadcrumbs=array(
'Posts'=>array('index'),
'Create',
);
$this->menu=array(
array('label'=>'List Post', 'url'=>array('index')),
array('label'=>'Manage Post', 'url'=>array('admin')),
);
?>
<h1>Create Post</h1>
<?php echo $this->renderPartial('_form', array('model'=>$model)); ?>
视图的属性是控制器定义的。
=================================================================
第三部分:视图
视图分两部分:布局和内容
-------------------------------------------
布局:protected/views/layouts
控制器载入布局
public $layout='//layouts/column2';
column2.php
<?php $this->beginContent('/layouts/main'); ?>
<div class="container">
<div class="span-18">
<div id="content">
<?php echo $content; ?>
</div><!-- content -->
</div>
<div class="span-6 last">
<div id="sidebar">
<?php if(!Yii::app()->user->isGuest) $this->widget('UserMenu'); ?> //如果是guest,不现实菜单
<?php $this->widget('TagCloud', array(
'maxTags'=>Yii::app()->params['tagCloudCount'],
)); ?>
<?php $this->widget('RecentComments', array(
'maxComments'=>Yii::app()->params['recentCommentCount'],
)); ?>
</div><!-- sidebar -->
</div>
</div>
<?php $this->endContent(); ?>
-------------------------------------------
内容:protected/views/post/
控制器加载视图,并把数据嵌入视图
public function actionIndex()
{
$dataProvider=new CActiveDataProvider('Post');
$this->render('index',array(
'dataProvider'=>$dataProvider,
));
}protected/views/post/index.php
<?php
$this->breadcrumbs=array( //breadcrumbs
'Posts',
);
$this->menu=array( //菜单项
array('label'=>'Create Post', 'url'=>array('create')),
array('label'=>'Manage Post', 'url'=>array('admin')),
);
?>
<h1>Posts</h1>
<?php $this->widget('zii.widgets.CListView', array(
'dataProvider'=>$dataProvider, //控制器的数据
'itemView'=>'_view', //显示具体项的方式
)); ?>
==============================
widget
protected/components
放全局的widget,widget是小块内容,显示在边栏,header等,非$content的材料。
-------------------------------
菜单项
protected/components/UserMenu.php
<?php
Yii::import('zii.widgets.CPortlet');
class UserMenu extends CPortlet
{
public function init()
{
$this->title=CHtml::encode(Yii::app()->user->name);
parent::init();
}
protected function renderContent()
{
$this->render('userMenu'); //widget使用的样式
}
}
-------------------------------
widget的样式
protected/components/views/userMenu.php
<ul>
<li><?php echo CHtml::link('Create New Post',array('post/create')); ?></li>
<li><?php echo CHtml::link('Manage Posts',array('post/admin')); ?></li>
<li><?php echo CHtml::link('Approve Comments',array('comment/index')) . ' (' . Comment::model()->pendingCommentCount . ')'; ?></li>
<li><?php echo CHtml::link('Logout',array('site/logout')); ?></li>
</ul>