Temat: historia zmian
Panowie, nie rozkminiliście wariantu następującego :-)
Stosując wasz sposób w poniższym przykładzie nie wiemy czy kraj_id = 1 powinien być aktualizowany do 2 czy według starej wersji. Nie wiem czy dobrze wyjaśniłem ale mam nadzieję że rozumiecie.
Tabela A: Id, Nowy, PoprzedniId Nazwa, kraj_id
Rekord 1: 1, 0, NULL, jakiś tam rekord 1
Rekord 2: 2, 0, 1 jakiś tam rekord 1
Tabela B: Id, Nowy, PoprzedniId Nazwa,
Rekord 1: 1, 0, NULL, Polska Rzeczpospolita Ludowa
Rekord 2: 2, 0, 1, Republika Polska
Rekord 3: 3, 0, NULL, Anglia
Mój sposób wygląda tak:
Tabela ZMIANY:
data_zdarzenia => no comment
klasa_obiektu => klasa z php co by łatwiej powołać np. wniosek
pola_klucza => pola klucza glownego, po ktorym unikalnie identyfikuję (w każdej klasie mam własność id_fields)klucz => wartość pól wyżej do identyfikacji, np po przecinku wartosc_przed_zmiana => bez komentarza :)
wartosc_po_zmianie => również bez
klasa_modyfikatora => klasa z PHP obiektu modyfikującego np. Pracownik, Userpola_klucza_modyfikatora => pola klucza głównego jak wcześniej
klucz_modyfikatora => jak wcześniej tyle że modyfikatora
Z takiej tabeli odpowiednimi (prostymi) selectami jesteś w stanie odtworzyć stan obiektu w każdej sekundzie życia systemu, ustalać jego cykl życia oraz pociągać do odpowiedzialności odpowiednich użytkowników. :-)
A tu kod do PHP, wytargałem z jakiegoś starego projektu.
Generalnie trzeba dziedziczyć po tym i tylko ustawiać $primary_fields i $not_logged_vars w każdej klasie potomnej.
Trzeba dopisać składanie obiektu do tablicy ...
class baseObject {
public $primary_fields = array('id'); // właściwość obiektu będąca kluczem
public $not_logged_vars = array(); // właściwości nie logowane
public $initialState = array();
public function logujZmiany($userObject = null)
{
if(!is_null($userObject))
{$klasa_modyfikatora = get_class($userObject);}
else {$klasa_modyfikatora = '';}
if(!is_null($userObject) && isset($userObject->id))
{$klucz_modyfikatora = $userObject->id;}
elseif(!is_null($userObject) && isset($userObject->Id))
{$klucz_modyfikatora = $userObject->Id;}
else {$klucz_modyfikatora = '';}
$data_zdarzenia = date('Y-m-d H:i:s');
$pola_klucza = implode('-',$this->primary_fields);
$pieces = array();
foreach($this->primary_fields AS $key => $var)
{
$pieces[] = $this->$var;
}
$klucz = implode('_',$pieces);
foreach($this->initialState AS $var => $content)
{
$l = Validator::removeRN($content);
$r = Validator::removeRN($this->$var);
$wynik = $l!=$r;
if(($l=='0000-00-00' && $r=='') || ($r=='0000-00-00' && $l=='')) {$wynik = false;}
if(((int)$l==0 && $r=='') || ((int)$r=='0' && $l=='')) {$wynik = false;}
if($wynik && !in_array($var,$this->not_logged_vars))
{
$SQL = "
INSERT INTO `lsi_grupa4`.`zmiany` (
`data_zdarzenia` ,
`klasa_obiektu` ,
`pola_klucza` ,
`klucz` ,
`wartosc_przed_zmiana` ,
`wartosc_po_zmianie` ,
`klasa_modyfikatora` ,
`klucz_modyfikatora` ,
`zmieniona_wlasciwosc`
)
VALUES (
'".$data_zdarzenia."',
'".get_class($this)."',
'".$pola_klucza."',
'".$klucz."',
'".$content."',
'".$this->$var."',
'".$klasa_modyfikatora."',
'".$klucz_modyfikatora."',
'".$var."'
);
";
$this->DB->SQL_insert($SQL);
}
}
}
Dawid Rokita edytował(a) ten post dnia 04.11.10 o godzinie 00:42