Controllo istantaneo in Database

Salve a tutti

voglio controllare l’email in modo istantaneo se è già registrato nel database oppure no, ATTENZIONE senza fare il submit.

Ho provato ma non mi funziona

VIEW:


<div class="form">


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

    'id'=>'user-form',

	//'method'=>'post',

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

	//'focus'=>array($model,'email'),

    'enableAjaxValidation'=>true,	

)); ?>


    <p class="note">Fields with <span class="required">*</span> are required.</p>


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


    <div class="row">

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

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

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

    </div>


    <div class="row">

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

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

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

    </div>





    <div class="row buttons">

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

    </div>


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

</div><!-- form -->

Controller:





        public  function actionCreateuser()

	{

		$model = new Users;


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

		{	

                         if(Users::model()->find("email = '".$model->email."'")!=null)

				$model->addError('email', 'select another email');

			 echo CActiveForm::validate($model);

			

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

			

		}

		

		

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

		{

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

			

                         if(Users::model()->find("email = '".$model->email."'")!=null)

				$model->addError('email', 'select another email');

				

			if(!$model->getErrors())	//in assenza degli errori

			{	

				$model->save();

				$this->redirect(Yii::app()->homeUrl);

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

			}

		}

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

		

	}




Come faccio il controllo istantaneo e dirgli che l’email è già selezionata da un’altro utente

Un errore potrebbe essere quel method=post commentato.

A parte questo sembra tutto rego.

La rules mettila pure nel model, esiste un Unique Validator.

Prova a usare il codice di base (generato da gii) per controller/view e aggiungere un cunique validator per la email.

Se il validatore ti scatta con il submit, attiva l’ajax validatation ed e’ fatta, non stare a fare esperimenti nel controller.

Mi sembra che hai dimenticato di assegnare il valore del email al tuo model prima di fare il find()… nel tuo esempio $model->email e vuoto…

pero concordo con zaccaria… puoi usare l’uniqe validatore per questo…

Grazie Zaccaria ho risolto inserendo in model


array('email', 'unique', 'on'=>'createUser'),

Ho un’altro problema

Ho creato una pagina per cambiare la password, e in questo caso mi deve verificare in modo istantaneo se la password inserita è corretta oppure no.

cioè prima mi dava errore quando esisteva, invece questa volta deve dare errore se non esiste nel database.

Immagino che dovrai verificare se la password nuova e’ uguale a quella vecchia, non uguale ad una password qualunque del database.

Fai un form a parte (CFormModel) per il cambio password, e in questo fai una regola custom di validazione.

ho fatto un nuovo model ma come faccio una nuova regola custom di validazione?

model:




<?php 

 

class Password extends CFormModel

{

	public $oldPassword;

	public $newPassword;

	public $confermPassword;

 

    /**

     * @return array validation rules for model attributes.

     */

    public function rules()

    {

       

        return array(

                array('oldPassword', 'required', 'on'=>'changePassword'),

        	array('newPassword, confermPassword', 'required', 'on'=>'changePassword, recoverPassword'),

		array('confermPassword', 'compare', 'compareAttribute'=>'newPassword'),

		array('oldPassword, newPassword, confermPassword', 'length', 'min'=>4, 'max'=>40),

		array('newPassword, oldPassword, confermPassword', 'safe'),

 

        );

    }


	public function attributeLabels()

	{

		return array(

			'oldPassword'=> 'Old Password',

			'newPassword' => 'New Password',

			'confermPassword' => 'Conferm Password',

		);

	} 

}