2013-03-20 74 views
0

我正在訪問我的網站上的訪問者報告部分,它建立在yii中。 我的cgrid查看記錄如下所示。Yii cgrid視圖排序

HostName  Visitors Counts  Detail 
facbook.com  40     click here 
google.com  150     click here 
yahoo.com  90     click here 

我只是想排序這個數據,因爲更高的訪問者在cgrid視圖上向上移動。就像google.com爲我提供的最高訪客一樣,它向上移動了CGridView。 怎麼可能? 請任何建議。我是計數訪客在運行時數據顯示在CGridview中我創建一個函數並將其作爲參數傳遞給主機名。我怎樣才能排序呢?

在CGridView,

array('name'=>'id', 
     'value'=>'visits::count_VisitorsByHostName($data->hostname)', 
     'header'=>'Visits' 
    ), 

在模型visits.php

public function count_VisitorsByHostName($hostname){    

    $connection = Yii::app()->db;    
    $query = "SELECT COUNT(id) as Visitors FROM visits WHERE hostname = '$hostname'"; 
    $connection->createCommand($query)->queryAll();    
    $count_visitors = $count_record[0]['Visitors'];     
    return $count_visitors;      
} 

回答

2

你可以做到這一點,那麼你的訪客數可以成爲你的CGridView一個排序的列。

所以你的控制器可以看起來是正常的;

class VisitsController extends Controller 
{ 
    ... 

    public function actionIndex() 
    { 
     $model=new Visits('search'); 
     $model->unsetAttributes(); // clear any default values 
     if(isset($_GET['Visits'])) 
      $model->attributes=$_GET['Visits']; 
     $this->render('index',array(
      'model'=>$model, 
     )); 
    } 

    ... 
} 

在你的模型,你就需要聲明一個變量來保存計數的搜索,然後添加到這個搜索()方法,像這樣;

class Visits extends CActiveRecord 
{ 
    /** 
    * @var array Allows model filtering by visit count 
    */ 
    public $visit_count; 

    ... 

    // Remember to declare it as safe 
    public function rules() 
    { 
     return array(
      ... 
      array(... ,'visit_count', ..., 'safe', 'on'=>'search'), 
      ... 
     ); 
    } 

    ... 

    // Give it a label if you wish 
    public function attributeLabels() 
    { 
     return array(
      ... 
      'visit_count' => 'Visitors Counts', 
      ... 
     ); 
    } 

    ... 

    // Now add to your search method 
    public function search() 
    { 
     $criteria=new CDbCriteria; 
     $visit_table = Visits::model()->tableName(); 
     $visit_count_sql = "(select count(*) from `$visit_table` where `$visit_table`.`hostname` = `t`.`hostname`)"; 
     $criteria->select = array(
      '*', 
      $visit_count_sql . " as `visit_count`", 
     ); 

     $criteria->compare($visit_count_sql, $this->visit_count); 

     // Set the CActiveDataProvider to order by the visitor count 
     $criteria->order = 'visit_count DESC'; 

     ... 
     // All your other criteria code 
     ... 

     // And add to the CActiveDataProvider 
     return new CActiveDataProvider($this, array(
      'criteria'=>$criteria, 
      'sort'=>array(
       'attributes'=>array(
        'visit_count'=>array(
         'asc'=>'visit_count', 
         'desc'=>'visit_count DESC', 
        ), 
       '*', 
       ), 
      ), 
      'pagination'=>array(
       'pageSize'=>100, 
      ), 
     )); 
    } 

    ... 
} 

然後,您可以將此添加到您的視圖中的CGridView;

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'visit-grid', 
    'dataProvider'=>$model->search(), 
    'filter'=>$model, 
    'columns'=>array(
     'hostname', 
     'visit_count', 
     array(
      // Whatever your detail column looks like! 
     ), 
     array(
      'class'=>'CButtonColumn', 
     ), 
    ), 
)); 

我沒有測試過,但我從我自己的項目的一個更復雜的模型剝離它,所以它可能需要一些編輯和變量名,將最有可能需要改變你的應用程序,但基本的流程就在那裏。

+0

嗨Stu, 首先非常感謝你。我的問題是解決我在谷歌上搜索了4天,但仍然沒有找到任何解決方案。如果可以的話,謝謝 我只想使用自定義排序,我的意思是哪個主機名爲我們提供了足夠的訪問者,這個主機在CGridview中向上移動。可能需要一個自定義功能,但怎麼能,我無法解決這個問題。 '主機名遊客計數詳細 facbook.com 40點擊這裏 google.com 150點擊這裏 yahoo.com 90點擊這裏' – 2013-03-20 10:43:15

+0

我想谷歌移動頂行,我怎麼能解決這個問題,我在很多請麻煩。 – 2013-03-20 10:50:34

+1

與上面它應該自動按'visit_count DESC'命令?您還應該能夠點擊訪問計數列標題以按該列進行排序? – Stu 2013-03-20 11:13:43

1

只要定義在控制器內的功能和在GridView值調用。

array('name'=>'id','value'=>array($this,'functionName')), 

並在控制器添加此動作:通過增加訪客數到你的初始查詢

public function functionName($data,$row){ 

//Your logic// 
Return value; 
}