[RESUELTO] Tabla y Ambito

[font="Courier New"]Hola,

Este es un problema que entre que soy nuevo en el uso de frameworks y más nuevo en ser "ordenado" en el desarrollo me tiene contra las cuerdas.

Tengo 2 tablas, una llamada "idiomas" y otra llamada "colores".

En la tabla idiomas tengo la definición de los idiomas que se usarán en las traducciones, en la de colores los colores con su código, el código de idioma y su descripción. Así sería

idioma

idiCodigo idiDescripcion

es español

en inglés

pt portugués

color

colCodigo idiCodigo colDescripcion

1 es blanco

1 en white

2 es negro

2 pt preto

3 es gris

También tengo una vista definida en la DB la cual, uniendo ambas me entrega

idioma_color

colCodigo idiDescripcion colDescripcion

1 español blanco

1 inglés white

1 portugués NULL

2 [/font]español [font="Courier New"]negro

2 portugués preto

2 inglés NULL

3 [/font][font="Courier New"]español [/font][font="Courier New"]gris

3 inglés NULL

3 portugués NULL

Logré (no con mucho esfuerzo) que el CRUD mostrara sólo los registros en español (como descripción del color a editar).

Pero ahora se me presenta otro problema: ¿cómo muestro a modo de "planilla" los colores ya traducidos o sin traducir?

Supongamos la vista de "update"

Color

Descripción: BLANCO

inglés: [white	]

portugués: [ ]

Sospecho que (al menos para ver el detalle) debo "tocar" el archivo "view.php", y para lo referente a agregar y editar el _form.php

Honestamente, leí la documentación de CGRid, CActiveRecord pero no logro entender lo ahí expuesto si me sirve y como…

¿Podrá alguien asistirme? No es un problema "técnico" sino de índole "práctica".

Gracias desde ya…

PD: Si responde algún Argentino, en las inmediaciones de Capital Federal invito una cerveza si es necesario :D

[/font]

El teme es de SQL:




SELECT * FROM color WHERE idcolor NOT IN (SELECT idcolor FROM idioma_color WHERE idioma = 'español') 



o algo por el estilo…

Eso te diría los colores que no estan…

Saludos

Sebas… Gracias por responder…

Mi problema no es la consulta de SQL… sino cómo implementarlo en Yii… no pretendo un pormenorizado detalle de la solución… sino… una suerte de “Oja de ruta” a seguir para poder resolverlo… ¿es mucho lo que pido? :blush: de todas maneras todos los aportes son bienvenidos :)

ColorModel::model()->findAllBySql( "Acá va el SQL que te pase");

y eso te devuelve todos los modelos de color que no tienen traducción en ese idioma de forma de ActiveRecords de color.

Saludos!

AAAaaaaaaaaaaaaaah! ok… Perdón que sea tan bruto :unsure:

Ya me doy cuenta de por donde puedo asirme… Voy a experimentar un poco con esto y comentaré que resultados tengo… Quizá hasta pueda luego "documentar" la solución con la que dé.

Si se te ocurren más ideas, las agradeceré…

E.

honestamente, no entiendo…

posteo el código de mi "view.php"

<?php

$this->breadcrumbs=array(

'Colors'=&gt;array('index'),


&#036;model-&gt;trnColor,

);

