Approve изменений в таблицах

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
Neuromance
Сообщения: 716
Зарегистрирован: 2011.09.06, 13:04

Approve изменений в таблицах

Сообщение Neuromance »

Коллеги, добрый день.

Есть задача : необходимо все изменения, которые делает пользователь,отправлять модератору на рассмотрение.Если модератор аппрувит, то изменение сохраняем. Если нет, то откатываем назад.

Решил делать с помощью Behavior-а.
Примерно как-то так

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

<?php
/**
 * Created by PhpStorm.
 * User: sz
 * Date: 17.03.16
 * Time: 17:59
 */

namespace common\behaviors;

use yii\base\Behavior;
use yii\db\ActiveRecord;

class ApproveBehavior extends Behavior
{
    const STATUS_DISABLED = 0;
    const STATUS_ENABLED = 1;
    const STATUS_CHECK_INSERT = 2;
    const STATUS_CHECK_UPDATE = 3;
    const STATUS_CHECK_DELETE = 4;

    public function events(){
        return [
            ActiveRecord::EVENT_BEFORE_INSERT => 'beforeInsert',
            ActiveRecord::EVENT_BEFORE_UPDATE => 'beforeUpdate',
            ActiveRecord::EVENT_BEFORE_DELETE => 'beforeDelete',
        ];
    }

    public function beforeDelete($event){
        $owner = $this->owner;
        $owner->status = self::STATUS_CHECK_DELETE;
        $owner->save(false);
        $event->isValid = false;
    }

    public function beforeInsert($event){
        $owner = $this->owner;
        $owner->status = self::STATUS_CHECK_INSERT;
    }

    public function beforeUpdate($event){
        $owner = $this->owner;
        $ownerClass = $owner->className();
        $copy = new $ownerClass;
        $copy->setAttributes($owner->attributes);
        if($copy->save()){
            $owner->setAttributes($owner->getOldAttributes());
            $owner->status = self::STATUS_CHECK_UPDATE;
            $owner->save(false);
        }
        $event->isValid = false;
    }
} 
С удалением и созданием записи всё ясно. beforeDelete, beforeInsert - меняем статус у записи.
С редактированием непонятно как быть..Вроде бы надо создавать копию строки в таблице, а оригинальной строке присваивать статус типа "на проверке". Но ведь возможны изменения в связанных таблицах. Например 2 таблицы, одна основная, вторая с переводами. Пользователь меняет и данные в сонвоной и в переводах. Тогда уже копию строк в каждой этой таблице надо делать. При этом каждая строка должна быть связана с оригинальной .
Например:

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

category - category_lang. Связаны через category_id
После изменения добавятся записи - category` и category_lang` . Связаны через category_id`. При этом ctegory` должна иметь ссылку на category, а category_lang` на category_lang..
Вот тут уже крыша начинает немного подтекать..А если связанных таблиц не 2, а 3 например, то вообще тушите свет...

Может есть у кого-то идеи, как быть?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Approve изменений в таблицах

Сообщение zelenin »

зачем создавать копию?
Аватара пользователя
Neuromance
Сообщения: 716
Зарегистрирован: 2011.09.06, 13:04

Re: Approve изменений в таблицах

Сообщение Neuromance »

zelenin писал(а):зачем создавать копию?
это всего лишь предложенный вариант. Возможно есть другие идеи как откатить изменения, если модератор их не одобрил?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Approve изменений в таблицах

Сообщение zelenin »

Neuromance писал(а):
zelenin писал(а):зачем создавать копию?
это всего лишь предложенный вариант. Возможно есть другие идеи как откатить изменения, если модератор их не одобрил?
зачем откатывать? просто в запросы включайте правило ->published()->
Аватара пользователя
Neuromance
Сообщения: 716
Зарегистрирован: 2011.09.06, 13:04

Re: Approve изменений в таблицах

Сообщение Neuromance »

Задача такая. Пользователь вносит изменения. До аппрува изменений показываются старые данные. После аппрува показываются новые данные.
Следовательно и старые, и новые данные должны быть сохранены в БД.

В вашем варианте до аппрува изменений пользователь просто не будет видеть измененную запись.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Approve изменений в таблицах

Сообщение zelenin »

Neuromance писал(а):Задача такая. Пользователь вносит изменения. До аппрува изменений показываются старые данные. После аппрува показываются новые данные.
Следовательно и старые, и новые данные должны быть сохранены в БД.

В вашем варианте до аппрува изменений пользователь просто не будет видеть измененную запись.
а вариант юзать отдельную таблицу для этого? во время одобрения/снятия переносить данные между таблицами?
Аватара пользователя
Neuromance
Сообщения: 716
Зарегистрирован: 2011.09.06, 13:04

Re: Approve изменений в таблицах

Сообщение Neuromance »

zelenin писал(а): а вариант юзать отдельную таблицу для этого? во время одобрения/снятия переносить данные между таблицами?
Вариант практически не отличается от моего, только я вместо отдельно таблицы использую ту же таблицу, но со статусами.
Основная то проблема в связанных таблицах и том, что для них тоже копии записей надо делать..

Думал просто может кто-то сталкивался с подобными проблемами (да почти уверен в этом) и решал их
Ответить