Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用CSqlDataProvider进行Yii CGridview排序_Php_Yii - Fatal编程技术网

Php 使用CSqlDataProvider进行Yii CGridview排序

Php 使用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

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

请尝试以下操作

    $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对象中提到的任何属性都将可排序
  • 也就是说,另一个答案应该适用于sql简单且来自一个表的情况,但在您的情况下,如果sql有点复杂,即数据来自多个表,则解决方案将略有变化

    在这种情况下,您必须考虑冲突的列名(如果有),以及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调用排序,无需使用
    名称
    ,除非您希望单击对标题进行排序