Validaciones de campos de otros modelos en formulario

Buenas a todos, ps me encuentro con esta pequeña inquietud de como aplicar las reglas de validación de un modelo en el formulario de otro.

Ejemplo: tengo un formulario del modelo A y ese formulario tiene campos de otro modelo llamemoslo B, asigné las reglas de validación del modelo B con un scenario especifico y hago la instancia con el respectivo scenario en el modelo A pero no me muestra ningun mensaje de error en los campos del modelo B sino que solo me muestra los errores de los campos que provienen del modelo A, los label que son del modelo B si les aparece el asterisco(*) característico de la validación required pero no da error al dejar el campo vacio como de costumbre pasa con la regla required, los modelos estan instanciados desde el controlador con su respectivo scenario.

aqui les dejo las rules de los modelos correspondientes y las instancias.

Modelo Prestamo rules()


array('cant_material, id_prestador, fecha_entrega', 'required', 'on'=>'prestamo', 'message'=>'Tiene que escoger {attribute} para proseguir con el prestamo!'),

Modelo Materiales rules()


array('cota', 'required', 'on'=>'prestamos', 'message'=>'Debe introducir la cota del material para realizar la búsqueda!'),

Modelo Ejemplares rules()


array('ejemplar', 'required', 'on'=>'prestar', 'message'=>'Escoja un ejemplar'),

Instancias de los modelos


$model=new Prestamo('prestamo');

$modelEjemplar = new Ejemplares('prestar');

$materiales = new Materiales('prestamos');

y aqui el formulario del modelo origen que es Prestamo


