Dudas sobre el uso de CActiveForm

Hola, estoy intentando usar un CActiveForm pero no hay manera.

Genero el formulario con:


<?php $form = $this->beginWidget('CActiveForm', array(

    'id'=>'formComentari',

    'enableAjaxValidation'=>true,

    'focus'=>array($comentari,'titol'),

)); ?>


<?php echo $form->hiddenField($comentari,'id_noticia'); ?>


<?php echo $form->errorSummary($comentari); ?>


<div class="simple">

<?php echo $form->labelEx($comentari,'titol'); ?>

<?php echo $form->textField($comentari,'titol',array('size'=>52,'maxlength'=>100)); ?>

</div>


<div class="simple">

<?php echo $form->labelEx($comentari,'cos'); ?>

<?php echo $form->textArea($comentari,'cos',array('cols'=>60,'rows'=>10)); ?>

</div>


<div class="action">

<?php echo CHtml::submitButton('Afegir Comentari'); ?>

</div>


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

Por lo que he leido esto deberia añadir un nuevo archivo llamado ‘jquery.yiiactiveform.js’ en el header de la página, pero no aparece nada allí.


<script type="text/javascript" src="/assets/7784f694/jquery.js"></script>

<script type="text/javascript" src="/js/jquery.corner.js"></script>

Entiendo que por eso no intenta hacer una validación AJAX pues no hace nada.

Otra duda que tengo és si se puede usar CActiveForm con un renderPartial, es decir, cargar el formulario mediante una llamada AJAX. Lo digo porqué entonces creo que tampoco se cargaria la libreria jquery.yiiactiveform.js no?

Para que se active el script jquery.yiiactiveform.js debes de activar la validacion via ajax en el formulario que has creado… por ej.


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

   'id'=>'MyForm',

   'enableAjaxValidation'=>true, //esta es la linea que necesitas

));

Y luego el codigo del controlador debe de verificar que se trata de una peticion via ajax… digo, por seguridad…


if(isset($_POST['ajax']) && $_POST['ajax']==='MyForm')

{

   echo CActiveForm::validate($model);

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

}

Y sobre utilizar renderPartial desde un CActiveForm… claro que lo puedes utilizar… y es parecido a utilizar render

Pero el enableAjaxValidation ya lo tengo puesto :S

El código del controlador és el siguiente:


<?php


class CrearComentariAction extends CAction{


	public function run(){

		$this->getController()->layout = false;

		$comentari = new NoticiaComentari;

		$this->performAjaxValidation($comentari);

		if(isset($_POST["NoticiaComentari"])){

			$comentari->attributes = $_POST['NoticiaComentari'];

			$comentari->save();

			$this->getController()->renderPartial('mostrarComentari',array('comentari'=>$comentari));

		}

		else{

			$comentari->id_noticia = $_GET['id'];

			$this->performAjaxValidation($comentari);

			$this->getController()->renderPartial('crearComentari',array('comentari'=>$comentari));

		}

	}


	protected function performAjaxValidation($model)

	{

	    if(isset($_POST['ajax']) && $_POST['ajax']==='formComentari')

	    {

	        echo CActiveForm::validate($model);

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

	    }

	}

}


?>

En cuanto a lo del render partial, a lo que me referia es si al añadir mediante una llamada AJAX el formulario, tambien se añadiria la libreria jquery.yiiactionform.js? Es decir, funcionaria la validación mediante AJAX en un formulario cargado a su vez mediante AJAX?

Usas algun debugger de codigo como firebug para ver los errores, las librerias cargadas y demas cosas ??

Sobre la carga del yiiactionform usando renderpartial… si lo hace siempre y cuando tengas elementos que utilicen la libreria…

Estoy usando firedebug para ver que se carga, consultas sql y errores. Lo único que veo en el firedebug es que la libreria no está cargada, pero no da ningún error.

En los assets veo que la libreria está, junto con muchas otras que no uso.

He visto, gracias a -> http://www.yiiframework.com/forum/index.php?/topic/11729-solved-ajax-validation-not-working-cactiveform/

que si no se añade


$form->error();

No se incluye la libreria jquery.yiiactiveform.js. Aún no me funciona pero almenos se carga la libreria js ;)

No si haces render o renderPartial, pero en el caso de lo segundo no, no se cargan las librerias, tendras que hacerlo tu de antemano.




Yii::app()->clientScript->registerCoreScript('yiiactiveform');



Y para que luego te funcione el formulario:




$options = // tus opciones de formulario

$options = CJavaScript::encode($options); // pasar el array a objeto js de configuracion

// registrar

Yii::app()->clientScript->registerScript('formComentari'.uniqueId(),"\$('#formComentari').yiiactiveform($options);");



Ten cuidado con doble binding si usas renderPartial. Yo para eso utilizo formularios normales (en escenarios de AJAX puro y duro) y los valido en cliente (jquery.validate.js) y servidor. Tambien puedes realizar la validacion servidor con attributos del model si sirves los campos de forma que el nombre sea NombreModelo[nombreattributo]

saludos

Hola antonio, tengo incluido el yiiactiveform.js, y en EnableAjaxvalidation lo tengo seteado a true, pero al imprimir la variable Post en mi actionCreate, no me aparece ninguna variable ajax, y como consecuencia no me valida mediante ajax, y portanto, solo me valida refrescando la página.

Mi cabecera:


<?php 

Yii::app()->clientScript->registerCoreScript('yiiactiveform');

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

		'id'=>'registration-form',

		'enableAjaxValidation'=>true,

		'enableClientValidation'=>true,

		'clientOptions'=>array(

			'validateOnChange'=>true,

			'validateOnSubmit'=>true)

	));

 ?>

Mi controlador:




                if(isset($_POST['ajax']) && $_POST['ajax']==='registration-form')

		{

			echo CActiveForm::validate($model);

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

		}

		

		if(isset($_POST['CrugeStoredUser']))//CrugeStoredUser es el modelo

		{

			//echo('<pre>'); con estas lineas imprimo todas las variables $POST, y esta solo me imprime los 2 valores del formulario, el mail, y un checkbox

			//print_r($_POST);

			//echo('</pre>');

			//Yii::app()->end();

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

			if($model->validate()){

                            ....



El modelo funciona perfectamente, es un form de registro, pero no funciona ajax…

Ando un poco desesperado… Alguna idea?? Gracias

Me respondo a mi mismo, incompatibilidad con librerías jquery, incluí librerías jquery propias, y no dejaban operar bien a las de yii… ya funciona perfectamente con ajax… Gracias de todos formas!!!

Tengo el mismo problema, pero no entendí como Plunk lo soluciono.

Deicidi hacerlo a mano, con jQuery nativo!

Cristian pinilla, si lees bien plunk lo soluciono quitando las libreriasJ JQuery, es probable que el alla gradados librerias adicionales, lo cual no deja funcionar bien las de YII, esto es porque yii ya integra las librerias Jquery, por lo tanto la solucion es no agregas estas librerias al proyecto.

Perdón por tardar en responder! hace tanto de esto. Claro, el problema era porque usaba una librería jquery, y yii registra sus propios archivos jquery y se estaba haciendo un Lio.

Saludos.