Validar Model Sem Salvar

Boa tarde, estou fazendo um subform que envia os dados via ajax e salva na sessão porem gostaria de validar estes dados como faço?

Já tentou usar:




if( $model->validate() ) {

 // dados válidos

}



Já mas não obtive exito, esqueci de especificar. Estou usando um modal do yii - bootstrap então teria que ser validação ajax pois ao submeter ele fecha o modal e após instalar o Yii-Bootstrap não consegui mais realizar validação ajax acredito que seja de uma maneira diferente, vou postar o código para facilitar

_form.php




<div class="form">


<?php $form=$this->beginWidget('bootstrap.widgets.TbActiveForm', array(

	'id'=>'associados-form',

	'enableAjaxValidation'=>true,

)); ?>


	<p class="note">Campos com <span class="required">*</span> são obrigatórios.</p>


	<?php

		echo $form->textFieldRow($model['Associados'],'nome',array('size'=>60,'maxlength'=>150));

		echo $form->textFieldRow($model['Associados'],'cnpj',array('size'=>20,'maxlength'=>20));

		echo $form->textFieldRow($model['Associados'],'endereco',array('size'=>60,'maxlength'=>200));

		echo $form->textFieldRow($model['Associados'],'bairro',array('size'=>60,'maxlength'=>200)); 

		echo $form->textFieldRow($model['Associados'],'cidades_id');

		echo $form->textFieldRow($model['Associados'],'cep',array('size'=>20,'maxlength'=>20));

		echo $form->textFieldRow($model['Associados'],'telefone',array('size'=>20,'maxlength'=>20));

		echo $form->textFieldRow($model['Associados'],'cxpostal');

		echo $form->textFieldRow($model['Associados'],'email',array('size'=>60,'maxlength'=>150));

		echo $form->textFieldRow($model['Associados'],'codigo');

		echo $form->textFieldRow($model['Associados'],'imagem',array('size'=>60,'maxlength'=>150));

		echo $form->textFieldRow($model['Associados'],'tipo');

		echo $form->textFieldRow($model['Associados'],'ativo');

		echo $form->textFieldRow($model['Associados'],'site',array('size'=>60,'maxlength'=>150));

		echo $form->textFieldRow($model['Associados'],'logo',array('size'=>60,'maxlength'=>150));

		echo $form->textFieldRow($model['Associados'],'inscricao_estadual',array('size'=>50,'maxlength'=>50));

		echo $form->textFieldRow($model['Associados'],'contato',array('size'=>60,'maxlength'=>150));

		echo $form->textFieldRow($model['Associados'],'data_fundacao');

		echo "<br/>";

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

    		'label'=>'Adicionar Diretor',

    		'type'=>'primary',

    		'htmlOptions'=>array(

        		'data-toggle'=>'modal',

        		'data-target'=>'#myModal',

    		),

		));

	?>

	<div id='diretores'></div>

	<div class="form-actions">

    	<?php $this->widget('bootstrap.widgets.TbButton', array('buttonType'=>'submit', 'type'=>'primary', 'label'=>$model['Associados']->isNewRecord ? 'Criar' : 'Atualizar')); ?>

    	<?php $this->widget('bootstrap.widgets.TbButton', array('buttonType'=>'reset', 'label'=>'Limpar')); ?>

	</div>

<?php $this->endWidget(); ?>


</div><!-- form -->


<?php 

$this->beginWidget('bootstrap.widgets.TbModal', array('id'=>'myModal'));

	echo $this->renderPartial('_form_diretores',array('model'=>$model));

 $this->endWidget(); 

 ?>



_form_diretores.php




<?php

