beforeSave()
Model inメソッドから特定のメッセージを送信しようとしています。フラッシュ メッセージが機能しません。Controller からこのメッセージを送信し、いくつかのパラメーターを使用することもできますが、この最善の解決策はありません。の使い方print
もよくありません。
私の質問は、モデルからコントローラー/ビューにメッセージを送信する方法ですか?
beforeSave()
Model inメソッドから特定のメッセージを送信しようとしています。フラッシュ メッセージが機能しません。Controller からこのメッセージを送信し、いくつかのパラメーターを使用することもできますが、この最善の解決策はありません。の使い方print
もよくありません。
私の質問は、モデルからコントローラー/ビューにメッセージを送信する方法ですか?
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,
),
));
次の手順を実行すると、いつでもモデル内でフラッシュを設定できるようになり、ページがレンダリングされる前にアプリ コントローラー内でフラッシュが自動的に設定されるため、コントローラー内で再度フラッシュを宣言する必要がなくなります。
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());
}
}