DbHelp.ru
Маленький Yii блог
Комментарии
Гость: комент
Гость: wahaha
zolter: Друпал на Yii? ))
nastia: http://drupal.org/
JB: Да там просто ад)) мне всего 3 значения нужно чтобы выпадало, все равно спасибо)...



Сервер Ultima Online - Forest Wars (от создателя данного блога)

Как работать с флеш-сообщениями

Рубрика: Перевод Cookbook

Оцените эту статью:

Рейтинг: 0.00 (0)
16 Авг. 2010
Опубликовать в Twitter Написать в Facebook Опубликовать в своем блоге livejournal.com

Yii Framework Blog img http://dbhelp.ruflash Флеш-сообщения используются для того, что бы сохранить в сессии некий текст, и после отображения его пользователю - сразу удалить.

Понятие "флеш-сообщение" никак не связано с технологие 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; ?>

Дальше идет код формы регистрации...

Ссылки:



Если хотите опубликовать этот материал у себя - пожалуйста, разместите ссылку на страницу откуда вы его взяли.
Другие yii статьи:

  1. Буквально пару дней назад закончилась вторая Международная конференция "FOSS Sea" в Одессе. Как вы понимаете я являлся одним из ... "FOSS Sea 2009"

  2. Во всех приложениях большую часть внимания мы с вами (программисты) должны уделять именно безопасности. Мы с вами живем в ... "Перевод : Безопасность"

  3. Давайте сегодня разберем почему стоит выбрать 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 - нет. Если ошибаюсь - поправьте.

[adm] zolter

Было сказано: Вторник, 17 Август 2010

to Timlar
спасибо за прием!

[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

Зачем отображать форму если пользователь уже зарегестрировался.


В данном случае пример с проекта, в котором пользователи очень часто регистрируют для себя больше одной учетной записи. С точки зрения удобства форму проще не скрывать.

ATI

Было сказано: Среда, 01 Сентябрь 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 не пустой.

Оставить комментарий


Код:
Имя: