[YII 1] [RISOLTO]Problema validazione form con AJAX

Salve a tutti,

non riesco a venirne a capo con questa validazione tramite ajax.

Non riesco a capire se sia dovuto al fatto che ho installato tutto nel sottodominio del mio vps…ma tutto il resto dell’ app funziona bene … compresi dei menu dipendenti che ho in altri form.

Questo e il form (registrazione.php)




<?php 

$this->pageTitle = 'Registrazione Nuovo Utente';


$this->breadcrumbs = array('Registrazione Utente');

?>




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

	'method'=>'POST',

	'id'=>'form',

	'action'=> Yii::app()->createUrl('Site/RegistrazioneUtente'),

	'enableAjaxValidation'=>true,

    'enableClientValidation'=>true,

	'clientOptions'=>array(

		'validateOnSubmit'=>true,

	),

  )); 

?>




<div class='form'>


<table class="tabella_login" style="width: 40%; margin: auto;">

  <tbody>

    <tr>

	  <td colspan="2" class="tabella_info_header tabella_first_form">Registrazione Nuovo Utente</td>

	</tr>

       

        <tr>

        <td class="tabella_info_campo_descrizione">

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

        </td>

        <td class="tabella_info_campo_data">

		<?php echo $form->textField($model,'nome'); ?>

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

        </td>

        </tr>

		

		<tr>

        <td class="tabella_info_campo_descrizione">

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

        </td>

        <td class="tabella_info_campo_data">

		<?php echo $form->textField($model,'cognome'); ?>

		<?php echo $form->error($model,'cognome', array('class'=>'text-error')); ?>

        </td>

        </tr>

		

		<tr>

        <td class="tabella_info_campo_descrizione">

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

        </td>

        <td class="tabella_info_campo_data">

		<?php echo $form->textField($model,'codice_fiscale'); ?>

		<?php echo $form->error($model,'codice_fiscale', array('class'=>'text-error')); ?>

        </td>

        </tr>

		

		<tr>

        <td class="tabella_info_campo_descrizione">

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

        </td>

        <td class="tabella_info_campo_data">

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

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

        </td>

        </tr>

		

		<tr>

        <td class="tabella_info_campo_descrizione">

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

        </td>

        <td class="tabella_info_campo_data">

		<?php echo $form->textField($model,'username'); ?>

		<?php echo $form->error($model,'username', array('class'=>'text-error')); ?>

        </td>

        </tr>

		

		<tr>

        <td class="tabella_info_campo_descrizione">

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

        </td>

        <td class="tabella_info_campo_data">

		<?php echo $form->passwordField($model,'password'); ?>

		<?php echo $form->error($model,'password', array('class'=>'text-error')); ?>

        </td>

        </tr>

		

		<tr>

        <td class="tabella_info_campo_descrizione">

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

        </td>

        <td class="tabella_info_campo_data">

		<?php echo $form->passwordField($model,'ripeti_password'); ?>

		<?php echo $form->error($model,'ripeti_password', array('class'=>'text-error')); ?>

        </td>

        </tr>

		

		 <tr class="tabella_info_footer">

	     <td colspan=2 class="tabella_chiusura_form">

		<?php echo CHtml::submitButton('Regitrami', array('class'=>'btn btn-primary btn-small'));?>


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

       </td>

       </tr>

       </tbody>

       </table>

</div>




Queste sono le regole di validazione che voglio applicare (inserite nel model RegistrazioneUtente):




<?php


