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.
}
});