2013-05-22 4 views
5

Я создаю модуль аудиторского следа, который я поставлю в более крупную систему; и я создал таблицу для хранения записей трейлов, как «аудитора», что я хочу видеть в настоящее время вошедшего в систему пользователя, страницы, на которой он/она находится, какие действия он/она сделал и каковы были изменения и когда ...Обнаружение изменений в модели; php yii framework

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

Пользователь | Отметка | Имя модуля | Действие | Старая стоимость | Новая ценность | Описание

я в принципе не было проблем с получением пользователю, по

Yii::app()->session['username']; 

страница/модуля и действия, получая диспетчерское:

$this->module->getName(); 
$this->action->id; 

Моя проблема заключается в изменении старое значение к новому значению, изменения, сделанные пользователем. Я мог бы «высмеивать», какие изменения/изменения он сделал, буквально копируя переменные и передавая его через мою функцию, где я создаю журнал. Как мне это сделать динамически?

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

ответ

8

В каждой модели, которую вы хотите наблюдать, вы можете написать метод afterFind(), в котором вы храните текущие атрибуты БД в какую-то частную переменную, e.b. _dbValues. Затем в beforeSave() вы проверяете текущие атрибуты с номерами _dbValues и создаете запись аудита, если произошли изменения.

После этого вы можете сделать еще один шаг и создать из него behavior. Вы поместили бы приватную переменную, afterFind() и метод beforeSave(). Затем вы можете прикрепить это поведение ко многим записям.

+0

'afterFind' будет оценен после каждого поиска, как и в сетке тоже, правильно? Возможно, сценарии могут использоваться для хранения атрибутов '_dbValues' только при обновлении. –

+0

Спасибо!это полезно: D – muffin

6

Быстрый пример:

+0

Спасибо .. я попробую это – muffin

0

Ваше решение хорошо, но что, если вы 2 темы, которые требуют -> Сохранить() в то же время?

Предположим, что:

  1. 1-й нитки найти запись, сохранить состояние.
  2. 2-я резьба найти запись, сохранить статус A.
  3. затем 1-я запись изменения резьбы на B, вызов -> save(). Система будет записывать A-> B
  4. , затем вторую запись изменения резьбы на C, вызов -> save(). Система будет регистрировать A-> C

сводка, есть 2 журнала: A-> B, A-> C. Если это не проблема для вас, просто проигнорируйте ее и выполните вышеуказанное решение.

 Смежные вопросы

  • Нет связанных вопросов^_^