class RegistrazioneUtente extends CFormModel{


public $nome;	

public $cognome;

public $codice_fiscale;

public $email;

public $username;

public $password;

public $ripeti_password;


public function rules(){

	return array(

	array(

'nome, cognome, email, codice_fiscale, username, password, ripeti_password', 'required', 'message' => 'Questo campo e obbligatorio',

        ),

	

     array(

	'nome',

	'match',

	'pattern' => '/^[a-z0-9_]+$/i',

	'message'=>'Inserire solo lettere e numeri',

	),	

	

	 array(

	'cognome',

	'match',

	'pattern' => '/^[a-z0-9_]+$/i',

	'message'=>'Inserire solo lettere e numeri',

	),

	

	 array(

	'username',

	'match',

	'pattern' => '/^[a-z0-9_]+$/i',

	'message'=>'Inserire solo lettere e numeri',

	),

	

	 array(

	'email',

	'email',

	'message'=>'Inserire email nel formato email Es: utente@tuaemail.it',

	),

	

	array(

	'codice_fiscale',

	'match',

	'pattern' => '/^[a-z0-9_]+$/i',

	'message'=>'Inserire solo lettere e numeri',

	),

	


     array(

	'password',

	'match',

	'pattern' => '/^[a-z0-9@\_]+$/i',

	'message'=>'Inserire solo lettere e numeri',

	),

	

	array(

	'ripeti_password',

	'compare',

	'compareAttribute'=>'password',

	'message'=>'Le password NON coincidono',

	),	

    

    array('username', 'verifica_username'),

	array('email', 'verifica_email'),  	

	array('codice_fiscale', 'verifica_codicefiscale'),

   );

  }

  


////////////CONTROLLO SE L' USERNAME ESISTE GIA    

   public function verifica_username($attributes, $params)	

	{

	$connsessione = Yii::app()->db;

    $ricerca = "SELECT username FROM tb_user WHERE"	;

	$ricerca .= "username='".$this->username."'";

	

	$risultato = $connsessione->createCommand($ricerca);

	$trovati = $risultato->query();

	foreach($trovati as $trovato)

	{

		if($this->username === $trovato['username'])

		{

		$this->addError('username', 'Questo username è già utilizzato da un altro utente');	

	break;

	    }

	}

 }




////////////CONTROLLO SE L' EMAIL ESISTE GIA    

    public function verifica_email($attributes, $params)	

	{

	$connsessione = Yii::app()->db;

    $ricerca = "SELECT email FROM tb_user WHERE"	;

	$ricerca.= "email='".$this->email."'";

	

	$risultato = $connessione->createCommand($ricerca);

	$trovati = $risultato->query();

	foreach($trovati as $trovato)

	{

		if($this->email === $trovato['email'])

		{

		$this->addError('email', 'Questo username è già utilizzato da un altro utente');	

	break;

	    }

	}

}


////////////CONTROLLO SE IL CODICE FISCALE ESISTE GIA    

   public function verifica_codicefiscale($attributes, $params)	

	{

	$connsessione = Yii::app()->db;

    $ricerca = "SELECT codice_fiscale FROM tb_user WHERE"	;

	$ricerca .= "codice_fiscale='".$this->codice_fiscale."'";

	

	$risultato = $connessione->createCommand($ricerca);

	$trovati = $risultato->query();

	foreach($trovati as $trovato)

	{

		if($this->codice_fiscale === $trovato['codice_fiscale'])

		{

		$this->addError('codice_fiscale', 'Questo codice fiscale è già associato ad un altro utente');	

	break;

		}

	}

  }

}






Mentre questa è l’ action che ho nel SiteController (manca ancora tutto il codice da inserire in caso la validazione venga superata…quindi invio email etc…ma per ora questo particolare non interessa):




..................

public function actionRegistrazioneUtente()

{

	


$model=new RegistrazioneUtente;


//////VALIDAZIONE AJAX

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

		{

			echo CActiveForm::validate($model);

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

		}


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

		{

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

			if(!$model->validate())

			{


$model->addError('ripeti_password', 'Errore durante l\' invio dei dati');	

}

else

{

////SE PASSA LA VALIDAZIONE REGISTRA L'UTENTE

///ED INVIA EMAIL DI CONFERMA

///DA INSERIRE IL CODICE PER EFFETTUARE QUESTE OPERAZIONI

}

}


$this->render('registrazione', array('model'=>$model));


}	

...............



Qualcuno può aiutarmi a risolvere perfavore ???? Questo è l’ errore che vedo quando inserisco l’ username (con F12) su Google Chrome su Network->XHR:




POST http://testarea.miodominio.it/sottodomini/testarea/Site/RegistrazioneUtente.nup 500 (Internal Server Error)



Se controllo all’ interno del POST (sempre da Chrome) trovo:




CDbException


