У меня есть форма 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');
}
Вы можете попробовать это:
<?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');
}
}
?>
Вы также можете посмотреть на это расширение
Вы можете написать собственный валидатор:
//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'),
...
Или лучше попробуйте использовать ЭТОТ
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[]'); ?>