【问题标题】:cakephp: model validation based on another fieldcakephp:基于另一个字段的模型验证
【发布时间】:2013-08-13 08:42:16
【问题描述】:

我正在尝试在一个字段上设置模型验证,仅在另一个字段等于特定值时才需要检查。

我的第一个字段是查询,它是一个包含许多值的下拉菜单,如果选择了一个值,那么我需要第二个字段“query_other”不为空。

我的物品模型中有这个设置:

public $validate = array(
   'query' => array(
        'notempty' => array(
            'rule' => array('notempty'),
            'message' => 'THE QUERY IS REQUIRED',
            //'allowEmpty' => false,
            //'required' => false,
            //'last' => false, // Stop validation after this rule
            //'on' => 'create', // Limit validation to 'create' or 'update' operations
        ),
    ),
    'query_other' => array(
        'notempty' => array(
            'rule' => array('if_query_other', 'query'),
            'message' => 'REASON IS REQUIRED',
            //'allowEmpty' => false,
            //'required' => false,
            //'last' => false, // Stop validation after this rule
            //'on' => 'create', // Limit validation to 'create' or 'update' operations
        ),
    ),
);

然后我就有了上面调用的这个自定义函数。

 function if_query_other(&$data, $check, $query_field) {

    if($this->data[$this->name][$query_field] == 'Other' && $check == NULL)
    {
        return false;
    }
    else
    {
        return true;
    }
  }

它不起作用,我目前收到此错误:Item::if_query_other() 的参数 1 应为参考,给定值

CakePHP 2.3.6 版

谢谢

【问题讨论】:

  • 验证函数在哪里,在模型本身中,还是在行为中?此外,您应该始终提及您的确切 CakePHP 版本!
  • 谢谢,验证在项目模型中,我使用的是 cakePHp 版本 2.3.6。

标签: validation cakephp model


【解决方案1】:

错误信息非常清楚,参数 1 是按值传递的,而不是您的方法签名所要求的 by reference。没有什么可以通过引用传递给自定义验证方法,因此只需删除&,分别从签名中删除第一个参数。

传递给自定义验证方法的第一个参数将始终是要验证的字段的数据(key => value 格式),然后是rule 数组中定义的可能参数,例如您的字段名。所以$check 永远不会是null,除非你在rule 数组中定义了null,即'rule' => array('if_query_other', null),因此你的第三个参数永远不会是字段名。

长话短说,您只需要定义两个参数,第一个将包含要验证的字段的数据,第二个将包含在rule 数组中定义的附加值。

这里是一个例子,它检查$query_field传入的字段是否存在以及它的值是否等于Other,如果存在则返回当前字段的值是否不为空(我假设内置- Validation::notEmpty() 足以满足您的“not empty”检查需求)。如果$query_field字段的值不等于Other,那么这条规则总是验证成功,即该值不需要不为空。

...

App::uses('Hash', 'Utility');
App::uses('Validation', 'Utility');

class Item extends AppModel
{
    ...

    public function if_query_other($check, $query_field)
    {
        if(Hash::get($this->data[$this->alias], $query_field) === 'Other')
        {
            return Validation::notEmpty(current($check));
        }

        return true;
    }
}

【讨论】:

  • 非常感谢,但它似乎没有启动,所以我想知道我是否正确调用它(如上所述?)我现在没有收到任何错误,但如果该字段为空不过还是会过去。
  • 我已经使用您的确切验证规则对其进行了测试,并且它按预期工作,如果 queryOther 并且 query_other 为空,则会引发错误。再次阅读您的问题后,我注意到您提到了otherOther,因此请确保您使用的是正确大小写的比较值。除此之外,很难判断您的设置可能有什么问题,您必须进行一些调试,检查是否实际调用了if_query_other,检查传递值的内容,Hash::get 和 @ 的结果987654345@等...
  • 谢谢,我想知道我上面的 $validate 规则是否错误地调用了你的函数?
  • 不,没关系(query 的严格规则应该是 noEmpty,大写 E,但是由于 PHP 中的方法不区分大小写,这无关紧要,并且会导致其他错误消息),正如我所说,我已经使用了这些确切的规则并且它有效:ge.tt/7Upw5ko/v/0
  • OK 非常感谢,一定是其他原因导致了问题。再次感谢您的帮助。
猜你喜欢
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多