我正在尝试从方法中的模型发送特定消息beforeSave()
。Flash 消息不起作用。我可以从 Controller 发送此消息并使用一些参数,但我不是这个最佳解决方案。使用print
也不好。
所以我的问题是如何从模型向控制器/视图发送任何消息?
我正在尝试从方法中的模型发送特定消息beforeSave()
。Flash 消息不起作用。我可以从 Controller 发送此消息并使用一些参数,但我不是这个最佳解决方案。使用print
也不好。
所以我的问题是如何从模型向控制器/视图发送任何消息?
您必须冒泡一条错误消息,试试这个
在您的模型中:
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());
}
}
那么 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,
),
));
通过执行以下操作,您将能够随时在模型中设置闪光灯,而不必担心在控制器中再次声明它们,因为它们会在页面呈现之前在您的应用程序控制器中自动设置。
在 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());
}
}