Как вручную проверить поле модели CakePHP? - PullRequest
0 голосов
/ 03 октября 2019

ВОПРОС ОБНОВЛЕН * : я узнал больше информации и поэтому изменил свой вопрос.

Я хочу сохранить своего пользователя с его номером лицензии, но только если он выберет, что у него есть лицензия,У меня есть три возможных значения для поля pilot_type (ROC, ROC-light и restative), и только последний параметр должен разрешать отправку пустой строки.

Для этого я написалследующая функция проверки:

$validator
    ->add('license_nr', 'present_if_license', [
        'rule' => function ($value, $context) {
            return $context['data']['pilot_type'] == 'recreative' || !empty($value);
        },
        'message' => "If you don't fly recreatively, a license number needs to be supplied"
]);

Проблема заключается в том, что установка любого правила проверки для поля вызовет дополнительную проверку в классе CakePHP Model, которая отклонит значение, если оно пустое. Я попытался исправить это, добавив ->allowEmpty('license_nr'), но это правило заставляет модель принимать пустую строку даже без запуска моей пользовательской функции. Даже приведение их в порядок и использование 'last' => true в моем собственном правиле не решает эту проблему:

$validator
    ->add('license_nr', 'present_if_license', [
        'rule' => function ($value, $context) {
            return false;
            // return $context['data']['pilot_type'] == 'recreative' || !empty($value);
        },
        'last' => true,
        'message' => "If you don't fly recreatively, a license number needs to be supplied"
    ])
    ->allowEmpty('license_nr');

Как заставить CakePHP запускать мою пользовательскую функцию, чтобы увидеть, может ли поле быть пустым,а не просто предполагать, что он никогда не может быть пустым или всегда должен быть пустым?

1 Ответ

1 голос
/ 04 октября 2019

По умолчанию поля не могут быть пустыми, поэтому это ожидаемое поведение, и вам придется явно разрешить пустые значения.

Чтобы достичь того, что вы пытаетесь сделать, вместоиспользуя дополнительное правило, вы должны настроить правило allowEmpty(), использовать второй аргумент для предоставления обратного вызова (обратите внимание, что в отличие от обратных вызовов правила он получит единственный аргумент, обеспечивающий контекст).

Таким образом, вы бысделайте что-то подобное, что вам может потребоваться немного изменить, например, в зависимости от того, нужно ли вам работать по-разному для создания ($context['newRecord'] = true) и обновления ($context['newRecord'] = false) записей:

->allowEmpty(
    'license_nr',
    function ($context) {
        return $context['data']['pilot_type'] === 'recreative';
    },
    "If you don't fly recreatively, a license number needs to be supplied"
)

Начиная с CakePHP 3.7 вы можете использовать allowEmptyString(), он будет работать так же, вам просто нужно поменять местами второй и третий аргументы, так как allowEmptyString() принимает сообщение в качестве второго аргумента и обратный вызов в качестве третьего аргумента.

См. Также

...