Пользовательское правило проверки Yii не вызывается при проверке () - PullRequest
2 голосов
/ 09 февраля 2012

Когда пользователь регистрируется в моем приложении, перед отправкой вызываются следующие правила проверки:

public function rules()
{   
    return array(
        array('email, firstName, lastName, password, passwordConfirm, telephone', 'required'),
        array('club, email, firstName, lastName, level, password, telephone', 'length', 'max'=>45),
        array('passwordConfirm', 'compare', 'compareAttribute'=>'password', 'on'=>'register'),
        array('email', 'isUniqueEmailAddress'),
    );  
}

Первые три правила проверки завершаются успешно, а четвертое (пользовательский метод проверки) - нет.Он должен вызвать функцию isUniqueEmailAddress и выполнить следующее:

/*
* Returns true if there doesn't exist a user in the database with the submitted email
*/
public function isUniqueEmailAddress($attribute, $params)
{
    //if (User::model()->find('email=:email', array(':email'=>$this->email)) !== null)
    //{
        $this->addError('email', 'Email account already exists');
    //}
}

Как видите, я даже закомментировал всю логику, чтобы просто гарантировать, что ошибка проверки отправляется обратно в регистрационную формуно ошибки не возвращаются при проверке ().Я прочитал Документацию Yii и исследовал форумы, но не могу понять, почему мой пользовательский метод проверки не вызывается?

Ответы [ 4 ]

1 голос
/ 28 мая 2012

Я столкнулся с этой проблемой при попытке установить флэш-сообщение в контроллере после вызова $ model-> save (). Это была проблема с форматированием кода, которая вызвала логическую ошибку.

Например, в модели у меня было что-то вроде этого:

public function validateNumItems($attribute, $params) {
  $this->addError($attribute, 'Validate Items Failed');
}

Теоретически это должно было вызывать сбой при отправке формы каждый раз в целях отладки. Но этого никогда не было.

Действие обновления моего контроллера выглядело так:

  public function actionUpdate($id) {
    $model = $this->loadModel($id);

    // Uncomment the following line if AJAX validation is needed
    // $this->performAjaxValidation($model);

    if (isset($_POST['Collection'])) 
    {
      $model->attributes = $_POST['Collection'];
      if ($model->save())
        Yii::app()->user->setFlash('success', "Data saved!");
        $this->redirect(array('index'));
    }

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

Отсутствующие скобки вокруг теста $ model-> save (), созданного Gii, вызвали логическую ошибку, когда я добавил новые строки. Поставив в скобки фиксированные вещи на месте.

  public function actionUpdate($id) {
    $model = $this->loadModel($id);

    // Uncomment the following line if AJAX validation is needed
    // $this->performAjaxValidation($model);

    if (isset($_POST['Collection'])) {
      $model->attributes = $_POST['Collection'];
      if ($model->save()) {
          Yii::app()->user->setFlash('success', "Data saved!");
          $this->redirect(array('index'));
      }
    }

    $this->render('update', array('model' => $model, ));
  }
1 голос
/ 19 ноября 2013
array('email', 'exist')

вот так.

public function rules()
{   
    return array(
        array('email, firstName, lastName, password, passwordConfirm, telephone', 'required'),
        array('club, email, firstName, lastName, level, password, telephone', 'length', 'max'=>45),
        array('passwordConfirm', 'compare', 'compareAttribute'=>'password', 'on'=>'register'),
        array('email', 'exist')
    );  
}
0 голосов
/ 17 июля 2014

попробуйте, все работает нормально -

public function rules()
    {   
        return array(
            array('email, firstName, lastName, password, passwordConfirm, telephone', 'required'),
        array('email', 'email','message'=>"The email isn't correct"),
            array('email', 'uniqueEmail'),
        );  
    }

ваша пользовательская функция, напишите в ту же модель -

public function uniqueEmail($attribute, $params)
    {
        if($user = User::model()->exists('email=:email',array(':email'=>$this->email)))
          $this->addError($attribute, 'Email already exists!');
    }
0 голосов
/ 09 февраля 2012

Я прокомментировал несколько возможных причин, по которым ваш код не работает (выглядит правильно), но в этом случае вы можете просто использовать валидатор Unique.

array('email', 'unique') сделает это.

...