yii2高級應用

public function searchWithRelated() { 
        $criteria = new CDbCriteria; 

        $criteria->together = true; //without this you wont be able to search the second table's data 
        $criteria->with = array('mySecondTable'); 
        $criteria->compare('id', $this->id, true); 
        $criteria->compare('mySecondTable.column', $this->mySecondTable_column, true); 

        return new CActiveDataProvider($this, array( 
            'criteria' => $criteria, 
            'sort'=>array( 
               'defaultOrder'=>'t.create_time DESC', 
            ), 
            'pagination' => array( 
                'pageSize' => 100, 
            ), 
        )); 
    }php

高級應用程序模板
這個模板用在大型的團隊開發項目中,並且後臺從前臺獨立分離出來以便於部署在多個服務器中。因爲YIi2.0的一些新的特性,這個程序模板的功能要更深一點。提供了基本的數據庫的支持,註冊、密碼找回等功

能夠經過Composer來安裝
若是沒有安裝Composer,先安裝html

  1. curl -s http://getcomposer.org/installer | php


而後用以下命令來獲取前端

  1. php composer.phar create-project --prefer-dist --stability=dev yiisoft/yii2-app-advanced /path/to/yii-application


也能夠直接下載壓縮文件:Yii 2 with advanced application template(beta)
https://github.com/yiisoft/yii2/ ... -app-2.0.0-beta.tgz


開始

安裝完成後,須要對其進行初始化操做。node

  • 執行init,選擇開發環境(dev)
    1. php /path/to/yii-application/init
  • 建立新的數據庫,設置common/config/main-local.php裏的components.db數據庫信息
  • 使用控制檯命令遷移數據庫
    1. yii migrate
  • 設置web服務器的根目錄
    前臺/path/to/yii-application/frontend/web/對應的url爲http://frontend/
    後臺/path/to/yii-application/backend/web/對應的url爲http://backend/



目錄結構

在根目錄下面有這幾個子目錄git

  • backend——後臺web程序
  • common——公共的文件
  • console——控制檯程序
  • environments——環境配置
  • frontend——前臺web程序

根目錄下面還有包含一些文件github

  • .gitignore ——git版本控制中忽略的文件和目錄,若是你有一些你不想要的文件到你的源代碼裏面就把它添加到這個文件中。
  • composer.json——這個下面會描述
  • init——在Composer裏面所描述初始化腳本
  • init.bat——和上面同樣,不過是Windows下面的
  • LIENSE.md——這個就不說了
  • README.md——同上
  • requirements.php——Yii運行環境要求檢測文件
  • yii——控制檯程序引導文件
  • yii.bat——Windows下面的東東



系統定義的路徑別名web

  • @yii ——框架的目錄。
  • @app——當前正在運行的應用程序的基本路徑。
  • @common -公共文件目錄。
  • @frontend——前端web應用程序目錄。
  • @backend ——後端web應用程序目錄。
  • @console -控制檯目錄。
  • @runtime——當前正在運行的web應用程序的運行時目錄
  • @vendor ——基礎框架目錄。
  • @web ——當前正在運行的web應用程序的url
  • @webroot——當前正在運行的web應用程序的web根目錄。


應用程序

這個模板包含三個應用程序,前臺、後臺和控制檯。前臺一般來講就是展示給終端用戶的,也就是項目自己。後臺就是管理員控制面板,包含有分析以及相似的功能等。控制檯主要用來作一些定時任務和一些簡單的服務器的管理,另外也能夠用來部署應用程序、數據庫的遷移、資源的管理等。

common 目錄提供一些公共的文件,可用於多個應用程序,例如User模型。

前臺和後臺都是web應用程序,他們都包含一個web目錄,也就是web的根目錄,在部署服務器的時候就得要指向這個目錄。
每一個應用程序都有他們本身的命名空間以及對應的別名。同理,common也有本身的命名空間和對應的別名。

配置和開發環境

