我正在使用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.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\']))',
),
),
),
),
));谢谢
发布于 2012-10-24 18:33:11
要在数据提供程序为CSqlDataProvider的网格视图中启用排序(通过单击列的标题),您至少需要两件事:
列必须为数据提供程序定义CSort对象,使用attributes that would be sortable.
name of the column列,但只有在指定网格视图的属性为时,才能对其进行排序。否则,如果将columns属性留空,则CSort对象中提到的任何属性都将是可排序的。也就是说,另一个答案应该适用于sql简单且来自一个表的情况,但在您的情况下,sql有点复杂,即数据来自多个表,解决方案将略有变化。
在这种情况下,您必须考虑到冲突的列名(如果有),以及CSort的attributes数组的适当规范。
示例:
$dataProvider=new CSqlDataProvider($sql,array(‘$sql attributes’=>$count,'sort'=>array( 'attributes'=>array( 'order_id,order_total‘//可排序列名的csv );
然后在你的网格中:
( ' header '=>Yii::t( 'Order ',‘order total'),'name'=>'order_total',//使标题可点击排序'value'=>'strip_tags($data\'order_total\')','type'=>'raw','htmlOptions'=>array( 'style'=>'text-align:right;',),),
1. First, give all conflicting names aliases in your sql.
2. Second, specify those aliases as the sortable `attributes` in the `CSort` object:‘attributes’=>数组( 'some_alias,some_other_alias‘)
3.在columns中指定列的name:
数组( 'header'=>'Foo',' name '=>'some_alias',' value '=>'$data\'some_alias\'‘//在这种情况下,这实际上是多余的,因为名称本身会拾取值,如果我们不对其应用任何函数,//我们不需要显式指定value )
请注意,只需指定排序对象即可通过url调用进行排序,除非您希望单击排序标题,否则无需使用name。
发布于 2012-10-24 15:45:53
如下所示进行尝试
$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
));https://stackoverflow.com/questions/13044681
复制相似问题