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?
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+")\'>×</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">×</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