【问题标题】:Yii2 : Get Sum In footer of gridviewYii2:在gridview的页脚中获取总和
【发布时间】:2016-11-16 10:11:47
【问题描述】:

我是新来的,无法评论here

当我尝试在页脚中获取总和时遇到问题。

我在控制器中的代码:

$searchModel = new ReceiptsSearch();
$sum = new ReceiptsSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
 return $this->render('index', [
   'searchModel' => $searchModel,
   'dataProvider' => $dataProvider,
   'sum'=>$sum,
   ]);

我的 SearchModel 代码:

public function search($params)
{
    $query = Receipts::find();
    $sum = $query->sum('price');
    $dataProvider = new ActiveDataProvider([
        'query' => $query,
    ]);

    $this->load($params);

    if (!$this->validate()) {
        return $dataProvider;
    }
    $query->joinWith('patient'); 
    $query->andFilterWhere([
       'id' => $this->id,
       'price' => $this->price,
       'reg_date' => $this->reg_date,
    ]);
    $query->andFilterWhere(['like','patient.patient_name',$this->patient_id]);

    return $dataProvider;$sum;
}

我的浏览页面

<?= GridView::widget([

    'dataProvider' => $dataProvider,$sum,

    'filterModel' => $searchModel,
    'showFooter' => true,
    'columns' => [

        ['class' => 'yii\grid\SerialColumn'],

        [
        'attribute'=>'patient_id',
        'value'=>'patient.patient_name'
        ],
        'price',
        ],
        [
        'attribute' => 'sum',
        'footer' => 'sum',
        ],
        ['class' => 'yii\grid\ActionColumn'],
    ],
    ]); 
?>

显示的消息是:

设置未知属性:yii\grid\GridView::0

【问题讨论】:

  • @InsaneSkull 我只是想知道该代码的哪一部分将进入控制器或搜索模型并查看..如何使用该解决方案。

标签: gridview yii yii2 sum yii2-advanced-app


【解决方案1】:

控制器

$searchModel = new ReceiptsSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);

return $this->render('index', [
  'searchModel' => $searchModel,
  'dataProvider' => $dataProvider,
]);

搜索模型

public function search($params)
{
  $query = Receipts::find()->joinWith('patient');

  $dataProvider = new ActiveDataProvider([
    'query' => $query,
  ]);

  $this->load($params);

  if (!$this->validate()) {
      return $dataProvider;
  }

  $query->andFilterWhere([
     'id' => $this->id,
     'price' => $this->price,
     'reg_date' => $this->reg_date,
  ]);

  $query->andFilterWhere(['like','patient.patient_name',$this->patient_id]);

  return $dataProvider;
}

查看

<?= GridView::widget([
   'dataProvider' => $dataProvider,
   'filterModel' => $searchModel,
   'showFooter' => true,
   'columns' => [
       ['class' => 'yii\grid\SerialColumn'],

       [
         'attribute' => 'patient_id',
         'value' => 'patient.patient_name'
       ],
       [
         'attribute' => 'price',
         'footer' => Receipts::getTotal($dataProvider->models, 'price'),       
       ],

       ['class' => 'yii\grid\ActionColumn'],
    ],
]); ?>

收据模型

public static function getTotal($provider, $fieldName)
{
    $total = 0;

    foreach ($provider as $item) {
        $total += $item[$fieldName];
    }

    return $total;
}

【讨论】:

  • 我在你是天才之前告诉过你,而不是疯狂它按我的意愿工作 :) .. 谢谢
  • @NaeemAli 告诉你我疯了,这就是天才的原因。 :)
  • 你不需要静态方法 Receipts::getTotal 它足以在你的视图文件中像这样 $dataProvider->query->sum('price') 那样做。那更好,因为它总是使用您当前的过滤器
【解决方案2】:

您可以在不使用辅助函数的情况下使用use kartik\grid\GridView; 达到相同的效果。

只需将 'showPageSummary' =&gt; true 添加到您的 GridView 配置中,并将 pageSummary' =&gt; true 添加到您需要求和的列中。

查看

use kartik\grid\GridView;

echo GridView::widget([
       'dataProvider' => $dataProvider,
       'filterModel' => $searchModel,
       'showPageSummary' => true,
       'columns' => [
            ['class' => 'yii\grid\SerialColumn'],
            [
                'attribute' => 'patient_id',
                'value' => 'patient.patient_name'
            ],
            [
                'attribute' => 'price',
                'pageSummary' => true
            ],
            ['class' => 'yii\grid\ActionColumn'],
       ],
]); ?>

【讨论】:

  • 您在 1 年零 3 个月后回答了我的问题 :),是的,您可以做到,我通过经验得到了这个答案:P
【解决方案3】:

页脚通常用于列的总结果(而不是单独的列)

假设$sum 是您希望在您认为的列价格下方看到的值

 <?= GridView::widget([
  'dataProvider' => $dataProvider
  'filterModel' => $searchModel,
  'showFooter' => true,
  'columns' => [
      ['class' => 'yii\grid\SerialColumn'],
      [
        'attribute'=>'patient_id',
        'value'=>'patient.patient_name'
      ],
      [
        'attribute'=>'price',
        'footer' => $sum,       
      ],
      ['class' => 'yii\grid\ActionColumn'],
    ],
  ]); 
?>

但是查看您的代码,您有几个错误..

在搜索中这是错误的

 return $dataProvider;$sum;

你只能返回一个值,所以你应该

  return $dataProvider;

在你的控制器中这是错误的

 $searchModel = new ReceiptsSearch();
 $sum = new ReceiptsSearch();

$sum 的结果与 $searcModel 的结果相同,$sum 没有返回新值

您应该以这种方式执行 $sum 的查询

$sum = Receipts::find()->sum('price');



$searchModel = new ReceiptsSearch();
$sum = Receipts::find()->sum('price');
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
  'searchModel' => $searchModel,
  'dataProvider' => $dataProvider,
   'sum'=>$sum,
  ]);

【讨论】:

  • 仍然给我Setting unknown property: yii\grid\GridView::0
  • 1) 像在我的代码中一样从“dataProvider”行中删除 $sum 2) 最终只是为了调试尝试注释行 'value'=>'patient.patient_name'
  • @scaisEedge trim() expects parameter 1 to be string, object given
  • 查看您的代码我发现了一些概念性错误..尝试纠正这些错误,然后发布更新的代码
  • 我用过这种方式,效果很好,但是即使我使用了过滤器,它也会给我 Receipt 表中所有数据的总和,谢谢你的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
相关资源
最近更新 更多