Hola a todos,
tengo un formulario de registracion de usuario donde quiero hacer validacione ajax de algunos campo.
Pero non me sale bien y me estoy volviendo loco con este problema.
Esto es mi formulario (vista: 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>
Estas son las reglas de validaciòn que tengo en el 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;
}
}
}
}
Esta es la action que tengo en mi Controlador (SiteController):
..................
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));
}
...............
Esto es lo que pasa si pongo F12 (con browser Google Chrome) en Network->XHR:
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}
Entiendo el error QL: SQLSTATE[42000], pero he visto que tambien a la compilacion de los otros campos del formulario aun me sale el error 500, como si el formulario encuentra problema con la ruta de la actionRegistrazioneUtente.
Tambien tengo que decir que la aplicacion de yii esta en un subdominio pero toda la aplicacion funciona bien y tambien muchos menu dependientes que tengo en otros formularios.
A qui les dejo tambien el var_dump de la query para comprobar que el usuario no existe en la tabla user:
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 }
Alguien puede ayudarme por favor ?
Espero usteded me entiendan. Les pido disculpa por mi espanol!!!!