当我动态构建表单元素时,我希望能够通过自定义验证规则检查并查看是否需要表单字段。问题是,当我添加自定义验证规则时,它会强制该字段不为空。如果我允许该字段为空,则除非在该字段中输入内容,否则它不会检查我的自定义验证器。
如何根据需要检查回调是否允许字段?
在我的SubmissionsTable
中 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;
}
答案 0 :(得分:1)
当传入空的$ value时,在自定义的中返回true应该可以解决问题。
如果您希望字段允许空字符串(=空),请在顶部使用allowBlank('custom_value_q'),逻辑上您不需要调用自定义验证器函数,这就是为什么它在空案例中被绕过的原因
// UPDATE 但是,您可以选择为allowEmpty()提供回调,如果您真的需要它,则应该可以仅调用自定义验证规则(如果该字段需要验证,因为非空白)。 p>
$validator->allowEmpty('fieldname', function ($context) {
return !isset($context['data']['description']) || $context['data']['description'] !== '';
});
答案 1 :(得分:0)
我知道这有点老了,但是我面临着同样的问题,正如我在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),您可以使用应用程序规则,仅当实体持久化时才对它们进行评估,因此在验证中允许字段为空,然后允许应用程序规则为空无论如何都会应用。