<div id="materiales" class="container-fluid"><br>


        <div id="material_1" class="row-fluid" align="center">

            <fieldset class="mtrls"><!--Datos del Material1-->

                <legend class="span12 mtrs" style=" font-size: 17px;"><b>Datos del Material</b></legend>

                <div>

                    <div><?php echo $form->labelEx($materiales,'cota', array('for'=>'mat1')); ?></div>

                    <div>

                        <?php echo $form->textField($materiales,'cota',array('maxlength'=>'10', 'onchange'=>'buscarMaterial(1)', 'name'=>'materiales[]', 'id'=>'mat1')); ?>

                        <?php echo $form->error($materiales,'cota'); ?>

                    </div>

                    <div id="ejemplar1">

                        <?php echo $form->labelEx($ejemplares,'ejemplar'); ?>

                        <?php echo $form->dropDownList($ejemplares, 'ejemplar', CHtml::listData(Ejemplares::model()->findAll(array('order'=>'ejemplar asc')),'id', 'ejemplar'), array('name'=>'ejemplares[]', 'id'=>'ejemplar_1')); ?>

                        <?php echo $form->error($ejemplares,'ejemplar'); ?>

                    </div>

                <div id="mensajesSistema1"  class="materialData1"></div>

                <br>                    

                <div id="tabla-mat1" class="span12"></div>

                </div>

            </fieldset><!--fin datos del material1-->

        </div>

        <br>


        <div id="material_2" class="row-fluid" align="center">

            <fieldset class="mtrls"><!--Datos del Material2-->

                <legend class="span12 mtrs" style=" font-size: 17px;"><b>Datos del Material</b></legend>

                <div>

                    <div><?php echo $form->labelEx($materiales,'cota', array('for'=>'mat2')); ?></div>

                    <div>

                        <?php echo $form->textField($materiales,'cota',array('maxlength'=>'10', 'onchange'=>'buscarMaterial(2)', 'name'=>'materiales[]', 'id'=>'mat2')); ?>

                    </div>

                    <div id="ejemplar2">

                        <?php echo CHtml::label('Ejemplar(es)','ejemplar_2'); ?>

                        <?php echo $form->dropDownList($ejemplares, 'ejemplar', CHtml::listData(Ejemplares::model()->findAll(array('order'=>'ejemplar asc')),'id', 'ejemplar'), array('name'=>'ejemplares[]', 'id'=>'ejemplar_2')); ?>         

                    </div>

                <div id="mensajesSistema2"  class="materialData2"></div>

                <br>                    

                <div id="tabla-mat2" class="span12"></div>

                </div>

            </fieldset><!--fin datos del material2-->

        </div>

        <br>


        <div id="material_3" class="row-fluid" align="center">

            <fieldset class="mtrls"><!--Datos del Material3-->

                <legend class="span12 mtrs" style=" font-size: 17px;"><b>Datos del Material</b></legend>

                <div>

                    <div><?php echo $form->labelEx($materiales,'cota', array('for'=>'mat3')); ?></div>

                    <div>

                        <?php echo $form->textField($materiales,'cota',array('maxlength'=>'10', 'onchange'=>'buscarMaterial(3)', 'name'=>'materiales[]', 'id'=>'mat3')); ?>

                    </div>

                    <div id="ejemplar3">

                        <?php echo CHtml::label('Ejemplar(es)','ejemplar_3'); ?>

                        <?php echo $form->dropDownList($ejemplares, 'ejemplar', CHtml::listData(Ejemplares::model()->findAll(array('order'=>'ejemplar asc')),'id', 'ejemplar'), array('name'=>'ejemplares[]', 'id'=>'ejemplar_3')); ?>         

                    </div>

                <div id="mensajesSistema3"  class="materialData3"></div>

                <br>                    

                <div id="tabla-mat3" class="span12"></div>

                </div>

            </fieldset><!--fin datos del material3-->

        </div>

        <br>


        <div id="cant_materiales" class="row-fluid" align="center">

            <legend class="span12 mtrs" style=" font-size: 17px;"><b>Usuarios</b></legend>

            <div>

            <?php 

                $datos = Datos::model()->findAll('id_tipo=1 and borrado=FALSE');

                $data = array();


                foreach ($datos as $dato)

                    $data[$dato->id] = $dato->nombres . ' '. $dato->apellidos;

            ?>

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

            <?php echo $form->dropDownList($model, 'id_prestador', $data, array('prompt'=>'Seleccione',

                                                                                'class'=>'input-medium')

                                            );

            ?>

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

            </div>

            <div id="pass_error"></div>

            <div id="check-pass" class="input-append">

                <?php echo $form->passwordField($modelDatos, 'password'); ?>

                <?php $this->widget('bootstrap.widgets.TbButton', array(

                    'label'=>'Verificar',

                    'type'=>'primary',

                    'htmlOptions'=>array(

                        'id'=>'btn-pass',

                        'onclick'=>'verificarPass()',

                    ),

                )); ?>

            </div>

        </div>

        <br>


        <div id="tipo_prestamo" class="row-fluid" align="center">

            <legend class="span12 mtrs" style=" font-size: 17px;"><b>Tipo de Prestamo</b></legend>

            <div class="span5">

                <?php echo CHtml::label('Sala',CHtml::activeId($model, 'id_tipoprestamo')); ?>

                <?php echo CHtml::radioButton('tprestamo', true, array('value'=>1, 'uncheckvalue'=>null)); ?>

            </div>

            <div class="span5"> 

                <?php echo CHtml::label('Circulante',CHtml::activeId($model, 'id_tipoprestamo')); ?>

                <?php echo CHtml::radioButton('tprestamo', '', array('value'=>2, 'uncheckvalue'=>null)); ?>

            </div>

        </div>

        <br>


        <div id="fecha_prestamo" class="row-fluid" align="center">

            <legend class="span12 mtrs" style=" font-size: 17px;"><b>Fechas del Prestamo</b></legend>

                <div id="fecha_prestamo" class="span5">

                    <?php echo $form->textFieldRow($model,'fecha_prestamo', array('readonly'=>true, 'value'=>date("d-m-Y"),)); ?>

                </div>

                <div id="fecha_entrega" class="span6">

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

                    <?php $this->widget('zii.widgets.jui.CJuiDatePicker',

                                        array(

                                            'model' => $model,

                                            'attribute' => 'fecha_entrega',

                                            'value' => $model->fecha_entrega,

                                            'language' => 'es',

                                            'htmlOptions' => array('readonly' => "readonly", 'class' => 'input-large', 'id'=>'fentrega'),

                                            //additional javascript options for the date picker plugin

                                            'options' => array(

                                                            'autoSize' => true,

                                                            // 'defaultDate'=>$model->fechanacimiento,

                                                            //'dateFormat'=>'yy-m-d',

                                                            'dateFormat' => 'dd-mm-yy',

                                                            'buttonImage' => Yii::app()->baseUrl . '/images/calendario.png',

                                                            'buttonImageOnly' => true,

                                                            'buttonText' => 'Escoger fecha',

                                                            'selectOtherMonths' => true,

                                                            'showAnim' => 'slide',

                                                            'showButtonPanel' => true,

                                                            'showOn' => 'button',

                                                                    'changeMonth' => 'true',

                                                                    'changeYear' => 'true',

                                                                    'yearRange' => "1900:+nn",

                                                                    'minDate'=> 0,

                                                                ),

                                                            ));

                    ?>

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

                </div>

        </div>

        <br><br>

        <div id="seccion-guardar" align="center">

            <?php $this->widget('bootstrap.widgets.TbButton',

                                array(

                                    'buttonType' => 'submit',

                                    'type' => 'info',

                                    'icon'=>'icon-ok icon-white',

                                    'label' => 'Guardar Prestamo',

                                    'htmlOptions' => array(

                                                        'id' => 'btn-guardar',

                                                    ),

                                )

                        );

            ?>

        </div>

    </div>

Espero puedan ayudarme con esta inquietud gracias de antemano, a lo mejor se me escapa algo de información sobre las validaciones de modelos externos.

Buenas.

A ver, las validaciones de modelos van en la propia clase CActiveRecord. Estas reglas se lanzan cuando haces una validación del modelo o un save.

Si tienes un formulario (es igual el nº de modelos) y lo envías, vas a tener que hacer varios save (para cada modelo).Si tienes varios modelos, una vez seteas los valores de todos ellos en el controlador, puedes lanzar la validación de cada uno y si alguna falla, vuelves a cargar la página del formulario.




if($model1->validate() && $model2->validate()...



Que se visualicen o no esos errores de validación en la vista de formulario no tiene nada que ver con las reglas de validación. Para que se muestren los errores debes pones los tag adecuados en la vista. Para tu ejemplo podrías hacer algo así:




$form=$this->beginWidget('CActiveForm', 

                                array(

                                    'id'=>'name-form'

                                    )

                                ); 


            echo $form->errorSummary($model1); 

            echo $form->errorSummary($model2); 

            echo $form->errorSummary($model3); 

            echo $form->errorSummary($model4); 

            // Y así sucesivamente.



Por supuesto puedes montar todos los errores en una sola etiqueta. Eso ya es tu decisión.

Un saludo.