События в yii2

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
yiiliveext
Сообщения: 498
Зарегистрирован: 2019.08.13, 01:49

Re: События в yii2

Сообщение yiiliveext » 2019.08.14, 09:10

ElisDN писал(а):
2019.08.14, 00:31
Потому что $ev->save() тоже генерирует событие и скрипт зацикливается.

Вставляйте через Yii::$app->db->createCommand()->insert('events', ['title' => ...])->execute().
Можно просто добавить в модель Event пустой afterSave

Код: Выделить всё

public function afterSave($insert, $changedAttributes)
{        
}

yiiliveext
Сообщения: 498
Зарегистрирован: 2019.08.13, 01:49

Re: События в yii2

Сообщение yiiliveext » 2019.08.14, 09:12

svil писал(а):
2019.08.14, 09:09
В модел event дату настроить? Потому что при save() дату добавляло текущую через TimestampBehavior::className()
Либо сделайте вариант с пустым afterSave, ли бо по методу Дмитрия вставляйте явно через time()

Аватара пользователя
svil
Сообщения: 560
Зарегистрирован: 2018.02.12, 22:41

Re: События в yii2

Сообщение svil » 2019.08.14, 09:33

Ошибка

Код: Выделить всё

Failed to instantiate component or class "created_at".
↵
Caused by: ReflectionException
Class created_at does not exist
В модели Event

Код: Выделить всё

 public function behaviors()
    {
        return [
            TimestampBehavior::className(),
            'createdAtAttribute' => 'created_at',
            'updatedAtAttribute' => 'updated_at',
            'value' => new Expression('NOW()'),
        ];
    }

yiiliveext
Сообщения: 498
Зарегистрирован: 2019.08.13, 01:49

Re: События в yii2

Сообщение yiiliveext » 2019.08.14, 10:30

Код: Выделить всё

 public function behaviors()
    {
        return [
            'class' => TimestampBehavior::class,
            'createdAtAttribute' => 'created_at',
            'updatedAtAttribute' => 'updated_at',
            'value' => new Expression('NOW()'),
        ];
    }

Аватара пользователя
svil
Сообщения: 560
Зарегистрирован: 2018.02.12, 22:41

Re: События в yii2

Сообщение svil » 2019.08.14, 14:28

дату текущую не видит

yiiliveext
Сообщения: 498
Зарегистрирован: 2019.08.13, 01:49

Re: События в yii2

Сообщение yiiliveext » 2019.08.14, 14:39

svil писал(а):
2019.08.14, 14:28
дату текущую не видит
В каком формате у вас поля created_at, updated_at?

Аватара пользователя
svil
Сообщения: 560
Зарегистрирован: 2018.02.12, 22:41

Re: События в yii2

Сообщение svil » 2019.08.14, 17:02

В Базу должны записываться как int

yiiliveext
Сообщения: 498
Зарегистрирован: 2019.08.13, 01:49

Re: События в yii2

Сообщение yiiliveext » 2019.08.14, 17:12

svil писал(а):
2019.08.14, 17:02
В Базу должны записываться как int
Тогда так:

Код: Выделить всё

public function behaviors()
    {
        return [
           TimestampBehavior::class
        ];
    }

Аватара пользователя
svil
Сообщения: 560
Зарегистрирован: 2018.02.12, 22:41

Re: События в yii2

Сообщение svil » 2019.08.14, 17:17

Ошибка

Код: Выделить всё

Database Exception – yii\db\Exception
SQLSTATE[HY000]: General error: 1364 Field 'created_at' doesn't have a default value
The SQL being executed was: INSERT INTO `event` (`title`) VALUES ('тестирую событие')
Error Info: Array
(
    [0] => HY000
    [1] => 1364
    [2] => Field 'created_at' doesn't have a default value
)
Модель Event

Код: Выделить всё

<?php

namespace app\models;

use Yii;
use yii\behaviors\TimestampBehavior;
use yii\db\Expression;
use yii\db\ActiveRecord;

/**
 * This is the model class for table "event".
 *
 * @property int $id
 * @property string $title
 */
class Event extends \yii\db\ActiveRecord
{
    public function behaviors()
    {
        return [
            TimestampBehavior::class
        ];
    }




    /**
     * {@inheritdoc}
     */
    public static function tableName()
    {
        return 'event';
    }

    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
         //   [['created_at', 'updated_at'], 'required'],
            [['created_at', 'updated_at'], 'integer'],
            [['created_at', 'updated_at'], 'safe'],

            // [['title'], 'required'],
            [['title'], 'string', 'max' => 250],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'title' => 'Title',
        ];
    }
    public function afterSave($insert, $changedAttributes)
    {
    }
}

Аватара пользователя
svil
Сообщения: 560
Зарегистрирован: 2018.02.12, 22:41

Re: События в yii2

Сообщение svil » 2019.08.14, 17:18

