CakePHP 3.x Обязательное пользовательское поле проверки

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

Как я могу проверить в обратном вызове, разрешать или нет поле по мере необходимости?

В моей таблице представлений

 public function validationDefault(Validator $validator)
 {
        $validator
        ->add("custom_value_q", [
            "custom" => [
                "rule" => [$this, "customFieldIsRequired"],
                "message" => "Message Here"
                    ]
                ]
            );
     return $validator;
}       

public function customFieldIsRequired($value, $context) 
{
 //logic here 
 return true;
}

person wilsmex    schedule 12.05.2016    source источник


Ответы (2)


Возвращение true в вашем пользовательском, когда передается пустое значение $, должно помочь.

Если вы хотите, чтобы поле допускало пустую строку (= пусто), используйте allowBlank('custom_value_q') сверху, логически вам не нужно вызывать пользовательскую функцию проверки, поэтому она обходится в пустом случае.

// ОБНОВЛЕНИЕ Однако у вас есть возможность предоставить обратный вызов для allowEmpty(), при этом должна быть возможность вызывать пользовательское правило проверки только в том случае, если вы действительно этого хотите (если поле необходимо проверить, потому что оно не пустое) .

$validator->allowEmpty('fieldname', function ($context) { return !isset($context['data']['description']) || $context['data']['description'] !== ''; });

person mark    schedule 12.05.2016
comment
Марк, это то, что я уже настроил. Я возвращаю true (для тестирования) в своей пользовательской функции, и поле по-прежнему не проходит проверку, когда ничего не вводится (пользовательская функция проверки даже не вызывается, если пользователь не вводит некоторые данные). Я хочу иметь возможность определить в своей пользовательской функции, разрешено ли поле быть пустым или нет. Я также попробовал allowBlank, но получил «метод не определен». Любые другие мысли? - person wilsmex; 12.05.2016
comment
любые другие мысли? Кажется, я не могу понять это. - person wilsmex; 17.05.2016
comment
Я тоже отчаянно нуждаюсь в ответе на этот вопрос @wilsmex. Потратив часы на борьбу с валидатором, я начинаю думать, что это просто ошибка в Cake, и меня расстраивает, что этим вопросам уделяется так мало внимания. - person theraccoonbear; 24.05.2016
comment
Вы правы, я только что подтвердил, что это похоже на ошибку в системе. Не могли бы вы открыть тикет на github.com/cakephp/cakephp/issues? Тогда мы сможем исправить это как можно скорее. - person mark; 26.05.2016
comment
Ну, может быть, не сама ошибка, а нежелательное поведение в вашем случае использования. Проблема в том, что если у вас есть пользовательское правило проверки, поле не должно быть пустым. Я обновил ответ. - person mark; 26.05.2016

Я знаю, что это немного устарело, но я столкнулся с той же проблемой, и, как я вижу в github, обсуждение этого вопроса все еще открыто (https://github.com/cakephp/cakephp/issues/8925 и https://github.com/cakephp/cakephp/issues/12484).

В этом случае, когда у вас есть поле, которое может быть пустым в некоторых ситуациях (может быть, если другое поле было заполнено), вы можете сделать это:

    $validator->allowEmptyString('field_a', function ($context) {
        // check whether the field can or cannot be empty
        return $canBeEmpty;
    });

так как это может быть неправильно оценено, когда создается пустая форма (для новых сущностей), так как все поля, вероятно, пусты, вам может потребоваться добавить атрибут required => false к входу формы, иначе поле будет помечено как обязательное и попросит быть заполняется обязательно.

Хотя необходимость указывать помощнику формы, должно ли поле быть обязательным, далеко от идеала, это не имеет большого значения и работает также для проверки сущностей и немодальных форм.

Только для проверки сущностей в соответствии с этим (https://github.com/cakephp/cakephp/issues/12484#issuecomment-414465002) вы можете использовать правила приложения, которые оцениваются только тогда, когда объект сохраняется, поэтому поле можно оставить пустым при проверке, и тогда будут применяться правила приложения. так или иначе.

person jmelero    schedule 22.03.2019