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