Переменная доступа в функции Gridview yii2

Я пытаюсь получить доступ к переменной в файле представления в Gridview но это ошибка it should be array but null given я заявляю $totalDays поверх моего файла просмотра, и я использую его в Gridview как ниже

[
'attribute' =>  'class_id',
'format' => 'raw',
'label' => "Class Date",
'value' => function ($model) {
array_push($totalDays,$model->class->date);
return $model->class->date;
},
'footer'=> '<span>Total Days</span>',
],

Но выкидывает следующую ошибку

array_push () ожидает, что параметр 1 будет массивом

3

Решение

Объяснить, $totalDays недоступен в виджете, потому что вся функция запускается только при визуализации виджета, $totalDays больше не объявляется. Как намекнул @arogachev выше, вам нужно будет сделать $totalDays в вашей модели, то вы можете получить к нему доступ. Попробуйте это в вашей модели;

public function getTotalDays(){
//Your logic here to generate totalDays
return $totalDays;
}

Тогда вы можете использовать это по вашему мнению, как это;

[
'attribute' =>  'class_id',
'format' => 'raw',
'label' => "Class Date",
'value' => function ($model) {
array_push($model->totalDays, totalDays,$model->class->date);
return $model->class->date;
},
'footer'=> '<span>Total Days</span>',
],
2

Другие решения

Вставить use после подписи функции в value вызываемая функция:

[
'attribute' =>  'class_id',
'format' => 'raw',
'label' => "Class Date",
'value' => function ($model) use($totaleDays) {
array_push($totalDays,$model->class->date);
return $model->class->date;
},
'footer'=> '<span>Total Days</span>',
],
2

Хотя вы можете определенно передать эту переменную через use раздел закрытия, это неправильно в вашем коде. Принцип MVC нарушается, потому что просмотр это только для отображения, и вы выставляете логику, такую ​​как array_push,

Я бы порекомендовал провести его рефакторинг и поместить расчет данных в модель, чтобы вы могли просто позвонить return $model->yourMethod(); и он вернет нужные данные.

2

Как @Fabrizio сказал. Вставить use после подписи функции в value вызываемая функция:

'value' => function ($model) use($totaleDays) {
array_push($totalDays,$model->class->date);
return $model->class->date;
},

Чтобы передать множественное значение в функцию-значение, вы можете использовать, как показано ниже.

'value' => function ($model) use($var1, $var2....., $varN) {
array_push($totalDays,$model->class->date);
return $model->class->date;
},

Как это use($var1, $var2....., $varN)

0
По вопросам рекламы [email protected]