Изменение правил проверки на лету

#php #cakephp #cakephp-1.3

#php #cakephp #cakephp-1.3

Вопрос:

Я работаю над формой, которая содержит пользовательские данные, в частности поле номера телефона. Номер телефона обычно не требуется, поэтому единственным правилом проверки в модели является usphone правило. Однако, если пользователь отправляет эту форму, номер телефона становится необходимым. Я думал, что смогу просто добавить validate правило на лету, установить модель и вызвать validates метод, но либо я делаю это неправильно, либо это работает не так, как я ожидал.

В моем контроллере:

 # Update a few validation rules that are specific to this context
$this->Proposal->Requestor->validate['phone_number']['notempty'] = array(
  'rule'       => 'notEmpty',
  'message'    => 'Please enter a phone number so can can contact you with any questions about the work.',
  'allowEmpty' => false,
  'required'   => true,
);

$validationErrors = array();
$this->Proposal->Requestor->set( $this->data['Requestor'] ); # $this->data['Requestor']['phone_number'] only (no other requestor data)
if( !$this->Proposal->Requestor->validates( array( 'fieldList' => array( 'phone_number' ) ) ) ) {
  $validationErrors['Requestor'] = $this->Proposal->Requestor->validationErrors;
}
 

Об ошибках не сообщается, даже если я оставляю поле номера телефона пустым. В этом случае единственная информация, которую я запрашиваю у пользователя, — это его номер телефона, поэтому остальные Requestor данные пусты, но я попытался объединить остальные пользовательские данные, и я получаю тот же результат. Если я удалю эту fieldList опцию, я получу сообщение об ошибке в другом поле, но по-прежнему ничего не будет в пустом номере телефона.

Есть идеи, чего мне здесь не хватает? Я возился с этим уже несколько часов и просто не нашел правильного ответа.

Спасибо.

Ответ №1:

Решение оказалось двояким:

  1. У меня было существующее правило для phone_number поля, которое заставляло значение быть номером телефона в США. Для этого правила также установлено allowEmpty значение true и required false . Я хотел перехватить пустое значение, чтобы я мог отобразить особенно точное сообщение.
  2. Мне пришлось обновить существующее правило, чтобы изменить allowEmpty значения required и, а также добавить новое правило со last значением, равным true .

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

 $this->Proposal->Requestor->validate = Set::merge(
  $this->Proposal->Requestor->validate,
  array(
    'phone_number' => array(
      'notempty' => array(
        'rule'       => 'notEmpty',
        'message'    => 'Please enter a phone number so can can contact you with any questions about the work.',
        'allowEmpty' => false,
        'required'   => true,
        'last'       => true,
      ),
      'usphone' => array(
        'allowEmpty' => false,
        'required'   => true,
      ),
    )
  )
);
 

Я не могу вспомнить, проверял ли я, что изменение существующего usphone правила было строго необходимым, учитывая last значение нового правила, но эта комбинация работает нормально.

Ответ №2:

Вы могли бы попробовать использовать многозначное поведение — http://bakery.cakephp.org/articles/dardosordi/2008/07/29/multivalidatablebehavior-using-many-validation-rulesets-per-model