在日常的開發中,直接設置配置文件會有多個問題數據庫

  • 每一個團隊成員都有本身的配置選項。若是提交這樣的配置將影響其餘團隊成員。
  • 產品數據庫密碼和API密鑰不該該在代碼倉庫中。
  • 在有多個服務器的狀況下:開發、測試、生產,每個服務器都應該有本身的配置。
  • 每種狀況下都定義全部配置選項很重複,而且還要花太多的時間去維持它。


爲了解決這些問題,Yii引入了一個很是簡單的環境的概念。每一個環境由環境目錄下的一組文件的集合來表示。init命令用於不一樣環境之間切換。它只是複製從環境目錄中全部應用程序的根目錄。

一般環境包含應用程序引導文件如index.php和以-local.php後綴的配置文件。這些已經添加到.gitignore中,因此不會再添加到源碼倉庫中。
爲了不重複的配置文件相互覆蓋。例如,前臺應用程序按照如下順序來讀取配置:json

  • common/config/main.php
  • common/config/main-local.php
  • frontend/config/main.php
  • frontend/config/main-local.php

參數文件按如下順序讀取bootstrap

  • common/config/params.php
  • common/config/params-local.php
  • frontend/config/params.php
  • frontend/config/params-local.php

後面讀取的文件配置會覆蓋前面的配置

整個的流程圖形以下


配置 Composer 

應用程序安裝完成後就能夠設置要目錄下面的composer.json

  1. {
  2.     "name": "yiisoft/yii2-app-advanced",
  3.     "description": "Yii 2 Advanced Application Template",
  4.     "keywords": ["yii", "framework", "advanced", "application template"],
  5.     "homepage": "http://www.yiiframework.com/",
  6.     "type": "project",
  7.     "license": "BSD-3-Clause",
  8.     "support": {
  9.         "issues": "https://github.com/yiisoft/yii2/issues?state=open",
  10.         "forum": "http://www.yiiframework.com/forum/",
  11.         "wiki": "http://www.yiiframework.com/wiki/",
  12.         "irc": "irc://irc.freenode.net/yii",
  13.         "source": "https://github.com/yiisoft/yii2"
  14.     },
  15.     "minimum-stability": "dev",
  16.     "require": {
  17.         "php": ">=5.4.0",
  18.         "yiisoft/yii2": "*",
  19.         "yiisoft/yii2-swiftmailer": "*",
  20.         "yiisoft/yii2-bootstrap": "*",
  21.         "yiisoft/yii2-debug": "*",
  22.         "yiisoft/yii2-gii": "*"
  23.     },
  24.     "scripts": {
  25.         "post-create-project-cmd": [
  26.             "yii\\composer\\Installer::setPermission"
  27.         ]
  28.     },
  29.     "extra": {
  30.         "writable": [
  31.             "backend/runtime",
  32.             "backend/web/assets",
  33.             "console/runtime",
  34.             "console/migrations",
  35.             "frontend/runtime",
  36.             "frontend/web/assets"
  37.         ]
  38.     }
  39. }

首先,修改一些基本信息。例如名稱,描述,關鍵詞,主頁等等。
你還能夠根據你的須要添加更多的應用程序。這些包都是來自packagist.org,可免費的瀏覽全部的代碼。
修改完composer.json以後 就能夠運行

  1. php composer.phar update --prefer-dist

,等下載並安裝完成後就能夠開始使用了。自動加載的類將會自動處理。

建立從後端到前端的連接

  一般狀況下須要從後端應用程序鏈接到前端應用程序。由於前端應用程序可能包含本身的URL管理規則,因此須要再添加一個不一樣名字的後臺的URL管理規則。

  1. return [
  2.     'components' => [
  3.         'urlManager' => [
  4.             // here is your normal backend url manager config
  5.         ],
  6.         'urlManagerFrontend' => [
  7.             // here is your frontend URL manager config
  8.         ],
  9.     ],
  10. ];

以後,就能夠像這樣來使用前臺的url

Reference: Learn Yii Framework online – CGridView filter with relational field

Model:

1. 添加filter用的屬性
var $a = 「」;
var $b = 「」;

2. 修改rules方法中的配置
array(‘……., a, b’, ‘safe’, ‘on’=>’search’);

3. 注意relations方法
public function relations()
{
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array(
‘xxx‘ => array(self::HAS_ONE,  ‘xxxModel’, array(‘…’ => ‘….’)),
);
}

