3

beforeSave()Model inメソッドから特定のメッセージを送信しようとしています。フラッシュ メッセージが機能しません。Controller からこのメッセージを送信し、いくつかのパラメーターを使用することもできますが、この最善の解決策はありません。の使い方printもよくありません。

私の質問は、モデルからコントローラー/ビューにメッセージを送信する方法ですか?

4

3 に答える 3

1

Session->setFlash() は明らかに動作しません。これは Session コンポーネントの一部であるためです。ただし、Session コンポーネントは静的なシングルトン クラス CakeSession を使用します。これには CakeSession::write() メソッドがあり、書き込むために配列を渡すだけです。 Session::setFlash() と同じ構造を持つメソッドが生成されるため、ビューで Session::flash() を使用すると、コントローラーから setFlash() と同じ結果が得られます。

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

Model メソッドに配置されるコメントのスニペット。

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 に答える