Relaciones Many Many Con Giix

Hola

Estoy realizando un trabajo con yii e instale giix.

Hasta el momento todo iba bien hasta que me di cuenta que llegue a las relaciones MANY MANY.

Tengo tres tablas:

4791

relaciones.png

Que son:

Servicios

Sucursal

servicio_tiene_sucursal

Al momento de crear una sucursal me aparece lo siguiente:

4792

relaciones2.png

Ese valor 1 y 2 son los id de los datos que tiene la tabla servicio_tiene_sucursal. Mi idea es que en vez que aparezca el 1 y el 2 en el label aparezca el nombre de servicio.

PARTE DE LA VIEW




<?php echo $form->error($model,'principal'); ?>

		</div><!-- row -->

		<div class="row">

		<?php echo $form->labelEx($model,'longitud'); ?>

		<?php echo $form->textField($model, 'longitud', array('maxlength' => 255)); ?>

		<?php echo $form->error($model,'longitud'); ?>

		</div><!-- row -->

		<div class="row">

		<?php echo $form->labelEx($model,'latitud'); ?>

		<?php echo $form->textField($model, 'latitud', array('maxlength' => 255)); ?>

		<?php echo $form->error($model,'latitud'); ?>

		</div><!-- row -->


		<label><?php echo GxHtml::encode($model->getRelationLabel('sucursalHabitacions')); ?></label>

		<?php echo $form->checkBoxList($model, 'sucursalHabitacions', GxHtml::encodeEx(GxHtml::listDataEx(SucursalHabitacion::model()->findAllAttributes(null, true)), false, true)); ?>

		<label><?php echo GxHtml::encode($model->getRelationLabel('sucursalImagens')); ?></label>

		<?php echo $form->checkBoxList($model, 'sucursalImagens', GxHtml::encodeEx(GxHtml::listDataEx(SucursalImagen::model()->findAllAttributes(null, true)), false, true)); ?>

		<label><?php echo GxHtml::encode($model->getRelationLabel('sucursalTarifas')); ?></label>

		<?php echo $form->checkBoxList($model, 'sucursalTarifas', GxHtml::encodeEx(GxHtml::listDataEx(SucursalTarifa::model()->findAllAttributes(null, true)), false, true)); ?>

		

                <label><?php echo GxHtml::encode($model->getRelationLabel('sucursalTieneServicios')); ?></label>

		<?php echo $form->checkBoxList($model, 'sucursalTieneServicios', GxHtml::encodeEx(GxHtml::listDataEx(SucursalTieneServicio::model()->findAllAttributes(null, true)), false, true)); ?>



CONTROLLER




    public function actionCreate() {

        $model = new Sucursal;




        if (isset($_POST['Sucursal'])) {

            $model->setAttributes($_POST['Sucursal']);


            if ($model->save()) {

                if (Yii::app()->getRequest()->getIsAjaxRequest())

                    Yii::app()->end();

                else

                    $this->redirect(array('view', 'id' => $model->id_sucursal));

            }

        }


        $this->render('create', array('model' => $model));

    }



MODELO SUCURSAL




	public function relations() {

		return array(

			'idHotel' => array(self::BELONGS_TO, 'Hotel', 'id_hotel'),

			'idComuna' => array(self::BELONGS_TO, 'Comuna', 'id_comuna'),

			'sucursalHabitacions' => array(self::HAS_MANY, 'SucursalHabitacion', 'id_sucursal'),

			'sucursalImagens' => array(self::HAS_MANY, 'SucursalImagen', 'id_sucursal'),

			'sucursalTarifas' => array(self::HAS_MANY, 'SucursalTarifa', 'id_sucursal'),

			'sucursalTieneServicios' => array(self::HAS_MANY, 'SucursalTieneServicio', 'id_sucursal'),

		);

	}


	public function pivotModels() {

		return array(

		);

	}


	public function attributeLabels() {

		return array(

			'id_sucursal' => Yii::t('app', 'Id Sucursal'),

			'id_hotel' => null,

			'id_comuna' => null,

			'direccion' => Yii::t('app', 'Direccion'),

			'numero' => Yii::t('app', 'Numero'),

			'extra' => Yii::t('app', 'Extra'),

			'tel_uno' => Yii::t('app', 'Tel Uno'),

			'tel_dos' => Yii::t('app', 'Tel Dos'),

			'tel_tres' => Yii::t('app', 'Tel Tres'),

			'email' => Yii::t('app', 'Email'),

			'principal' => Yii::t('app', 'Principal'),

			'longitud' => Yii::t('app', 'Longitud'),

			'latitud' => Yii::t('app', 'Latitud'),

			'idHotel' => null,

			'idComuna' => null,

			'sucursalHabitacions' => null,

			'sucursalImagens' => null,

			'sucursalTarifas' => null,

			'sucursalTieneServicios' => null,

		);

	}



