Уникальные значения электронной почты из динамической формы Yii 1.1

У меня есть форма Yii принять first name, last name а также email от пользователя. Используя add more По ссылке пользователи могут добавить несколько строк из этих трех элементов.

Для проверки электронной почты, unique а также required установлены в правилах модели и все работает нормально. Я использую JavaScript для создания дополнительной строки при нажатии add more ссылка на сайт.

проблема

В первом ряду мои значения John, Newman, [email protected] и второй ряд, я вхожу Mathew, Heyden, [email protected], В этом случае адрес электронной почты дублируется. Ни одно из правил валидации (require а также unique) способен подтвердить это. Кто-нибудь может предложить лучший метод для проверки этого?

Обновить:
Я создал пользовательскую функцию проверки, и я думаю, этого достаточно, чтобы решить мою проблему. Может кто-нибудь сказать мне, как получить доступ ко всему form data / post data в пользовательской функции проверки?

public function uniqueOnForm($attribute){
// This post data is not working
error_log($_REQUEST, true);
$this->addError($attribute, 'Sorry, email address shouldn\'t be repeated');
}

1

Решение

Вы можете попробовать это:

<?php
public function rules()
{
return array(
array('first_name', 'checkUser')
);
}

public function checkUser($attribute)
{
if($this->first_name == $this->other_first_name){
$this->addError($attribute, 'Please select another first name');
}
}
?>

Вы также можете посмотреть на это расширение

1

Другие решения

Вы можете написать собственный валидатор:

//protected/extensions/validators
class UniqueMailValidator extends CValidator
{

/**
* @inheritdoc
*/
protected function validateAttribute($object, $attribute)
{
$record = YourModel::model()->findAllByAttributes(array('email' => $object->$attribute));
if ($record) {
$object->addError($attribute, 'Email are exists in db.');
}
}
}

// in your model
public function rules()
{
return array(
array('email', 'ext.validators.UniqueMailValidator'),
...

Или лучше попробуйте использовать ЭТОТ

0

public function rules(){
return array(
//other rules
array('email', 'validEmail'),
)

}

public function validEmail($attribute, $params){
if(!empty($this->email) && is_array($this->email)){
$isduplicate = $this->isDuplicate($this->email);
if($isduplicate){
$this->addError('email', 'Email address must be unique!');
}
}
}

private function isDuplicate($arr){
if(count(array_unique($arr)) < count($arr)){
return true;
}
else {
return false;
}
}

потому что вы используете табличный ввод (несколько строк), поэтому убедитесь, что поле ввода в виде массива. может быть так:

<?php echo $form->textField($model, 'email[]'); ?>
0
По вопросам рекламы [email protected]