我在cakephp 1.3中有一个模型。我想为我的example_id字段设置自定义验证,该验证使用example_type字段的值。如果example_type是特定类型(1,不是2或3),我只想使验证失败。
以下是示例验证变量:
var $validate = array(
'example_type' => array(
'notempty' => array(
'rule' => array('notempty'),
'message' => 'Example Type: This is a required field'
),
'numeric' => array(
'rule' => array('numeric'),
'message' => 'Example Type: Please choose from the drop down.'
),
'isSpecificType' => array(
'rule' => array('isSpecificType')
)
),
'example_id' => array(
'range' => array(
'rule' => array('range', -1, 2147483648),
'message' => 'Example ID: Enter number from 0 to 2147483647',
'allowEmpty' => true
),
'numeric' => array(
'rule' => array('numeric'),
'message' => 'Example ID: Numeric only.',
'allowEmpty' => true
),
'is_type' => array(
'rule' => array('exampleNotEmpty', $specific_type_var),
'message' => 'Example ID: You must have an example id if the example type is 1'
)
)
);
然后我将具有两个自定义验证功能,即isSpecificType和exampleNotEmpty。请参阅以下内容:
function isSpecificType($check) {
$specific_type_var = $check['example_type'];
return true;
};
function exampleNotEmpty($check, $type) {
if ($type === 1) {
if (is_null($check['example_id'])) {
return false; //by the way, i realize is_null may not be correct here, but I have the capability to correct this after I am able to run it a few times
}
}
return true;
};
最后,在我的AppModel顶部,在$ validate声明之前,我创建了变量$ specific_type_var。请参阅以下内容:
var $specific_type_var = 1;
现在,我的问题。我在这条线上出现错误:
'rule' => array('exampleNotEmpty', $specific_type_var),
错误是:解析错误:语法错误,/cakephpproject/app/models/example.php在##
行上出现意外的'$ specific_type_var'(T_VARIABLE),期望')'在这篇文章中,我最后的问题是:我是否会以正确的方式进行操作?我是否有语法错误?或者,我可以直接在另一个字段正在调用的自定义验证函数内部访问example_type字段吗?我在模型中甚至可以做些什么,还是必须在控制器层做?
答案 0 :(得分:0)
我有一些问题。一种是如何在cakephp模型中使用变量。其次是如何使用这些变量将字段传递给其他字段的自定义验证器。第三是如何将空字段传递给自定义验证器。
第一个问题的答案:重写构造函数使您可以向模型添加变量。
public function __construct($id = false, $table = null, $ds = null){
parent::__construct($id, $table, $ds);
$this->example_type_var = 1;
}
回答第二个问题:在您需要传递的字段上创建一个自定义验证器,并使用该函数进行设置。注意(我认为)规则发生时有一个命令。确保将自定义规则作为第一条规则,并且将该字段放在需要访问该字段值的第二个字段之前。
var $validate = array(
'example_type' => array(
'updateActionne' => array(
'rule' => array('_updateTheOleType')
)
)
)
然后在自定义验证器中
function _updateTheOleType($check) {
$this->example_type_var = $check['example_type'];
return true;
}
在第二个自定义验证器中,再次使用$ this-> example_type_var。请参阅以下内容:
function _exampleNotEmpty($check) {
if ($this->example_type_var === '3') {
if (empty($check['example_id']) && $check['example_id'] !== '0') {
return false;
}
}
return true;
}
第三个问题的答案:我错误地认为allowEmpty是将空字段传递给自定义验证程序所需要的。那不是它的工作原理。 AllowEmpty设置为true表示空字段在规则上返回true。您的自定义验证程序甚至不会运行。 AllowEmpty设置为false意味着空字段将再次通过验证,而无需进入规则的自定义验证器函数。正确的属性是必需的。设置为true必须强制规则始终运行。
错误:
var $validate = array(
'example_id' => array(
'exampleNotEmpty' => array(
'rule' => array('_exampleNotEmpty'),
'message' => 'Example ID: You must have an example ID if the event is example type.',
'allowEmpty' => true
)
)
)
错误:
var $validate = array(
'example_id' => array(
'exampleNotEmpty' => array(
'rule' => array('_exampleNotEmpty'),
'message' => 'Example ID: You must have an example ID if the event is example type.',
'allowEmpty' => false
)
)
)
正确:
var $validate = array(
'example_id' => array(
'exampleNotEmpty' => array(
'rule' => array('_exampleNotEmpty'),
'message' => 'Example ID: You must have an example ID if the event is example type.',
'required' => true
)
)
)