4. 修改search()方法添加行
$criteria->compare(‘xxx.ax‘,$this->a);
$criteria->compare(‘xxx.bx‘,$this->b);

View
1. ‘dataProvider’=>$model->with(「xxx「)->search(),

2. 列展現修改
array(
‘name’ => ‘a‘,
‘value’ => ‘$data->xxx->ax‘,
‘filter’ => array(select的下來菜單數組),
),
array(
‘name’ => ‘b‘,
‘value’ => ‘$data->xxx->bx‘,
‘filter’ => array(1 => 「Set」, 0 => ‘Not Set’),
),

代碼提示:
1. 添加的兩個屬性僅僅用於記錄頁面的搜索條件
2. search方法中的CDbCriteria搜索方法沒有任何變化,請學習如何使用關聯搜索

$criteria = new CDbCriteria; 
//select
$criteria->select = '*';//默認*
$criteria->select = 'id,name';//指定的字段
$criteria->select = 't.*,t.id,t.name';//鏈接查詢時,第一個表as t,因此用t.*
$criteria->distinct = FALSE; //是否惟一查詢 


//join
$criteria->join = 'left join table2 t2 on(t.id=t2.tid)'; //鏈接表  
$criteria->with = 'xxx'; //調用relations  


//where 查詢數字字段
$criteria->addCondition("id=1"); //查詢條件,即where id = 1  
$criteria->addBetweenCondition('id', 1, 4);//between 1 and 4     
$criteria->addInCondition('id', array(1,2,3,4,5)); //表明where id IN (1,23,,4,5,);  
$criteria->addNotInCondition('id', array(1,2,3,4,5));//與上面正好相法,是NOT IN


//where 查詢字符串字段
$criteria->addSearchCondition('name', '分類');//搜索條件,其實表明了。。where name like '%分類%' 
 
//where 查詢日期字段
$criteria->addCondition("create_time>'2012-11-29 00:00:00'");
$criteria->addCondition("create_time<'2012-11-30 00:00:00'");


//where and or
$criteria->addCondition('id=1','OR');//這是OR條件,多個條件的時候,該條件是OR而非AND  


//這個方法比較特殊,他會根據你的參數自動處理成addCondition或者addInCondition,
//即若是第二個參數是數組就會調用addInCondition  


$criteria->compare('id', 1);    
/**  * 傳遞參數 */  


$criteria->addCondition("id = :id");  
$criteria->params[':id']=1;  


//order 
$criteria->order = 'xxx DESC,XXX ASC' ;//排序條件  


//group
$criteria->group = 'group 條件';  
$criteria->having = 'having 條件 '; 


//limit
$criteria->limit = 10;    //取1條數據,若是小於0,則不做處理  
$criteria->offset = 1;   //兩條合併起來,則表示 limit 10 offset 1,或者表明了。limit 1,10  

<?php $this->widget('zii.widgets.grid.CGridView', array( 'id'=>'chapter-grid', 'dataProvider'=>$model->search(), //數據結果集 'filter'=>$model, 'columns'=>array( 'id', //錨點<a href="http://www.gulianqiang.com/"></a> array( 'name'=>'name', 'type'=>'raw', 'value'=>'CHtml::link($data->name,"/book/$data->id")', ), //圖片 array( 'name'=>'image', 'type'=>'image', 'value'=>'LImages::getPath("book").$data->image',//圖片相對路徑 ), //下拉列表 array( 'name'=>'type', 'value'=>'Lookup::item("chapterType",$data->type)', 'filter'=>Lookup::items('chapterType'), ), //內容截取 array( 'name'=>'content', 'type'=>'html', 'value'=>'mb_substr(htmlspecialchars_decode($data->content),0,100,"utf-8")', ), //時間 array( 'name'=>'create_time', 'type'=>'datetime', ), // 根據相關信息讀數據庫 array( 'name'=>'user_id', 'value'=>'User::model()->findbyPk($data->user_id)->username', 'filter'=>false, ), array( 'class'=>'CButtonColumn', ), ),)); ?>

相關文章
相關標籤/搜索