В Cake есть удобное средство выдачи сообщений – Flash. Но меня всегда огорчало то, что нельзя передать тип Flash. Я выделяю для себя 3 типа: ошибки («Не удалось добавить»), подтверждение («Добавление завершено») и просто сообщения. Оказывается, можно это сделать встроенными средствами CakePHP.
Недавно на Bakery появился совет как сделать это с помощью Helper. Признаюсь, для одного из проектов я примерно так и делал. Но в комментариях написали, что для этого можно использовать стандарнтые средства. Если написать в контроллере
$this->Session->setFlash('my error message', 'default', array(), 'errorKey');
, то потом можно показать этот flash message во view с помощью
$session->flash('errorKey');
Но при этом надо ещё делать $session->check('errorKey'). Что-то сильно много кода получается в layout, если есть несколько типов сообщений. Лучше вынести это в Element.
app\views\elements\flash.ctp
<? $types
= array('error', 'success', 'flash'); foreach (
$types as $type) { if (
$session->check('Message.'.$type)) {
$session->flash($type); }
}
?>
Тогда можно в layout (например, app\views\layouts\default.ctp) писать
<?=$this->renderElement('flash')?>
, что намного приятнее.
Но $this->Session-setFlash и 2 лишних параметра тоже не сильно красиво, особенно, если таких вызовов несколько десятков на контроллер. Воспользуемся тем, что всё что есть в app\app_controller.php можно использовать во всех контроллерах и допишем туда
function flash($message, $class='flash') { return $this->Session->setFlash($message, 'default', array(), $class);
}
Теперь в любом контроллере можно писать
$this->flash('This is the test error message.', 'error');$this->flash('This is the test success message.', 'success');
$this->flash('This is the test message. Just message.');
Последним штрихом добавим красоты в CSS:
div.message {
border-top: 2px solid;
border-bottom: 2px solid;
text-align: center;
font-size: 12px;
font-weight: normal;
padding: 5px;
}
#errorMessage {
background-color: #ffcfcf;
border-color: #d37474;
color: #900;
}
#flashMessage {
background-color: #fff6bf;
border-color: #ffd324;
color: #993;
}
#successMessage {
background-color: #cfffcf;
border-color: #94d394;
color: #090;
}
Получаются вот такие красивые сообщения. По ним сразу можно судить, надо ли нервничать.
Кстати, у контроллера есть свой метод flash для отображения сообщения на отдельной странице (как на форумах «Вы будете автоматически переадресованы»). Я его не использую, но если он кому-то нужен, назовите функцию flash по-другому.