Как работать с флеш-сообщениями
Рубрика: Перевод Cookbook
16 Авг. 2010
Флеш-сообщения используются для того, что бы сохранить в сессии некий текст, и после отображения его пользователю - сразу удалить.
Понятие "флеш-сообщение" никак не связано с технологие Flash от Adobe
---Таким образом флеш-сообщения доступны только в текущем и следующем запросе. Флеш-сообщения могут быть установлены при помощи метода setFlash() класса CWebUser.
Например, вы хотите сообщить пользователю что "его пароль успешно изменен", для в нужном экшинсе контроллера добавляем следующий код:
Yii::app()->user->setFlash('success',"Пароль изменен");
Таким образом мы сохраняем в сессии переменную "success" со значением "Пароль изменен". Если вы хотите использовать больше чем одно флеш-сообщение - просто используйте уникальные значения "имени".
Теперь в файле отображения (там же где находится наша форма изменения пароля, к примеру) добавляем код проверки на наличие флеш-сообщения и его отображения:
<?php if(Yii::app()->user->hasFlash('success')):
echo Yii::app()->user->getFlash('success');
endif; ?>
Для проверки существования сообщения мы использовали метод hasFlash(), для получения текста сообщения - getFlash();
Таким образом после того как флеш-сообщение было созданно в контроллере - оно будет показано в отображении.
Теперь добавим немного "красоты". Обернем наше сообщение в класс "info" что бы использовать эффект плавного затухания. Получим:
<?php if(Yii::app()->user->hasFlash('success')):?>
<div class="info">
<?php echo Yii::app()->user->getFlash('success'); ?>
</div>
<?php endif; ?>
В экшинсе после создания флеш сообщения, добавим следующий код:
Yii::app()->clientScript->registerScript(
'myHideEffect',
'$(".info").animate({opacity: 1.0}, 3000).fadeOut("slow");',
CClientScript::POS_READY
);
По этому примеру вы можете использовать и другие возможности jQuery или javascript для обработки сообщения.
Реальный пример использования
Контроллер:
<?php
public function actionReg() {
$model = new User('reg');
if (!empty($_POST['User'])) {
// получили данные с формы
$model->attributes = $_POST['User'];
if ($model->validate()) {
$message = "Спасибо за регистрацию!";
$this->sendHtmlMail(...);
$model->insert();
// данные в базу добавлены, можна и флеш-сообщение показать:
Yii::app()->clientScript->registerScript(
'myHideEffect',
'$(".flash-success").animate({opacity: 1.0}, 5000).fadeOut("slow");',
CClientScript::POS_READY
);
Yii::app()->user->setFlash('success',"На указанный email было отправленно письмо для подтверждения регистрации!");
} else {
// просто выводим форму
}
}
$this->render('reg', array('model' => $model));
}
Отображение (view/controller/reg):
<h1>Регистрация</h1>
<?php if(Yii::app()->user->hasFlash('success')):?>
<div class="flash-success">
<?php echo Yii::app()->user->getFlash('success'); ?>
</div>
<?php endif; ?>
Дальше идет код формы регистрации...
Ссылки:
Если хотите опубликовать этот материал у себя - пожалуйста, разместите ссылку на страницу откуда вы его взяли.
- Буквально пару дней назад закончилась вторая Международная конференция "FOSS Sea" в Одессе. Как вы понимаете я являлся одним из ... "FOSS Sea 2009"
- Во всех приложениях большую часть внимания мы с вами (программисты) должны уделять именно безопасности. Мы с вами живем в ... "Перевод : Безопасность"
- Давайте сегодня разберем почему стоит выбрать Yii Framework и какими плюсами он обладает.
next
Если вы незнакомы со старыми статьями этого ... "Шаг 2: Почему стоит выбрать Yii?"

[adm] zolter
Было сказано: Понедельник, 16 Август 2010
Маленький перевод того с чем сейчас часто работаю

[guest] МОТОРИСТ
Было сказано: Понедельник, 16 Август 2010
Вопросик: А разве в момент $model->insert() не происходит валидация? Тогда зачем if ($model->validate())?
P.S. Хорошая статья, давно интересовался данным вопросом.

[guest] Timlar
Было сказано: Понедельник, 16 Август 2010
hasFlash() использовать не обязательно. Если сообщение не было установлено, то просто ничего не выведется на экран. Еще как вариант, чтобы не писать постоянно обрамляющий див, можно переопределить метод setFlash() в компоненте WebUser:
public function setFlash($key, $value, $defaultValue=NULL) {
$value = ($value) ? '<div class="success">'.$value.'</div>' : NULL;
return parent::setFlash($key, $value, $defaultValue=NULL);
}
В таком случае див будет подставляться автоматически :)

[adm] zolter
Было сказано: Вторник, 17 Август 2010
to МОТОРИСТ
если не ошибаюсь валидация происходит при $model->save(). А при явных указаниях ->insert или ->update - нет. Если ошибаюсь - поправьте.

[guest] RSol
Было сказано: Вторник, 17 Август 2010
to Timlar
hasFlash() приятно использовать чтобы выводить или не выводить форму, я делаю так:
<h1>Регистрация</h1>
<?php if(Yii::app()->user->hasFlash('success')):?>
<div class="flash-success">
<?php echo Yii::app()->user->getFlash('success'); ?>
</div>
<?php else: ?>
Дальше идет код формы регистрации...
<?php endif; ?>
Зачем отображать форму если пользователь уже зарегестрировался.
А вообще, я последнее время в лайоуте делаю несколько renderPartial для сообщений типа success, notify, error и т.п., чтобы не прописывать это каждый раз во вьювах.

[guest] zolter
Было сказано: Вторник, 17 Август 2010
Зачем отображать форму если пользователь уже зарегестрировался.В данном случае пример с проекта, в котором пользователи очень часто регистрируют для себя больше одной учетной записи. С точки зрения удобства форму проще не скрывать.

[guest] elbek
Было сказано: Среда, 15 Сентябрь 2010
Vopros! pochemu posle soxraneniya (
$model->insert()) $this->redirect() netu? Ato $_POST soxranyayet i browser yesho mojet peredat sam kogda polzovatel najimaet reload!Yiit::app()->clientScript->registerScript() ne rabotaet psole reloada

[guest] elbek
Было сказано: Среда, 15 Сентябрь 2010
izvinite ne
$this->redirect() a $this->refresh();

[guest] zolter
Было сказано: Среда, 15 Сентябрь 2010
В данном случае это просто как пример работать с флеш сообщениями. Если вы сделаете флеш ил редирект - пользователь их просто не успеет увидеть.
Что бы небыло таких проблем вы можете просто скрывать свою форму если $_POST не пустой.


