Разные Flash для ошибок, сообщений, подтверждений

В Cake есть удобное средство выдачи сообщений - Flash. Но меня всегда огорчало то, что нельзя передать тип Flash. Я выделяю для себя 3 типа: ошибки ("Не удалось добавить"), подтверждение ("Добавление завершено") и просто сообщения. Оказывается, можно это сделать встроенными средствами CakePHP.

Недавно на Bakery появился совет как сделать это с помощью Helper. Признаюсь, для одного из проектов я примерно так и делал. Но в комментариях написали, что для этого можно использовать стандарнтые средства. Если написать в контроллере

PHP:
  1. $this->Session->setFlash('my error message', 'default', array(), 'errorKey');

, то потом можно показать этот flash message во view с помощью

PHP:
  1. $session->flash('errorKey');

Но при этом надо ещё делать $session->check('errorKey'). Что-то сильно много кода получается в layout, если есть несколько типов сообщений. Лучше вынести это в Element

app\views\elements\flash.ctp

PHP:
  1. <?
  2.     $types = array('error', 'success', 'flash');
  3.  
  4.     foreach ($types as $type) {
  5.         if ($session->check('Message.'.$type)) {
  6.             $session->flash($type);
  7.         }
  8.     }
  9. ?>

Тогда можно в layout (например, app\views\layouts\default.ctp) писать

PHP:
  1. <?=$this->renderElement('flash')?>

, что намного приятнее.

Но $this->Session-setFlash и 2 лишних параметра тоже не сильно красиво, особенно, если таких вызовов несколько десятков на контроллер. Воспользуемся тем, что всё что есть в app\app_controller.php можно использовать во всех контроллерах и допишем туда

PHP:
  1. function flash($message, $class='flash') {
  2.     return $this->Session->setFlash($message, 'default', array(), $class);
  3. }

Теперь в любом контроллере можно писать

PHP:
  1. $this->flash('This is the test error message.', 'error');
  2. $this->flash('This is the test success message.', 'success');
  3. $this->flash('This is the test message. Just message.');

Последним штрихом добавим красоты в CSS:

CSS:
  1. div.message {
  2.     border-top: 2px solid;
  3.     border-bottom: 2px solid;
  4.     text-align: center;
  5.     font-size: 12px;
  6.     font-weight: normal;
  7.     padding: 5px;
  8. }
  9.  
  10. #errorMessage {
  11.     background-color: #ffcfcf;
  12.     border-color: #d37474;
  13.     color: #900;
  14. }
  15.  
  16. #flashMessage {
  17.     background-color: #fff6bf;
  18.     border-color: #ffd324;
  19.     color: #993;
  20. }
  21.  
  22. #successMessage {
  23.     background-color: #cfffcf;
  24.     border-color: #94d394;
  25.     color: #090;
  26. }

Получаются вот такие красивые сообщения. По ним сразу можно судить, надо ли нервничать.

image

UPD: У контроллера есть свой метод flash для отображения сообщения на отдельной странице (как на форумах "Вы будете автоматически переадресованы"). Я его не использую, но если он кому-то нужен, назовите функцию flash по-другому.


Понравилось?

  1. Подпишись через RSS
  2. Расскажи о http://php.southpark.com.ua друзьям.
    Все способы хороши: ICQ, E-mail, свой блог, комментарий в чужом блоге или сообщение на форуме
  3. Добавь статью на news2.ru, Хабрахабр или в закладки

Огромное спасибо!

И не стесняйтесь комментировать - у меня стоит плагин, который убирает rel="nofollow" у людей, которые написали больше 5 комментариев.

RSS feed | Trackback URI

6 комментариев »

Comment by Влад
2007-11-23 22:29:10

Как раз сегодня делал вручную "раскраску" флеша. Доделал, и нашёл хелпер :)) так всегда

 
Comment by Sam Subscribed to comments via email
2007-11-27 12:53:29

Как всегда полезная заметка.
p.s. если не трудно - можно добавить её на русскую bakery-wiki ;)

 
2007-12-02 21:12:55

Верно, добавьте пожалуйста на http://cake-php.ru/wiki/

 
2007-12-06 18:03:07

[...] раз уж есть возможность делать красивые flash-сообщения, то можно дальше оптимизировать код. Тут надо учесть 2 [...]

 
2007-12-09 23:13:21

[...] Сидел на днях перечитывал RSS-ки за пару недель, пытался вновь войти в программистский римт… уж сильно меня увлекло мое давнее увлечение - конструирование шокеров. :) Но об этом, я скорее всего, напишу позже. Так вот, сидел-перечитывал и наткнулся на статьи Владимира Лучанинова “Вернуться назад и сообщить о результате” и “Разные flash для ошибок, сообщений и подтверждений“. [...]

 
Comment by Afterglow
2008-02-26 01:12:08

Спасибо, очень полезно

 
Имя (required)
E-mail (required - never shown publicly)
URL
Текст комментария
You may use <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> in your comment.