天天看點

Yii學習

參考網址

http://www.yiieye.com/book_cn/chapter17.html

http://www.yiiframework.com/doc/cookbook/

http://www.yiiframework.com/doc/guide/zh_cn/form.view

http://www.yiiframework.com/doc/api/CBaseController

protected/controllers/sitecontroller.php 控制檔案

protected/components/UserIdentity.php 使用者認證

protected/models/LoginForm.php 表單檔案 相當于邏輯層,進行權限控制 資料的判斷等

protected/views/site/login.php 模版檔案

修改已有登陸登出框流程

1. 在siteController.php

actionLogin() actionLogout()

2. 模版 view/site/login.php

//這樣給form增加其他屬性

<?php echo CHtml::beginForm('',$method='post',array("id"=>"signupForm")); ?>

//給其他文本元件增加屬性

<?php echo CHtml::activeTextField($form,'username',array("class"=>"required","minlength"=>"3")) ?>

3. 登陸要填寫的内容表單

models/LoginForm.php 與之相關的檔案是 componets/userIdentity.php 這裡進行取庫和使用者名的認證

$user=PROFILE::model()->find('LOWER(EMAIL)=?',array(strtolower($this->username)));

4. 主模版檔案 views/layout/main.php

-------------------------------------------------------------------------------------------------

單個檔案展開分析說明: sitecontroller.php

-------------------------------------------------------------------------------------------------

1. 存取資料庫方法

http://www.yiieye.com/book_cn/chapter21.html

存儲第一種(SAVE )

存表時候用到

例子:

$post=new Post;

$post->title='sample post';

$post->content='content for the sample post';

$post->createTime=time();/$post->createTime=new CDbexpression_r('NOW()');

$post->save();

$user_field_data= new user_field_data;

$user_field_data->flag=0;

$user_field_data->user_id=$profile->id;

$user_field_data->field_id=$_POST['emailhiden'];

$user_field_data->value1=$_POST['email'];

$user_field_data->save();

注:當一個表存儲4次的時候,需要建立4個handle new4次

存儲第二種(存儲)

存儲後我們需要找到這條記錄的流水id 這樣做 $profile = new profile; $profile->id;

存儲第三種 用于更加安全的方法,來綁定變量類型 這樣可以在同一個表中存儲兩個記錄

$sql="insert into user_field_data(user_id,field_id,flag,value1) values(:user_id,:field_id,:flag,:value1);";

$command=user_field_data::model()->dbConnection->createCommand($sql);

$command->bindParam(":user_id",$profile->id,PDO::PARAM_INT);

$command->bindParam(":field_id",$_POST['firstnamehiden'],PDO::PARAM_INT);

$command->bindParam(":flag",$tmpflag,PDO::PARAM_INT);

$command->bindParam(":value1",$_POST['firstname'],PDO::PARAM_STR);

$command->execute();

$command->bindParam(":user_id",$profile->id,PDO::PARAM_INT);

$command->bindParam(":field_id",$_POST['emailhiden'],PDO::PARAM_INT);

$command->bindParam(":flag",$tmpflag,PDO::PARAM_INT);

$command->bindParam(":value1",$_POST['email'],PDO::PARAM_STR);

$rowchange = $command->execute();

// 用來判斷

if( $rowchange != 0){ 修改成功 }

注:update delete都可以用這個方法

$sql="delete from profile where id=:id";

$command=profile::model()->dbConnection->createCommand($sql);

$command->bindParam(":id",$userid,PDO::PARAM_INT);

$this->rowflag=$command->execute();

$sql="update profile set pass=:pass,role=:role where id=:id";

$command=profile::model()->dbConnection->createCommand($sql);

$command->bindParam(":pass",$password,PDO::PARAM_STR);

$command->bindParam(":role",$role,PDO::PARAM_INT);

$command->bindParam(":id",$userid,PDO::PARAM_INT);

$this->rowflag=$command->execute();

// 同理變更updateAll()模式

$sql="update user_field_data set flag = :flag where user_id= :user_id and field_id= :field_id ";

//原始sql語句

$criteria = new CDbCriteria;

$criteria->condition = 'user_id = :user_id and field_id= :field_id';

$criteria->params = array(':user_id' => $userid,':field_id' => $fieldid);

$arrupdate = array('flag' => $flag);

if(user_field_data::model()->updateAll($arrupdate,$criteria) != 0)

{

更新成功後。。。

}

第四種更新和存儲應用同一個handle 流程:先查詢記錄是否存在,若存在就更新,不存在就新建立