MODELO SUCURSALTIENESERVICIO




abstract class BaseSucursalTieneServicio extends GxActiveRecord {


	public static function model($className=__CLASS__) {

		return parent::model($className);

	}


	public function tableName() {

		return 'sucursal_tiene_servicio';

	}


	public static function label($n = 1) {

		return Yii::t('app', 'Servicios Sucursal|Servicios Sucursal', $n);

	}


	public static function representingColumn() {

		return 'id_sucursaltieneservicio';

	}


	public function rules() {

		return array(

			array('id_sucursal, id_servicios', 'numerical', 'integerOnly'=>true),

			array('id_sucursal, id_servicios', 'default', 'setOnEmpty' => true, 'value' => null),

			array('id_sucursaltieneservicio, id_sucursal, id_servicios', 'safe', 'on'=>'search'),

		);

	}


	public function relations() {

		return array(

			'idServicios' => array(self::BELONGS_TO, 'Servicios', 'id_servicios'),

			'idSucursal' => array(self::BELONGS_TO, 'Sucursal', 'id_sucursal'),

		);

	}


	public function pivotModels() {

		return array(

		);

	}


	public function attributeLabels() {

		return array(

			'id_sucursaltieneservicio' => Yii::t('app', 'Id Sucursaltieneservicio'),

			'id_sucursal'  => Yii::t('app', 'Sucursal'),

			'id_servicios' => Yii::t('app', 'Servicio'),

			'idServicios' => null,

			'idSucursal' => null,

		);

	}


	public function search() {

		$criteria = new CDbCriteria;


		$criteria->compare('id_sucursaltieneservicio', $this->id_sucursaltieneservicio);

		$criteria->compare('id_sucursal', $this->id_sucursal);

		$criteria->compare('id_servicios', $this->id_servicios);


		return new CActiveDataProvider($this, array(

			'criteria' => $criteria,

		));

	}

}



MODELO SERVICIO




<?php


abstract class BaseServicios extends GxActiveRecord {


	public static function model($className=__CLASS__) {

		return parent::model($className);

	}


	public function tableName() {

		return 'servicios';

	}


	public static function label($n = 1) {

		return Yii::t('app', 'Servicios|Servicioses', $n);

	}


	public static function representingColumn() {

		return 'nombre';

	}


	public function rules() {

		return array(

			array('nombre', 'length', 'max'=>255),

			array('nombre', 'default', 'setOnEmpty' => true, 'value' => null),

			array('id_servicios, nombre', 'safe', 'on'=>'search'),

		);

	}


	public function relations() {

		return array(

			'sucursalTieneServicios' => array(self::HAS_MANY, 'SucursalTieneServicio', 'id_servicios'),

		);

	}


	public function pivotModels() {

		return array(

		);

	}


	public function attributeLabels() {

		return array(

			'id_servicios' => Yii::t('app', 'Id Servicios'),

			'nombre' => Yii::t('app', 'Nombre'),

			'sucursalTieneServicios' => null,

		);

	}


	public function search() {

		$criteria = new CDbCriteria;


		$criteria->compare('id_servicios', $this->id_servicios);

		$criteria->compare('nombre', $this->nombre, true);


		return new CActiveDataProvider($this, array(

			'criteria' => $criteria,

		));

	}

}



Muchas Gracias

Buenos días.

Creo q lo q debes de hacer es establecer eu tu listData las claves y los textos. No sé cómo funciona GxHtml::lisDataEx pq no trabajo con Giix, pero supongo q será parecido a CHtml::listData. CHtml::listData como primer parámetro tiene el modelo, como segundo el valor guardaro y como tercero el texto mostrado.

Entonces en esta línea:




<?php echo $form->checkBoxList($model, 'sucursalTieneServicios', GxHtml::encodeEx(GxHtml::listDataEx(SucursalTieneServicio::model()->findAllAttributes(null, true)), false, true)); ?>



Deberías poner algo como:




<?php echo $form->checkBoxList($model, 'sucursalTieneServicios', GxHtml::encodeEx(GxHtml::listDataEx(SucursalTieneServicio::model()->findAllAttributes(null, true)), false, NombreServicio)); ?>



Teniendo en cuenta q deberías de crear una propiedad en el modelo SucursalTieneServicio que devuelva el nombre del servicio. Algo como esto:




public function getNombreServicio()

    {

        return $this->idServicios->nombre;

    }



Un saludo.