Trigger – danie pierwsze

Trigger (wyzwalacz)- umożliwia nam wykonanie jakiejś czynności gdy na tabeli zachodzą jakieś zmiany.

Przykład:
Wyobraźmy sobie że mamy system bankowy. Naturalną rzeczą jest tutaj logowanie wszystkiego co się da…
Użytkownik A(id = 2) chce przelać 1024zł na konto użytkownika 1337 :)

Bez użycia triggerów:

  1. Zmniejszamy stan konta o 1024zł
    UPDATE  `uzytkownik` SET  `malopieniedzy` = `malopieniedzy` - 1024 WHERE  `uzytkownik`.`id` =1;
  2. Ustawiamy nowy przelew
    INSERT INTO `przelew` (`od`, `do`, `ile`, `kiedy`) VALUES ('1', '1337', '1024', '2010-08-30 20:47:39');
  3. Zapisujemy do loga
    INSERT INTO `log` (`kto`, `ile`, `kiedy`) VALUES ('1', '1024', '2010-08-30 20:47:39');

Wykonujemy 3 zapytania i aż 3 razy przesyłamy te same dane!

Z użyciem triggerów

  1. Piszemy trigger-y (jednorazowo)
    CREATE TRIGGER `zabieram_pieniadze`
        BEFORE INSERT ON `przelew`
            FOR EACH ROW
            UPDATE `uzytkownik` SET `malopieniedzy` = `malopieniedzy` - NEW.ile WHERE `id` = NEW.od;
    

    CREATE TRIGGER `zapis_do_loga`
        AFTER INSERT ON `przelew`
            FOR EACH ROW
            INSERT INTO `log` (`kto`, `ile`, `kiedy`) VALUES (NEW.od, NEW.ile, NEW.kiedy);
    
  2. Ustawiamy nowy przelew
    INSERT INTO `przelew` (`od`, `do`, `ile`, `kiedy`) VALUES ('1', '1337', '1024', '2010-08-30 20:47:39');

Jak to będzie wyglądało ?

MySQL widzi że chcemy wstawić do bazy dane (INSERT `przelew`), jako że istnieje trigger `zabieram_pieniadze`, to zostanie wykonany nim wstawimy dane do przelewu (takie magiczne słówko “BEFORE”).
Mamy też trigger `zapis_do_loga` który zostanie uruchomiony po wykonaniu operacji INSERT (magiczne słówko “AFTER”)

Fajne, fajne ale gdzie będziemy tego używać?
W tym projekcie triggery zostaną użyte dla tabel typu MyISAM aby automatycznie wstawiać dane.

* Triggery działają tylko dla INSERT, UPDATE i DELETE
** Zapytania pisane z palca – mogą być drobne błędy w składni

Za szybko – błędy projektowe

Kilka dni bez programowania i zauważyłem dość istotny błąd… InnoDB nie obsługuje FULLTEXT (pewnie myśl o kodowaniu mnie tak rozproszyła ;))

Jak temu zaradzić ?
Trzeba będzie użyć triggerów i “tabel pomocniczych” (rozpiszę napiszę to później)

Odświeżona wersja bazy

Nowy projekt Zend Framework

Koniec pisania o niczym, zaczynamy kodowanie (no prawie) :)

Przygotowanie projektu w ZF:

Na początek przyda się ściągnąć Zend Framework 2 (wersja dev). Paczkę można zassać stąd: ZendFramework-2.0.0dev1.zip

Rozpakowujemy wszystko i wchodzimy do folderu bin. Znajdują się w nim 3 pliki
zf.bat
zf.php
zf.sh

jako że używam windowsa, to interesuje mnie tylko „zf.bat”

Edytujemy plik tak aby PHP_BIN wskazywał na php.exe

W moim przypadku „C:\xampplite\php\php.exe”

SET PHP_BIN="C:\xampplite\php\php.exe"
SET PHP_DIR=%~dp0
GOTO RUN

Jeżeli wszystko zrobiliśmy OK., to po wpisaniu w konsoli „zf” powinniśmy dostać spis dostępnych opcji.

Pozostaje tylko wpisać zf create project „C:\phptrac”. W taki oto sposób utworzyliśmy nasz pierwszy projekt.

Struktura katalogów:

+---application (nasz kod)
|   +---configs (ustawienia)
|   +---controllers
|   +---models
|   \---views
|      +---helpers
|      \---scripts
|         +---error
|         \---index
+---docs
+---library (blblioteki - tutaj kopiujemy pliki zenda)
+---public
\---tests
+---application
\---library

Teraz już tylko ustawiamy DocumentRoot na folder /public i zaczynamy zabawę :)

Na SVN’nie dostępny pusty/czysty projekt (zmieniona jest tylko nazwa folderu public na htdocs)

Przygotowania do wersji 0.1

Chwilę temu postanowiłem podzielić projekt na kilka małych kroczków (wersji). W ten sposób chcę uniknąć “skoku na głęboką wodę” i stopniowo dokładać kolejne moduły.

Na pierwszy ogień idzie:

  • Rejestracja/logowanie użytkowników
  • Sprawdzanie podstawowych uprawnień
  • Tworzenie nowych projektów
  • Wiki
  • Lista ToDo
  • Zdarzenia/Bugtrack

