2013-05-22 8 views
5

Sto creando un modulo di audit trail che inserirò in un sistema più grande; e ho creato una tabella per memorizzare le voci dei trail, come "auditor" cosa voglio vedere all'utente attualmente connesso, la pagina in cui si trova, quale azione ha fatto e quali sono stati i cambiamenti e quando ...Rilevamento delle modifiche nel modello; php yii framework

questi sono fondamentalmente ciò che voglio vedere; la tabella dei miei audit trail è simile a:

Utente | timestamp | Nome del modulo | Azione | Vecchio valore | Nuovo valore | Descrizione

ho praticamente avuto nessun problema a trovare l'utente, da

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

pagina/modulo e l'azione da ottenere del controller:

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

Il mio problema è con i cambiamenti vecchio valore al nuovo valore, le modifiche eseguite dall'utente. Potrei "annusare" quali modifiche/modifiche ha fatto copiando letteralmente le variabili e passandole attraverso la mia funzione in cui creo il log .. Come faccio a farlo dinamicamente?

mi piacerebbe rilevare se le proprietà o gli attributi di un determinato modello sono stati modificati e vedere quali modifiche sono state apportate in modo da ottenere un registro dettagli ... Grazie! scusa, sto davvero cercando di spiegarlo.

risposta

8

In ogni modello che si desidera osservare è possibile scrivere un metodo afterFind(), in cui vengono memorizzati gli attributi DB correnti in alcune variabili private, e.b. _dbValues. Quindi in beforeSave() si verificano gli attributi correnti con quelli in _dbValues e si crea un record di controllo in caso di modifiche.

Dopo aver funzionato, puoi fare un ulteriore passo avanti e creare un behavior da esso. Dovresti inserire la variabile privata, il afterFind() e il metodo beforeSave(). Quindi puoi associare quel comportamento a molti record.

+0

'afterFind' verrà valutato dopo ogni ricerca, come nella griglia, giusto? Forse gli scenari potrebbero essere usati per memorizzare attributi a '_dbValues' solo in aggiornamento. –

+0

Grazie!questo è utile: D – muffin

6

esempio rapida:

+0

Grazie..proverò questo fuori – muffin

0

La soluzione è buona, ma cosa succede se ci sono 2 fili che chiamano -> save() allo stesso tempo?

Si supponga che:

  1. il primo filo trovare registrare, salvare la A di stato.
  2. il secondo thread trova record, salva lo stato A.
  3. quindi 1a nota di modifica della filettatura in B, chiama -> salva(). Il sistema registrerà A-> B
  4. quindi il secondo record di cambio di thread in C, chiama -> save(). Il sistema registrerà A-> C

riepilogo, ci sono 2 log: A-> B, A-> C. Se questo non è un problema per te, basta ignorarlo e fare la soluzione di cui sopra.

Problemi correlati