Yii Framework Forum: Non Mi Va L'invio Del Form Con Ajax - Yii Framework Forum

Jump to content

  • (2 Pages)
  • +
  • 1
  • 2
  • You cannot start a new topic
  • You cannot reply to this topic

Non Mi Va L'invio Del Form Con Ajax Rate Topic: -----

#1 User is offline   nickyii 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 63
  • Joined: 15-September 12

Posted 12 April 2013 - 02:16 PM

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
1

#2 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,988
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 12 April 2013 - 02:23 PM

In questi casi la mia prassi è

var_dump($_FILES);
var_dump($_GET);
var_dump($_POST);
die;


Ovviamente _FILES in caso di upload di files.
0

#3 User is offline   nickyii 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 63
  • Joined: 15-September 12

Posted 13 April 2013 - 03:08 AM

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?
1

#4 User is offline   st4nny 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 340
  • Joined: 10-April 12

Posted 13 April 2013 - 07:04 AM

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();
		}
	}

0

#5 User is offline   nickyii 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 63
  • Joined: 15-September 12

Posted 13 April 2013 - 08:44 AM

niente da fare.
Mi invia il form lo stesso, non lo valida lato client e mi ricarica tutta la pagina
1

#6 User is offline   nickyii 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 63
  • Joined: 15-September 12

Posted 14 April 2013 - 04:33 PM

qualcuno sa aiutarmi? non esiste nessuna variabile $_POST['ajax']...
1

#7 User is offline   emafer 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 182
  • Joined: 23-February 12
  • Location:Amandola

Posted 15 April 2013 - 03:28 AM

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')

2) 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
0

#8 User is offline   nickyii 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 63
  • Joined: 15-September 12

Posted 15 April 2013 - 04:55 AM

grazie mille provo subito
1

#9 User is offline   nickyii 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 63
  • Joined: 15-September 12

Posted 15 April 2013 - 08:27 AM

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...
1

#10 User is offline   emafer 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 182
  • Joined: 23-February 12
  • Location:Amandola

Posted 15 April 2013 - 01:52 PM

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

#11 User is offline   nickyii 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 63
  • Joined: 15-September 12

Posted 16 April 2013 - 03:03 AM

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;
	}
}

1

#12 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,988
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 17 April 2013 - 01:14 AM

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

#13 User is offline   nickyii 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 63
  • Joined: 15-September 12

Posted 17 April 2013 - 05:14 AM

View Postsensorario, on 17 April 2013 - 01:14 AM, said:

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.
1

#14 User is offline   nickyii 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 63
  • Joined: 15-September 12

Posted 17 April 2013 - 05:58 AM

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'
1

#15 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,988
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 17 April 2013 - 01:18 PM

View Postnickyii, on 17 April 2013 - 05:14 AM, said:

con git intendi GII o github?


No no, intendo git.
0

#16 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,988
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 17 April 2013 - 01:19 PM

Per caso hai incluso jquery "a mano"?
1

#17 User is offline   nickyii 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 63
  • Joined: 15-September 12

Posted 17 April 2013 - 06:28 PM

View Postsensorario, on 17 April 2013 - 01:18 PM, said:

No no, intendo git.


scusa l'ignoranza... ma cos'è?

View Postsensorario, on 17 April 2013 - 01:19 PM, said:

Per caso hai incluso jquery "a mano"?


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
1

#18 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,988
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 17 April 2013 - 06:54 PM

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?".
1

#19 User is offline   nickyii 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 63
  • Joined: 15-September 12

Posted 18 April 2013 - 02:37 AM

View Postsensorario, on 17 April 2013 - 06:54 PM, said:

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!
1

#20 User is offline   nickyii 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 63
  • Joined: 15-September 12

Posted 18 April 2013 - 09:56 AM

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?
1

Share this topic:


  • (2 Pages)
  • +
  • 1
  • 2
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users