這篇文章主要介紹了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 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', '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文件,内容如下:
<?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
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
关于Yii
Framework框架获取分类下面的所有子类的方法
以上是YiiFramework的入門知識點總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!