我正在尝试在一个字段上设置模型验证,只需要检查另一个字段是否等于特定值。
我的第一个字段是查询,它是一个包含许多值的下拉列表,如果选中此项,则一个值为“其他”,然后我需要第二个字段“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;
}
}
它无效,我目前收到此错误:参数1到Item :: if_query_other()应该是参考,给定值
CakePHP版本2.3.6
由于
答案 0 :(得分:2)
错误消息非常清楚,参数1按值传递,而不是by reference,因为您的方法签名需要。通过引用自定义验证方法无需传递任何内容,因此只需删除&
,分别从签名中删除第一个参数。
传递给自定义验证方法的第一个参数将始终是要验证的字段的数据(以key => value
格式),然后是rule
数组中定义的可能参数,例如您的字段名。所以$check
从来都不是null
,除非您在null
数组中定义rule
,即'rule' => array('if_query_other', null)
,因此您的第三个参数将永远不会是rule
字段名。
长话短说,您只需要定义两个参数,第一个将包含要验证的字段的数据,第二个将包含$query_field
数组中定义的附加值。
这是一个例子,它检查Other
中传递的字段是否存在以及它的值是否等于Validation::notEmpty()
,如果是,则返回当前字段的值是否为空(我是假设内置$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;
}
}
,则此规则将始终成功验证,即该值不需要为空。
{{1}}