歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Yii 不完全解決方案

Yii 不完全解決方案

日期:2017/3/1 9:34:59   编辑:Linux編程

此文意在記錄 Yii 開發過程中的小問題解決方案,不全面,不權威,不是教程。自己寫過,覺得可以解決問題,以後也可能用上,就記記吧。

1. Yii 中 Js 和 Css 文件的引入。

我們就從最簡單的問題開始吧,說起來也不是問題,只是語法罷了。假設我們的 js 文件都放在和 protected 同一層的 js 文件夾裡,css 文件都放在和 protected 同一層的 css 文件夾裡,好吧,規范就是這樣的...那我們可以在對應的 view 界面按下面這樣寫,css 和 js 函數的參數是不同的哦...(之前因為這個調了一個小時..)

注冊 js 文件的第二個參數是 js 所放的位置,可選三個:CClientScript::POS_HEAD 放在 Head 部分 CClientScript::POS_BEGIN 放在 Body 開始處 CClientScript::POS_END 放在 Body 結束處,沒有特別要求就不用填了...注冊 Css 文件的第二個參數是 media,,有興趣的同學點這裡,目前還是默認就好...

對於 Jquery 這樣的 js ,用 registerCoreScript 不會造成莫名奇妙的錯誤...

//注冊 js 文件
Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl.'/js/project1.js',CClientScript::POS_HEAD);
//注冊 css 文件
Yii::app()->clientScript->registerCssFile(Yii::app()->baseUrl.'/css/project1.css');
//注冊 Jquery 文件
Yii::app()->clientScript->registerCoreScript('jquery');

進修:官方文檔 其他 http://www.linuxidc.com/Linux/2015-01/111602.htm

2. Yii isNewRecord 修復

Yii 的 Model 的 isNewRecord 屬性是很好用的,可以根據這個屬性進行分情況討論。但是,假如我們開啟了事務機制或是其他情況,造成數據插入後又被回滾了,這時數據庫裡沒有該條記錄,但是 isNewRecord 是 flase,即認為已經不是新紀錄了。解決方法是用主鍵去訪問數據庫,判斷究竟是不是新紀錄,而我們在用到這個屬性之前要先按下面處理一下。以下 Model 是 Post,主鍵是 id:

if(!$model->isNewRecord)
{
$db_exist = Post::model()->findByPk($model->id);
if($db_exist == NULL)
$model->isNewRecord = true;
}

進修:官方文檔

3.Yii 生成 隱藏輸入域

雖然自己寫一個輸入域很容易(不就是 display:none 嘛),但是有時架不住需要按照 Yii 的表單代碼格式呀,反正就一句話...

<?php echo $form->hiddenField($model,'name'); ?>
<?php if($model->isNewRecord) echo $form->hiddenField($model,'path',array('size'=>60,'maxlength'=>128,'id'=>'path1')); ?>

進修:官方文檔

4. Yii 生成下拉菜單

很多時候我們在 form 裡需要一個下拉菜單,這時候 Chtml 的 listdata 就很好用的。假如我們數據庫裡的字段只有很少的可能,比如 0 和 1,可以按下面寫:

echo $form->dropDownList($model,'is_marry',array('0'=>'否','1'=>'是'));

這時候,你看到的就是 是 和 否 的下拉菜單,選擇 '是' 提交的時候這個字段填的就是 1 ,'否' 就是 0 。當然,經常不只這麼簡單,我們可以在 Model 裡面添加一個函數用於生成下拉菜單的數組,然後在 view 裡去調用就行了。這個函數的數據可以自己寫的,或者在數據庫查找得來的。下面用了 listdata, 具體意思是以 model 中 id 為 鍵, name 為值。

/* 寫在 model 裡 */
public function getUserOptions()
{
$models = User::model()->findAll();
$models = User::model()->findAllByAttributes(array('is_regeister'=>'1'));
return CHtml::listdata($models, 'id', 'name');
}

/* 寫在 view 的界面裡 */
echo $form->dropDownList($model,'user_id',User::model()->getUserOptions());

進修:官方文檔

5. Yii 開啟事務機制

在你同時保存幾條記錄到數據庫時,你可能很有必要開啟事務機制。Yii 開啟事務機制很容易,只要三句話就夠了。

/*開啟事務機制*/
$transaction = Yii::app()->db->beginTransaction();
try
{
/* 成功則 commit */
$transaction->commit();
}
catch(Exception $e)
{
$transaction->rollBack();
}

比較完整的像這樣:

if($_POST['ModelA'])
{
/*開啟事務機制*/
$transaction = Yii::app()->db->beginTransaction();
try
{
/*此處省略一堆邏輯*/
$modelA->save();
$modelB->save();

/* 成功則 commit */
$transaction->commit();
$this->redirect(array('view','id'=>$model->id));
}
catch(Exception $e)
{
$transaction->rollBack();
}
}

不過我一般會像下面這樣,有什麼好處請自行體會...

if($_POST['ModelA'])
{
/*開啟事務機制*/
$transaction = Yii::app()->db->beginTransaction();
try
{
$validated = true;

/*此處省略一堆邏輯*/
$valid = $modelA->save();
$validated = $valid & $validated;

/*此處繼續省略一堆邏輯*/
$valid = $modelB->save();
$validated = $valid & $validated;

/* 成功則 commit */
if($validated)
{
$transaction->commit();
$this->redirect(array('view','id'=>$model->id));
}
else
{
/*不成功即回滾 */
$transaction->rollBack();
}
}
catch(Exception $e)
{
$transaction->rollBack();
}
}

進修:官方文檔

其他

  • http://www.linuxidc.com/Linux/2015-01/111602.htm
  • http://www.linuxidc.com/Linux/2015-01/111604.htm
  • Yii 用戶登陸機制 http://www.linuxidc.com/Linux/2015-01/111602.htm

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2015-01/111606p2.htm

Copyright © Linux教程網 All Rights Reserved