我正在尝试使用beforeSave()
方法从模型发送特定消息。 Flash消息不起作用。我可以从Controller发送此消息并使用一些参数,但我不是这个最佳解决方案。使用print
也不好。
所以我的问题是如何从模型向控制器/视图发送任何消息?
答案 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());
}
}