example custom content column php gridview yii

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'', ... ); }