$this->menu=array(

array('label'=&gt;'List Color', 'url'=&gt;array('index')),


array('label'=&gt;'Create Color', 'url'=&gt;array('create')),


array('label'=&gt;'Update Color', 'url'=&gt;array('update', 'id'=&gt;&#036;model-&gt;id)),


array('label'=&gt;'Delete Color', 'url'=&gt;'#', 'linkOptions'=&gt;array('submit'=&gt;array('delete','id'=&gt;&#036;model-&gt;id),'confirm'=&gt;'Are you sure you want to delete this item?')),


array('label'=&gt;'Manage Color', 'url'=&gt;array('admin')),

);

?>

<h1>View Color <?php echo $model->trnColor; ?></h1>

<?php $this->widget(‘zii.widgets.CDetailView’, array(

'data'=&gt;&#036;model,


'attributes'=&gt;array(


	//'id',


	//'colCodigo',


	//'idiCodigo',


	'trnColor',


),

));

?>

<h2>Translations for <?php echo $model->trnColor; ?></h2>

<?php

$sSQL = "SELECT " .

    	&quot;tbl_color.colCodigo, &quot; .


    	&quot;tbl_idioma.idiCodigo, &quot; .


    	&quot;tbl_idioma.idiDescripcion, &quot; .


    	&quot;IF(ISNULL(tbl_color.trnColor),'',tbl_color.trnColor) AS trnColor &quot; .


  	&quot;FROM tbl_color &quot; .


  	&quot;RIGHT OUTER JOIN tbl_idioma &quot; .


           	&quot;ON (tbl_color.idiCodigo = tbl_idioma.idiCodigo) AND &quot;.


           	&quot;(tbl_color.colCodigo = &#036;model-&gt;colCodigo)&quot; .


  	&quot;ORDER BY tbl_idioma.idiDescripcion;&quot;;

$NoEspColorScope = Color::model()->findAllBySql($sSQL);

$this->widget(‘zii.widgets.CDetailView’,

array(


'data'=&gt;&#036;NoEspColorScope,


'columns'=&gt;array(


	//'id',


	'colCodigo',


	'idiCodigo',


	'idiDescripcion',


	'trnColor',


),


)

);

?>

pretendo q se vea algo como

View Color AMARILLO

Descripción AMARILLO

Translations for AMARILLO

ingles: YELLOW

portugues:

Y obtengo:

View Color AMARILLO

Descripción AMARILLO

Translations for AMARILLO

Col Codigo Not set

Idi Codigo Not set

Idi Descripcion Not set

Trn Color Not set

No me doy cuenta definitivamente :-[

Logré destrabar que me mostrara un registro de la tabla de Color en Español y debajo una grilla con los colores traducidos que ya existían.

Ahora la pesquisa es lograr que en vez de mostrarme el código del idioma (que es un campo comun a la tabla Color y la tabla de Idiomas) me muestre el nombre de dicho idioma…

¿Dónde debo definir esa "relacion"?¿de que manera?

He leído CActiveRecord, como definir las relaciones en el modelo de la tabla, más no entiendo cómo hacer referencia a un campo de la tabla Idioma en la vista de Color

La tabla Color tiene los campos: colCodigo, idiCodigo, colDescripcion y la de Idioma tiene idiCodigo e idiDescripcion.

La idea es que en la vista de Color tenga "disponible" el campo idiDescripvion de modo que pueda "dibujar" esto

Español: Blanco

Inglés: White

Portugués: (espacio en blanco)

¿Algún alma caritativa que me indique los pasos para realizarlo?

Gracias desde ya…

Me podes mostar las relaciones que tenes definidas en el modelo Color?

Gracias Pol… Acá está

/**


 * @return array relational rules.


 */


public function relations()


{


	// NOTE: you may need to adjust the relation name and the related


	// class name for the relations automatically generated below.


	return array(


  'tblArticulos' =&gt; array(self::MANY_MANY, 'Articulo', 'tbl_artcolor(artCodigo, colCodigo)'),


'idiCodigo' =&gt; array(self::BELONGS_TO, 'Idioma', 'idiCodigo'),


//'idiDescripcion' =&gt; array(self::BELONGS_TO, 'Idioma', 'idiDescripcion'),


	);


}

Intenté poner lo que está comentado, pero me sale un error diciendo que el campo no está definido en el modelo…

Gracias por el interés

entonces,

$color->idiCodigo->idiDecripcion te va a dar lo que necesitas!!!

Por que??

$color es una instancia del modelo Color.

Como tiene definida una relacion BELONGS_TO con Idioma llamada idiCodigo (seria mejor que la renombres a tblIdioma, o directamente idioma) $color->idiCodigo es el registro del modelo Idioma relacionado con ese $color.

$color->idiCodigo->idiDescripcion, es el campo idiDescripcion del modelo Idioma.

Si renombras la relacion idiCodigo a idioma asi:




public function relations()

{

   return array(

  	'tblArticulos' => array(self::MANY_MANY, 'Articulo', 'tbl_artcolor(artCodigo, colCodigo)'),

  	'idioma' => array(self::BELONGS_TO, 'Idioma', 'idiCodigo'), // <- ACA ESTA EL CAMBIO, en la clave del array!!

   );

}



entonces tendrias que usarlo asi:

$codigo->idioma->idiDescripcion

Voy entendiendo…

Y como refiero al campo idiDescripcion en esta parte?..




<h2>Translations for <?php echo $model->trnColor; ?></h2>


<?php $this->widget('zii.widgets.grid.CGridView', array(

  'dataProvider'=>$coloresTraducidos,

  'columns'=>array(

	//'id',

	//'colCodigo',

	'idiDescripcion', // esto hace que yii no encuentre en el modelo Color el campo... Lo cual entiendo, pero no se cómo modificarlo..

	'trnColor',),

)); ?>



Hoy pensaba usar una vista… pero concluí en que es el camino más largo al tener que definir en detalle el tratamiento de los datos…




<h2>Translations for <?php echo $model->trnColor; ?></h2>


<?php $this->widget('zii.widgets.grid.CGridView', array(

  'dataProvider'=>$coloresTraducidos,

  'columns'=>array(

        //'id',

        //'colCodigo',

        'idiCodigo.idiDescripcion', // idiCodigo si no renombraste la relacion, si la renombraste a idioma seria idioma.idiDescripcion

        'trnColor',),

)); ?>




Siiiiiiiiiiiiiiiiii!.. anduvo!..

El que sabe, sabe… el que no, aprende…