注:1.第一次查詢的變量,要跟save()前的變量一緻。

2.存儲時候需要再次 new一下庫對象

$user_field_data = user_field_data::model()->findByAttributes(

$attributes = array('user_id' => Yii::app()->user->user_id, 'field_id' => $key));

if ($user_field_data !== null)

{

$user_field_data->value1 = $value;

$user_field_data->save();

}

else

{

$user_field_data = new user_field_data;

$user_field_data->user_id = Yii::app()->user->user_id;

$user_field_data->field_id = $key;

$user_field_data->value1 = $value;

$user_field_data->save();

}

2、查詢資料

注:當項目沒查找到整個對象會為空需要這樣判定

if($rows !== null) 當對象不為空

{

return true;

}else{

return false;

}

SELECT

讀表時候用到

第一種find()

// find the first row satisfying the specified condition

$post=Post::model()->find($condition,$params);

// find the row with postID=10

$post=Post::model()->find('postID=:postID', array(':postID'=>10));

同樣的語句,用另種方式表示

$criteria=new CDbCriteria;

$criteria->select='title'; // only select the 'title' column

$criteria->condition='postID=:postID';

$criteria->params=array(':postID'=>10);

$post=Post::model()->find($criteria); // $params is not needed

第二種 find()

$post=Post::model()->find(array(

'select'=>'title',

'condition'=>'postID=:postID',

'params'=>array(':postID'=>10),

));

// find the row with the specified primary key

$post=Post::model()->findByPk($postID,$condition,$params);

// find the row with the specified attribute values

$post=Post::model()->findByAttributes($attributes,$condition,$params);

示例:第一種 findByAttributes()

$checkuser = user_field_data::model()->findByAttributes(

array('user_id' => Yii::app()->user->user_id, 'field_id' => $fieldid));

第二種 findByAttributes()

$checkuser = user_field_data::model()->findByAttributes(

$attributes = array('user_id' => Yii::app()->user->user_id, 'field_id' => $fieldid));

第三種 當沒有conditions時候,不用params

$user_field_data = user_field_data::model()->findAllByAttributes(

$attributes = array('user_id' => ':user_id'),

$condition = "field_id in (:fields)",

$params = array(':user_id' => Yii::app()->user->user_id, ':fields' => "$rule->dep_fields"));

// find the first row using the specified SQL statement

$post=Post::model()->findBySql($sql,$params);

例子

user_field_data::model()->findBySql("select id from user_field_data where user_id = :user_id and field_id = :field_id ", array(':user_id' => $userid,':field_id'=>$fieldid));

此時回傳的是一個對象

第四種 添加其他條件

http://www.yiiframework.com/doc/api/CDbCriteria#limit-detail

$criteria = new CDbCriteria;

$criteria->select ='newtime'; //選擇隻顯示哪幾個字段要與庫中名字相同,但是不能COUNT(newtime) as name這樣寫

$criteria->join = 'LEFT JOIN Post ON Post.id=Date.id';

1. 先要在relation函數中增加與Post表的關系語句

2. Date::model()->with('post')->findAll($criteria)

$criteria->group = 'newtime';

$criteria->limit = 2; // 都是從0開始,選取幾個

$criteria-> offset = 2;// 從哪個偏移量開始

print_r(Date::model()->findAll($criteria));

得到行數目或者其他數目 count

// get the number of rows satisfying the specified condition

$n=Post::model()->count($condition,$params);

// get the number of rows using the specified SQL statement

$n=Post::model()->countBySql($sql,$params);

// check if there is at least a row satisfying the specified condition

$exists=Post::model()->exists($condition,$params);

3、更新(UPDATE)

例子:

$post=Post::model()->findByPk(10);

$post->title='new post title';

$post->save(); // save the change to database

// update the rows matching the specified condition

Post::model()->updateAll($attributes,$condition,$params);

例子:或者參考上面例子

$c=new CDbCriteria;

$c->condition='something=1';

$c->limit=10;

$a=array('name'=>'NewName');

Post::model()->updateAll($a, $c);

// update the rows matching the specified condition and primary key(s)

Post::model()->updateByPk($pk,$attributes,$condition,$params);

例子

$profile = profile::model()->updateByPk(

Yii::app()->user->user_id,

$attributes = array('pass' => md5($_POST['password']), 'role' => 1));

// update counter columns in the rows satisfying the specified conditions

Post::model()->updateCounters($counters,$condition,$params);

4、删除(DELETE)

例子:

$post=Post::model()->findByPk(10); // assuming there is a post whose ID is 10

