CakePHP 3.5, как проверить пустое или не пустое поле на основе значения другого поля?

Я использую CakePHP 3.5.5.

Я поражен пользовательским правилом проверки. У меня есть поля страны и штата, на мой взгляд. В случае, если значение поля страны равно США, тогда мы делаем поле состояния обязательным, в противном случае мы не делаем этого. Я поместил пользовательское правило проверки в свой UsersTable.php, как это:

public function validationDefault(Validator $validator) {
  $validator
    ->add('state', 'custom', [
    'rule' => [$this,'validate_state'],
    'provider' => 'custom',
    'message' => 'Please enter state'
  ]);
}

и создали функцию validate_state следующим образом:

public function validate_state($value, $context) {
    //debug($value, $context);die;
//if state is us)
  //if state is not empty return true;
  //if state is empty return false;
//else return true;
}

Но это не работает вообще. Единственное, что он делает, это показывает сообщение "Это поле нельзя оставлять пустым", если я использую это правило. Я понимаю, что CakePHP предполагает запуск notEmpty самостоятельно, если вы создали правило валидатора для поля. Но моя проблема в том, что я не могу править значение поля true или false перед проверкой значения другого поля, для которого мне нужно использовать пользовательскую функцию перед проверкой метода notEmpty. Но в моем случае здесь, если я не использую метод notEmpty, он не вводит пользовательскую функцию validate_state и не показывает пользовательское сообщение, которое я использую в этом правиле.

Знаете ли вы лучший способ сделать это без взлома данных запроса формы перед отправкой в ​​валидатор?

2 ответа

Используйте вызываемый для notEmpty (или же allowEmpty), и так же, как вы бы сделали это в своем custom Правило, оцените контекст, чтобы определить, применяются ли правила (т. е. должно ли поле быть пустым), что-то вроде:

$validator
    ->notEmpty('state', null, function ($context) {
        // field must not be empty when the conditions evaluate to true
        return
            isset($context['data']['country']) &&
            $context['data']['country'] === 'US';
    })
    // ...

Смотрите также

      $validator->notEmpty('state', 'The message to show', function ($context) {
    if (isset($context['data']['country']) && $context['data']['country'] == 'US')
    {
        return true; // this means state cannot be empty if country is US.
    }
});
Другие вопросы по тегам