3

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

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

4

3 回答 3

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());
    }
}
于 2014-02-13T14:53:13.133 回答
1

那么 Session->setFlash() 显然不起作用,因为它是 Session 组件的一部分,但是 Session 组件使用静态单例类 CakeSession,它有方法 CakeSession::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,
                ),
            ));
于 2013-04-10T08:55:01.500 回答
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());
  }
}
于 2016-11-08T19:49:06.443 回答