Home >Backend Development >PHP Tutorial >Summary of YiiFramework entry knowledge points (graphic tutorial), yiiframework knowledge points_PHP tutorial
This article summarizes the introductory knowledge points of YiiFramework. Share it with everyone for your reference, the details are as follows:
Create Yii application skeleton
web is the root directory of the website
yiic webapp /web/demo
You need to pay attention when creating models and CURD through GII
1. Model Generator operation
Even if there is a table prefix, the full name of the table must be filled in Table Name, that is, including the table prefix. As shown below:
2. Crud Generator operation
In this interface, fill in the model name in Model Class. Capitalize first letter. You can also refer to the file name generated by the model generator in the proctected/models directory when generating the model. As shown below:
If you generate a CURD controller for the three tables of news, newstype, and statustype, in the Model Generator, enter: News, newsType, and StatusType in the Model Class. The case is the same as that of the created file name. It is not acceptable if it is written as NEWS or News.
Notes on creating modules
Create a module through GII, and the Module ID is generally in lowercase. In any case, the ID filled in here determines the configuration in the main.php configuration file. As follows:
'modules'=>array( 'admin'=>array(//这行的admin为Module ID。与创建Module时填写的Module ID大写写一致 'class'=>'application.modules.admin.AdminModule',//这里的admin在windows os中大小写无所谓,但最好与实际目录一致。 ), ),
Routing
system represents the framework directory of the yii framework
application represents the protected directory under the created application (such as d:wwwrootblog).
application.modules.Admin.AdminModule
Represents the AdminModules.php file in the Admin directory under the modules directory under the application directory (for example: d:wwwrootblogprotected) (actually pointing to the name of the class of the file)
system.db.*
Represents all files in the db directory in the framework directory under the YII framework.
AccessRules description in controller
/** * 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('*'), ), ); }
See the code comments above.
user: represents the user session information. For details, please refer to API: CWebUser
CWebUser represents the persistent state of a web application.
CWebUser serves as an application component with the ID user. Therefore, user status can be accessed from anywhere via Yii::app()->user
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 method or/and setter method
<?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
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; } }
More related:
/* 由于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, )); }
The rules method in the model
/* * 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'), ); }
Description:
1. The verification field must be an attribute entered by the user. Content not entered by the user does not require validation.
2. Operation fields in the database (even if they are generated by the system, such as creation time, update time and other fields - in the yii_computer source code provided by boyLee, these attributes generated by the system are not placed in safe. See the code below). For data that is not provided by the form, as long as it is not verified in the rules method, it must be added to safe, otherwise it cannot be written to the database .
yii_computer’s News.php model about rules method
/** * @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'), ); }
Three ways to display dynamic content in the view
1. Implement it directly in PHP code in the view file. For example, to display the current time in the view: Copy code The code is as follows:4000c8f71a5968bbf98347f8d215530b
2. Implement the display content in the controller and pass it to the view through the second parameter of render
The controller method contains:
$theTime=date("Y-m-d H:i:s"); $this->render('helloWorld',array('time'=>$theTime));
View file:
Copy code The code is as follows:83836f31ba8ca844667ba20694e24f83
The data in the second parameter of the called render() method is an array (array type). The render() method will extract the values in the array and provide them to the view script. The keys in the array will be provided to the view script. variable name. In this example, the key of the array is time and the value is $theTime. The extracted variable name $time is used by the view script. This is a way to pass data from the controller to the view.
3. Views and controllers are very close brothers, so $this in the view file refers to the controller that renders this view. Modify the previous example and define a public property of the class in the controller instead of a local variable whose value is the current date and time. Then access the properties of this class through $this in the view.
View naming convention
View file name, please be the same as ActionID. But remember, this is just a recommended naming convention. In fact, the view file name does not have to be the same as the ActionID. You only need to pass the file name as the first parameter to render().
DB related
$Prerfp = Prerfp::model()->findAll( array( 'limit'=>'5', 'order'=>'releasetime desc' ) );
$model = Finishrfp::model()->findAll( array( 'select' => 'companyname,title,releasetime', 'order'=>'releasetime desc', 'limit' => 10 ) ); foreach($model as $val){ $noticeArr[] = " 在".$val->title."竞标中,".$val->companyname."中标。"; }
$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; }
$user=User::model()->find('LOWER(username)=?',array($username));
$noticetype = Dictionary::model()->find(array( 'condition' => '`type` = "noticetype"') );
// 查找postID=10 的那一行 $post=Post::model()->find('postID=:postID', array(':postID'=>10));
You can also use $condition to specify more complex query conditions. Instead of using a string, we can make $condition an instance of CDbCriteria, which allows us to specify conditions that are not limited to WHERE. For example:
$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)的属性名和值,上面的例子可以重写为如下:
$post=Post::model()->find(array( 'select'=>'title', 'condition'=>'postID=:postID', 'params'=>array(':postID'=>10), ));
其它
1、链接
复制代码 代码如下:7c505248a490ae1463d77b05928ad0d56e7c809d23c61c5458f5ff9644fd2464title,0,26),array('prerfp/details','id'=>$val->rfpid),array('target'=>'_blank'));?>5db79b134e9f6b82c0b36e0489ee08ed 54bdf357c58b8a65c66d7c19c8e4d114
具体查找API文档:CHtml的link()方法
复制代码 代码如下:7c505248a490ae1463d77b05928ad0d5f9a806777b25b024e5601a9bbe618c1ftitle;?>" href="bada38b8104438857964ce6857a93dc1createUrl('prerfp/details',array('id'=>$val->rfpid)) ;?>" >2f277e33591d2311455909a32f4d08c5title,0,26); ?>5db79b134e9f6b82c0b36e0489ee08ed 54bdf357c58b8a65c66d7c19c8e4d114
具体请查找API文档:CController的createUrl()方法
以上两个连接效果等同
组件包含
一个示例:
在视图中底部有如下代码:
复制代码 代码如下:bead0c01d72484362dad3d97d7ac2310widget ( 'Notice' ); ?>
打开protected/components下的Notice.php文件,内容如下:
<?php Yii::import('zii.widgets.CPortlet'); class Banner extends CPortlet { protected function renderContent() { $this->render('banner'); } }
渲染的视图banner,是在protected/components/views目录下。
具体查看API,关键字:CPortlet
获取当前host
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扩展中遇到的情况
$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程序设计有所帮助。