我正在使用CakePHP的简单注册表。
这是我的编辑视图:
<h2>Add User</h2>
<?php echo $form->create('User');
echo $form->input('first_name');
echo $form->input('last_name');
echo $form->input('email');
echo $form->input('address');
echo $form->input('phone');
echo $form->end('Edit');?>
这些是我在User.php中的验证规则
class User extends AppModel {
var $name = 'User';
var $validate = array(
(... more rules here ...)
'password' => array('rule' => array('confirmPassword', 'password'),
'message' => 'Passwords do not match'),
'password_confirm' => array('rule' => 'alphanumeric',
'required' => true)
);
这是一个愚蠢的问题,但是当我使用编辑表单时,数据保存失败,因为我需要在最后一条规则中输入密码。当然,该规则是为注册页面添加的。
我找到了数十亿种绕过这个问题的方法(禁用保存验证,选择要保存的字段,......),但我想知道“正确”的CakePHP做法是什么?看起来像这样一个简单的问题,但我找不到任何关于如何以干净的方式完成的文档。
让我的问题更加明确:我不想要一个可以更改密码的编辑用户页面。
答案 0 :(得分:3)
Cake方式是简单地将验证规则设置为仅应用于create
,允许您自由编辑数据,而无需再次验证字段。
var $validate = array(
'fieldName' => array(
'rule' => 'ruleName'
'required' => true,
'allowEmpty' => false,
'on' => 'create', // or update <-- here
'message' => 'Your Error Message'
)
);
当然,如果您不想在此处编辑密码字段,只需删除相应的input
答案 1 :(得分:3)
我使用多个验证集:
在您的模型或app_model中,使用以下方法覆盖validates函数:
function validates($options = array()) {
// copy the data over from a custom var, otherwise
$actionSet = 'validate' . Inflector::camelize(Router::getParam('action'));
if (isset($this->validationSet)) {
$temp = $this->validate;
$param = 'validate' . $this->validationSet;
$this->validate = $this->{$param};
} elseif (isset($this->{$actionSet})) {
$temp = $this->validate;
$param = $actionSet;
$this->validate = $this->{$param};
}
$errors = $this->invalidFields($options);
// copy it back
if (isset($temp)) {
$this->validate = $temp;
unset($this->validationSet);
}
if (is_array($errors)) {
return count($errors) === 0;
}
return $errors;
}
在您的控制器中:
class UsersController extends AppController {
function forgot() {
$this->User->set($this->data);
$this->User->validationSet = 'forgotpassword';
if ($this->User->validates()) {
// send email to reset password and show success message
}
}
}
最后回到你的模型中,构建一个验证数组,你可以拥有你的默认验证数组,然后添加一个补充数组,如
class User extends AppModel {
var $validate = array( ... );
var $validateForgotpassword = array( ... );
}
此处有更多详情:
http://snook.ca/archives/cakephp/multiple_validation_sets_cakephp
(请注意文章中的代码示例中有一个错误,因此请务必更改$ param ='validate'。$ validationSet; to $ param ='validate'。$ this-&gt; validationSet;)
答案 2 :(得分:1)
删除您的'required'=&gt;是的,它没有按照你的想法去做。
'required'=&gt; true表示该字段应存在于任何已保存的数据中。你没有通过它。