YiiFramework入门知识点总结(图文教程)
《PHP实战:YiiFramework入门知识点总结(图文教程)》要点: 本文总结了YiiFramework入门知识点.分享给大家供大家参考,具体如下:PHP应用 创建Yii应用骨架 web为网站根目录 通过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配置文件中的配置.如下: 'modules'=>array( 'admin'=>array(//这行的admin为Module ID.与创建Module时填写的Module ID大写写一致 'class'=>'application.modules.admin.AdminModule',//这里的admin在windows os中大小写无所谓,但最好与实际目录一致. ),), 路由 system表示yii框架的framework目录 控制器中的accessRules说明 /** * 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('@'),//表示认证用户 ),// 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 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办法 <?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; } } 更多相关: /* 由于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方法 /* * 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','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,'safe','on'=>'search'),); } 说明: 1、验证字段必须为用户输入的属性.不是由用户输入的内容,无需验证. yii_computer的News.php模型关于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,'max'=>128,'encoding'=>'utf-8'),'max'=>8000,array('author_name','max'=>10,array('status_id,type_id',// The following rule is used by search(). // Please remove those attributes that should not be searched. array('id,status_id',); } 视图中显示动态内容三种办法 1、直接在视图文件中以PHP代码实现.比如显示当前时间,在视图中:
代码如下:
<?php echo date("Y-m-d H:i:s");?>
2、在控制器中实现显示内容,通过render的第二个参数传给视图 控制器办法中包含: $theTime=date("Y-m-d H:i:s"); $this->render('helloWorld',array('time'=>$theTime)); 视图文件:
代码如下:
<?php echo $time;?>
调用的render()方法第二个参数的数据是一个array(数组类型),render()方法会提取数组中的值提供给视图脚本,数组中的 key(键值)将是提供给视图脚本的变量名.在这个例子中,数组的key(键值)是time,value(值)是$theTime则提取出的变量名$time是供视图脚本使用的.这是将控制器的数据传递给视图的一种方法. 3、视图与控制器是非常紧密的兄弟,所以视图文件中的$this指的就是渲染这个视图的控制器.修改前面的示例,在控制器中定义一个类的公共属性,而不是局部变量,它是值就是当前的日期和时间.然后在视图中通过$this拜访这个类的属性. 视图命名约定 视图文件命名,请与ActionID相同.但请记住,这只是个推荐的命名约定.其实视图文件名不必与ActionID相同,只需要将文件的名字作为第一个参数传递给render()就可以了. DB相关 $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)); 也可以使用$condition 指定更复杂的查询条件.不使用字符串,我们可以让$condition 成为一个CDbCriteria 的实例,它允许我们指定不限于WHERE 的条件.例如: $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、链接
代码如下:
<span class="tt"><?php echo CHtml::link(Controller::utf8_substr($val->title,26),array('prerfp/details','id'=>$val->rfpid),array('target'=>'_blank'));?></a> </span>
具体查找API文档:CHtml的link()办法
代码如下:
<span class="tt"><a target="_blank"? title="<?php echo $val->title;?>" href="<?php echo $this->createUrl('prerfp/details',array('id'=>$val->rfpid)) ;?>" ><?php echo Controller::utf8_substr($val->title,26); ?></a> </span>
具体请查找API文档:CController的createUrl()办法 以上两个连接效果等同 组件包含 一个示例: 在视图中底部有如下代码:
代码如下:
<?php $this->widget ( '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:wwwrootblog目录下.则上面的值为d:wwwrootblogprotected.注意路径最后没有返斜杠. echo Yii::app()->baseUrl; 如果项目目录在:d:wwwrootblog目录下.则上面的值为/blog.注意路径最后没有返斜杠. (d:wwwroot为网站根目录),注意上面两个区别.一个是basePath,一个是baseUrl 其它(不一定正确) 在一个控制器A对应的A视图中,调用B模型中的办法,采用:B::model()->B模型中的办法名(); 前期需要掌握的一些API 希望本文所述对大家基于Yii框架的PHP程序设计有所赞助. 编程之家培训学院每天发布《PHP实战:YiiFramework入门知识点总结(图文教程)》等实战技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培养人才。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |