Есть задача : необходимо все изменения, которые делает пользователь,отправлять модератору на рассмотрение.Если модератор аппрувит, то изменение сохраняем. Если нет, то откатываем назад.
Решил делать с помощью 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;
}
}
С редактированием непонятно как быть..Вроде бы надо создавать копию строки в таблице, а оригинальной строке присваивать статус типа "на проверке". Но ведь возможны изменения в связанных таблицах. Например 2 таблицы, одна основная, вторая с переводами. Пользователь меняет и данные в сонвоной и в переводах. Тогда уже копию строк в каждой этой таблице надо делать. При этом каждая строка должна быть связана с оригинальной .
Например:
Код: Выделить всё
category - category_lang. Связаны через category_id
После изменения добавятся записи - category` и category_lang` . Связаны через category_id`. При этом ctegory` должна иметь ссылку на category, а category_lang` на category_lang..
Может есть у кого-то идеи, как быть?