Combos Dependientes Estado>Municipio>Parroquia

Buenos dias, tengo varios dias intentando hacer unos combos dependientes y queria ver si me podian ayudar. pues aqui la cuestion.

Mis tablas son:


tbl_estado

id (PK)

estado


tbl_municipio

id (PK)

idestado(FK)

municipio


tbl_Parroquia

id (PK)

idmunicipio (FK)

parroquia


La tabla que necesito que tenga la ubicacion se llama tbl_estructura y en ella tengo almacenado solo el id de la parroquia, ya que con el se puede saber todo lo demas.


tbl_estructura

id

idparroquia

denominacion


Una vez sabiendo eso tengo mi Form para crear un nuevo organismo en el mismo tengo este codigo, hasta ahora solo he trabajado en la relacion Estado-Municipio que obviamente no he podido realizar. en el form tengo esto


<div class="row">

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

		<?php echo $form->dropDownList($model,'id', //idestado

		CHtml::listData(TblEstado::model()->findAll(),'id','estado'),

			array(

				'ajax'=>array(

					'type'=>'POST',

					'url'=>CController::createUrl('TblEstructura/Selectestado'),

					'update'=>'#'.CHtml::activeId($model,'municipio'),

					),

				)

			//CHtml::listData(TblEstado::model()->findAll(),'id','estado')

		); ?>

		<!-- <?php echo $form->error($model,'idestado'); ?>  No tienen Error porque no son necesario-->

	</div>

	

	

	<div class="row">

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

		<?php echo $form->dropDownList($model,'id',

			CHtml::listData(TblMunicipio::model()->findAll(),'id','municipio')

		); ?> 

	</div>

	<div class="row">

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

		<?php echo $form->dropDownList($model,'idparroquia',

			CHtml::listData(TblParroquia::model()->findAll(),'id','parroquia')

		); ?> 

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

	</div>



en el modelo tengo la funcion Selectestado asi:


public function actionSelectestado() 

	{


		$id_uno = $_POST ['TblEstructura']['id'];

		$lista = TblMunicipio::model()->findAll('id = :id_uno',array(':id_uno'=>$id_uno));

		$lista = CHtml::listData($lista, 'id', 'municipio');


		foreach ($lista as $valor => $municipio) {

			echo CHtml::tag('option',array('value'=>$valor),CHtml::encode($municipio),true);

		}


	}

Todo lo hice siguiendo un tutorial bastante bueno de youtube.

cambie algunas cosas ya que la relacion que muestran en el video no igual a la mia. la cuestion esta en que no me actualiza el combo de municipio. obviamente estoy haciendo algo mal, pero no se que es… agradeceria cualquier ayuda.

Cabe destacar que los id(PK) se llaman igual en todas las tablas y por peticion de el DBA no puedo cambiarlas. estoy realmente desesperado ya. necesito ayuda T_T

Cambia esto en el _form


<div class="row">

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

        <?php echo $form->dropDownList($model,'id',

        	CHtml::listData(TblMunicipio::model()->findAll(),'id','municipio')

        ); ?> 

</div>



Por esto


<div class="row">

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

        <?php echo $form->dropDownList($model,'municipio',//<----El cambio aquí

        	CHtml::listData(TblMunicipio::model()->findAll(),'id','municipio')

        ); ?> 

</div>



Suponiendo que tu modelo (TblEstructura) tiene las siguientes propiedades:




class TblEstructura extends CActiveRecord {

    public $idestado;

    public $idmunicipio;

    .

    .

    .

    .

}



Y que tu controlador tiene:




class TblEstructuraController extends Controller {

    public function accessRules() {

        return array(

            array('allow',

                'actions'=>array('index','view', 'selectParroquia', 'selectMunicipio'),

                'users'=>array('*'),

            ),

            .

            .

            .

        )

    }


    public function actionCreate() {

        $model=new TblEstructura;

        // importante

        $estadoListData = CHtml::listData(TblEstado::model()->findAll(), 'id', 'estado');


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

                $model->attributes=$_POST['TblEstructura'];

                if($model->save())

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

        }


        // importante

        $this->render('create',array(

            'model'=>$model,

            'estadoListData'=>$estadoListData

        ));

    }


    public function actionSelectMunicipio() {

        $id = (int) $_POST ['TblEstructura']['idestado'];

         $lista = CHtml::listData(TblMunicipio::model()->findAll('idestado =:id', array(':id'=>$id)), 'id', 'municipio');


         echo CHtml::tag('option', array('value'=>''), '-- Seleccione Municipio --', true);


        foreach ($lista as $valor=>$municipio) {

            echo CHtml::tag('option', array('value'=>$valor), CHtml::encode($municipio), true);

        }

    }


    public function actionSelectParroquia() {

        $id = (int) $_POST ['TblEstructura']['idmunicipio'];

        $lista = CHtml::listData(TblParroquia::model()->findAll('idmunicipio =:id', array(':id'=>$id)), 'id', 'parroquia');


        echo CHtml::tag('option', array('value'=>''), '-- Seleccione Parroquia --', true);


        foreach ($lista as $valor => $parroquia) {

            echo CHtml::tag('option', array('value'=>$valor), CHtml::encode($parroquia), true);

        }

    }


    .

    .

    .

}



