YII學習筆記


YII知識小結:

1.YII默認控制器為 SiteController 默認控制器可以通過配置文件 application/config/main.php修改,指定 defaultController即可, 如 'defaultController' => 'home',

2.控制器的默認方法為actionIndex 可以通過定義控制器屬性 defaultAction來設置,如 public $defaultAction = 'lists';

3.獲取Controller ID Yii::app()->getController()->id 獲取Action ID Yii::app()->getController()->getAction()->id 類:system.web.CWebApplication

4.獲取POST參數 Yii::app()->request->getPost('name'); 獲取GET參數 Yii::app()->request->getQuery('name');

5.判斷提交方式 Yii::app()->request->isPostRequest Yii::app()->request->isAjaxRequest 類:system.web.CHttpRequest

6.view中導入js、css、Meta 類:system.web.CClientScript

//導入CSS
Yii::app ()->clientScript->registerCssFile ( Yii::app()->baseUrl.'/uploadify.css', CClientScript::POS_HEAD );
//導入YII集成JQUERY
Yii::app ()->clientScript->registerCoreScript ( 'jquery' );
//導入外部JS
Yii::app ()->clientScript->registerScriptFile ( Yii::app()->baseUrl.'/jquery.uploadify.min.js', CClientScript::POS_HEAD );
//Meta信息
Yii::app()->clientScript->registerMetaTag('關鍵字','keywords');
Yii::app()->clientScript->registerMetaTag('些描述','description');
Yii::app()->clientScript->registerMetaTag('作者','author');
Yii::app()->clientScript->registerMetaTag(' text/html;charset=utf-8', null, 'Content-Type');

7.生成URL可以使用 Yii::app()->createUrl('post/read', array('id' => 1))

8.main.php引用其他配置文件可用'params'=>require(dirname(__FILE__).'/params.php'), params.php直接返回數組即可,如return array();訪問方式則為Yii::app()->params['paramName']

9.數據在保存、查找、驗證前后調用before、afeter方法,如:beforeSave、afterSave、beforeValidate

protected function beforeSave() 
{
    if(parent::beforeSave()) {
        if($this->isNewRecord) {
            $this->create_time = date("Y-m-d H:i:s");
        } else {
            $this->update_time = date("Y-m-d H:i:s");
        }
        return true;
    } else {
        return false;
    }
}

10.表單驗證時可以指定應用場景,如$model = new Post('create') 或者通過$post->scenario = 'create' 指定

11.獲取http://127.0.0.1/test/index?var=val的內容:

Yii::app()->request->getUrl /test/index?var=val
Yii::app()->request->getHostInfo http://127.0.0.1
Yii::app()->request->getPathInfo test/index
Yii::app()->request->getRequestUri /test/index?var=val
Yii::app()->request->getQueryStringvar=val

12.判斷是否為AJAX動作:

Yii::app()->request->isAjaxRequest

13.GET,POST,REQUEST

Yii::app()->request->getParam('id');//request
Yii::app()->request->getQuery('id');//get
Yii::app()->request->getPost('id');//post

 

 

 

AR:
數據庫配置:

'db'=>array(
            //'class'=>'system.db.CDbConnection',
            'connectionString' => 'mysql:host=localhost;dbname=yii',
            'emulatePrepare' => true,
            'username' => 'root',
            'password' => '',
            'charset' => 'utf8',
            //默認false,設置為true即開啟記錄綁定參數,但是性能代價比較高
            'enableParamLogging' => 'true',
            // 開啟表結構緩存(schema caching)提高性能
            // 'schemaCachingDuration'=>3600,
        ),


創建記錄:

$post=new Post;
$post->title='sample post';
$post->content='content for the sample post';
$post->create_time=time();
$post->save();

也可以直接POST給屬性:

$model->attributes=$_POST['Post'];
$model->save();

 

讀取記錄:

// 查找滿足指定條件的結果中的第一行
$post=Post::model()->find($condition,$params);
// 查找具有指定主鍵值的那一行
$post=Post::model()->findByPk($postID,$condition,$params);
// 查找具有指定屬性值的行
$post=Post::model()->findByAttributes($attributes,$condition,$params);
// 通過指定的 SQL 語句查找結果中的第一行
$post=Post::model()->findBySql($sql,$params);

