Разные Flash для ошибок, сообщений, подтверждений
В Cake есть удобное средство выдачи сообщений - Flash. Но меня всегда огорчало то, что нельзя передать тип Flash. Я выделяю для себя 3 типа: ошибки ("Не удалось добавить"), подтверждение ("Добавление завершено") и просто сообщения. Оказывается, можно это сделать встроенными средствами CakePHP.
Недавно на Bakery появился совет как сделать это с помощью Helper. Признаюсь, для одного из проектов я примерно так и делал. Но в комментариях написали, что для этого можно использовать стандарнтые средства. Если написать в контроллере
, то потом можно показать этот flash message во view с помощью
-
$session->flash('errorKey');
Но при этом надо ещё делать $session->check('errorKey'). Что-то сильно много кода получается в layout, если есть несколько типов сообщений. Лучше вынести это в Element
app\views\elements\flash.ctp
-
<?
-
-
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') {
-
}
Теперь в любом контроллере можно писать
-
$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;
-
}
Получаются вот такие красивые сообщения. По ним сразу можно судить, надо ли нервничать.

UPD: У контроллера есть свой метод flash для отображения сообщения на отдельной странице (как на форумах "Вы будете автоматически переадресованы"). Я его не использую, но если он кому-то нужен, назовите функцию flash по-другому.
Как раз сегодня делал вручную "раскраску" флеша. Доделал, и нашёл хелпер :)) так всегда
Как всегда полезная заметка.
p.s. если не трудно - можно добавить её на русскую bakery-wiki
Верно, добавьте пожалуйста на http://cake-php.ru/wiki/
[...] раз уж есть возможность делать красивые flash-сообщения, то можно дальше оптимизировать код. Тут надо учесть 2 [...]
[...] Сидел на днях перечитывал RSS-ки за пару недель, пытался вновь войти в программистский римт… уж сильно меня увлекло мое давнее увлечение - конструирование шокеров.
Но об этом, я скорее всего, напишу позже. Так вот, сидел-перечитывал и наткнулся на статьи Владимира Лучанинова “Вернуться назад и сообщить о результате” и “Разные flash для ошибок, сообщений и подтверждений“. [...]
Спасибо, очень полезно