/*

 * Modal para adicionar diretores

 */

 $scriptDiretores='	

 function adicionaDiretores(diretores) {

		objDiretores = eval(diretores);

		table = "<table>";

		for (var i in objDiretores) {

			table+="<tr id=\'"+i+"\'>";

			table+="<td>"+objDiretores[i].nome+"</td>";

			table+="<td>"+objDiretores[i].telefone+"</td>";

			table+="<td>"+objDiretores[i].email+"</td>";

			table+="<td onclick=\'excluirDiretores("+i+")\'>&times;</td>";

			table+="</tr>";

		}

		

		table+="</table>";

		$(\'#diretores\').html(table);

	}

 function excluirDiretores(id) {

	$.ajax({

		type: "POST",

		url: "'.$this->createUrl("/admin/associados/deletediretores").'",

		data: {diretor: id},

		success:function(){

			$("#diretores #"+id+"").slideUp();

		}

		

	});

}';


Yii::app()->clientScript->registerScript('diretores',$scriptDiretores,CClientScript::POS_END);

?>

<div class="modal-header">

    <a class="close" data-dismiss="modal">&times;</a>

    <h4>Adicionar Diretores</h4>

</div>

<?php $form=$this->beginWidget('bootstrap.widgets.TbActiveForm', array(

	'id'=>'diretores-form',

	'action' => $this->createUrl('/admin/associados/creatediretores'),

	'enableAjaxValidation'=>true,

)); ?>

<div class="modal-body">

<?php

	echo $form->textFieldRow($model['Diretores'],'nome');

	echo $form->textFieldRow($model['Diretores'],'telefone');

	echo $form->textFieldRow($model['Diretores'],'email');

	

?>

<div class="modal-footer">

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

    	'buttonType' => 'ajaxSubmit',

        'type'=>'primary',

        'label'=>'Salvar',

        'url' => Yii::app()->createUrl('/admin/associados/creatediretores'),

        'htmlOptions'=>array('data-dismiss'=>'modal'),

        'ajaxOptions'=>array(

        	'success' => "function(diretores){adicionaDiretores(diretores)}",

		)

    )); ?>

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

        'label'=>'Fechar',

        'url'=>'#',

        'htmlOptions'=>array('data-dismiss'=>'modal'),

    )); ?>

</div>

<?php $this->endWidget(); ?>

</div>



Primeira vez que faço isto então aceito dicas de melhorias também =)

Thiago,

Pelo que entendi você quer submeter um form via AJAX em um "Modal" certo?

Faça as seguintes alterações:

Primeiro passo alterar os parâmetros do form para:





<div class="form">

<?php $form=$this->beginWidget('bootstrap.widgets.TbActiveForm', array(

	'id'=>'associados-form',

	'enableAjaxValidation'=>false,

	'enableClientValidation'=>true,

	'clientOptions'=>array(

		'validateOnSubmit'=>true,

	),

)); ?>

Em seguida modifique seu botão submit para:





<?php

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

    'buttonType'=>'ajaxSubmit',

    'type'=>'primary',

    'label'=>'Salvar',

    'ajaxOptions'=>array(

        'data'=>'js:jQuery("#associados-form").serialize()',

        'dataType'=>'json',

        'success'=>'function(data){

            if(Object.keys(data).length == 0){

                $("#myModal").modal("toggle");

            }else{

                $.each(data, function(key, val) {

                    $("#associados-form #"+key+"_em_").text(val);

                    $("#associados-form #"+key+"_em_").show();

                });

            }

        }',

    )

));

?>

Agora na action do seu controller:





<?php

  $modelAssociados = new Associados;

  if( Yii::app()->request->isAjaxRequest && isset($_POST['Associados']) ) {

    $errors = CActiveForm::validate($modelAssociados);

    if($errors !== '[]') {

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

 	}else{

        $modelAssociados->save(false);

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

    }

  }

?>

Bom fiz aqui nas preças mas acredito que irá funcionar.

Abraços

Valeu, é quase isto a questão é que são dois forms um form normal e um subform em um modal, o que da submit via ajax está no modal "_form_diretores.php" o "_form" está funcionando validando etc, preciso validar o subform que está no modal e da submit via ajax porém é da mesma action. Não é uma solução muito boa mas preciso que o usuário possa adicionar quantos diretores quiser em um subform de associados pois associados has_many diretores e foi a solução mais simples que encontrei.

Eu vou fazer separado os forms por enquanto até descobrir como fazer então gostaria de saber a solução mais comun em forms relacionados com has_many?

Eu costumo fazer algo parecido com isso: http://www.eha.ee/labs/yiiplay/index.php/en/site/extension?view=dynamicrows

Era exatamente isto que queria inicialmente mas por não ter achado nada a respeito de como fazer desisti. Tem como baixar so esta extensão? só achei o download do pacote completo.

Consegui utilizando a extensão: MultiModelForm

muito boa e simples de usar, valeu