Non Mi Va L'invio Del Form Con Ajax

ho un CActiveForm


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

	'id'=>'comment-form',

	'enableAjaxValidation'=>true,

));

poi ho tutto il form (è praticamente uguale al form dei commenti del blog di esempio).

il form invia e valida correttamente con il php. Ma se metto true la variabile ajax come sopra non va la validazione lato client.

nel controller ho messo il pezzo per l’axaj:


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

		{

			echo CActiveForm::validate($comment);

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

		}

ma nonostante questo non funziona… mi va sempre tutto come se non ci fosse l’ajax…

ho notato, stampando l’array $_POST che non c’è nessun campo ajax…

qualcuno mi sa aiutare a fare sta validazione lato client e il submit con ajax? Dove sto sbagliando? grazie mille

In questi casi la mia prassi è




var_dump($_FILES);

var_dump($_GET);

var_dump($_POST);

die;



Ovviamente _FILES in caso di upload di files.

ho apportato queste modifiche:


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

	'id'=>'comment-form',

	//'action'=>Yii::app()->getRequest()->getUrl()."#commentform",

	'enableAjaxValidation'=>true,

	'enableClientValidation' => true,

    'clientOptions'=>array(

    	'validateOnSubmit'=>true,

	),            

));

ho fatto le stampe come dici tu e ottengo:


array (size=5)

  'r' => string 'blog/view' (length=9)

  'anno' => string '2013' (length=4)

  'mese' => string '04' (length=2)

  'giorno' => string '08' (length=2)

  'url' => string 'url_url' (length=26)

array (size=3)

  'YII_CSRF_TOKEN' => string '5621bed0b722e846d21319d31b00768d21debcc8' (length=40)

  'Commenti' => 

    array (size=3)

      'nome' => string '' (length=0)

      'email' => string '' (length=0)

      'testo' => string '' (length=0)

  'inviacom' => string 'Invia' (length=5)

il primo per il GET è dell’url, il secondo è il POST del form… non invia nessun elemento AJAX…

devo mettere il ajaxSubmitButton invece del submitButton?

prova così:




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

  'id'=>'comment-form',

  'enableAjaxValidation'=>true,

  'validateOnSubmit'=>true,

  'validateOnChange'=>false,

  'validateOnType'=>false,

)); ?>



o così




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

        'id'=>'comment-form',

        'enableAjaxValidation'=>true,

        'clientOptions'=>array('validateOnSubmit'=>true, 'validateOnChange'=>false),

)); ?>



e poi decommenta performAjaxValidation, se hai del codice creato con gii:




                $model=new Comment;


		// Uncomment the following line if AJAX validation is needed

		$this->performAjaxValidation($model);


		if(isset($_POST['Comment']))

		{

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

			if($model->save())

				$this->redirect(array('view','id'=>$model->id));

		}


		$this->render('create',array(

			'model'=>$model,

		));



e se non ce l’hai:




protected function performAjaxValidation($model)

	{

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

		{

			echo CActiveForm::validate($model);

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

		}

	}



niente da fare.

Mi invia il form lo stesso, non lo valida lato client e mi ricarica tutta la pagina

qualcuno sa aiutarmi? non esiste nessuna variabile $_POST[‘ajax’]…

Se non esiste la variabile hai 2 possibilità:

  1. la metti nel form, sapendo che va inviato via ajax mettendo un

echo CHtml::hiddenField('ajax', 'qualifica-form')

  1. puoi controllare se la richiesta è una richiesta ajax, eseguendo la funzione non se c’è il post ajax ma richiamando il controllo:

if (Yii::app()->request->isAjaxRequest) blabla()

La soluzione 2 ha un po’ di pendenze, risolte qui

grazie mille provo subito

niente ci rinuncio.

Pensavo di semplificarmi le cose con yii ma me le sto solo complicando… non capisco perchè non funzioni.

non funziona nulla… ne la validazione lato client ne la chiamata ajax… quest ultima la chiamata ajax la fa ma non esiste nessun $_POST[‘ajax’]… e se lo metto a mano in un hidden field nel caso in cui uno non ha il javascript attivo viene fuori un casino…

Ritornerò a scrivere a mano il codice jquery e ajax senza usare yii a sto punto…

se vuoi postare il codice che usi adesso vediamo di trovare una soluzione…

questo è il codice di dove richiamo il file dove c’è il form:




