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

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

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

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

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

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

Комментарии

 

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 уже смотрел, у него многоуровневые комментарии, сделаны как виджет, а мне нужен самый простой вариант комментариев и я хотел его реализовать простыми средствами, заложенными в фреймворк. Собственную реализацию сделать можно, но предполагалось (мной), что многие вещи уже есть в фреймворке, надо только знать, как ими пользоваться. Собственно, это было предложение для будущего урока Дмитрию.

 

Борис – radiator-termal.ru

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

 

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

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

 

Борис

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

 

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

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

 

Uterm

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

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

 

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

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

 

Евгений

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

 

Эдуард – desroom.ru

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

 

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

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

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

 

Евгений

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

 

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

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

 

Виталик – www.menshakov.com

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

 

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

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

 

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.

 

Сергей

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

 

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

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

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

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


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





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