CakePHP如何从Model设置消息?

时间:2013-04-09 15:45:55

标签: php cakephp cakephp-2.2

我正在尝试使用beforeSave()方法从模型发送特定消息。 Flash消息不起作用。我可以从Controller发送此消息并使用一些参数,但我不是这个最佳解决方案。使用print也不好。

所以我的问题是如何从模型向控制器/视图发送任何消息?

3 个答案:

答案 0 :(得分:8)

试试这个

在您的模型中:

public function beforeSave($options = array()){
    if($not_ok){
        $this->error = __('My error message');
        return false;
    }
    return true;
}

在您的控制器中:

public function add(){
    $save = $this->Modelname->save($this->request->data);
    if(!save){
        $this->Session->setFlash($this->Modelname->error);
        $this->redirect($this->referer());
    }
}

答案 1 :(得分:1)

Well Session-> setFlash()显然不起作用,因为它是Session组件的一部分,但是 Session组件使用静态单例类CakeSession,它具有CakeSession :: write()方法所有你要做的就是将数组传递给write方法,该方法具有与Session :: setFlash()相同的结构,因此当你使用Session时: :flash()在视图中你将得到与来自控制器的setFlash()相同的结果。

参考:http://api.cakephp.org/2.2/class-CakeSession.html

来自评论的

片段,放在模型方法中。

App::uses('CakeSession','Model/Datasource');            
            CakeSession::write('Message', array(
                'flash' => array(
                    'message' => 'your message here',
                    'element' => 'default',
                    'params' => null,
                ),
            ));

答案 2 :(得分:1)

通过执行以下操作,您可以随时在模型中设置闪烁,而不必担心在控制器中再次声明它们,因为它们会在呈现页面之前自动设置在应用控制器中。

在AppController中:

public function beforeRender() {
  parent::beforeRender();
  $this->generateFlashes();
}

public function generateFlashes() {
  $flashTypes = array('alert', 'error', 'info', 'success', 'warning');
  $model = $this->modelClass;

  foreach($flashTypes as $type) {
    if(!empty($this->$model->$type)) {
      $message = '<strong>' . ucfirst($type) . ':</strong> ' . $this->$model->$type;
      $this->Flash->error($message, array('escape' => false));
    }
  }
}

在模特:

public function beforeSave($options = array()){
  if($not_ok){
    $this->error = __('My error message');
    return false;
  }
  return true;
}

在控制器中:

public function add(){
  // $this->modelClass will use whatever the actual model class is for this
  // controller without having to type it out or replace the word modelClass
  $save = $this->{$this->modelClass}->save($this->request->data);
  if(!save){
    // no need to set flash because it will get created in AppController beforeRender()
    $this->redirect($this->referer());
  }
}