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

[
            '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 будет массивом, заданным null

5
Mike Ross 24 Дек 2015 в 01:35

4 ответа

Лучший ответ

Чтобы объяснить, $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>',
],
5
Joe Miller 24 Дек 2015 в 07:24

Как сказал @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)

2
Sahil Patel 7 Авг 2018 в 07:21

Вставьте 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>',
],
5
Fabrizio Caldarelli 23 Дек 2015 в 23:13

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

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

2
arogachev 24 Дек 2015 в 04:53