Una modificacion a tu vista create (para enviar los datos de ESTADO desde el CONTROLLER [actionCreate]):




<?php $this->renderPartial('_form', array('model'=>$model, 'estadoListData'=>$estadoListData)); ?>



Tu vista _form deberia lucir algo como:




    <div class="row">

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

        <?php

        echo $form->dropDownList($model, 'idestado', $estadoListData, array(

            'ajax'=>array(

                'type'=>'POST',

                'url'=>$this->createUrl('selectMunicipio'),

                'update'=>'#' . CHtml::activeId($model, 'idmunicipio')

            ), 'prompt'=>'-- Selecciona Estado --'

        ));

        ?>

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

    </div>

    <div class="row">

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

        <?php

        echo $form->dropDownList($model, 'idmunicipio', array(), array(

            'ajax'=>array(

                'type'=>'POST',

                'url'=>$this->createUrl('selectParroquia'),

                'update'=>'#' . CHtml::activeId($model, 'idparroquia')

            ), 'prompt'=>'-- Selecciona Municipio --'

        ));

        ?>

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

    </div>

    <div class="row">

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

        <?php echo $form->dropDownList($model, 'idparroquia', array(), array('prompt'=>'-- Selecciona Parroquia --')); ?>

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

    </div>



Espero te sirva, saludos

B)

Muchas gracias, antes de haber visto tu post lo hice por mi cuenta. y creo que salio bien. fijate como quedó y si ves algo que deba corregir lo agradezco mucho. tambien lo dejo por si alguien lo necesita. :)

_form.php


<!-- ************************************************************************************************ -->

<!-- ************************************************************************************************ -->

<!-- ************************************************************************************************ -->

	<div class="row">

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

		<?php echo $form->dropDownList(TblEstado::model(),'id',

			CHtml::listData(TblEstado::model()->findAll(),'id','estado'),

			array(

                    'ajax' => array(

                    'type' => 'POST',

                    'url' => CController::createUrl('TblEstructura/Selectmunicipio'),

                    'update' => '#'.CHtml::activeId(TblMunicipio::model(),'id'),

                    'beforeSend' => 'function(){

                    	$("#TblEstructura_idparroquia").find("option").remove();

                    	}',

                  //$("#TblMunicipio_id").find("option").remove();

                ),'prompt' => 'Seleccione un Estado...'

            )

		); ?>

	</div>


	<div class="row">

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

	    <?php echo $form->dropDownList(TblMunicipio::model(),'id',

	      CHtml::listData(TblMunicipio::model()->findAll(),'id','municipio'),

	      array(

	          'ajax' => array(

	                    'type' => 'POST',

	                    'url' => CController::createUrl('TblEstructura/Selectparroquia'),

	                    'update' => '#'.CHtml::activeId($model,'idparroquia'), 

	                ),'prompt' => 'Seleccione un Municipio...'

	          )

	    ); ?>

	    

  </div>




	<div class="row">

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

    	<?php echo $form->dropDownList($model,'idparroquia',array(

    	'prompt' => 'Seleccione un Parroquia...'

    	)

    	); ?>

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

	</div>




<!-- ************************************************************************************************ -->

<!-- ************************************************************************************************ -->

<!-- ************************************************************************************************ -->

TblEstructuraController.php




public function accessRules()

	{

		return array(

			array('allow',  // allow all users to perform 'index' and 'view' actions

				'actions'=>array('index','view','SelectMunicipio','Selectparroquia'),

				'users'=>array('*'),

			),

			array('allow', // allow authenticated user to perform 'create' and 'update' actions

				'actions'=>array('create','update'),

				'users'=>array('@'),

			),

			array('allow', // allow admin user to perform 'admin' and 'delete' actions

				'actions'=>array('admin','delete'),

				'users'=>array('admin'),

			),

			array('deny',  // deny all users

				'users'=>array('*'),

			),

		);

	}


public function actionSelectmunicipio()

	{

		 $id_uno= $_POST['TblEstado']['id']; 

	     $lista = TblMunicipio::model()->findAll('idestado = :id_uno',array(':id_uno' => $id_uno));

	     $lista = CHtml::listData($lista, 'id', 'municipio');


	   		echo CHtml::tag('option',array('value' => ''),'Seleccione un Municipio...',true);

	            foreach($lista as $valor => $municipio)

            {

                echo CHtml::tag('option',array('value' => $valor),CHtml::encode($municipio), true);

            }


	}


	public function actionSelectparroquia()

	{

		 $id_dos= $_POST['TblMunicipio']['id']; 

	    //$lista2 = TblParroquia::model()->findAll('idmunicipio = :id_dos',array(':id_dos' => $id_dos));

	     $lista2 = TblParroquia::model()->findAll('idmunicipio = :id_dos',array(':id_dos' => $id_dos));

	     $lista2 = CHtml::listData($lista2, 'id', 'parroquia');


	   		echo CHtml::tag('option',array('value' => ''),'Seleccione un Parroquia...',true);

	            foreach($lista2 as $valor2 => $parroquia)

            {

                echo CHtml::tag('option',array('value' => $valor2),CHtml::encode($parroquia), true);

            }


	}