Dla podanych modułów została też zaprojektowana prosta baza.

Obecnie nie będzie podziału zadaniowego na grupy ale będzie można przypisać X osób do jednego zadania :)

Tworzenie makiety dla tego projektu okazało się strzałem w kolano(?). Nie będzie przecież żadnych wodotrysków, miliona animacji i gwiazdek z ocenami :) Wyświetlać będziemy tylko formularze, tabelki i prosty tekst.

Kolejna wersja layoutu prezentuje się następująco:

PHPTrac layout

W stosunku do poprzedniej wersji dodałem pole statusu i przeniosłem szukajkę – nic specjalnego :)

Na uwagę zasługuje jedynie pole “informacji” oraz “użytkowników”.

Pole informacji:

Ikonka znajdująca się w prawym górnym roku ma za zadanie informować użytkownika o aktualnym statusie dokumentu, zdarzenia czy strony wiki. Informacja pojawi się jedynie kiedy przeglądając dokument, inna osoba zdecyduje się go edytować.

Przykładowo:
Użytkownik A i B przeglądają stronę wiki/index. W pewnym momencie użytkownik A zauważa literówkę/błąd i rozpoczyna edycję dokumentu. W tym momencie użytkownikowi B wyświetla się informacja.

Pole użytkowników (+status):

Status użytkownika (trzeba opisywać ? :) ).  W tym miejscu możesz ustawić swój status (dostępny/zajęty) oraz opis (“Poprawiam bug #1234″). Status “nieobecny” pojawi się automatycznie po 3 minutach braku aktywności.

Lista aktywnych członków zespołu (po najechaniu na nazwę wyświetla się opis aktualnie wykonywanej czynności “Edytuje wiki”, “Dodaje nowe zdarzenie”…)
Po kliknięciu na nazwę użytkownika rozpoczniemy z nim czat (patrz GMail). Ikonka w prawym górnym rogu rozpocznie czat grupowy (zostanie zapisany log dla osób nieobecnych).

Komunikacja będzie również dla wersji desktopowej.

Makieta strony

Przed rozpoczęciem projektowania bazy postanowiłem przygotować makietę strony. We wszystkich poprzednich projektach pomysł się sprawdził w 100%. Klient wiedział dokładnie co dostanie i programista wiedział co musi napisać.

Obecnie pracuję nad stroną główną. Jako że sporadycznie zajmuję się majstrowaniem przy widoku, to cały efekt jest trochę opłakany. Interfejs (w wersji końcowej) ma być podobny do GMaila.

Na górze po lewej znajduje się główne menu. Tutaj nic więcej nie da się napisać :)
Po środku znajduję się prosta wyszukiwarka. Podstawowa wersja przeszuka wszystkie “treści” (wiki, listę todo, dokumenty, …) i wyświetli po 3-5 najświeższych wyników dla każdego modułu. Dopiero w zaawansowanej wyszukiwarce będzie można ustalić miejsca wyszukiwania, przedział czasowy, użytkowników… Myślicie że trzeba podać bezpośredni link do zaawansowanej szukajki?
Prawa góra, to menu użytkownika.

Panel prawy będzie “menu pomocniczym” oraz panelem informacyjnym.  Pokaże nam informacje o aktywnym dokumencie/stronie wiki, użytkownikach online (oraz czym aktualnie się zajmują) wyświetli także listę zadań i nadchodzące/ważne wydarzenia.

Zastanawiam się czy dodać pole statusu. Jego zadaniem będzie informowanie reszty zespołu czym aktualnie się zajmujesz – coś w rodzaju twittera albo statusu w komunikatorze.

Kilka słów o projekcie…

Po tytule projektu (PHPTrac) nie trudno się domyślić co będzie kodowane :)

Głównym celem jest stworzenie prostego (w obsłudze) systemu zarządzania projektami. Całość można podzielić na dwie główne części: aplikację w php i c#. Aplikacja webowa ma za zadanie zarządzać projektami i udostępniać rozbudowane api. Część desktopowa napisana w C# będzie ułatwiać korzystanie z całego systemu.

Czego użyje do napisania?

Część pisana w PHP:
Zend Framework 2.0 – zaryzykuje i wezmę wersję dev
Doctrine 2.0 (beta) – nie używałem nigdy
Prace będzie wspomagać jQuery

Część pisana w C#:
Chciałem napisać klienta w wersji .net 4.0 jednak sprzęt nie pozwala na spokojną pracę w VS2010, z tego powodu użyje .net 3.5

Co projekt będzie oferował?

  • Bugtrack
  • Wiki (z różnymi formatowaniami)
  • Kalendarz + Kalendarz od Google
  • Magazynowanie plików + dokumenty od Google
  • Listę TODO z możliwością podziału na grupy
  • Statystyki aktywności
  • Podglądanie źródeł projektu
  • Spędzony czas / śledzenie czas
  • Komunikację między członkami zespołu

To chyba tyle…

Daj się poznać!

Ja też zgłosiłem się do konkursu.

Jutro napiszę więcej – ostatnie 80minut urlopu :)



Follow

Otrzymuj każdy nowy wpis na swoją skrzynkę e-mail.