$post->delete(); // delete the row from the database table

// delete the rows matching the specified condition

Post::model()->deleteAll($condition,$params);

// delete the rows matching the specified condition and primary key(s)

Post::model()->deleteByPk($pk,$condition,$params);

5、比較(COMPARE)

目前可以取出的

1. $allquestion=field::model()->findAllBySql("select label from field where step_id = :time1 ", array(':time1' =>1));

2.

$criteria=new CDbCriteria;

$criteria->select='label,options';

$criteria->condition='step_id=:postID';

$criteria->params=array(':postID'=>1);

$allquestion=field::model()->findAll($criteria);

$allquestion=field::model()->find("",array("label"));

可以與在models檔案夾中的 庫連接配接檔案relations()函數合用,這樣可以聯合查詢

$criteria=new CDbCriteria;

$criteria->condition='field.step_id=1';

$this->_post=field::model()->with('step')->findAll($criteria);

這樣出來的數組裡面包含step表中的值,且這個值的條件為 step.id=field.step_id

public function relations()

{

return array(

'step'=>array(self::BELONGS_TO, 'step', 'step_id'),

);

}

---------------------------------------------------------------------------

UserIdentity.php

---------------------------------------------------------------------------

class UserIdentity extends CUserIdentity{}

進行對資料庫的校驗密碼且複制給$this->_id=$user->id; 表示使用者狀态為登陸

注: 任何登陸的程式設計都要繼承此檔案,單獨建立檔案即使繼承的類都一樣,但yii是不認可的

$identity=new UserIdentity($forms->email,'ethos');

$identity->authenticate();

Yii::app()->user->login($identity);

---------------------------------------------------------------------------

LoginForm.php

---------------------------------------------------------------------------

這些在models下用來定義文本框符合各種條件

class LoginForm extends CFormModel{

rules() attributeLabels() authenticate()

}

function rules(){

array('username', 'email'),//調用js認證

array('password', 'authenticate'),//調用下一個函數

}

---------------------------------------------------------------------------

login.php

---------------------------------------------------------------------------

1.

//這樣給form增加其他屬性

<?php echo CHtml::beginForm('',$method='post',array("id"=>"signupForm")); ?>

//給其他文本元件增加屬性觸發js函數

<?php echo CHtml::activeTextField($form,'username',array("class"=>"required","minlength"=>"3")) ?>

<?php echo CHtml::submitButton('Login',array ("onclick"=>"testok()")); ?> //testok() 為js函數

<?php echo CHtml::submitButton('Login',array ("onclick"=>"alert(\"sam\");return false;")); ?>

<?php echo CHtml::activeLabel($post,$post->label); ?>

<?php echo CHtml::activeTextField($post,'label',array('size'=>65,'maxlength'=>128)); ?>

<?php echo CHtml::activeTextField($post,'content',array('rows'=>20, 'cols'=>50)); ?>

label或者 content是目前表的列名字這個很重要相當于顯示資料對象中的某個屬性

可以輸出資料庫的值

<?php foreach($post as $n=>$model): ?>

<?php echo CHtml::activeLabel($model,'label'); ?>

<?php echo CHtml::textField('firstname','',array("class"=>"required","minlength"=>"3")) ?>

<?php endforeach; ?>

注:若需要從資料庫傳值到input元件需要用CHtml::textField

僅僅是需要錄入資訊,且背景取得用這個就行 CHtml::textField('username','',array("class"=>"required","minlength"=>"3"));

2. 關于用JQuery驗證文本框的改寫說明