如上所示,我們通過 Post::model() 調用 find 方法。 請記住,靜態方法 model() 是每個 AR 類所必須的。 此方法返回在對象上下文中的一個用於訪問類級別方法(類似於靜態類方法的東西)的 AR 實例。

如果 find 方法找到了一個滿足查詢條件的行,它將返回一個 Post 實例,實例的屬性含有數據表行中相應列的值。 然后我們就可以像讀取普通對象的屬性那樣讀取載入的值,例如 echo $post->title;。

如果使用給定的查詢條件在數據庫中沒有找到任何東西, find 方法將返回 null 。

調用 find 時,我們使用 $condition 和 $params 指定查詢條件。此處 $condition 可以是 SQL 語句中的 WHERE 字符串,$params 則是一個參數數組,其中的值應綁定到 $condation 中的占位符。例如:

$post = Post::model()->find('id=:id',array(':id'=>1));


CDbCriteria:用$criteria實例作為find()的查詢條件

$criteria=new CDbCriteria;
$criteria->select='title';  // 只選擇 'title' 列
$criteria->condition='postID=:postID';
$criteria->params=array(':postID'=>10);
$post=Post::model()->find($criteria); // $params 不需要了

改寫:用數組直接取代$criteria,數組的鍵和值各自對應標准(criterion)的屬性名和值

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

 

計數:

// 獲取滿足指定條件的行數
$n=Post::model()->count($condition,$params);
// 通過指定的 SQL 獲取結果行數
$n=Post::model()->countBySql($sql,$params);
// 檢查是否至少有一行復合指定的條件
$exists=Post::model()->exists($condition,$params);

 

更新記錄:

// 更新符合指定條件的行
Post::model()->updateAll($attributes,$condition,$params);
// 更新符合指定條件和主鍵的行
Post::model()->updateByPk($pk,$attributes,$condition,$params);
// 更新滿足指定條件的行的計數列
Post::model()->updateCounters($counters,$condition,$params);

例如:

Post::model()->updateAll(array('title'=>'hello'),'id=1');

 

刪除記錄:

// 刪除符合指定條件的行
Post::model()->deleteAll($condition,$params);
// 刪除符合指定條件和主鍵的行
Post::model()->deleteByPk($pk,$condition,$params);

例如:

Post::model()->deleteAll('id=:id',array(':id'=>6));

 

數據驗證:
     當調用 save() 時, AR 會自動執行數據驗證。 驗證是基於在 AR 類的 rules() 方法中指定的規則進行的。

if($post->save())
{
    // 數據有效且成功插入/更新
}
else
{
    // 數據無效,調用  getErrors() 提取錯誤信息
}

將表單提交過來的數據賦值給AR屬性:

$post->title=$_POST['title'];
$post->content=$_POST['content'];
$post->save();

簡化:

// 假設 $_POST['Post'] 是一個以列名索引列值為值的數組
$post->attributes=$_POST['Post'];
$post->save();

 

使用 AR 處理事務
每個 AR 實例都含有一個屬性名叫 dbConnection ,是一個 CDbConnection 的實例,這樣我們可以在需要時配合 AR 使用由 Yii DAO 提供的 事務 功能:

$model=Post::model();
$transaction=$model->dbConnection->beginTransaction();
try
{
    // 查找和保存是可能由另一個請求干預的兩個步驟
    // 這樣我們使用一個事務以確保其一致性和完整性
    $post=$model->findByPk(10);
    $post->title='new post title';
    $post->save();
    $transaction->commit();
}
catch(Exception $e)
{
    $transaction->rollBack();
}

 

命名范圍(named scope) 表示一個命名的查詢規則,它可以和其他命名范圍聯合使用並應用於 Active Record 查詢。
用法:命名范圍主要是在 CActiveRecord::scopes() 方法中以名字-規則對的方式聲明。 如下代碼在 Post 模型類中聲明了兩個命名范圍, published 和 recently。

