как реализовать журнал действий
как реализовать журнал действий
Как реализовать в yii2 запись действий пользоателей, то есть зашел пользователь Иванов в свой кабинет, создал запись, в журнале запись создается c датой и временем. И так по всем контроллерам и видам с привязкой к пользователю. Отслеживаются действия пользователя и заносятся в журнал.
Re: как реализовать журнал действий
Отлавливаем событие EVENT_BEFORE_ACTION у приложения и ведем нужные логи
Re: как реализовать журнал действий
Eсть таблица Events для записи событий(id, company_id, content, timecreate )
Есть таблица Companies для организаций (id, name)
Есть таблица users (id, name, ...)
User добавил запись в таблицу companies и в таблице events должна быть записана запись об этом.
И как это все в events таблицу записать?
Есть таблица Companies для организаций (id, name)
Есть таблица users (id, name, ...)
User добавил запись в таблицу companies и в таблице events должна быть записана запись об этом.
И как это все в events таблицу записать?
Последний раз редактировалось svil 2019.06.27, 16:52, всего редактировалось 2 раза.
Re: как реализовать журнал действий
События состоят из следующего цикла.
1 Определяю событие: регистрация действий пользователя(таблица users).
2 Добавление константы в модель User. Например, const EVENT_ACT_USER='act_user'; Это используется для добавления обработчиков и для запуска события.
3 Определяю метод(обработчик), который должен что-то делать, когда происходит событие. В моем случае, запись в БД events. У него должен быть параметр $event.
4 Присоединяю этот обработчик к model используя метод on(). Можно прикрепить более одного обработчика к одному событию.
5 Инициирую событие, используя trigger().
Обработчик и метод on являются частью класса Component.
Как в БД записать в таблицу events в поле content строку "Добавление Организации - companies.name- id пользователя-имя пользователя"?
Модель User
В контроллере CompaniesController
1 Определяю событие: регистрация действий пользователя(таблица users).
2 Добавление константы в модель User. Например, const EVENT_ACT_USER='act_user'; Это используется для добавления обработчиков и для запуска события.
3 Определяю метод(обработчик), который должен что-то делать, когда происходит событие. В моем случае, запись в БД events. У него должен быть параметр $event.
4 Присоединяю этот обработчик к model используя метод on(). Можно прикрепить более одного обработчика к одному событию.
5 Инициирую событие, используя trigger().
Обработчик и метод on являются частью класса Component.
Как в БД записать в таблицу events в поле content строку "Добавление Организации - companies.name- id пользователя-имя пользователя"?
Модель User
Код: Выделить всё
<?php
namespace app\models;
use Yii;
use common\models\User as UserAlias;
use yii\base\Component;
class User extends \yii\db\ActiveRecord
{
const EVENT_ACT_USER='act_user';
public static function tableName()
{
return 'users';
}
public function getEvent($event){
$ev=new \app\models\Events();
$ev->content= $this->getPrimaryKey().$this->surname;
return $ev->save() ? $ev : null
}
public function init(){
$this->on(self::EVENT_ACT_USER, [$this, 'getEvent']);
parent::init();
}
}
Код: Выделить всё
public function actionCreate()
{
$model = new Companies();
if ($model->load(Yii::$app->request->post()) && $model->save()) {
$model->trigger(User::EVENT_ACT_USER);
return $this->redirect(['view', 'id' => $model->id]);
}
Re: как реализовать журнал действий
Может нужно в отдельной папке components события описывать?
Код: Выделить всё
namespace app\components;
use yii\base\Component;
use yii\base\Event;
Re: как реализовать журнал действий
Не записывает.
Код: Выделить всё
<?php
namespace app\models;
use Yii;
use common\models\User;
use yii\base\Component;
use app\models\Events;
use yii\base\Event;
class Useventer extends Component
{
const EVENT_ACT_USER='act_user';
/**
* {@inheritdoc}
*/
public static function tableName()
{
return 'users';
}
public function getEvent($event){
$ev=new \app\models\Events();
$ev->content= $this->getPrimaryKey().$this->surname;
$ev->save();
// return $ev->save() ? $ev : null;
}
public function init(){
$this->on(self::EVENT_ACT_USER, [$this, 'getEvent']);
parent::init(); // DON'T Forget to call the parent method.
}
}
Re: как реализовать журнал действий
Код: Выделить всё
Event::on(User::class, User::EVENT_ACT_USER, [$this, 'getEvent']);
Re: как реализовать журнал действий
Контроллер companies
Код: Выделить всё
public function actionCreate()
{
$model = new Companies();
if ($model->load(Yii::$app->request->post()) && $model->save()) {
Event::on(User::class, User::EVENT_ACT_USER, [$this, 'getEvent']);
return $this->redirect(['view', 'id' => $model->id]);
}
if($model->save()){
$model->trigger(Useventer::EVENT_ACT_USER);
}
return $this->render('create', [
'model' => $model,
]);
}
Последний раз редактировалось svil 2019.06.27, 18:53, всего редактировалось 2 раза.
Re: как реализовать журнал действий
User (модель)
Как в контроллере companies при создании вызвать триггер?
Код: Выделить всё
public function getEvent($event){
$ev=new \app\models\Events();
$ev->content= $this->getPrimaryKey().$this->surname;
return $ev->save() ? $ev : null;
}
public function init(){
Event>on(self::EVENT_ACT_USER, [$this, 'getEvent']);
parent::init(); // DON'T Forget to call the parent method.
}
Re: как реализовать журнал действий
https://www.yiiframework.com/doc/guide/ ... ept-events
Как это в коде?
Код: Выделить всё
объект Active Record инициирует событие EVENT_AFTER_INSERT после добавления в базу данных новой записи. Чтобы отслеживать записи, добавленные в базу данных каждым объектом Active Record, можно использовать следующий код:
use Yii;
use yii\base\Event;
use yii\db\ActiveRecord;
Event::on(ActiveRecord::className(), ActiveRecord::EVENT_AFTER_INSERT, function ($event) {
Yii::debug(get_class($event->sender) . ' добавлен');
});
Re: как реализовать журнал действий
пока никак
Re: как реализовать журнал действий
Добавила в events записи без триггеров при добавлении Организации или Пользователя
код //1-//4 ниже. Итог тот же. И так по нужным контроллерам, где crud дописать.
код //1-//4 ниже. Итог тот же. И так по нужным контроллерам, где crud дописать.
Код: Выделить всё
//При добавлении организации в backend/controllers/CompaniesController
public function actionCreate()
{
$model = new Companies();
$ev =new Events(); //1
if ($model->load(Yii::$app->request->post()) && $model->save()) {
$ev->content='Создание организации:'.trim(Yii::$app->user->identity->surname); //2
$ev->company_id = $model->id;//3
$ev->save();//4
return $this->redirect(['view', 'id' => $model->id]);
}
return $this->render('create', [
'model' => $model,
]);
}
//При добавлении пользователя в модели common/models/SignupForm
public function signup()
{
if ($this->validate()) {
$user = new User();
$job = new Jobs();
$ev = new Events(); //1
$user->setPassword($this->password);
$user->password= $user->setPassword2($this->password,$user->password_hash);
$user->generateAuthKey();
$user->surname = $this->surname;
$user->name = $this->name;
$user->thirdname = $this->thirdname;
$user->basket = $this->basket;
$user->save(true);
$job->user_id=$user->getId();
$job->company_id = $this->id_companies;
$job->name = $this->job;
$job->save();
$ev->content='Создание пользователя'.$this->surname.trim(Yii::$app->user->identity->surname) ; //2
$ev->company_id = $this->id_companies; //3
$ev->save(); //4
$auth = Yii::$app->authManager;
$authorRole = $auth->getRole('author');
$auth->assign($authorRole, $user->getId());
return $user;
}
return null;
}
Re: как реализовать журнал действий
Но с триггерами надо разобраться