首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Yii使用CSqlDataProvider进行CGridview排序

Yii使用CSqlDataProvider进行CGridview排序
EN

Stack Overflow用户
提问于 2012-10-24 15:34:15
回答 2查看 7.1K关注 0票数 3

我正在使用CSqlDataProvider构造CGridview,我不能使用CActiveRecord,因为结果集太大并且抛出内存错误。列需要是可排序的。我该如何实现这一点呢?

示例sql

代码语言:javascript
复制
$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数据提供程序

代码语言:javascript
复制
    $dataProvider = new CSqlDataProvider($orders_query_raw, array(
        'totalItemCount'=>$count, // get from a count query
        'pagination'=>array(
            'pageSize'=>50,
        ),
    ));

和gridview

代码语言:javascript
复制
$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\']))',
                ),
            ),
        ),
    ),
));

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-24 18:33:11

要在数据提供程序为CSqlDataProvider的网格视图中启用排序(通过单击列的标题),您至少需要两件事:

列必须为数据提供程序定义CSort对象,使用attributes that would be sortable.

  • Have定义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;',),),

  • 列名称冲突:

代码语言:javascript
复制
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

票数 6
EN

Stack Overflow用户

发布于 2012-10-24 15:45:53

如下所示进行尝试

代码语言:javascript
复制
    $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
));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13044681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档