Работа с событиями в Yii2
Давным-давно была опубликована статья про события в Yii. В качестве практического дополнения к той статье на этот раз попробовали выполнить несколько примеров в прямом эфире.
Начали с событий в JavaScript, пощёлкали по кнопкам, потом перешли в PHP и изучили принципы объявления, навешивания обработчиков и запуска события в Yii2 Framework:
UPD: Интересное дополнение по логике применения
Один из следующих уроков посвятим поведениям в Yii2. Дату сообщу также в рассылке по вебинарам. Запишитесь, если ещё не с нами:
Если вдруг назрели интересные темы для следующих вебинаров, то можете предложить их в комментариях здесь или в первой статье. Спасибо за внимание!
1) Шаблоны проектирования и как они работают в yii2
2) RBAC;
3) Cache;
4) Фронтенд (фишки с работой с гридами, вьюшками итд).
Блин жаль у меня вчера не получилось поучаствовать, буду теперь смотреть онлайн.
Как изменилась работа с AJAX в Yii2. То что было просто и понятно в Yii 1.1, теперь совершенно непонятно - не смог сделать добавление комментария к посту через ajax (без перезагрузки страницы, с выводом сообщения об успехе или ошибке и очищением всех заполненных полей комментария). И при этом, чтобы продолжала работать валидация на клиенте. Думаю, кроме этого частного случая, было бы интересно узнать о новшествах применения ajax в Yii2 вообще.
Реализацию комментариев посмотрите у vova07 в его yii2-start - https://github.com/vova07/yii2-start
Там у него и сам модуль комментариев интересно реализован и как грамотно писать js-обработчики для таких случаев можно подсмотреть :)
А вообще я с вами согласен, в yii2 работа с ajax стала менее доступна и понятна.. Меня наверное на смех поднимут, но я довольно часто использую такой костылик, когда мне вызвать модальное окошко, особенно если оно состоит из нескольких шагов. Рисую pjax-контейнер.с модальным окошком, содержимое которого меняется в зависимости от тех или иных условий. На кнопку вешаю событие
И дальше пишу скриптик
Кстати, интересно будет узнать мнение Дмитрия и других программистов о таком подходе. Насколько правильно/не правильно так делать.
У vova07 уже смотрел, у него многоуровневые комментарии, сделаны как виджет, а мне нужен самый простой вариант комментариев и я хотел его реализовать простыми средствами, заложенными в фреймворк. Собственную реализацию сделать можно, но предполагалось (мной), что многие вещи уже есть в фреймворке, надо только знать, как ими пользоваться. Собственно, это было предложение для будущего урока Дмитрию.
Это 5 + ! Очень интересно смотреть когда все по полочкам рассказывают. Все понятно стало до чего давно руки не доходили, надеюсь будете продолжать это доброе дело, обучать нас Yii ! )
Спасибо! Записи в блоге выкладываю на следующий день. Можете подписаться на вебинары, если хотите поучаствовать прямо в эфире.
А как на них подписаться?
Вверху под видео есть форма.
Дмитрий, не сочтите за наглость, но у меня есть предложение. Не хотите ли вы выпускать краткую версию вебинара? Только нужный материал, ничего лишнего: без прямого эфира, без лишних слов и разговоров, по заготовленному тексту, без пауз на подумать, и т.д. Ведь отличный материал, слайды уже есть. Как пример могу привести http://sorax.org, только там по js.
Понимаю, что это трудоемкий процесс, но может быть задумывались над этим?
Если возьмёте монтаж видео на себя, то можно попробовать. Это всего лишь по два рабочих дня в неделю.
Очень интересно рассказываете. Кое где затянуто, но в целом интересно. Жду вебинара про поведения :)
автор забил походу на них) так всегда. Сначала начинают а потом перестают, либо платные продукты выпускают. И там тоже самое, сначала хорошие, потом просто ради денег штампуют.
Лень человека можно побороть только деньгами))
Да, беда. Наверное автор сейчас на работе работает, деньги зарабатывает.
Найдите какого-нибудь автора, оплатите ему мега-курс за 200 тысяч и раздайте бесплатно. Делов то...
После поведений хотелось бы вообще узнать про исключения. ведь в gii есть создание исключений. что, куда и откуда :)
Большое спасибо за урок. Очень доступно и развернуто)
Дмитрий, спасибо большое за твой труд. Хорошо структурировано, с примерами и, что по мне, главное, - логическим подведением к теме. Для меня очень важно всегда понимать, что откуда берется и во что перерастает. Удачи тебе и интересных проектов!
Дополнил статью ссылкой на хорошее размышление на тему событий форуме.
Дмитрий, здравствуйте!
По следам вебинара. Пытаюсь навесить обработчик на событие beforeLogin в модели LoginForm
Вот такой код
в итоге при логине событие не обрабатывается. Пытался делать не анонимной функцией, а отдельной, причем умышленно поставил имя функции, которой в классе нет. Даже ошибки никакой не появилось, т.е. есть ощущение, что обработчик просто не "навесился"
Вы привязываете к модели $user, а событие находится в компоненте Yii::$app->user.
а, т.е. вот так нужно Yii::$app->user->on и тп. Спасибо!
Еще один вопрос про поведения, если позволите.
Использую стандартный Blameable, по умолчанию он обновляет поля created_on и updated_on.
Также в таблице есть поле last_login. Из пример выше хотел не руками присваивать занчение через свойство, а сделать через поведение.
В обработчике события afterLogin делаю так
Однако, при сохранении модели текущий timestamp все равно пишется в updated_at.
Вывожу модель на печать, и вижу, что поменялось значение только самого атрибута, а в beforeInsert и beforeUpdate стоит все то же значение 'updated_at'. Где ошибка?
Если указаны attributes, то используются они. Если не указаны, то используются createdAtAttribute и updatedAtAttribute.
Т.е. как правильно нужно написать в этом случае?
не,это понятно, я сначала так и сделал. А если через поведение? Как правильно в поведении поменять атрибут, который должен обновиться? Т.е. всегда при обновлении модели у меня будет меняться поле updated_on, а в случае afterLogin - last_login
Интересуюсь чисто с образовательной точки зрения.
> Как правильно в поведении поменять атрибут, который должен обновиться?
Обычно в поведениях ничего не меняют.
Т.е. динамически конфигурацию поменять нельзя?
Можно, только обычно незачем. А если всё же хочется, то меняйте сам массив attributes.
Спасибо!
Привет) Посмотрел ваше видео, сам покопался в коде и у меня возник вопрос, почему нельзя использовать паттерн обсервер в чистом виде? Чем он не подходит и какие преимущества дает такой подход?
Это и есть Observer, уже сделанный во фреймворке.