如何使用CakePHP的模型验证消息而不是控制器的setFlash消息?

时间:2011-03-23 20:31:06

标签: php cakephp cakephp-1.3

描述

我的网站的每个页面都有一个简单的表单 - 单个输入和一个提交按钮。关键在于用户输入他/她的电子邮件地址并点击提交。

如果数据是电子邮件地址,它会起作用 - 但如果它不是有效的电子邮件地址,则会提交表单,页面重新加载(或其他),并且会显示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.'
        )
    ),
);
}

2 个答案:

答案 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。