YiiFramework 随笔(五)

BLOG 1.5文档
在postcontroller.php
———————————
1.先执行actionList()
$pages=new CPagination($postCount); 声明一个类对象后,起分页作用
$pages->pageSize= 2;//这里设置每页显示几个
之后通过render直接把参数传递给list模版,之后通过$this->widget()再生成分页表格

views/post/list.php是模版
1. 它调用<?php $this->widget(‘CLinkPager’,array(‘pages’=>$pages)); ?>

2. 若想调用自定义的widget 通常在protected/components下
1> 在主模版(protected/views/layouts/main.php)中调用此小的模版。相当于把页面区块化
<?php $this->widget(‘UserMenu’,array(‘visible’=>!Yii::app()->user->isGuest)); ?>
2>定义一个总的类Portlet.php继承CWidget
每次运行的时候判定$this->visible的值,若为登陆才显示
且定义相应的css变量为$cssClass
定义一个空函数protected function renderContent()
3>再定义UserMenu.php,这个可以定义它自身的新功能并继承Portlet
protected/components/UserMenu.php
这里可以接收模版userMenu.php的回传值$_POST[‘command’]进行相应的判断
在这个新widget中定义protected function renderContent()转向到新的模版
再通过回调parent::init();在这个类Portlet 中重新定位renderContent(),使之转向到新模板的位置
4>其次在protected/components/views下定义其模版名为userMenu.php

系统自定义的widget有
CClipWidget CTabView using | http://www.yiiframework.com/doc/cookbook/8/
CFilterWidget
CFlexWidget you can see this (demos/phonebook/) for flash
CInputWidget using in table http://www.yiiframework.com/forum/index.php/topic,1387.msg7917.html#msg7917
CWidget
———————————————————-
actionCreate()
功能:创建新的blog
controller
1. $post = new Post; 这样可以声明相应的表对象,另外一个作用是接收form过来的所有信息
2. $_POST[‘previewPost’] 这个根据submitbutton而定名字(previewPost),若点击某按钮(previewPost),这个值就不为空
3. 通过$post->validate()或者$post->save()调用验证功能validate.返回错误提示代码
返回到tpl用 <?php echo CHtml::errorSummary($post); ?> 接收
4. $post->attributes=$_POST[‘Post’];进行数据安全性测试
在post.php 中function safeAttributes()函数定义了哪些文本框是可以接受它提交的数据的

templet
1.有一个技巧
先$this->render(‘create’,array(‘post’=>$post)); create的tpl中
而在create的tpl中,复用_form这个同一个模版。与update复用
2.添加了提交和预览两种按钮,但都是应用CHtml::submitButton()组件
预览:tpl <?php echo CHtml::submitButton(‘Preview’,array(‘name’=>’previewPost’)); ?>
<?php if(isset($_POST[‘zhaogongyu’]) && !$post->hasErrors()): ?>
<?php echo CHtml::encode($post->title); ?>
<?php endif; ?>
controller if(isset($_POST[‘previewPost’])){ $post->validate();}

models
post.php
下拉功能
1. 定义一个新函数,供tpl引用其内容可以出现下拉列表
const STATUS_DRAFT=0;
const STATUS_PUBLISHED=1;
const STATUS_ARCHIVED=2;
public function getStatusOptions()
{
return array(
self::STATUS_DRAFT=>’Draft’,
self::STATUS_PUBLISHED=>’Published’,
self::STATUS_ARCHIVED=>’Archived’,
);
}
2. _form.php tpl
<?php echo CHtml::activeDropDownList($post,’status’,Post::model()->statusOptions); ?>

添加form表中没有的项目到数据库中
1.protected function beforeValidate($on)
应用这个函数,可以在存储save和validate时候之前调用它,并且添加一些必要字段到数据库
$parser=new CMarkdownParser;
$this->contentDisplay=$parser->safeTransform($this->content); //过滤一下结果值,保证存入数据库后安全。之后赋给contentDisplay这个数据库字段,用于保存
注:出于安全考虑,虽然tpl中定义content的时候名字为 <?php echo CHtml::activeTextArea($post,’content’,array(‘rows’=>20, ‘cols’=>50)); ?>
tpl中若想预览content的值,要用$this->contentDisplay,不用$this->content

2. 同理加入创建时间字段,存入数据库
$this->createTime=$this->updateTime=time();
$this->authorId=Yii::app()->user->id;

3. Yii类中CActiveRecord 定义了$this->isNewRecord。来判断是否为一条新数据
若是新数据 返回为insert 否则返回update

4. 当save存储一个表后,需要存储与之相关的关联表。这时就可调用protected function afterSave()
if(($tag=Tag::model()->findByAttributes(array(‘name’=>$name)))===null)
{
$tag=new Tag(array(‘name’=>$name));
$tag->save();
}
$this->dbConnection->createCommand(“INSERT INTO PostTag (postId, tagId) VALUES ({$this->id},{$tag->id})”)->execute();

注意:

不可使用的数据库字段:url,与内部URL解析冲突

不可使用的model类名Clone,可能与PHP内置类冲突。


Technorati :



发表评论

您的电子邮箱地址不会被公开。

9 + 1 =