php - custom - yii2 gridview filter
Yii gridview usa variable externa en valor (2)
Tengo una función en mi modelo de profesor que devuelve categorías array.
getCaterogies() {
return array(''1'' => ''short tempered'', ''2'' => ''funny'', ''3'' => ''visionary'', ...);
}
Estoy almacenando índices en la base de datos y mostrando valores en todas partes usando el valor de la matriz correspondiente a eso.
$categories = $teacher->categories;
$category = $categories[$teacher->category];
Hago esto porque una vez alguien me sugirió no almacenar cadenas en una base de datos que son estados, en cambio almacenar valores enteros y almacenar la conversión en la base de datos o definirla en el modelo ht. El problema con las cadenas es que son más propensas a los errores humanos en las comparaciones. Tal vez por sensibilidad a las mayúsculas y minúsculas.
Ahora el problema al que me enfrento es que, mientras visualizo los valores en gridview, necesito escribir las 2 líneas en un campo de valor, pero es una expresión, y las variables externas tampoco lo hacen.
¿Cómo puedo hacer que esto funcione para gridview?
Puede usar la función anónima como valor que puede tomar $row
, $data
params donde $row
contiene el número de fila (basado en cero) y $data
contiene el modelo de datos para la fila.
De esa forma puedes tenerlo definido solo adentro.
$this->widget(''zii.widgets.grid.CGridView'', array(
''dataProvider''=>$dataProvider,
''columns''=>array(
array(
''name''=>''..'',
''value''=>function($data,$row){
$categories = $teacher->categories;
return $categories[$data->category];
},
),
),
));
Y si desea usarlo desde afuera, puede confiar en el use
de 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];
},
),
),
));
Yo personalmente recomendaría el segundo, porque de esa manera el cálculo de la matriz será solo una vez y se usará en todos los casos.
Puedes escribir
$categories = $teacher->categories;
$category = $categories[$teacher->category];
en una línea:
$category = $teacher->categories[$teacher->category];
Además, te sugiero que uses otra solución:
class ModelClass
{
const STATUS_SHORT_TEMPERED = 1;
const STATUS_FUNNY = 2;
const STATUS_VISIONARY = 3;
}
Esto le permite usar una mayor semántica
ModelClass::STATUS_FUNNY;
en lugar de menos semántica
2;
Además, puede componer su matriz de esta manera:
getCaterogies() {
return array(
ModelClass::STATUS_FUNNY => ''status funny'',
...
);
}