Home PageКаталог Изменения НовыеКомментарии Пользователи Регистрация
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 по-другому.


 
Комментарии

[code]
function mess($message, $class = 'flash') {

return $this->Session->setFlash($message, 'default', array('class' => $class));

}
[/code]


а вызов просто как 


[code]
$session->flash()
[/code]


и безо всяких проверок

dsl-85-172-118-67.avtlg.ru (2009-02-07 18:31:35)
можно сделать на ajax, но так надежней
MehanickusSystem? (2009-11-16 05:25:02)
Добавить комментарий:

Один файл. [Показать файлы/форму]