2

当我动态构建表单元素时,我希望能够通过自定义验证规则检查并查看是否需要表单字段。问题是,当我添加自定义验证规则时,它会强制该字段不为空。如果我允许该字段为空,它不会检查我的自定义验证器,除非在该字段中输入了某些内容。

如何在回调中检查是否根据需要允许字段?

在我的提交表中

 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;
}
4

2 回答 2

1

当传入空的 $value 时,在您的自定义项中返回 true 应该可以解决问题。

如果您希望该字段允许空字符串(=空),请在顶部使用 allowBlank('custom_value_q') ,从逻辑上讲,您不需要调用自定义验证器函数,这就是在空情况下绕过它的原因。

//更新但是,您可以选择为allowEmpty()提供回调,这样应该可以仅在您确实需要时调用自定义验证规则(如果字段需要验证,因为非空白) .

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

于 2016-05-12T08:32:40.387 回答
0

我知道这有点老了,但我面临着同样的问题,正如我在 github 上看到的那样,关于它的讨论仍然开放(https://github.com/cakephp/cakephp/issues/8925https:/ /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),您可以使用应用程序规则,这些规则仅在实体被持久化时进行评估,因此字段可以允许在验证中为空,然后无论如何都会应用应用程序规则。

于 2019-03-22T11:20:07.547 回答