在cakephp中,如何访问其他模型字段的自定义验证中的模型字段?

时间:2018-10-17 16:39:37

标签: php validation cakephp model-view-controller cakephp-1.3

我在cakephp 1.3中有一个模型。我想为我的example_id字段设置自定义验证,该验证使用example_type字段的值。如果exam​​ple_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字段吗?我在模型中甚至可以做些什么,还是必须在控制器层做?

1 个答案:

答案 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
        )
    )
)