Php 使用CSqlDataProvider进行Yii CGridview排序
我正在使用CSqlDataProvider构建CGridview,但我无法使用CActiveRecord,因为结果集很大,并且会引发内存错误。这些列需要可排序。我应该如何做到这一点 示例sqlPhp 使用CSqlDataProvider进行Yii CGridview排序,php,yii,Php,Yii,我正在使用CSqlDataProvider构建CGridview,但我无法使用CActiveRecord,因为结果集很大,并且会引发内存错误。这些列需要可排序。我应该如何做到这一点 示例sql $orders_query_raw = 'select o.order_id, o.customer_name, o.customer_email, o.customer_advertiser, o.payment_method, o.created, o.last_updated, o.currenc
$orders_query_raw = 'select o.order_id, o.customer_name, o.customer_email, o.customer_advertiser, o.payment_method, o.created, o.last_updated, o.currency, o.currency_value, o.status, o.blinking, s.name, ot.text order_total, o.customer_id, op.product_id, o.phonebooking
from `order` o, `order_total` ot, `order_status` s , order_product op
where o.order_id = op.order_id and o.status = s.order_status_id and ot.order_id = o.order_id and s.language_id = '1' and ot.class = 'ot_total' group by o.order_id'
sql数据提供程序
$dataProvider = new CSqlDataProvider($orders_query_raw, array(
'totalItemCount'=>$count, // get from a count query
'pagination'=>array(
'pageSize'=>50,
),
));
和gridview
$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider' => $dataProvider,
'id'=>'order-grid',
'columns' => array(
array(
'header'=>'Order ID',
'value'=>array($this, 'gridOrderId'),
'type'=>'raw',
),
array(
'header'=>Yii::t('order', 'Customers'),
'name'=>'customer.fullName',
'value'=>'CHtml::link($data[\'customer_name\'], \'mailto:\'.$data[\'customer_email\'])',
'type'=>'raw',
),
array(
'header'=>Yii::t('order', 'Order total'),
'value'=>'strip_tags($data[\'order_total\'])',
'type'=>'raw',
'htmlOptions'=>array(
'style'=>'text-align:right;',
),
),
array(
'header' => Yii::t('order', 'Date Purchased'),
'name' => 'created',
),
array(
'header'=> Yii::t('order', 'Last modify date'),
'value'=>array($this, 'gridLastModified'),
),
array(
'header' => Yii::t('order', 'Status changed by'),
'value' => array($this, 'gridLastModifiedUserFirstName'),
),
array(
'header' => Yii::t('provider', 'Provider\'s code'),
'value' => array($this, 'gridProviderCode'),
'type' => 'raw',
'htmlOptions'=>array(
'class'=>'nobr',
),
),
array(
'header' => Yii::t('order', 'Follow up'),
'value' => array($this, 'gridFollowUp'),
'type' => 'raw',
),
array(
'header' => Yii::t('order', 'Order status'),
'value' => '$data[\'name\']',
),
array(
'class'=>'CButtonColumn',
'template'=>'{update}',
'header'=>'Action',
'buttons'=>array(
'update'=>array(
'url'=>'Yii::app()->createUrl(\'order/update\', array(\'order_id\'=>$data[\'order_id\']))',
),
),
),
),
));
谢谢请尝试以下操作
$sort = new CSort();
$sort->defaultOrder = 'order_id'; // for initial order
$sort->attributes = array(
'created'
);
$dataProvider = new CSqlDataProvider($orders_query_raw, array(
'totalItemCount'=>$count, // get from a count query
'pagination'=>array(
'pageSize'=>50,
),
'sort'=>$sort
));
要在数据提供程序为CSqlDataProvider
的网格视图中启用排序(通过单击列的标题),您至少需要两件事:
CSort
对象columns
属性的情况下,否则如果columns属性留空,CSort对象中提到的任何属性都将可排序属性的正确规范
示例:
- 任何表中都没有冲突的列名(与其他答案相同):
$dataProvider=新的CSqlDataProvider($sql,数组)(
'totalItemCount'=>$count,
'排序'=>数组(
'属性'=>数组(
'order\u id,order\u total'//可排序列名的csv
)
)
));
然后在网格中:
数组(
'header'=>Yii::t('order','order total'),
'name'=>'order_total',//使标题可单击排序
'value'=>'strip\'u标记($data[\'order\'u total\']),
'type'=>'raw',
“htmlOptions”=>数组(
'style'=>'text-align:right;',
),
),
- 冲突的列名:
- 首先,在sql中为所有冲突的名称指定别名
- 其次,在
CSort
对象中将这些别名指定为可排序的属性
:
“属性”=>数组(
'一些别名,一些其他别名'
)
- 为
列中的列指定名称:
数组(
'header'=>'Foo',
'name'=>'some_alias',
'value'=>'$data[\'some\u alias\']'//这实际上是多余的
//因为名称本身会获取值,而我们不会
//如果我们没有对其应用任何函数,则需要显式指定值
)
请注意,仅通过指定排序对象即可启用按url调用排序,无需使用名称
,除非您希望单击对标题进行排序