CakePHP 3.x自定义验证字段必需

时间:2016-05-12 03:57:28

标签: cakephp cakephp-3.2

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

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

在我的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;
}

2 个答案:

答案 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/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),您可以使用应用程序规则,仅当实体持久化时才对它们进行评估,因此在验证中允许字段为空,然后允许应用程序规则为空无论如何都会应用。