Работа с событиями в Yii2

Давным-давно была опубликована статья про события в Yii. В качестве практического дополнения к той статье на этот раз попробовали выполнить несколько примеров в прямом эфире.

Начали с событий в JavaScript, пощёлкали по кнопкам, потом перешли в PHP и изучили принципы объявления, навешивания обработчиков и запуска события в Yii2 Framework:

UPD: Интересное дополнение по логике применения

Один из следующих уроков посвятим поведениям в Yii2. Дату сообщу также в рассылке по вебинарам. Запишитесь, если ещё не с нами:

Если вдруг назрели интересные темы для следующих вебинаров, то можете предложить их в комментариях здесь или в первой статье. Спасибо за внимание!

Другие статьи

После добавления личного кабинета пользователя и редактора профиля в прошлых частях сегодня начнём делать модуль администратора. А именно, создадим модуль и CRUD для управления пользователями с помощью генератора Gii и доработаем его вид и маршрутизацию под свои требования.

Время идёт, уроки становятся круче. Провели очередной вебинар по мотивам статьи о поведениях. В перерыве поговорили о жизни, о программировании, о блогах. А какая тема дальше? Поразмышлял об этом в эфире. В любом случае сразу вам сообщю в рассылке по вебинарам.

При подготовке вебинара о событиях вспомнил, что в Yii2, в отличие от первой версии, события и поведения на компоненты приложения можно навесить через конфигурационный файл виртуальными свойствами. И я уже давно хотел рассказать о геттерах и сеттерах.

Поговорили о том, что же такое фреймворк, из чего он состоит, что за зверь этот Web-MVC и как он облегчает жизнь. Это нам как раз пригодится при изучении остальных тем. А ещё немного порассуждали о других фреймворках в блоке ответов на вопросы.

Комментарии

 

minority

1) Шаблоны проектирования и как они работают в yii2
2) RBAC;
3) Cache;
4) Фронтенд (фишки с работой с гридами, вьюшками итд).

Ответить

 

Сергей Распутний

Блин жаль у меня вчера не получилось поучаствовать, буду теперь смотреть онлайн.

Ответить

 

Евгений

Как изменилась работа с AJAX в Yii2. То что было просто и понятно в Yii 1.1, теперь совершенно непонятно - не смог сделать добавление комментария к посту через ajax (без перезагрузки страницы, с выводом сообщения об успехе или ошибке и очищением всех заполненных полей комментария). И при этом, чтобы продолжала работать валидация на клиенте. Думаю, кроме этого частного случая, было бы интересно узнать о новшествах применения ajax в Yii2 вообще.

Ответить

 

Neuromance

Реализацию комментариев посмотрите у vova07 в его yii2-start - https://github.com/vova07/yii2-start
Там у него и сам модуль комментариев интересно реализован и как грамотно писать js-обработчики для таких случаев можно подсмотреть :)

А вообще я с вами согласен, в yii2 работа с ajax стала менее доступна и понятна.. Меня наверное на смех поднимут, но я довольно часто использую такой костылик, когда мне вызвать модальное окошко, особенно если оно состоит из нескольких шагов. Рисую pjax-контейнер.с модальным окошком, содержимое которого меняется в зависимости от тех или иных условий. На кнопку вешаю событие

$(document).on('click', 'a[data-pjax]', function(event) {
  $.pjax.reload(...);
}) 

И дальше пишу скриптик

$('#pjax-container-id').on('pjax:end', function() {}
  $('#modal-id').modal();
});

Кстати, интересно будет узнать мнение Дмитрия и других программистов о таком подходе. Насколько правильно/не правильно так делать.

Ответить

 

Евгений

У vova07 уже смотрел, у него многоуровневые комментарии, сделаны как виджет, а мне нужен самый простой вариант комментариев и я хотел его реализовать простыми средствами, заложенными в фреймворк. Собственную реализацию сделать можно, но предполагалось (мной), что многие вещи уже есть в фреймворке, надо только знать, как ими пользоваться. Собственно, это было предложение для будущего урока Дмитрию.

Ответить

 

Борис

Это 5 + ! Очень интересно смотреть когда все по полочкам рассказывают. Все понятно стало до чего давно руки не доходили, надеюсь будете продолжать это доброе дело, обучать нас Yii ! )

Ответить

 

Дмитрий Елисеев

Спасибо! Записи в блоге выкладываю на следующий день. Можете подписаться на вебинары, если хотите поучаствовать прямо в эфире.

Ответить

 

Борис

А как на них подписаться?

Ответить

 

Дмитрий Елисеев

Вверху под видео есть форма.

Ответить

 

Uterm

Дмитрий, не сочтите за наглость, но у меня есть предложение. Не хотите ли вы выпускать краткую версию вебинара? Только нужный материал, ничего лишнего: без прямого эфира, без лишних слов и разговоров, по заготовленному тексту, без пауз на подумать, и т.д. Ведь отличный материал, слайды уже есть. Как пример могу привести http://sorax.org, только там по js.

Понимаю, что это трудоемкий процесс, но может быть задумывались над этим?

Ответить

 

Дмитрий Елисеев

