Два пользовательских правила проверки для тех же двух полей не работают, когда оба присутствуют в CakePHP 2
У меня есть массив $validate в модели с двумя пользовательскими правилами проверки. В моих действиях "добавить" и "редактировать", если пользователь не вводит "Необходимую дату" ИЛИ не устанавливает флажок "Не требуется", приложение должно выдать предупреждение. Если пользователь вводит ОБА Дата необходимости и ставит флажок, приложение должно выдать предупреждение о том, что он должен выбрать один или другой.
Моя проблема в том, что эти правила не работают вообще, если они оба присутствуют. Если я прокомментирую одно или другое, правило без комментариев работает нормально.
Вот код из модели:
public $validate = array(
'need_date' => array(
'allowEmpty' => true,
'rule' => 'checkNeedDate',
'message' => 'Please enter a Need Date or check the box if not required.'
),
'no_need_date' => array(
'allowEmpty' => true,
'rule' => 'checkNeedDate',
'message' => 'Please enter a Need Date or check the box if not required.'
),
'need_date' => array(
'allowEmpty' => true,
'rule' => 'oneOrTheOther',
'message' => 'Please enter EITHER \'Not Required\' OR a Need Date.'
),
'no_need_date' => array(
'allowEmpty' => true,
'rule' => 'oneOrTheOther',
'message' => 'Please enter EITHER \'Not Required\' OR a Need Date.'
)
);
И вот функции проверки из той же модели:
//Make sure that either the Requested Need Date field is filled in OR that the Not Required checkbox has been checked
function checkNeedDate($field) {
if(!empty($this->data[$this->alias]['need_date']) || !empty($this->data[$this->alias]['no_need_date'])) {
return true;
} else {
return false;
}
}
//Make sure that the user has not filled in the Need Date field AND checked the Not Required box
function oneOrTheOther($field) {
if(!empty($this->data[$this->alias]['need_date']) && !empty($this->data[$this->alias]['no_need_date']) ) {
return false;
} else {
return true;
}
}
Что я могу здесь делать не так?
РЕДАКТИРОВАТЬ: функция oneOrTheOther() работает как в моих действиях "добавить", так и "изменить", когда присутствует checkNeedDate(). checkNeedDate(), кажется, проблема, когда это не само по себе.
1 ответ
TLDR: проверьте область "Несколько правил на поле" в CakePHP 2 Book. (Вы перезаписываете первое значение, используя кратные значения одного и того же ключа).
Больше деталей:
Это стандарт array()
проблема и одна из тех мелких вещей, которые часто упускают из виду (не волнуйтесь, мы все сделали это хотя бы один раз).
Если вы установите ключ, который уже установлен, он заменит значение предыдущего ключа.
Пример:
$food = [
'pizza' => 'yuck',
'vegetables' => 'meh',
'pizza' => 'OMGYES!',
];
Полученный массив будет:
$food = [
'pizza' => 'OMGYES!',
'vegetables' => 'meh',
];
Попробуй это:
public $validate = array(
'need_date' => [
'customCheck' => [
'allowEmpty' => true,
'rule' => 'checkNeedDate',
'message' => 'Please enter a Need Date or check the box if not required.'
],
'needDate' => [
'allowEmpty' => true,
'rule' => 'oneOrTheOther',
'message' => 'Please enter EITHER \'Not Required\' OR a Need Date.'
]
],
'no_need_date' => [
'checkNeedDate' => [
'allowEmpty' => true,
'rule' => 'checkNeedDate',
'message' => 'Please enter a Need Date or check the box if not required.'
],
'oneOrTheOther' => [
'allowEmpty' => true,
'rule' => 'oneOrTheOther',
'message' => 'Please enter EITHER \'Not Required\' OR a Need Date.'
]
],
);
Обратите внимание, что каждое правило находится в своем собственном ключе с уникальным именем в одном и том же ключе имени поля.