2012-07-21 22 views
16

Tengo una función en mi modelo de profesor que devuelve categorías array.Yii gridview use variable externa en valor

getCaterogies() { 
    return array('1' => 'short tempered', '2' => 'funny', '3' => 'visionary', ...); 
} 

estoy almacenando los índices en la base de datos y la visualización de valores de todo el mundo utilizando el valor de la matriz correspondiente a la ..

$categories = $teacher->categories; 
$category = $categories[$teacher->category]; 

que estoy haciendo esto porque una vez que alguien me sugirió no almacenar cadenas en una base de datos que son estados, en su lugar 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 al mostrar 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 toman.

¿Cómo puedo hacer que esto funcione para gridview?

Respuesta

45

puede utilizar la función anónima como el valor que puede tomar $row, $data params donde $row mantiene el número de fila (basado en cero) y $data contiene el modelo de datos para la fila.

De esta forma puede tenerlo definido solo dentro.

$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 utilizarlo desde fuera, puede confiar en 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]; 
      }, 
     ), 
    ), 
)); 

Yo personalmente recomiendo segundo, porque de esa manera el cálculo de la matriz será sólo una vez y se usará en todos los casos.

+4

funciona como un encanto ... ambas soluciones ... gracias ..:) –

+0

Consejo: Si es necesario, puede llamar a una función de modelo (para cada registro), para devolver los valores múltiples que desea imprimir en diferentes columnas gridview para dicho registro. En lugar de llamar a la función en cada columna, puede llamarla por la primera columna y actualizar $ categorías con el resultado. Las otras columnas podrían simplemente leer desde $ categorías. Para hacer esto, 'usa' el parámetro por referencia (simplemente agrega un signo & (&) al frente del parámetro cuando se incluye, no también dentro de la función). 'valor' => función ($ data, $ fila) use (& $ categorías) { $ categories = ... }, –

2

Puede escribir

$categories = $teacher->categories; 
$category = $categories[$teacher->category]; 

en una línea:

$category = $teacher->categories[$teacher->category];  

Además, le sugiero que utilice otra solución:

class ModelClass 
{ 
    const STATUS_SHORT_TEMPERED = 1; 
    const STATUS_FUNNY = 2; 
    const STATUS_VISIONARY = 3; 
} 

Esto le permite utilizar una mayor semántica

ModelClass::STATUS_FUNNY; 

en lugar de menos semántica

2; 

Además, se puede componer la matriz de esta manera:

getCaterogies() { 
    return array(
     ModelClass::STATUS_FUNNY => 'status funny', 
     ... 
    ); 
} 
+0

muchas gracias por su sugerencia const .. –

+0

está seguro de '$ category = $ teacher-> categories [$ teacher-> category];' will wirk, porque es un getter dinámico en el modelo y el getter que me está devolviendo la matriz. –

+2

gracias por su tiempo y sugerencias, pero lo que estoy buscando es precisamente respondido por el otro tipo, y podría necesitar esas soluciones en muchos otros casos ... En este caso, su solución funciona perfecto, pero latr Tal vez necesite esas cosas de 'uso' ... el flujo de entrada no me permite votar ... :( –

Cuestiones relacionadas