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