您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

YiiFramework的入门知识点总结

2024/2/21 12:55:21发布29次查看
这篇文章主要介绍了yiiframework入门知识点,结合图文形式总结分析了yiiframework创建的具体步骤及使用的相关注意事项,需要的朋友可以参考下
本文总结了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配置文件中的配置。如下:
'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说明
/** * 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 访问用户状态
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 propertypublic 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', '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方法
/** * @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代码实现。比如显示当前时间,在视图中:
<?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,0,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,0,26); ?></a> </span>
具体请查找api文档:ccontroller的createurl()方法
以上两个连接效果等同
组件包含
一个示例:
在视图中底部有如下代码:
<?php $this->widget ( 'notice' ); ?>
打开protected/components下的notice.php文件,内容如下:
<?phpyii::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 framework框架获取分类下面的所有子类的方法
以上就是yiiframework的入门知识点总结的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product