<?php if(Yii::app()->user->hasFlash('commentSubmitted')): ?>

                	<p class="greenalert"><?php echo Yii::app()->user->getFlash('commentSubmitted'); ?></p>

            	<?php else: ?>              

					<?php $this->renderPartial('/commenti/_form',array(

                        'model'=>$comment,

                    )); ?>

                <?php endif; ?>



questo è il codice del _form.

Ho provato sia con il bottone normale, che mi ricarica sempre la pagina e non valida nel client, e con il bottone ajax che mi fa la chiamata ajax e mi ritorna il pezzo json con tutti gli errori del form ma non me li mostra.

Ho provato a mettere tutti true sui clientOptions ma nulla




<div class="blogcommentform">


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

	'id'=>'comment-form',

	'action'=>Yii::app()->getRequest()->getUrl()."#anchform",

	'enableAjaxValidation'=>true,

	'enableClientValidation' => true,

        'clientOptions'=>array('validateOnSubmit'=>true, 

                               'validateOnType'=>false,

                               'validateOnChange'=>true,

)); ?>

			        

        <fieldset>

                            

        	<?php echo $form->labelEx($model,'nome',array('class'=>'commlabtxt')); ?>

			<?php echo $form->textField($model,'nome',array('class'=>'commfietxt','placeholder'=>'Il tuo nome')); ?>

            <?php echo $form->error($model,'nome',array('id'=>'Commenti_nome')); ?>

            

            <?php echo $form->labelEx($model,'email',array('class'=>'commlabtxt')); ?>

			<?php echo $form->textField($model,'email',array('class'=>'commfietxt','placeholder'=>'La tua email')); ?>

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

                            

        </fieldset>

                        

        <fieldset>

            

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

			<?php echo $form->textArea($model,'testo',array('rows'=>5, 'cols'=>5,'class'=>'commfietxta','placeholder'=>'Il tuo commento')); ?>

            <?php echo $form->error($model,'testo', array('class'=>'errorMessage alerttxta')); ?>

                            

        </fieldset>

                                

        <fieldset class="commentbutton_fieldset">

            //bottone ajax

            <?php echo CHtml::ajaxSubmitButton('InviaA','','',array('class'=>'commentbutton')); ?>

             //bottone normale

            <?php //echo CHtml::submitButton('Invia',array('class'=>'commentbutton')); ?>                            

        </fieldset>

                        

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


</div>



questo è il controller




public function actionView()

	{				

		$post=$this->loadModel();

		

		$comment=new Commenti;

		

		$this->performAjaxValidation($comment);

		

		if(isset($_POST['Commenti']))

		{

			$comment->attributes=$_POST['Commenti'];

			if($post->addComment($comment))

			{

				if($comment->stato==Commenti::STATUS_PENDING)

					Yii::app()->user->setFlash('commentSubmitted','<span>Grazie per il tuo commento!</span> Il tuo commento sarà pubblicato dopo l\'approvazione.');

				if($comment->stato==Commenti::STATUS_APPROVED){

					Yii::app()->user->setFlash('commentSubmitted','<span>Grazie per aver scritto!</span> Il tuo commento è stato inserito con successo.');

				}

				$this->refresh(true,'#anchform');

			}

		}		

		

		$this->render('view',array(

			'model'=>$post,

			'comment'=>$comment,

		));

	}


protected function performAjaxValidation($model) {		

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

			echo CActiveForm::validate($model);

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

		}

    }



questo è il model dei commenti




class Commenti extends CActiveRecord

{

	

	const STATUS_PENDING=0;

        const STATUS_APPROVED=1;

	

	public static function model($className=__CLASS__)

	{

		return parent::model($className);

	}


	public function tableName()

	{

		return 'commenti';

	}


	public function rules()

	{

		return array(

			array('nome, email, testo', 'required','message'=>"{attribute} obbligatorio"),

			array('nome', 'length', 'min'=>3, 'max'=>255),

			array('email', 'email'),

			array('testo', 'length', 'min'=>5, 'max'=>200),			

			array('nome, email, testo', 'safe', 'on'=>'search'),

		);

	}


	public function relations()

	{

		return array(

			'author' => array(self::BELONGS_TO, 'utenti', 'id_utente'),

		);

	}


	public function attributeLabels()

	{

		return array(

			'id' => 'ID',

			'id_post' => 'Id Post',

			'nome' => 'Nome',

			'email' => 'Email',

			'data' => 'Data',

			'testo' => 'Testo',

			'id_utente' => 'Id Utente',

			'stato' => 'Stato',

		);

	}