Если возьмёте монтаж видео на себя, то можно попробовать. Это всего лишь по два рабочих дня в неделю.

Ответить

 

Евгений

Очень интересно рассказываете. Кое где затянуто, но в целом интересно. Жду вебинара про поведения :)

Ответить

 

Эдуард

автор забил походу на них) так всегда. Сначала начинают а потом перестают, либо платные продукты выпускают. И там тоже самое, сначала хорошие, потом просто ради денег штампуют.
Лень человека можно побороть только деньгами))

Ответить

 

Дмитрий Елисеев

Да, беда. Наверное автор сейчас на работе работает, деньги зарабатывает.

Найдите какого-нибудь автора, оплатите ему мега-курс за 200 тысяч и раздайте бесплатно. Делов то...

Ответить

 

Евгений

После поведений хотелось бы вообще узнать про исключения. ведь в gii есть создание исключений. что, куда и откуда :)

Ответить

 

Сергей Нагайцев

Большое спасибо за урок. Очень доступно и развернуто)

Ответить

 

Виталик

Дмитрий, спасибо большое за твой труд. Хорошо структурировано, с примерами и, что по мне, главное, - логическим подведением к теме. Для меня очень важно всегда понимать, что откуда берется и во что перерастает. Удачи тебе и интересных проектов!

Ответить

 

Дмитрий Елисеев

Дополнил статью ссылкой на хорошее размышление на тему событий форуме.

Ответить

 

Andrewkha

Дмитрий, здравствуйте!

По следам вебинара. Пытаюсь навесить обработчик на событие beforeLogin в модели LoginForm

Вот такой код

public function login()
    {
        if ($this->validate()) {
            $user = $this->getUser($this->username);

            //$user->last_login = time();
            //$user->save();

            $user->on(\yii\web\User::EVENT_BEFORE_LOGIN, function($event){
                echo 5; exit;
            });

            return Yii::$app->user->login($user, $this->rememberMe ? 3600*24*7 : 0);
        } else {
            return false;
        }
    }

в итоге при логине событие не обрабатывается. Пытался делать не анонимной функцией, а отдельной, причем умышленно поставил имя функции, которой в классе нет. Даже ошибки никакой не появилось, т.е. есть ощущение, что обработчик просто не "навесился"

Ответить

 

Дмитрий Елисеев

Вы привязываете к модели $user, а событие находится в компоненте Yii::$app->user.

Ответить

 

Andrewkha

а, т.е. вот так нужно Yii::$app->user->on и тп. Спасибо!

Еще один вопрос про поведения, если позволите.

Использую стандартный Blameable, по умолчанию он обновляет поля created_on и updated_on.
Также в таблице есть поле last_login. Из пример выше хотел не руками присваивать занчение через свойство, а сделать через поведение.

В обработчике события afterLogin делаю так

$event->identity->updatedAtAttribute = 'last_update'

Однако, при сохранении модели текущий timestamp все равно пишется в updated_at.

Вывожу модель на печать, и вижу, что поменялось значение только самого атрибута, а в beforeInsert и beforeUpdate стоит все то же значение 'updated_at'. Где ошибка?

    [_behaviors:yii\base\Component:private] => Array
        (
            [TimestampBehavior] => yii\behaviors\TimestampBehavior Object
                (
                    [createdAtAttribute] => created_on
                    [updatedAtAttribute] => last_login
                    [value] => 
                    [attributes] => Array
                        (
                            [beforeInsert] => Array
                                (
                                    [0] => created_on
                                    [1] => updated_on
                                )

                            [beforeUpdate] => updated_on
Ответить

 

Дмитрий Елисеев

Если указаны attributes, то используются они. Если не указаны, то используются createdAtAttribute и updatedAtAttribute.

Ответить

 

Andrewkha

Т.е. как правильно нужно написать в этом случае?

Ответить

 

Дмитрий Елисеев
$event->identity->updateAttributes(['last_update' => time()]);
Ответить

 

Andrewkha

не,это понятно, я сначала так и сделал. А если через поведение? Как правильно в поведении поменять атрибут, который должен обновиться? Т.е. всегда при обновлении модели у меня будет меняться поле updated_on, а в случае afterLogin - last_login

Интересуюсь чисто с образовательной точки зрения.

Ответить

 

Дмитрий Елисеев

> Как правильно в поведении поменять атрибут, который должен обновиться?

Обычно в поведениях ничего не меняют.

Ответить

 

Andrewkha

Т.е. динамически конфигурацию поменять нельзя?

Ответить

 

Дмитрий Елисеев

Можно, только обычно незачем. А если всё же хочется, то меняйте сам массив attributes.

Ответить

 

Andrewkha

Спасибо!

Ответить

 

Сергей

Привет) Посмотрел ваше видео, сам покопался в коде и у меня возник вопрос, почему нельзя использовать паттерн обсервер в чистом виде? Чем он не подходит и какие преимущества дает такой подход?

Ответить

 

Дмитрий Елисеев

Это и есть Observer, уже сделанный во фреймворке.

Ответить

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

Войти | Завести аккаунт


(никто не увидит)



Можно использовать теги <p> <ul> <li> <b> <i> <a> <pre>