Unique Validation Rule

Hallo,

ich habe zur Zeit folgendes Problem.

Ich habe eine Active Record Class namens "UserDbModel" mit folgenden Rules:


		

return array(

	array('email, password', 'required', 'on'=>'login'),

	array('username', 'unique', 'attributeName' => 'username', 'caseSensitive' => false, 'className' => 'UserDbModel', 'enableClientValidation' => true),

	array('pointsSolo, pointsTeamm', 'numerical', 'integerOnly'=>true),

	array('email', 'length', 'max'=>254),

	array('username', 'length', 'max'=>20),

	array('city', 'length', 'max'=>11),

	array('token', 'length', 'max'=>30),

	// The following rule is used by search().

	// Please remove those attributes that should not be searched.

	array('id, email, username, city, lastSeen, registered, pointsSolo, pointsTeam', 'safe', 'on'=>'search'),

);



Dazu habe ich ein Formular erstellt:


<?php 

	$form=$this->beginWidget('CActiveForm', array( 'enableClientValidation'=>true,												  'clientOptions'=>array('validateOnSubmit'=>true,),)); 

    echo $form->errorSummary($model); ?>

 

    <div class="row">

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

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

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

    </div>

 

    <div class="row">

        <?php echo $form->label($model,'city'); ?>

        <?php echo $form->textField($model,'city', array('value' => $model->city)) ?>

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

    </div>


    <div class="row submit">

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

    </div>

 

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

Die Validation des Formulars funktioniert mit Ausnahme von der Uniquerule des Usernames. Hat jemand eine Idee wieso? Das Feld wird scheinbar auch validiert aber egal was ich eingebe, danach wird das Feld immer grün also als validiert markiert.

Edit: Ich habe gerade bemerkt, dass die Validation Rule beim Absenden des Formulars greift und dann einen Fehler anzeigt, wie kann ich das auch Clientseitig prüfen? enableClientValidation ist ja auch true gesetzt.

Grüße,

Stefan

Hallo Stefan

Ich habe dasselbe Problem. Konntest du es zwischenzeitlich lösen? Bin dankbar für jeden Tipp…

Beste Grüsse

Domo

Also für mich sieht es so aus als würde CUniqueValidator einfach keine clientseitige Validierung unterstützen (Methode clientValidateAttribute der Basisklasse CValidator ist nicht überschrieben). Macht auch irgendwo Sinn, weil ja gegen die DB geprüft werden muss. Andere Validator wie CBooleanValidator haben es da natürlich leichter. Das einzige was mir im Moment einfallen würde: neue Klasse von CUniqueValidator ableiten, clientValidateAttribute überschreiben. Die Methode muss JavaScript Code zurückgeben, der einen AJAX-Aufruf an deine Anwendung macht. Das heißt du bräuchtest zusätzlich noch ne Action, die dann eben prüft ob der eingegebene Wert unique ist. Ist dann zwar keine reine clientseitige Validierung mehr, aber wohl das was noch am ehesten rankommt.

Ich habe in der Sache erstmal nicht weiter geforscht, da es nur ein nice to have Feature gewesen wäre. Der Lösungsansatz von Ben erscheint aber logisch und den werden wir dann wohl auch in Betracht ziehen.