gpt4 book ai didi

php - Yii CGridview 使用 CSqlDataProvider 排序

转载 作者:可可西里 更新时间:2023-11-01 00:23:09 25 4
gpt4 key购买 nike

我正在使用 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\']))',
),
),
),
),
));

谢谢

最佳答案

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

  1. 必须为数据提供者定义CSort 对象,使用attributes that would be sortable .
  2. 必须定义 name of the column 但前提是您正在指定 GridView 的columns 属性,否则如果columns 属性留空,CSort 对象中提到的任何属性都将是可排序的.

也就是说,另一个答案应该适用于 sql 很简单且来自 1 个表的情况,但在您的情况下,sql 有点复杂,即数据来自多个表,解决方案会略有变化。

在这种情况下,您必须考虑冲突的列名称(如果有),以及 CSort 的属性数组的正确规范。

例子:

  • 在任何表中都没有冲突的列名(与其他答案相同):

    $dataProvider=new CSqlDataProvider($sql, array(
    'totalItemCount'=>$count,
    'sort'=>array(
    'attributes'=>array(
    'order_id, order_total' // csv of sortable column names
    )
    )
    ));

    然后在你的网格中:

    array(
    'header'=>Yii::t('order', 'Order total'),
    'name'=>'order_total',// to make header clickable to sort
    'value'=>'strip_tags($data[\'order_total\'])',
    'type'=>'raw',
    'htmlOptions'=>array(
    'style'=>'text-align:right;',
    ),
    ),
  • 冲突的列名:

    1. 首先,在您的 sql 中给所有冲突的名称别名。
    2. 其次,将这些别名指定为 CSort 对象中的可排序属性:

      'attributes'=>array(
      'some_alias, some_other_alias'
      )
    3. columns 中的列指定名称:

      array(
      'header'=>'Foo',
      'name'=>'some_alias',
      'value'=>'$data[\'some_alias\']' // this is actually redundant in this
      // case, because the name will itself pick up the value, and we don't
      // need to specify value explicitly if we are not applying any function to it
      )

请注意,通过 url 调用排序只需指定排序对象即可启用,无需使用 name,除非您希望点击排序 header

关于php - Yii CGridview 使用 CSqlDataProvider 排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13044681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com