fill a field after validating another

Hi there,

I started using Yii recently and now I’m facing some problems and I pretty sure It’s because I’m not used to it.

I’m trying to fill a field on my form after validating another one. But I don’t know exactly how to do that. The validation for the first field is fine.

Here are my rules from model




            array('placa', 'exist',

                'allowEmpty' => false,

                'attributeName' => 'placa',

                'className' => 'Patrimonio',

                'message' => 'Patrimônio não encontrado.',

                'skipOnError'=>true

            ),

            array('cod_conservacao_ant', 'buscarConservacao'),



and here is the method I created




    public function buscarConservacao($attribute,$params){

        $patrimonio = $this->placa;

        $conservacao = Patrimonio::model()->findByAttributes(array('placa'=>$patrimonio))->cod_conservacao;

        $this->cod_conservacao_ant = $conservacao;

    }



I thought about using ajax, but I still don’t know quite right how to use it on the form.

Any ideas how to solve this?

After some search I found out that ajax was the better solution.

I wanted to share what I did to help out someone

This is my _form




        <div class="row">

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

            <?php

                $ajaxConservacao = CHtml::ajax(array(

                    'type' => 'GET',

                    'url' => array('/movimentacao/conservacaoPatrimonio'),

                    'data' => array (

                        'patrimonio' => 'js:$(this).val()',

                    ),

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

                ));


                $ajaxSala = CHtml::ajax(array(

                    'type' => 'GET',

                    'url' => array('/movimentacao/salaPatrimonio'),

                    'data' => array (

                        'patrimonio' => 'js:$(this).val()',

                    ),

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

                ));


                echo $form->textField($model,'placa',array('disabled'=>$options, 'size'=>6,'maxlength'=>6, 'onchange' => $ajaxConservacao . $ajaxSala));

            ?>




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

        </div>


        <div class="row">

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

            <?php

                echo $form->dropDownList($model, 'cod_conservacao_ant',

                    $this->getConservacaoPatrimonio($model->placa),

                    array('disabled'=>$options)

                );

            ?>


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

        </div>


        <div class="row">

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

            <?php //echo $form->textField($model,'cod_sala_ant', array('disabled'=>true)); ?>

            <?php

                echo $form->dropDownList($model, 'cod_sala_ant',

                    $this->getSalaPatrimonio($model->placa),

                    array('disabled'=>$options)

                );

            ?>

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

        </div>



this is my controller




    public function actionConservacaoPatrimonio($patrimonio){

        $options = array('disabled'=>true);


        echo CHtml::listOptions('', $this->getConservacaoPatrimonio($patrimonio), $options);

    }

    public function getConservacaoPatrimonio($patrimonio){

        $result = array();


        if($placas = Patrimonio::model()->findAllByAttributes(array('placa'=>$patrimonio)))

            foreach($placas as $placa) {

                $reg = array();

                $reg['cod_conservacao'] = $placa->cod_conservacao;

                $reg['descr_conservacao'] = $placa->codConservacao->descr_conservacao;

                $result[] = $reg;

            }

        return CHtml::listData($result, 'cod_conservacao', 'descr_conservacao');

    }


    public function actionSalaPatrimonio($patrimonio){

        $options = array('disabled'=>true);


        echo CHtml::listOptions('', $this->getSalaPatrimonio($patrimonio), $options);

    }

    public function getSalaPatrimonio($patrimonio){

        $result = array();


        if($placas = Patrimonio::model()->findAllByAttributes(array('placa'=>$patrimonio)))

            foreach($placas as $placa) {

                $reg = array();

                $reg['cod_sala'] = $placa->cod_sala;

                $reg['descr_sala'] = $placa->codSala->descr_sala;

                $result[] = $reg;

            }

        return CHtml::listData($result, 'cod_sala', 'descr_sala');

    }



So with this I don’t need any rule on the model and it works just the way I needed.