用jquery的validate插件控制文本框輸入格式(http://bassistance.de/jquery-plugins/jquery-plugin-validation/)

js中要寫

signupForm 為表單id

$().ready(function() {

// validate the comment form when it is submitted

$("#commentForm").validate();

// validate signup form on keyup and submit

$("#signupForm").validate({

});

});

php中要添加 要求此字段的輸入要求

<?php echo CHtml::activeTextField($form,'username',array("class"=>"required","minlength"=>"3")) ?>

注:jquery.validate.js中

defaults: {

messages: {},

groups: {},

rules: {},

errorClass: "errorjs", 原來是error現在時errorjs 不然與yii的錯誤提示沖突

=====================================================================================

用rule 存資料庫

http://www.yiiframework.com/doc/guide/database.arr

當 資料庫的php

public function rules()

{

return array(

array('email','length','max'=>40),

array('pass','length','max'=>255),

array('role', 'required'),

array('role, overall_percent, overall_time', 'numerical', 'integerOnly'=>true),

);

}

在controller時候需要

在rule的required的時候 都需要指派。 overall_percent,overall_time遵循 role的原則

$profile = new profile;

$profile->email=$_POST['email'];

$profile->firstname=$_POST['firstname'];

$profile->role=0;

$profile->overall_time=0;

$profile->overall_percent=0;

$zipcode = $this->zipPlace($_POST['zipcode']);

echo $zipcode->state;

var_dump($profile->save());

注 當一個表存儲4次的時候,需要建立4個handle new4次

--------------------------------------------------------------------------------------------------

在登陸驗證時候增加額外項給Yii::app()->user->lastTime

在UserIdentity.php中

class UserIdentity extends CUserIdentity

{

$this->setState('lastTime',$user->lastTime);

}

前台就可以調用Yii::app()->user->lastTime

隻有這樣添加的新值,才能在程式中這樣任意重複指派。預設的值不可,比如Yii::app()->user->username

Yii::app()->user->lastTime='1';

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

$form->validate()如何起作用的說明

1. StartForm.php中 我們定義了各個文本框的 rules()

2. 需要在controller中調用, 先聲明這個文本框

$forms=new StartForm;

// 要把回傳函數這些屬性給$forms這個對象

$forms->firstname=$_POST['firstname'];

$forms->firstname=$_POST['email'];

$forms->firstname=$_POST['zipcode'];

$forms->firstname=$_POST['perstatus'];

//調用php端的文本校驗

if($forms->validate()){

XXXXXX

}

3. 同理為LoginForm

$form=new LoginForm;

if(isset($_POST['LoginForm']))

{

$form->attributes=$_POST['LoginForm'];//回傳函數這些屬性給form

if($form->validate()){

}

}

4. 當進入到validate的時候我們仍然需要增加邏輯來确認每個文本框需要認證的屬性

-----------------------------------------------------------------------------------------------------------------------------------------------------

yii的session可以這樣設定

1. 程式中可以這樣調用 Yii::app()->session[$var]=$value;

2. 若main.php

定義後 'session' => array(

'class' => 'system.web.CDbHttpSession',

'connectionID' => 'db', ),

當運作第一次網站時候系統會建立yiisession的表,session自動存儲在庫的yiisession表内

3. 而庫連接配接可以這樣

'db'=>array(

// 'connectionString'=>'Your DSN',

'connectionString'=>'mysql:host=localhost;dbname=testnewtax',

'username'=>'root',

'password'=>'adminzhao',

),

4. 在main.php中 增加參數檔案 params.php (這個檔案是與main.php平行結構 放到檔案夾中)

'params'=>require(dirname(__FILE__).'/params.php'),

在程式裡可以這樣引用

----------------------------------------------------------------------------------------

yii 傳回的位址也可以這樣寫

1. Yii::app()->user->returnUrl = Yii::app()->getBaseUrl()."/step/show/id/1";

$this->redirect(Yii::app()->user->returnUrl);

2. $this->redirect(array('step/show','id'=>1));

3. $this->render('index',array('post'=>$questions));

4. $this->renderPartial('field_show',array('field'=>$field,'key'=>++$key,));

注意:有的時候$this->render、$this->redirect在同一個action中應用,程式會報錯原因如下

1.當我們建立新的form的時候 我們應用2中方法,

1》FillForm.php class FillForm extends CFormModel 這樣可以把這個表單中每個項目用php進行核查是否符合規則,在FillForm.php public function rules()中建立規則

2》直接在繼承資料庫表時候建立表單的核查規則 Post.php (post是庫中的表)class Post extends CActiveRecord 在Post.php 中 public function rules() 中建立規則

2. 在繼承CFormModel類後同一個action中就不能同時出現$this->render、$this->redirect,否則會報錯

變通辦法如下在controller中建立2個action對應一個form

public function actionFill()

{

$form=new FillForm;

$this->render('fill',array('form'=>$form));

}

public function actionUpdatePass()

{

if(isset($_POST['password']))

{

//XXX

$this->redirect(array('step/show','id'=>1));

}

else

$this->refresh();

}

}

在tpl中設定 <?php echo CHtml::beginForm('UpdatePass',$method='post',array("id"=>"fillForm")); ?>

----------------------------------------------------------------------------------------

彈出視窗 目前有個問題就是彈出的視窗路徑是相對于現在的controller的無法調到另外路徑下

1. 在ptl檔案中 輸入 <?php echo CHtml::linkButton('popup',array ("onclick"=>"startAlert()")); ?>

2. js檔案 function startAlert(){ window.open('fillpass'); }

3. sitecontroller.php public function actionFillpass(){ $this->render('fillpass'); }

4. 建立fillpass的tpl themes/views/site/fillpass.php

--------------------------------------------------------------------------------------------------------------------------------------------------------

删除按鈕 帶确認項

---------------------------------------------------------------------------------------------------------------------------------------------------------

1. 在tpl中

<?php

echo CHtml::Button('cancel', array (

'submit' => 'DeleteUser',

'params' => '',

'confirm'=>'Are you sure?'

))

?>

//這樣寫就可以傳送參數用get方法接收

$this->redirect(array('category/show',array('id'=>1,'rule_id'=>'1')));

2. 原始代碼

<?php echo CHtml::linkButton('Logout',array(

'submit'=>'',

'params'=>array('command'=>'logout'),

));

?>

<?php echo CHtml::Button('Delete', array (

'submit' => $this->createUrl('post/delete',$this->getReturnParams()),

'params' => array('id'=>123),

'confirm'=>'Are you sure?'

))

?>

------------------------------------------------------------------------------------------------------------------------------------------------

代碼可以先取出使用者已經選的選項,再指派到前台頁面中

------------------------------------------------------------------------------------------------------------------------------------------------

<?php foreach($options = $tempradio as $key => $value): ?>

<?php

if ($field->value == $key)

echo "<span class='radio'>",CHtml::radioButton($field->id, true, array("class" => "noborder", "value" => $key)),$value,"</span>";

else

echo "<span class='radio'>",CHtml::radioButton($field->id, false, array("class" => "noborder", "value" => $key)),$value,"</span>";

?>

<?php endforeach; ?>

--------------------------------------------------------------------------------------------------------------------------------

tpl調用jquery的AJAX

--------------------------------------------------------------------------------------------------------------------------------

1.tpl中 調用js中的函數startAlert()

<?php echo CHtml::Button('Flag', array("id" => "cb_btn_$field->id", "name" => "cb_btn_$field->id", "onclick" => "startAlert('$field->id')"));?>

2.js中

function startAlert(id){

$.ajax({

type: "POST",

url: "../../Change",

data: "id="+id+"&location=Boston",

success: function(msg){

//alert( "Data Saved: " + msg );

document.getElementById('cb_'+id).innerHTML=msg;

}

});

}

注意:data傳遞參數是post且格式如下"id="+id+"&location=Boston" 可以傳遞N個變量 url :填寫路徑是有技巧的

1. 當URL路徑 trunk/bo/index.php/category/show/id/1 意義為 在categorycontroller下的 actionshow中 id是參數名 1 為參數值這樣時候 AJAX需要寫"../../Change" 網上遞歸兩層

2. 當URL路徑 trunk/bo/index.php/category/fill 意義為 在categorycontroller下的 actionfill中這樣時候 AJAX需要寫"Change" 不需要遞歸

--------------------------------------------------------------------------------------------------------------------------------------------

main.php 裡面的内容包括

--------------------------------------------------------------------------------------------------------------------------------------------

1》 params 檔案的應用

1.protected/config/main.php 中進入這個檔案'params' => include(dirname(__FILE__) . '/params.php')

相當于引入了一些全局靜态變量到系統中

2. 實際的操作方法為。在tpl檔案中可以引用 Yii::app()->params['TEXT_TYPE']

2》 http://www.yiiframework.com/doc/guide/zh_cn/topics.url

設定網頁上的URL 把帶問号的參數?r=site/login,變成/組成的URL

opentax/trunk/bo/index.php?r=site/login ====》 opentax/trunk/bo/site/login

1. 'components' => array(這裡增加一個數組

'urlManager' => array(

'urlFormat' => 'path',

'showScriptName' => 'false',

'urlSuffix' => '.html', //傳遞參數後會自動添加此字尾名,用于欺騙作用的下标。id/1 ===> id/1.html

),

)

3》 http://www.yiiframework.com/doc/guide/zh_cn/topics.theming

設定新主題 theme 相當于整個網站的新tpl風格

'theme' => 'opentax', 與components數組平行

Yii::app()->theme->baseUrl . '/images/FileName.gif' 需要調用theme中的圖檔時候,可以用此位址

4》 http://www.yiiframework.com/doc/guide/zh_cn/topics.logging

在components中設定,可以用來輸出特出的值

'log' => array(

'class' => 'CLogRouter',

'routes' => array(

array(

'class' => 'CFileLogRoute',

'levels' => 'error, warning',

'class'=>'CWebLogRoute', //當加上這兩句話時候,程式就顯示一個關于執行過程的表格易于開發,但是釋出時候需要去除,不然影響程式速度(http://www.yiiframework.com/forum/index.php/topic,2004.0.html)

'levels'=>'trace', //當加上這兩句話時候,程式就顯示一個關于執行過程的表格易于開發,但是釋出時候需要去除,不然影響程式速度

),

),

),

5》 增加資料庫的連接配接檔案

'db'=>array(

'class'=>'CDbConnection',

'connectionString'=>'mysql:host=localhost;dbname=ox',

'username'=>'root',

'password'=>'',

),

6》 http://www.yiiframework.com/doc/guide/zh_cn/topics.prado

模版引擎

在components中添加

'viewRenderer'=>array(

'class'=>'CPradoViewRenderer',

),

7》 http://www.yiiframework.com/doc/guide/zh_cn/topics.security

安全性

1.CSRF 保護。在form中添加一個cookie,當送出時候伺服器會認證這個值,若相同表示為可信任的表單及其傳的值

components中加入

'request'=>array(

'enableCsrfValidation'=>true,

),

且建立表單時候一定用CHtml::form。這種格式,其他格式都不能被保護

2.XSS 保護

<?php $this->beginWidget('CHtmlPurifier'); ?>

...display user-entered content here...

<?php $this->endWidget(); ?>

3.Cookie 保護

components中加入

'request'=>array(

'enableCookieValidation'=>true,

),

用時候這樣調用和指派

$cookie=Yii::app()->request->cookies[$name];

$value=$cookie->value;

// send a cookie

$cookie=new CHttpCookie($name,$value);

Yii::app()->request->cookies[$name]=$cookie;

8》http://www.yiiframework.com/doc/guide/zh_cn/topics.performance

提高性能

1.應用php的APC(Alternative PHP Cache)。參考http://www.php.net/manual/en/book.apc.php

return array(

'components'=>array(

'cache'=>array('class'=>'CDbCache'),

'cache2'=>array('class'=>'CMemCache'),

),

);

然後通過Yii::app()->cache和Yii::app()->cache2來通路。

2.關閉YII_DEBUG 設定為false

3. Active Record用這個調用庫檔案也可以應用到緩存技術

4. 可以用$cs=Yii::app()->clientScript;來合并許多的js檔案

5. 可以引用google的jquery來代替自身的echo CGoogleApi::bootstrap(); CGoogleApi::load

--------------------------------------------------------------

當用yii自帶的BUTTON調用自己的JQuery.yii.js時候會與Jquery.validate.js沖突

1. 這樣調用Button 就yii自己生成了 JQuery.yii.js,會産生沖突。文本框驗證不了

<?php echo CHtml::Button('cancel', array (

'submit' => Yii::app()->request->baseUrl . '/category/DeleteUser',

'params' => '',

'confirm' => 'Are you sure?'

)) ?>

2. 解決:

需要避開帶參數的button

<?php echo CHtml::Button('cancel',array("onclick"=>"deleteuser('".Yii::app()->request->baseUrl . '/category/DeleteUser'."')"));?>

讓它去調用js函數deleteuser()且把相對路徑傳給他。讓js去送出表單和詢問

js如下:

function deleteuser(url)

{

if(confirm('are you sure?'))

{

document.getElementById('fillForm').action=url;

document.getElementById('fillForm').submit();

}

}

----------------------------------------------------------------------------------------------------------------------------

yii controller中需要load某些檔案的操作方法

1. /protected/config/main.php 中 是縱覽哪些檔案是可以load進來的

// autoloading model and component classes

'import' => array(

'application.models.*',

'application.components.*',

'application.classes.*',

),

2. controller之間的action不能互相調用且controller之間也不能互相引用

需要公共的函數可以寫到這些檔案中隻要建立一個class就可以

解決方法在公共函數中進行回傳一個變量或者全局變量,用變量進行判斷

----------------------------------------------------------------------------

YII 的 JQUERY 的json 運用方法

1. php中建立數組

$chage['fieldid'] = $fieldid;

$chage['butflag'] = 0;

echo CJSON::encode($chage);

2. JS檔案中輸出

var Jsonstr = $.json.decode(msg);

這樣就可以取值Jsonstr['fieldid']

-----------------------------------------------------------------------------------------------

YII 不用自帶的php validate驗證功能,自己可以模仿輸出

1. 在php中

先用資料庫查詢使用者是否存在

if($this->checkEmail($_POST['email']))

{

$error[0] = 'email already exists';

$er = true;

}

if($er) // 如果存在傳回到首頁

{

$questions = $this->loadQuest();

$this->render('index', array(

'post' => $questions,

'error_msg_email' => $error[0],

'error_msg_zip' => $error[1],

'firstname' => $_POST['firstname'],

'email' => $_POST['email'],

'zipcode' => $_POST['zipcode'],

'perstatus' => $_POST['perstatus'],

));

}

2. tpl中 index.tpl

if($textname == "email")

{

echo CHtml::textField($textname, $value = $$textname, array("class" => "required email", "minlength" => "3"));

//用css的控制,決定錯誤提示是否輸出及輸出的位置

echo '<label class="errorjs" for="email" generated="true" style="',($error_msg_email == '')?'display:none':'','">',$error_msg_email,'</label>';

echo CHtml::hiddenField($textname . "hiden", $model->id);

}

----------------------------------------------------------------------------------------------------------------------------------

類的不同調用

1. 當定義類中函數有靜态屬性時候。加static 的是靜态成員,不能用執行個體化。

在你運作的時候他自己在記憶體中開辟了塊空間,不用再一次new, 有點像全局變量

class Uti

{

public static function teOptions($text){}

}

2. 外面函數調用時候,用 Uti::teOptions() 這樣就可以。但引用變量時候需self::$a,這樣的方式

3. 若類中定義為 先執行個體化(new)一下才能用

class Uti

{

public function texOptions($text){}

}

4. 外部調用如下: 類中變量可以$this->a方式使用

$component = new Uti;

$tmpflag = $component -> texOptions();

--------------------------------------------------------------------------------------------------------------------------------------------------------

解釋models檔案夾中讀取資料庫中表的檔案。relationship的應用

http://www.yiiframework.com/doc/guide/zh_cn/database.arr

1. 表結構如下

category (pk) id , name

postcategory (pk,fk1) postID,(pk,fk2)categoryID

post (pk) id , title,content,createTime,(fk1)authorID

user (pk) id , username,password email

profile (pk,fk1) ownerID,photo,website

2. relation結構如下

'VarName'=>array('RelationType', 'ClassName', 'ForeignKey', ...additional options)

// author 為自己命名的标志,在查詢時候應用

// user和post的關系是一對多,post belongs to user

// 外鍵是 authorID

// categories 為自己命名的标志,在查詢時候應用

// category和post的關系是多對多,隻不過用了一個中間表讓之形成一對多,多對一這樣的關系。post many_many category

// 外鍵是 postcategory 這個表,它裡面有兩個字段

class Post extends CActiveRecord { public function relations() { return array( 'author'=>array(self::BELONGS_TO, 'User', 'authorID'), 'categories'=>array(self::MANY_MANY, 'Category', 'PostCategory(postID, categoryID)'), ); } }

// posts 為自己命名的标志,在查詢時候應用

// post和user的關系是多對一,user has many post

// 外鍵是 authorID

// profile 為自己命名的标志,在查詢時候應用

// user和Profile的關系是多對一,user has one Profile 是 has many的變種

// 外鍵是 ownerID

class User extends CActiveRecord { public function relations() { return array( 'posts'=>array(self::HAS_MANY, 'Post', 'authorID'), 'profile'=>array(self::HAS_ONE, 'Profile', 'ownerID'), ); } }

3. sql程式調用時候

//因為沒有調用之前定義的author,categories,查詢結果不啟用關聯查詢,不會消耗性能

$post=Post::model()->findByPk(10);

//當用到with()這個函數時候,它關聯了author 是以查詢結果中增加user表中的結果

$posts=Post::model()->with('author')->findAll();

//用到了三個命名标志,是以它關聯三個表 user ,Category, PostCategory

$posts=Post::model()->with('author','categories')->findAll();

//因為有關聯到user中的profile 是以目前關聯的是 post ,user, category, postcategory,profile

$posts=Post::model()->with(array( 'author'=>array( 'profile', 'posts'), 'categories'))->findAll();

注意:當不設定relation的時候但仍然要操作left join 之類的操作。方法如下

$sql = "select * from date left join post on post.id = date.id";

$temp=Date::model()->dbConnection->createCommand($sql)->queryAll();

用 Yii的AR時候不設定relation時候不能操作

這樣是錯誤的。他調用了Yii的 CActiveRecord類中的populateRecords方法,它會根據relation中的表字段重新排列一下,是以左連接配接的内容不會被顯示

Date::model()->findBySql("select * from date left join post on post.id = date.id");

----------------------------------------------------------------------------------------------------------------------------------------------------------

View 的應用

http://www.yiiframework.com/doc/guide/basics.view

1. 可以用render用來傳值到view層

$this->render('edit', array(

'var1'=>$value1,

'var2'=>$value2,

));

當用這種形式時候

通過調用 renderPartial() 可以不依賴布局而渲染視圖.

2. 主檔案的tpl在這裡protected/views/layouts/main.php

可以用這樣的形式來定義頭和尾檔案

......header here......

<?php echo $content; ?>

......footer here......

3. 應用元件CWidget

<?php $this->beginWidget('path.to.WidgetClass'); ?>

...body content that may be captured by the widget...

<?php $this->endWidget(); ?>

或者不需要body的元件

<?php $this->widget('path.to.WidgetClass'); ?>

也可以通過傳遞值到元件中

<?php

$this->widget('CMaskedTextField',array(

'mask'=>'99/99/9999'

));

?>

4. 系統視圖

當出現404這樣的錯誤時候 protected/views/system 在這裡的模版可以列出顯示錯誤頁面

--------------------------------------------------------------------------------

Path Alias and Namespace 路徑假名

1. 應用YiiBase::getPathOfAlias() 會把system.web.CController 變成真正的實體路徑 yii/framework/web/CController

導入檔案的方法,這樣比include和require高效

Yii::import('system.web.CController');

這樣可以導入一個目錄的檔案

Yii::import('system.web.*');

2. import基于spl_autoload_extensions建立新對象,且比較快http://cn.php.net/spl_autoload

ClassA.php

<?php class ClassA { var $val = 'Hello from class "ClassA"'; } ?>

ClassB.php

<?php class ClassB { var $val = 'Hello from class "ClassB"'; } ?>

ClassC.php

<?php class ClassC { var $val = 'Hello from class "ClassC"'; } ?>

ClassD.php

<?php class ClassD { var $val = 'Hello from class "ClassD"'; } ?>

ClassE.php

<?php class ClassE { var $val = 'Hello from class "ClassE"'; } ?>

1》spl_autoload_extensions('.php,.inc');

// new priority: .php .inc

for($n=65; $n<70; $n++) {

$className = 'Class'.chr($n);

spl_autoload($className);

$ins = new $className;

echo $ins->val.'<br>';

//1.4 miliseconds

}

2》 Simple:

<?php

// default priority: .inc .php

for($n=65; $n<70; $n++) {

$className = 'Class'.chr($n);

spl_autoload($className);

$ins = new $className;

echo $ins->val.'<br>';

}

// 4.2 miliseconds

?>

3. http://www.yiiframework.com/doc/guide/zh_cn/extension.integration

用Yii::import 方法還可以嵌入第三方程式

1》我們嵌入zend的Zend_Search_Lucene子產品方法如下

首先,假設protected是網站的主目錄,我們提取Zend Framework的釋出檔案到protected/vendors目錄。确認protected/vendors/Zend/Search/Lucene.php檔案存在

2》在一個controller類檔案的開始寫入如下語句

Yii::import('application.vendors.*');

require_once('Zend/Search/Lucene.php');

在任何action中可以這樣引用了

$lucene=new Zend_Search_Lucene($pathOfIndex);

$hits=$lucene->find(strtolower($keyword));

------------------------------------------------------------------------

Conventions 相關協定

1. URL

傳統GET傳輸參數http://hostname/index.php?r=ControllerID/ActionID

當用到CUrlManager這個元件時候(相關參考protected/config/main.php),url變成http://hostname/ControllerID/ActionID.html

--------------------------------------------------------------------

在controller檔案中 設定預設顯示的action

1. public $defaultAction='login'; 這樣就可以顯示預設的第一個action了

2. action 也可以自由定義 跟controller一樣

http://www.yiiframework.com/doc/guide/zh_cn/basics.controller

定義如下:

class UpdateAction extends CAction

{

public function run()

{

// place the action logic here

}

}

當在controller中調用此action時候。action類檔案為protected/controllers/post/UpdateAction.php

class PostController extends CController

{

public function actions()

{

return array(

'edit'=>'application.controllers.post.UpdateAction',

);

}

}

3. public function actions() 單獨的這個函數表名執行controller時候需要前期執行某些函數

Filters preprocess/postprocess 都有可能被用到

---------------------------------------------

可以用YII的errorhandler

if($this->_category === null)

throw new CHttpException(500, 'The requested category does not exist.');

繼續閱讀