描述
我的网站的每个页面都有一个简单的表单 - 单个输入和一个提交按钮。关键在于用户输入他/她的电子邮件地址并点击提交。
如果数据是电子邮件地址,它会起作用 - 但如果它不是有效的电子邮件地址,则会提交表单,页面重新加载(或其他),并且会显示Flash消息,而不是我的模型更具体“不是有效的电子邮件“错误。
问题:
那么,我如何使用模型的验证消息而不是控制器的通用消息?
表格:
echo $this->Form->create('Email', array('class'=>'form1', 'url'=>'/emails/add', 'inputDefaults'=>array('label'=>false)));
echo $this->Form->input('Email.email');
echo $this->Form->end('SIGN-UP');
电子邮件控制器“添加”功能(或方法?):
function add() {
if (!empty($this->data)) {
$this->Email->create();
if ($this->Email->save($this->data)) {
$this->Session->setFlash(__('The email address has been saved', true));
$this->redirect($this->referer());
} else {
$this->Session->setFlash(__('The email address could not be saved. Please, try again.', true));
$this->set('error', 'custom error here');
$this->redirect($this->referer());
}
}
}
电子邮件模型:
class Email extends AppModel {
var $name = 'Email';
var $validate = array(
'email' => array(
'is_valid' => array( //named whatever we want
'rule' => 'notEmpty',
'rule' => array('email', true),
'message' => 'Please supply a valid email address.',
'last' => true //causes it to not check the next rule if this one fails
),
'is_unique' => array( //named whatever we want
'rule' => 'isUnique',
'message' => 'That email address is already in our database.'
)
),
);
}
答案 0 :(得分:3)
戴夫
CakePHP为您完成此操作,您已正确设置验证,如果您的保存失败,则错误为REDIRECT。这会丢失帖子数据,从而丢失验证消息
简单地
if ($this->Email->save($this->data)) {
$this->Session->setFlash(__('The email address has been saved', true));
$this->redirect($this->referer());
} else {
$this->Session->setFlash(__('There were problems saving, please see the messages below.', true));
}
答案 1 :(得分:2)
通常,您将使用$ form helper的错误选项。请参阅section of the manual on this。
但是,如果要使用验证消息填充Flash消息,可以使用模型方法invalidFields()
。这是一个例子:
if (!$this->User->save($this->data)) {
$validationErrors = $this->User->invalidFields();
$this->Session->setFlash($validationErrors['email']); // named key of the rule
$this->redirect('/somewhere');
}
这样做是为了在模型中写入失败的验证规则的消息。当invalidFields()
返回一个数组时,您可以操纵其中的值以产生更好的错误消息,例如,连接不同的错误消息。
顺便说一句,我注意到上面的代码中有些不好。您将模型类命名为“电子邮件”,并且有一个核心CakePHP类已经命名为Email(这是着名的电子邮件组件),因此我建议您以不同的方式命名整个MVC。