CakePHP: Articles/Tutorials/DifferentFlash

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

Автор Владимир Лучанинов

В 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 сообщения на сайте (6 Кб)

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