CakePHP验证没有带二维数组的模型

时间:2011-08-02 09:43:06

标签: cakephp cakephp-1.3

使用CakePHP 1.3,我如何使用内置验证来验证生成如下设置的二维数组的表单,并且只使用“预订”模型。对于这个例子,我们假设我只需要确保它们是必需的:

[Booking] => Array
        (
            [id] => 10000141
            [terms] => 1
        )

[Member] => Array
        (
            [name] => Test Name
            [billing_address] => 1234 Park Lane
            [billing_city] => New York
            [billing_zip] => 10001
            [billing_state] => NY
            [billing_country] => US
        )

[Order] => Array
        (
            [theTotal] => 21.64
            [currencyCode] => USD
        )

[CreditCard] => Array
        (
            [card_number] => 1234567890
        )

我理解如何使用Multiple Validation Sets,但由于我没有“会员”,“订购”,“信用卡”的模型,我该如何验证信息?

此表单与模型的多维度是因为我将数据发送到PayPal进行处理,除了预订之外不保存任何信息。

3 个答案:

答案 0 :(得分:1)

模型

您所使用的验证是Model class的一项功能。我个人会为上面的每一个创建模型,包括您的$validates数组,但将$useTable属性设置为false以防止它与您的数据库进行交互。这应该允许您在your controllers等地方使用模型中的功能,例如验证。

答案 1 :(得分:1)

控制器

CakePHP将每个加载模型的validationErrors属性传递给View类(然后是FormHelper类),因此可以显示验证错误。自Controller::render()方法checks that each model is loaded以来,从控制器(不扩展render()方法)真正实现这一目标的唯一方法是即时创建所需的模型:

public function add() {
    // ...
    $this->Member = new Model(null, false); // make fake model with no table
    $this->modelNames[] = 'Member'; // add to list of models
    // perform validation
    if (!Validation::minLength($this->data['Member']['name'], 1)) {
        $this->Member->validationErrors['name'] = 'Please enter you name';
    }
    // ...
}

修改

如果按照“蛋糕标准”表示你想使用Model::validate数组,这也是可能的:

public function add() {
    // ...
    $this->Member = new Model(null, false); // make fake model with no table
    $this->modelNames[] = 'Member'; // add to list of models
    // perform validation
    $this->Member->validate = array(
        'name' => array(
            array(
                'rule' => array('minLength', 5),
                'message' => 'Your full name must be at least five characters in length'
            ),
        ),
    );
    $this->Member->set($this->data);
    $this->Member->validates();
}

答案 2 :(得分:1)

视图

由于CakePHP希望在将验证错误传递给视图之前查看真实模型,因此您也可以手动执行此操作以简化操作:

public function add() {
    // perform validation
    if (!Validation::minLength($this->data['Member']['name'], 1)) {
        $validationErrors['Member']['name'] = 'Please enter you name';
    }
    // etc ...
    $this->set(compact('validationErrors')); // pass to view
}

在您的视图中,您可以手动将其设置为FormHelper:

<?php $this->Form->validationErrors = $validationErrors; ?>