Yii gridview использует внешнюю переменную в значении
У меня есть функция в моей модели Teacher, которая возвращает массив категорий.
getCaterogies() {
return array('1' => 'short tempered', '2' => 'funny', '3' => 'visionary', ...);
}
Я храню индексы в базе данных и отображаю значения везде, используя значение массива, соответствующее этому.
$categories = $teacher->categories;
$category = $categories[$teacher->category];
Я делаю это, потому что однажды кто-то предложил мне не хранить строки в базе данных, которые являются статусами, вместо этого хранить целые значения и либо хранить преобразование в базе данных, либо определять ее в модели ht. Проблема со строками заключается в том, что они более склонны к ошибкам человека в сравнении. Возможно, из-за чувствительности к регистру.
Теперь проблема, с которой я сталкиваюсь, заключается в том, что при отображении значений в gridview мне нужно записать 2 строки в поле значений, но это выражение, а внешние переменные также не принимаются.
Как это сделать для gridview?
Ответы
Ответ 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',
...
);
}