本文总结了YiiFramework入门知识点。分享给大家供大家参考,具体如下:
创建Yii应用骨架
web为网站根目录
yiic webapp /web/demo
通过GII创建model和CURD时需要注意
1、Model Generator 操作
即使在有表前缀的情况下,Table Name中也要填写表的全名,即包括表前缀。如下图:
2、Crud Generator 操作
该界面中,Model Class中填写model名称。首字母大写。也可参照在生成model时,在proctected/models目录中通过model generator生成的文件名。如下图:
如果对news、newstype、statustype这三个表生成CURD控制器,则在Model Generator中,在Model Class中输入:News、newsType、StatusType。大小写与创建的文件名的大小写相同。如果写成NEWS或NeWs等都不可以。
创建模块注意事项
通过GII创建模块,Module ID一般用小写。无论如何,这里填写的ID决定main.php配置文件中的配置。如下:
1
|
2
3
4
5
|
'modules' => array (
'admin' => array ( //这行的admin为Module ID。与创建Module时填写的Module ID大写写一致
'class' => 'application.modules.admin.AdminModule' , //这里的admin在windows os中大小写无所谓,但最好与实际目录一致。
),
),
|
路由
system表示yii框架的framework目录
application表示创建的应用(比如d:\wwwroot\blog)下的protected目录。
application.modules.Admin.AdminModule
表示应用程序目录(比如:d:\wwwroot\blog\protected)目录下的modules目录下的Admin目录下的AdminModules.php文件(实际上指向的是该文件的类的名字)
system.db.*
表示YII框架下的framework目录下的db目录下的所有文件。
控制器中的accessRules说明
1
|
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
/**
* Specifies the access control rules.
* This method is used by the 'accessControl' filter.
* @return array access control rules
*/
public function accessRules()
{
return array (
array ( 'allow' , // allow all users to perform 'index' and 'view' actions
'actions' => array ( 'index' , 'view' ), //表示任意用户可访问index、view方法
'users' => array ( '*' ), //表示任意用户
),
array ( 'allow' , // allow authenticated user to perform 'create' and 'update' actions
'actions' => array ( 'create' , 'update' ), //表示只有认证用户才可操作create、update方法
'users' => array ( '@' ), //表示认证用户
),
array ( 'allow' , // allow admin user to perform 'admin' and 'delete' actions
'actions' => array ( 'admin' , 'delete' ), //表示只有用户admin才能访问admin、delete方法
'users' => array ( 'admin' ), //表示指定用户,这里指用户:admin
),
array ( 'deny' , // deny all users
'users' => array ( '*' ),
),
);
}
|
看以上代码注释。
user: represents the user session information.详情查阅API:CWebUser
CWebUser代表一个Web应用程序的持久状态。
CWebUser作为ID为user的一个应用程序组件。因此,在任何地方都能通过Yii::app()->user 访问用户状态
1
|
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public function beforeSave()
{
if (parent::beforeSave())
{
if ( $this ->isNewRecord)
{
$this ->password=md5( $this ->password);
$this ->create_user_id=Yii::app()->user->id; //一开始这样写,User::model()->user->id;(错误)
//$this->user->id;(错误)
$this ->create_time= date ( 'Y-m-d H:i:s' );
}
else
{
$this ->update_user_id=Yii::app()->user->id;
$this ->update_time= date ( 'Y-m-d H:i:s' );
}
return true;
}
else
{
return false;
}
}
|
getter方法或/和setter方法
1
|
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
<?php
/**
* UserIdentity represents the data needed to identity a user.
* It contains the authentication method that checks if the provided
* data can identity the user.
*/
class UserIdentity extends CUserIdentity
{
/**
* Authenticates a user.
* The example implementation makes sure if the username and password
* are both 'demo'.
* In practical applications, this should be changed to authenticate
* against some persistent user identity storage (e.g. database).
* @return boolean whether authentication succeeds.
*/
private $_id ;
public function authenticate()
{
$username = strtolower ( $this ->username);
$user =User::model()->find( 'LOWER(username)=?' , array ( $username ));
if ( $user ===null)
{
$this ->errorCode=self::ERROR_USERNAME_INVALID;
}
else
{
//if(!User::model()->validatePassword($this->password))
if (! $user ->validatePassword( $this ->password))
{
$this ->errorCode=self::ERROR_PASSWORD_INVALID;
}
else
{
$this ->_id= $user ->id;
$this ->username= $user ->username;
$this ->errorCode=self::ERROR_NONE;
}
}
return $this ->errorCode===self::ERROR_NONE;
}
public function getId()
{
return $this ->_id;
}
}
|
model/User.php
1
|
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public function beforeSave()
{
if (parent::beforeSave())
{
if ( $this ->isNewRecord)
{
$this ->password=md5( $this ->password);
$this ->create_user_id=Yii::app()->user->id; //====主要为此句。得到登陆帐号的ID
$this ->create_time= date ( 'Y-m-d H:i:s' );
}
else
{
$this ->update_user_id=Yii::app()->user->id;
$this ->update_time= date ( 'Y-m-d H:i:s' );
}
return true;
}
else
{
return false;
}
}
|
更多相关:
1
|
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
/*
由于CComponent是post最*父类,所以添加getUrl方法。。。。如下说明:
CComponent 是所有组件类的基类。
CComponent 实现了定义、使用属性和事件的协议。
属性是通过getter方法或/和setter方法定义。访问属性就像访问普通的对象变量。读取或写入属性将调用应相的getter或setter方法
例如:
$a=$component->text; // equivalent to $a=$component->getText();
$component->text='abc'; // equivalent to $component->setText('abc');
getter和setter方法的格式如下
// getter, defines a readable property 'text'
public function getText() { ... }
// setter, defines a writable property 'text' with $value to be set to the property
public function setText($value) { ... }
*/
public function getUrl()
{
return Yii::app()->createUrl( 'post/view' , array (
'id' => $this ->id,
'title' => $this ->title,
));
}
|
模型中的rules方法
1
|
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
/*
* rules方法:指定对模型属性的验证规则
* 模型实例调用validate或save方法时逐一执行
* 验证的必须是用户输入的属性。像id,作者id等通过代码或数据库设定的不用出现在rules中。
*/
/**
* @return array validation rules for model attributes.
*/
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array (
array ( 'news_title, news_content' , 'required' ),
array ( 'news_title' , 'length' , 'max' =>128),
array ( 'news_content' , 'length' , 'max' =>8000),
array ( 'author_name, type_id, status_id,create_time, update_time, create_user_id, update_user_id' , 'safe' ),
// The following rule is used by search().
// Please remove those attributes that should not be searched.
array ( 'id, news_title, news_content, author_name, type_id, status_id, create_time, update_time, create_user_id, update_user_id' , 'safe' , 'on' => 'search' ),
);
}
|
说明:
1、验证字段必须为用户输入的属性。不是由用户输入的内容,无需验证。
2、数据库中的操作字段(即使是由系统生成的,比如创建时间,更新时间等字段——在boyLee提供的yii_computer源码中,对系统生成的这些属性没有放在safe中。见下面代码)。对于不是表单提供的数据,只要在rules方法中没有验证的,都要加入到safe中,否则无法写入数据库。
yii_computer的News.php模型关于rules方法
1
|
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
/**
* @return array validation rules for model attributes.
*/
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array (
array ( 'news_title, news_content' , 'required' ),
array ( 'news_title' , 'length' , 'max' =>128, 'encoding' => 'utf-8' ),
array ( 'news_content' , 'length' , 'max' =>8000, 'encoding' => 'utf-8' ),
array ( 'author_name' , 'length' , 'max' =>10, 'encoding' => 'utf-8' ),
array ( 'status_id, type_id' , 'safe' ),
// The following rule is used by search().
// Please remove those attributes that should not be searched.
array ( 'id, news_title, news_content, author_name, type_id, status_id' , 'safe' , 'on' => 'search' ),
);
}
|
视图中显示动态内容三种方法
1、直接在视图文件中以PHP代码实现。比如显示当前时间,在视图中:
2、在控制器中实现显示内容,通过render的第二个参数传给视图
控制器方法中包含:
1
|
2
|
$theTime = date ( "Y-m-d H:i:s" );
$this ->render( 'helloWorld' , array ( 'time' => $theTime ));
|
视图文件:
调用的render()方法第二个参数的数据是一个array(数组类型),render()方法会提取数组中的值提供给视图脚本,数组中的 key(键值)将是提供给视图脚本的变量名。在这个例子中,数组的key(键值)是time,value(值)是$theTime则提取出的变量名$time是供视图脚本使用的。这是将控制器的数据传递给视图的一种方法。
3、视图与控制器是非常紧密的兄弟,所以视图文件中的$this指的就是渲染这个视图的控制器。修改前面的示例,在控制器中定义一个类的公共属性,而不是局部变量,它是值就是当前的日期和时间。然后在视图中通过$this访问这个类的属性。
视图命名约定
视图文件命名,请与ActionID相同。但请记住,这只是个推荐的命名约定。其实视图文件名不必与ActionID相同,只需要将文件的名字作为第一个参数传递给render()就可以了。
DB相关
1
|
2
3
4
5
6
|
$Prerfp = Prerfp::model()->findAll(
array (
'limit' => '5' ,
'order' => 'releasetime desc'
)
);
|
1
|
2
3
4
5
6
7
8
9
10
|
$model = Finishrfp::model()->findAll(
array (
'select' => 'companyname,title,releasetime' ,
'order' => 'releasetime desc' ,
'limit' => 10
)
);
foreach ( $model as $val ){
$noticeArr [] = " 在" . $val ->title. "竞标中," . $val ->companyname. "中标。" ;
}
|
1
|
2
3
4
5
6
7
8
9
10
11
12
|
$model = Cgnotice::model()->findAll (
array (
'select' => 'status,content,updatetime' ,
'condition' => 'status = :status ' ,
'params' => array ( ':status' =>0),
'order' => 'updatetime desc' ,
'limit' => 10
)
);
foreach ( $model as $val ){
$noticeArr [] = $val ->content;
}
|
1
|
|
$user =User::model()->find( 'LOWER(username)=?' , array ( $username ));
|
1
|
2
3
|
$noticetype = Dictionary::model()->find( array (
'condition' => '`type` = "noticetype"' )
);
|
1
|
2
|
// 查找postID=10 的那一行
$post =Post::model()->find( 'postID=:postID' , array ( ':postID' =>10));
|
也可以使用$condition 指定更复杂的查询条件。不使用字符串,我们可以让$condition 成为一个CDbCriteria 的实例,它允许我们指定不限于WHERE 的条件。例如:
1
|
2
3
4
5
|
$criteria = new CDbCriteria;
$criteria ->select= 'title' ; // 只选择'title' 列
$criteria ->condition= 'postID=:postID' ;
$criteria ->params= array ( ':postID' =>10);
$post =Post::model()->find( $criteria ); // $params 不需要了
|
注意,当使用CDbCriteria 作为查询条件时,$params 参数不再需要了,因为它可以在CDbCriteria 中指定,就像上面那样。
一种替代CDbCriteria 的方法是给find 方法传递一个数组。数组的键和值各自对应标准(criterion)的属性名和值,上面的例子可以重写为如下:
1
|
2
3
4
5
|
$post =Post::model()->find( array (
'select' => 'title' ,
'condition' => 'postID=:postID' ,
'params' => array ( ':postID' =>10),
));
|
其它
1、链接
具体查找API文档:CHtml的link()方法
打开protected/components下的Notice.php文件,内容如下:
1
|
2
3
4
5
6
7
8
9
|
<?php
Yii::import( 'zii.widgets.CPortlet' );
class Banner extends CPortlet
{
protected function renderContent()
{
$this ->render( 'banner' );
}
}
|
渲染的视图banner,是在protected/components/views目录下。
具体查看API,关键字:CPortlet
获取当前host
1
|
2
3
4
5
|
Yii::app()->request->getServerName();
//and
$_SERVER [ 'HTTP_HOST' ];
$url = ' http:// ' .Yii::app()->request->getServerName(); $url .= CController::createUrl( 'user/activateEmail' , array ( 'emailActivationKey' => $activationKey ));
echo $url ;
|
关于在发布新闻时添加ckeditor扩展中遇到的情况
1
|
2
3
4
5
6
7
8
|
$this ->widget( 'application.extensions.editor.CKkceditor' , array (
"model" => $model , # Data-Model
"attribute" => 'news_content' , # Attribute in the Data-Model
"height" => '300px' ,
"width" => '80%' ,
"filespath" =>Yii::app()->basePath. "/../up/" ,
"filesurl" =>Yii::app()->baseUrl. "/up/" ,
);
|
echo Yii::app()->basePath
如果项目目录在:d:\wwwroot\blog目录下。则上面的值为d:\wwwroot\blog\protected。注意路径最后没有返斜杠。
echo Yii::app()->baseUrl;
如果项目目录在:d:\wwwroot\blog目录下。则上面的值为/blog。注意路径最后没有返斜杠。
(d:\wwwroot为网站根目录),注意上面两个区别。一个是basePath,一个是baseUrl
其它(不一定正确)
在一个控制器A对应的A视图中,调用B模型中的方法,采用:B::model()->B模型中的方法名();
前期需要掌握的一些API
CHtml
希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。