如何通过yii2中的索引将值从控制器传递到模型中的函数

时间:2017-07-17 06:53:00

标签: gridview model controller yii2

我在网格中添加了一个额外的列,其值由模型中的函数计算。 索引文件中的列

       [
        'attribute' => 'Arrears',
        'pageSummary'=>true,
        'value' => function ($model) {
            return $model->calculatearrears($model);
                    },
        ],

模型中的功能

public function calculatearrears($model,$month){

    return ChallanArrears::find()->select('total')
    ->Where(['challan_arrears.challan_id' => Challan::find()
    ->select(['MAX(id)'])->where(['month_year' => $month])
    ->andWhere(['sid'=>$model->sid])->groupBy('sid')])->scalar();
}

现在,我想将值从控制器传递给此函数。 我在控制器中的代码是

public function actionIndex()
{
    $request = Yii::$app->request;
    $month = $request->post('month');

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

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

这个值可以在索引页面中访问,但是当我在索引中的函数中传递它时,它不起作用。我试图将其作为

传递
[
        'attribute' => 'Arrears',
        'pageSummary'=>true,
        'value' => function ($model, $month) {
            return $model->calculatearrears($model, $month);
                    },
        ],

发生错误未定义变量:月 请帮助我指导可能是我试图以错误的方式实现我的目标。或者告诉我如何从控制器访问该值并通过gridview小部件将其传递给函数

2 个答案:

答案 0 :(得分:0)

您可以使用use()使clous

显示$ month
 [
    'attribute' => 'Arrears',
    'pageSummary'=>true,
    'value' => function ($model) use($month) {
        return $model->calculatearrears($model, $month);
                },
    ], 

并且显然必须根据所需用途调整函数calculatearrears,例如:

 public function calculatearrears($model, $month){
      .......

 }

答案 1 :(得分:0)

有两种方法可以做到这一点。首先,稍微修改一下代码:

你在模特中的功能:

public function calculatearrears($model,$month){

    return ChallanArrears::find()->select('total')
    ->Where(['challan_arrears.challan_id' => Challan::find()
    ->select(['MAX(id)'])->where(['month_year' => $month])
    ->andWhere(['sid'=>$model->sid])->groupBy('sid')])->scalar();
}

在视图文件中:

[
    'attribute' => 'Arrears',
    'pageSummary'=>true,
    'value' => function ($model) use($month) {   // here use($month)
        return $model->calculatearrears($model, $month);
        },
    ], 

或更多OOP方式,首先在模型中定义属性并添加到规则中:

class YourModel extends ActiveRecord 
{
    public $month;

    public function rules() {
        return [
              // your rules
            ['month', 'string'],
        ];
    }
    //...
}

在控制器中:

public function actionIndex()
{
    $request = Yii::$app->request;

    $searchModel = new DetailfeereportSearch();
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);  //here $month will be loaded, because it's now your model property

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

将您的功能更改为:

public function calculatearrears(){

    return ChallanArrears::find()->select('total')
    ->Where(['challan_arrears.challan_id' => Challan::find()
    ->select(['MAX(id)'])->where(['month_year' => $this->month])
    ->andWhere(['sid'=>$this->sid])->groupBy('sid')])->scalar();
}

在视图文件中使用它:

 [
      'attribute' => 'Arrears',
      'pageSummary'=>true,
      'value' => function ($model) {
            return $model->calculatearrears();
       },
  ],