我正在浏览我的网站中的访客报告部分。 我的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中显示数据时,我是运行时的Count访问者我创建了一个函数并将其作为参数传递给hostname。我该如何排序?
在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;
}
答案 0 :(得分: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',
),
),
));
我没有对此进行过测试,但是我已经从我自己的一个项目中删除了一个更复杂的模型,因此可能需要一些编辑和变量名称很可能需要更改您的应用程序,但基本流程就在那里。
答案 1 :(得分:1)
只需在控制器中定义函数并调用gridview值。
array('name'=>'id','value'=>array($this,'functionName')),
在控制器中添加此操作:
public function functionName($data,$row){
//Your logic//
Return value;
}