Если поставлю Null по умолчанию для 'created_at', 'updated_at' - туда null и запишется

Аватара пользователя
svil
Сообщения: 560
Зарегистрирован: 2018.02.12, 22:41

Re: События в yii2

Сообщение svil » 2019.08.14, 17:39

Так сделала
Yii::$app->db->createCommand()->insert('event', ['title' => "тестирую событие", 'created_at' => time()])->execute();

yiiliveext
Сообщения: 498
Зарегистрирован: 2019.08.13, 01:49

Re: События в yii2

Сообщение yiiliveext » 2019.08.14, 17:53

svil писал(а):
2019.08.14, 17:17
Ошибка

Код: Выделить всё

Database Exception – yii\db\Exception
SQLSTATE[HY000]: General error: 1364 Field 'created_at' doesn't have a default value
The SQL being executed was: INSERT INTO `event` (`title`) VALUES ('тестирую событие')
Error Info: Array
(
    [0] => HY000
    [1] => 1364
    [2] => Field 'created_at' doesn't have a default value
)
Скопировал вашу модель, создал таблицу и не смог воспроизвести ошибку, значения created_at и updated_at записываются корректно.

Аватара пользователя
svil
Сообщения: 560
Зарегистрирован: 2018.02.12, 22:41

Re: События в yii2

Сообщение svil » 2019.08.14, 18:36

https://github.com/svil1502/yii2_bz_events

Меня сейчас больше всего беспокоит как отразить поля любой таблицы которая записывается в Event

Аватара пользователя
svil
Сообщения: 560
Зарегистрирован: 2018.02.12, 22:41

Re: События в yii2

Сообщение svil » 2019.08.14, 18:41

Добавила с 2 таблиц записи и в Event они пояились , но я не могу указать какие поля добавились
http://ilin.itcrk.ru/yii2_bz_events/web/event/index

Аватара пользователя
svil
Сообщения: 560
Зарегистрирован: 2018.02.12, 22:41

Re: События в yii2

Сообщение svil » 2019.08.14, 18:56

Код: Выделить всё

 Yii::$app->db->createCommand()->insert('event', ['title' =>  $event->sender->name . ' добавлен', 'created_at' => time()])->execute();

Аватара пользователя
svil
Сообщения: 560
Зарегистрирован: 2018.02.12, 22:41

Re: События в yii2

Сообщение svil » 2019.08.14, 18:57

Получается делать ветвление , чтобы распознать какая таблица участвует и в зависимсоти от этого добавлять поля в Event

yiiliveext
Сообщения: 498
Зарегистрирован: 2019.08.13, 01:49

Re: События в yii2

Сообщение yiiliveext » 2019.08.14, 18:58

svil писал(а):
2019.08.14, 18:41
Добавила с 2 таблиц записи и в Event они пояились , но я не могу указать какие поля добавились
http://ilin.itcrk.ru/yii2_bz_events/web/event/index
Обычно требуется указывать какие поля изменились.

yiiliveext
Сообщения: 498
Зарегистрирован: 2019.08.13, 01:49

Re: События в yii2

Сообщение yiiliveext » 2019.08.14, 19:07

Как-то так:

Код: Выделить всё

        Event::on(
            \yii\db\ActiveRecord::class,
            \yii\db\ActiveRecord::EVENT_AFTER_INSERT,
            function ($event) {
                    $ev = new \common\models\Event();
                    $ev->title = get_class($event->sender);
                    $ev->event_type = 'insert';
                    $ev->model_id = $event->sender->id;
                    $ev->save();
            }
        );

        Event::on(
            \yii\db\ActiveRecord::class,
            \yii\db\ActiveRecord::EVENT_AFTER_UPDATE,
            function ($event) {
                $ev = new \common\models\Event();
                $ev->title = get_class($event->sender);
                $ev->event_type = 'update';
                $ev->model_id = $event->sender->id;
                $ev->changed_attributes = json_encode($event->changedAttributes, JSON_UNESCAPED_UNICODE);
                $ev->save();
            }
        );

Аватара пользователя
svil
Сообщения: 560
Зарегистрирован: 2018.02.12, 22:41

Re: События в yii2

Сообщение svil » 2019.08.14, 19:15

В каждую модель добавляю

Код: Выделить всё

public $mess;
...
 public function attr()
    {
        $mess = $this->name.$this->id.$this->id ; //здесь поля разные могут быть
        return $mess;
    }
И потом только этот $mess и беру:

Код: Выделить всё

        Yii::$app->db->createCommand()->insert('event', ['title' =>  $event->sender->attr() . ' изменен', 'created_at' => time(),  'updated_at' => time()])->execute();

Аватара пользователя
svil
Сообщения: 560
Зарегистрирован: 2018.02.12, 22:41

Re: События в yii2

Сообщение svil » 2019.08.14, 23:37

ElisDN, спасибо.

Ответить