Yii gridview использует внешнюю переменную в значении - программирование
Подтвердить что ты не робот

Yii gridview использует внешнюю переменную в значении

У меня есть функция в моей модели Teacher, которая возвращает массив категорий.

getCaterogies() {
   return array('1' => 'short tempered', '2' => 'funny', '3' => 'visionary', ...);
}

Я храню индексы в базе данных и отображаю значения везде, используя значение массива, соответствующее этому.

$categories = $teacher->categories;
$category = $categories[$teacher->category];

Я делаю это, потому что однажды кто-то предложил мне не хранить строки в базе данных, которые являются статусами, вместо этого хранить целые значения и либо хранить преобразование в базе данных, либо определять ее в модели ht. Проблема со строками заключается в том, что они более склонны к ошибкам человека в сравнении. Возможно, из-за чувствительности к регистру.

Теперь проблема, с которой я сталкиваюсь, заключается в том, что при отображении значений в gridview мне нужно записать 2 строки в поле значений, но это выражение, а внешние переменные также не принимаются.

Как это сделать для gridview?

4b9b3361

Ответ 1

Вы можете использовать анонимную функцию как значение, которое может принимать параметры $row, $data, где $row содержит номер строки (с нулевой основанием) и $data содержит модель данных для строки.

Таким образом, вы можете определить его только внутри.

$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider,
    'columns'=>array(
        array(
            'name'=>'..',
            'value'=>function($data,$row){
                $categories = $teacher->categories;
                return $categories[$data->category];
            },
        ),
    ),
));

И если вы хотите использовать его извне, вы можете положиться на PHP use:

$categories = $teacher->categories;
$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider,
    'columns'=>array(
        array(
            'name'=>'..',
            'value'=>function($data,$row) use ($categories){
                return $categories[$data->category];
            },
        ),
    ),
));

Я бы рекомендовал второй вариант, потому что таким образом вычисление массива будет только один раз и будет использоваться во всех случаях.

Ответ 2

Вы можете написать

$categories = $teacher->categories;
$category = $categories[$teacher->category];

в одной строке:

$category = $teacher->categories[$teacher->category];    

Кроме того, я предлагаю вам использовать другое решение:

class ModelClass
{
    const STATUS_SHORT_TEMPERED = 1;
    const STATUS_FUNNY = 2;
    const STATUS_VISIONARY = 3;
}

Это позволяет использовать более семантический

ModelClass::STATUS_FUNNY;

вместо менее семантического

2;

Кроме того, вы можете создать свой массив следующим образом:

getCaterogies() {
    return array(
        ModelClass::STATUS_FUNNY => 'status funny',
        ...
    );
}