class Post extends CActiveRecord
{
    ......
    public function scopes()
    {
        return array(
            'published'=>array(
                'condition'=>'status=1',
            ),
            'recently'=>array(
                'order'=>'create_time DESC',
                'limit'=>5,
            ),
        );
    }
}

例子:查找最近發布的5篇帖子

$posts=Post::model()->published()->recently()->findAll();

***總體來說,(1)命名范圍必須出現在一個 find 方法調用的左邊。
                   (2)最終結果就像給一個查詢添加了一系列過濾器。
                   (3)命名范圍可用於 find,update 和 delete 方法。
                   (4)默認的命名范圍(defaultScope())只會應用於 SELECT 查詢。INSERT, UPDATE 和 DELETE 查詢將被忽略。
                   (5)命名范圍只能用於類級別方法。也就是說,此方法必須使用 ClassName::model() 調用。



在視圖層(../views/..)添加CSS文件或JavaScript文件

Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl ."/js/TableView.js"); 
Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl . "/js/datechooser.js");

批注1:在視圖層引用與在控制層引用的方式一樣。但在視圖層中引用加載的要晚一些。
批注2:引用路徑是使用baseUrl,而不是basePath。
批注3:關於參數CClientScript::POS_END,作用是延時加載,提高頁面渲染效率。例如:
Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl . "/js/jqueryui/jquery-ui.min.js", CClientScript::POS_END);
引入jquery核心部件:

Yii::app()->clientScript->registerCoreScript('jquery'); 

批注:不論在頁面中的何種位置引用,最終yii會將jquery.js文件放入yii的assets文件夾下。即/projectName/assets/82qg58/jquery-1.6.1.min.js。

一、在../layouts/main.php中引入
1,直接引入

<!-- css -->
<link rel="stylesheet" type="text/css" href="<?php echo Yii::app()->request->baseUrl; ?>/css/print.css" media="print" />
<!-- 圖片 -->
<link rel="stylesheet" type="text/css" href="<?php echo Yii::app()->request->baseUrl; ?>/js/autocomplete/indicator.gif" />
<!-- js -->
<script type="text/javascript" src="<?php echo Yii::app()->request->baseUrl; ?>/js/jquery.js"></script>

2,yii方式引入

<?php
<!-- (一)簡單用法 -->
<!-- js -->
    Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl . "/js/jqueryui/jquery-ui.min.js", CClientScript::POS_END);


<!-- (二)復雜用法 -->
if($this->user->id) {
        Yii::app()->clientScript->registerScriptFile(Yii::app()->createUrl('/account/info', array('format' => 'js')), CClientScript::POS_END);
}

if($this->user->id) {
        Yii::app()->clientScript->registerScriptFile(Yii::app()->createUrl('site/baseJs'));
}
?>

 

插入meta信息: 

Yii::app()->clientScript->registerMetaTag('keywords','關鍵字');
Yii::app()->clientScript->registerMetaTag('description','一些描述');
Yii::app()->clientScript->registerMetaTag('author','作者');  


獲取網站路徑等小元素

在view中得到當前controller的ID方法 :Yii::app()->getController()->id;

在view中得到當前action的ID方法 :Yii::app()->getController()->getAction()->id;

yii獲取ip地址 :Yii::app()->request->userHostAddress;

yii判斷提交方式 :Yii::app()->request->isPostRequest

得到當前域名: Yii::app()->request->hostInfo

得到proteced目錄的物理路徑 :YII::app()->basePath;

獲得上一頁的url以返回 :Yii::app()->request->urlReferrer;

得到當前url :Yii::app()->request->url;

得到當前home url :Yii::app()->homeUrl

得到當前return url :Yii::app()->user->returnUrl

項目路徑 :dirname(Yii::app()->BasePath)

Yii::getPathOfAlias('webroot') &nbsp; 如果你自己有個目錄下有些類或文件常用,可以在main.php的最上邊定義一個路徑別名,別名可以被翻譯為其相應的路徑。如果是多個可以在main.php中的array中加一個配置

如:
'aliases'=>array(
  'local'=>'path/to/local/'
), 

獲取布局文件:$this->getLayoutFile('main');

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM