0

我正在尝试在一个字段上设置模型验证,如果另一个字段等于特定值,则只需要检查该字段。

我的第一个字段是查询,它是一个包含许多值的下拉列表,如果选择了这个值,则一个值为“其他”,那么我需要第二个字段“查询其他”不为空。

我的项目模型中有这个设置:

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 版

谢谢

4

1 回答 1

2

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

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

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

这是一个例子,它检查传入的字段是否存在以及它的值是否$query_field等于“检查需求)。如果该字段的值不等于,则该规则将始终验证成功,即该值不需要为非空。OtherValidation::notEmpty()$query_fieldOther

...

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;
    }
}
于 2013-08-12T11:57:12.500 回答