CakePHP Validation 没有二维数组的模型
Posted
技术标签:
【中文标题】CakePHP Validation 没有二维数组的模型【英文标题】:CakePHP Validation no model with two dimensional array 【发布时间】: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 进行处理,并且除了预订之外不保存任何信息。
【问题讨论】:
【参考方案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';
(附加到数组)以上是关于CakePHP Validation 没有二维数组的模型的主要内容,如果未能解决你的问题,请参考以下文章
在 CakePHP 中保存没有数据的模型(只需在 db 中创建 id)