Yii2:如何根据之前的页面在页脚中加上总和'和?

时间:2015-09-18 18:52:43

标签: php gridview yii2

请看下面的图片。

enter image description here

您可以在摘要列中看到总计 215340 。我想要的是,在下一页中,它应该开始在这个数字上对这些数字求和。

这是一段代码。

 GridView::widget([
    'dataProvider' => $dataProvider,
    //  'filterModel' => $searchModel,
    'columns' => [
      [
        'class' => 'kartik\grid\SerialColumn'],
      //     'id',
      [
        'attribute' => 'customer_id',
        'value' => function ($data) {
          return $data->customerDetail->account_no;
        }
      ],
      [
        'attribute' => 'naration',
        'pageSummary' => 'Total',
      ],
      [
      'attribute' => 'transaction_type',
      'label' => 'Deposits',
      'pageSummary' => true,
      'pageSummaryOptions' => ['id' => 'total_sum'],
      'value' => function ($data) {
        if($data->transaction_type==10)
          return $data->amount;
        else
          return 0;
        }
      ],
      [
      'attribute' => 'transaction_type',
      'label' => 'Withdrawals',
      'pageSummary' => true,
      'value' => function ($data) {
        if($data->transaction_type==11)
          return $data->amount;
        else
          return 0;
        }
      ],
      [
        'class' => 'backend\components\TotalColumn',
        'label' => 'Balance',
        'attribute' =>'amount',
      ],

    ],
    // This line displays sum of the columns.
    'showPageSummary' => true,
  ]);
?>

我正在考虑使用$_GET将此页面的总和发送到下一页但问题是当用户转到上一页时,即从第3页到第2页。您是否有任何小部件或其他内容问题

1 个答案:

答案 0 :(得分:0)

我的想法是使用mysql选择当前列中所有记录的总和,并将此值与前一页的总值相加,我需要知道此查询的当前页面的偏移量和限制,我可以得到那些来自数据提供者的值,要实现这一点,我必须覆盖函数\yii\grid\Column::renderFooterCellContent()

扩展\yii\grid\DataColumn

namespace frontend\components;

use yii\helpers\ArrayHelper;

class DataColumn extends \yii\grid\DataColumn
{
    protected function renderFooterCellContent()
    {
        if ($this->footer instanceof \Closure) {
            return call_user_func($this->footer, ArrayHelper::getValue($this, 'grid.dataProvider.pagination'));
        } else {
            return parent::renderFooterCellContent();
        }
    }
}

您的视图文件

use frontend\models\Client;
use yii\db\Expression;
use yii\db\Query;
use yii\grid\GridView;
use yii\data\Pagination;
use frontend\components\DataColumn;

echo GridView::widget([
    'dataProvider' => $dataProvider,
    'dataColumnClass' => DataColumn::className(),
    'showFooter' => true,
    'columns' => [
        //['class' => 'yii\grid\SerialColumn'],
        'id',
        [
            'attribute' => 'num_users',
            'footer' => function ($pagination) {
                if ($pagination instanceof Pagination) {
                    $offset = $pagination->offset;
                    $limit = $pagination->limit;

                    $cquery = (new Query())
                        ->select(['sub_users' => new Expression('SUM(num_users)')])
                        ->from([
                            'cpage' => (new Query())
                                ->select('num_users')
                                ->offset($offset)
                                ->limit($limit)
                                ->from(Client::tableName())
                        ]);

                    //negative offset is illegal
                    if ($offset > 0) {
                        $pquery = (new Query())
                            ->select(['sub_users' => new Expression('SUM(num_users)')])
                            ->from([
                                'ppage' => (new Query())
                                    ->select('num_users')
                                    ->offset(0)
                                    ->limit($offset)
                                    ->from(Client::tableName())
                            ]);
                        $cquery->union($pquery, true);
                    }

                    return (new Query())->from(['subt' => $cquery])->sum('sub_users');
                }
            }
        ],
    ]
]);

原始SQL查询

SELECT SUM(sub_sum_users) FROM (
    SELECT SUM(num_users) as sub_sum_users FROM (
        SELECT num_users FROM `clients` LIMIT 20 OFFSET 120
    ) cpage
    UNION ALL
    SELECT SUM(num_users) as sub_sum_users FROM (
        SELECT num_users FROM `clients` LIMIT 20 OFFSET 100
    ) ppage
) sublt

注意:

你可以考虑使用ActiveRecord,我的girdview有很多连接查询,所以对我来说很重要

$offset = $pagination->offset;
$limit = $pagination->limit;
$cquery = Client::find()
    ->select(['sub_users' => new Expression('SUM(num_users)')])
    ->from([
        'cpage' => Client::find()->select('num_users')->offset($offset)->limit($limit)
    ]);

//negative offset is illegal
if ($offset > 0) {
    $pquery = $cquery = Client::find()
        ->select(['sub_users' => new Expression('SUM(num_users)')])
        ->from([
            'ppage' => Client::find()->select('num_users')->offset(0)->limit($offset)
        ]);
    $cquery->union($pquery, true);
}

return (new Query())->from(['subt' => $cquery])->sum('sub_users');