CDbCommand ha riportato un errore nell'esecuzione della query SQL: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '='Pippo'' at line 1. The SQL statement executed was: SELECT username FROM user WHEREusername='Pippo' (/var/www/clients/client1/web1/web/sottodomini/testarea/yii/framework/db/CDbCommand.php:543)


#0 /var/www/clients/client1/web1/web/sottodomini/testarea/yii/framework/db/CDbCommand.php(377): CDbCommand->queryInternal('', 0, Array)

#1 /var/www/clients/client1/web1/web/sottodomini/testarea/protected/models/RegistrazioneUtente.php(83): CDbCommand->query()

#2 /var/www/clients/client1/web1/web/sottodomini/testarea/yii/framework/validators/CInlineValidator.php(42): RegistrazioneUtente->verifica_username('username', Array)

#3 /var/www/clients/client1/web1/web/sottodomini/testarea/yii/framework/validators/CValidator.php(213): CInlineValidator->validateAttribute(Object(RegistrazioneUtente), 'username')

#4 /var/www/clients/client1/web1/web/sottodomini/testarea/yii/framework/base/CModel.php(159): CValidator->validate(Object(RegistrazioneUtente), NULL)

#5 /var/www/clients/client1/web1/web/sottodomini/testarea/yii/framework/web/widgets/CActiveForm.php(920): CModel->validate(NULL)

#6 /var/www/clients/client1/web1/web/sottodomini/testarea/protected/controllers/SiteController.php(43): CActiveForm::validate(Object(RegistrazioneUtente))

#7 /var/www/clients/client1/web1/web/sottodomini/testarea/yii/framework/web/actions/CInlineAction.php(49): SiteController->actionRegistrazioneUtente()

#8 /var/www/clients/client1/web1/web/sottodomini/testarea/yii/framework/web/CController.php(308): CInlineAction->runWithParams(Array)

#9 /var/www/clients/client1/web1/web/sottodomini/testarea/yii/framework/web/CController.php(286): CController->runAction(Object(CInlineAction))

#10 /var/www/clients/client1/web1/web/sottodomini/testarea/yii/framework/web/CController.php(265): CController->runActionWithFilters(Object(CInlineAction), Array)

#11 /var/www/clients/client1/web1/web/sottodomini/testarea/yii/framework/web/CWebApplication.php(282): CController->run('RegistrazioneUt...')

#12 /var/www/clients/client1/web1/web/sottodomini/testarea/yii/framework/web/CWebApplication.php(141): CWebApplication->runController('Site/Registrazi...')

#13 /var/www/clients/client1/web1/web/sottodomini/testarea/yii/framework/base/CApplication.php(180): CWebApplication->processRequest()

#14 /var/www/clients/client1/web1/web/sottodomini/testarea/index.php(24): CApplication->run()

#15 {main}



Sono sicuro che è un errore di punteggiatura nella regola di validazione (visto l’ errore che mi da), ma ho notato che anche quando inserisco gli altri campi (Esempio: Nome, Cognome etc) come passo al campo successivo mi da sempre ERORR 500 INTERNAL SERVER ERROR e quindi non riesco a capire dove sia l’ errore. Suppongo che non sia solo nella regola di validazione dei campi username, email, codice_fiscale a questo punto, ma credo vi sia un’ errore più grossolano.

Avendo però la mente offuscata dal batti e ribatti di codice che scrivo per tentare di risolvere…non sto campendo più una mazza!!! Se qualcuno può aiutarmi gliene sarei grato. Buon fine settimana a tutti!!! :slight_smile:

Questo è il var_dump della query eseguita per l’ username:




object(CDbDataReader)#35 (6) { ["_statement":"CDbDataReader":private]=> object(PDOStatement)#33 (1) { ["queryString"]=> string(50) "SELECT username FROM user WHERE username='Pippo'" } ["_closed":"CDbDataReader":private]=> bool(false) ["_row":"CDbDataReader":private]=> NULL ["_index":"CDbDataReader":private]=> int(-1) ["_e":"CComponent":private]=> NULL ["_m":"CComponent":private]=> NULL }



Risolto da solo.

L’ errore era tra le query del validator.

Corrette le query…tutto funziona perfettamente.