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

У меня есть функция в моей модели 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', ... ); }