khurram
(Khurram 619)
1
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
zaccaria
(Matteo Falsitta)
2
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.
mdomba
(Maurizio Domba Cerin)
3
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…
khurram
(Khurram 619)
4
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.
zaccaria
(Matteo Falsitta)
5
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.
khurram
(Khurram 619)
6
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',
);
}
}