0

我正在我的站点中构建在 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'
   ),

在模型访问.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;                     
}
4

2 回答 2

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,
        ));
    }

    ...
}

在您的模型中,您需要声明一个变量来保存计数搜索,然后将其添加到您的 search() 方法中,如下所示;

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',
        ),
    ),
));

我没有测试过,但是我已经从我自己的一个项目中的一个更复杂的模型中剥离了它,所以它很可能需要一些编辑,并且很可能需要为你的应用程序更改变量名,但基本流程是那里。

于 2013-03-20T07:51:46.063 回答
1

只需在控制器中定义函数并调用 gridview 值即可。

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

并在控制器中添加此操作:

public function functionName($data,$row){

//Your logic//
Return value;
}
于 2013-03-20T06:43:51.733 回答