	public function search()

	{

		$criteria=new CDbCriteria;


		$criteria->compare('id',$this->id);

		$criteria->compare('id_post',$this->id_post);

		$criteria->compare('nome',$this->nome,true);

		$criteria->compare('email',$this->email,true);

		$criteria->compare('data',$this->data,true);

		$criteria->compare('testo',$this->testo,true);

		$criteria->compare('id_utente',$this->id_utente);

		$criteria->compare('stato',$this->stato);


		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

		));

	}	

	

	protected function beforeSave()

	{

		if(parent::beforeSave())

		{

			if($this->isNewRecord)

				$this->data=new CDbExpression('NOW()');

			return true;

		}

		else

			return false;

	}

}



Per caso usi git e riesci a tornare ad un punto in cui il form funzionava correttamente?

con git intendi GII o github?

in ogni caso no non ho una versione che funziona. Il codice iniziale era quello e poi l’ho provata e non andava…

praticamente è uguale a quello del blog di esempio… non capisco perche il mio non funziona.

aspetta forse ho trovato l’errore.

Mi segna errore nel pezzo di codice jquery creato automaticamente da yii per la validazione del form!

Infatti guardando quello del blog di esempio è diverso!

Codice jquery del blog di esempio:




/*<![CDATA[*/

jQuery(function($) {

	$('#comment-form').yiiactiveform({

		'attributes':[

			{'inputID':'Comment_author','errorID':'Comment_author_em_'},

			{'inputID':'Comment_email','errorID':'Comment_email_em_'},

			{'inputID':'Comment_url','errorID':'Comment_url_em_'},

			{'inputID':'Comment_content','errorID':'Comment_content_em_'}

		]

	});

});

/*]]>*/



Codice jquery che genera a me:




/*<![CDATA[*/

jQuery(function($) {

	jQuery('#comment-form').yiiactiveform({

		'attributes':[

			{'id':'Commenti_nome','inputID':'Commenti_nome','errorID':'Commenti_nome','model':'Commenti','name':'nome','enableAjaxValidation':true},

			{'id':'Commenti_email','inputID':'Commenti_email','errorID':'Commenti_email_em_','model':'Commenti','name':'email','enableAjaxValidation':true},

			{'id':'Commenti_testo','inputID':'Commenti_testo','errorID':'Commenti_testo_em_','model':'Commenti','name':'testo','enableAjaxValidation':true}

		]

	});

});

/*]]>*/



e l’errore che mi da è questo:

Uncaught TypeError: Object[object Object] has no method ‘yiiactiveform’

No no, intendo git.

Per caso hai incluso jquery "a mano"?

scusa l’ignoranza… ma cos’è?

hem… si… infatti ora che mi lo hai detto ho tolto il jquery di google… e funziona!!! Grazie!!!

pero ora mi spunta una curiosità… immagino che il jquery linkato in automatico nella pagina, da yii, risieda da qualche parte nella libreria… ma se tipo esce la versione nuova d jquery e io voglio aggiornarlo?

EDIT: come non detto mi rispondo da solo: framework/web/js/source/jquery.min.js e jquery.js

Personalmente ti sconsiglio di aggiornarlo a mano. Tutti i widget che utilizzi, sono stati testati con la versione già presente nel core di Yii, che puoi caricare con registerCoreScript(‘jquery’); Te lo sconsiglio perché se cambi jquery, non sai se quel che stai usando funziona correttamente ed in un certo senso lo hai toccato con mano quello che ti sto dicendo.

Cerca di fare a mano SOLO quello che riguarda la tua applicazione, casomai, estendi quello che fa Yii. Hai un framework sotto il cofano e fa già tutto quanto quello che ti serve per fare un sito web. Chiediti sempre, in sostanza, "come si fa con Yii?".

Hai ragione! Essendo nuovo non so cosa puo fare yii, ma mi sto accorgendo che puo fare molte cose!!! Grazie mille a tutti coloro che mi aiutano!!! Siete grandi!

ho bisogno di aiuto!

Vorrei mettere il recaptcha per evitare spam da parte dei bot… ma non riesco a farlo funzionare con la validazione!

C’è un altro modo per evitare lo spam senza il captcha? perchè mi sta facendo impazzire.

PS: oppure il captcha di yii è buono quanto quello di google?