本文总结了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:wwwrootlog)下的protected目录。application.modules.Admin.AdminModule表示应用程序目录(比如:d:wwwrootlogprotected)目录下的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:CWebUserCWebUser代表一个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:wwwrootlog目录下。则上面的值为d:wwwrootlogprotected。注意路径最后没有返斜杠。
echo Yii::app()->baseUrl;
如果项目目录在:d:wwwrootlog目录下。则上面的值为/blog。注意路径最后没有返斜杠。
(d:wwwroot为网站根目录),注意上面两个区别。一个是basePath,一个是baseUrl
其它(不一定正确)
在一个控制器A对应的A视图中,调用B模型中的方法,采用:B::model()->B模型中的方法名();
前期需要掌握的一些APICHtml
希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。