【问题标题】:CakePHP Validation no model with two dimensional arrayCakePHP Validation 没有二维数组的模型
【发布时间】:2011-08-02 09:43:05
【问题描述】:

使用 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 进行处理,并且除了预订之外不保存任何信息。

【问题讨论】:

    标签: cakephp cakephp-1.3


    【解决方案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】:

    型号

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

    【讨论】:

    • @deisel 感谢您的评论,但我想问是否有办法做到这一点,而无需为每个模型创建模型。目前基本上是为了节省时间和复杂性,因为在未来,我们很可能会以不同的方式验证和保存所有这些信息,使用价格的预订模型和保存帐单地址和抄送号码的用户模型。我们已经在我们的系统中使用了 45 个模型,并且在发送到 paypal 之前添加另外 3 个模型只是为了一页验证,这并不是最好的选择。
    【解决方案3】:

    查看

    由于 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; ?>
    

    【讨论】:

    • 完美。谢谢!在我们为表单上的所有数据实现真实模型之前,进行临时验证是一种更简单、更好的方法。
    • 在 Cake 2 中略有不同:$validationErrors['Member']['name'][] = 'Please enter you name';(附加到数组)
    猜你喜欢
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多