<?php

/**
 * ExampleLogObserver
 * Implementacja na podstawie wzorca obserwatora klasa Log oraz jej pochodne są
 * elementem obserwowanym!
 *
 * http://php.net/manual/pl/class.splobserver.php
 *
 * @uses LogObserver
 * @final
 * @author Tomasz Świenty
 * @version 0.3
 * @copyright Copyright (c) BetaSoft
 */
final class ExampleLogObserver extends LogObserver {



    /**
     * update
     *
     * @param SplSubject $subject
     * @return void
     */
    public function update(SplSubject $subject) {

        // podstawowe sprawdzenie czy obserwowany obiekt jest instancją klasy Log
        if (!is_a($subject, 'Log')) {
            return TRUE;
        }

        // zwraca obiekt klasy LogEvent który przechowuje ostatniego eventa Loga
        $event = $subject->getLastEvent();

        /* zwraca klase obserwowanego obiektu w postaci np. CONTACT, PROCESS, EVENT
           nazwa najczęściej odpowiada nazwie katalogu w classes/Log/Contact, classes/Log/Process
           jeśli coś nie ma katalogu to nie ma loga i nie da się zrobić obserwatora :)
        */
        $clsnam = $event->getEventClsnam();

        // identyfikator numeryczny np. contid dla $clsnam = CONTACT
        $keyval = $event->getEventKeyval();

        /* kategoria zmiany opisowa np. ADDED, MODIFIED
           aby pobrać wszystkie dostępne kategorie zmian należy wywołać kod
           $categoryMap = $subject->getCategoryMap();
           format zwróconych danych to tablica
         */
        $chacat = $event->getEventCategory();

        /* priorytet zdarzenia indeksowo np. 1, 5 itd zakres to 1-8 w postaci
           1 - EVENT_EMERG
           2 - EVENT_ALERT
           3 - EVENT_CRIT
           4 - EVENT_ERR
           5 - EVENT_WARNING
           6 - EVENT_NOTICE
           7 - EVENT_INFO
           8 - EVENT_DEBUG
         */
        $prior = $event->getEventPriority();

        // priorytet tekstowo np. EVENT_INFO
        $priorText = $event->getEventPriority(TRUE);

        // kto wykonuje akcje tekstowo jesli ma byc usr_id trzeba dać getEventActor(FALSE)
        $actor = $event->getEventActor();

        /* jeśli event loga dotyczył zmian w kolumnach to są to szczegóły zmian w kolumnach w postaci tablic array(nazwa kolumny => poprzednia wartosc)
           aby pobrać wszystkie kolumnych, których zmiana jest obserwowana należy wywołać kod
           $observedColums = $subject->getObservedColums();
           funkcja zwraca tablicę gdzie klucze to obserwowane kolumny a wartość to albo tablica albo string
           - jeśli tablica to ta tablica posiada klucz func - funkcja sprawdzająca dane oraz text - opis kolumny
           - jeśli string to opis kolumny
         */
        $details = $event->getEventDetails(TRUE);

        // jeśli nie ma kategorii zmian to nie wykonuj mnie
        if (!$chacat) {
            return TRUE;
        }

        // np. ma obsługiwać tylko log klasy kontaktow czyli jeśli klasa inna niż CONTACT to nie wykonuj mnie
        // sprawdzenie można dać wcześniej
        if ($clsnam != 'CONTACT') {
            return TRUE;
        }

        // jeśli kategoria zmian inna niż ADDED to nie wykonuj mnie
        if ($chacat != 'ADDED') {
            return TRUE;
        }

        // tutaj po spełnieniu warunków wykonania obserwatora wykonuję dedykowany kod

    }

} // class ExampleLogObserver

?>
