Novije i potpunije stranice pogledajte na adresi: http://www.dario-ljubesic.iz.hr/

Aplikacije :: Proizvodno zanatstvo :: Dario

Nastanak

HOK i kanadska agencija za međunarodni razvoj krajem 2002-ge godine postižu sporazum o sufinanciranju projekta pod nazivom "Internet poslovno povezivanje".

Projekt "Proizvodno zanatstvo" započeo je početkom 2003-će godine, a osnovni zadatak je prikaz podataka o proizvodnim obrtima. Kad je projekt započeo, nije se znalo na kojem serveru će biti postavljen (engl. host), niti koja baza će se upotrijebiti (razmatrane su i komercijalne baze poput SQL Server-a). U to doba HOK je imao svoje stranice na serverima firme HT, gdje je bila zakupljena i baza na SQL Server-u.

Relativno brzo, pala je odluka o izvedbi na LAMP tehnologiji. Kako sam ja počeo izvedbu projekta prije konačne odluke, morao sam osmisliti sustav tako da ga je relativno jednostavno postaviti na različitim bazama. Iz PEAR-a (standardne biblioteke PHP-a) upotrijebljen je PEARDB dio za apstrakciju pristupa spremištu podataka.

Razvoj

Izabrana verzija MySQL 4.0x podržava pretraživanje tekstualnih polja (engl. full text search, FTS). Izabrao sam tzv. "Boolean FTS" koji je u testovima pokazivao zadovoljavajuće rezultate (ako zanemarima BUG-ove s "našim" slovima, posebno đĐšŠ). Neki od BUG-ova popravljeni su u kasnijim verzijama.

Upotrijebljena tehnologija djelomično je opisana na stranici o sustavu za upravljanje sadržajem.

Višejezičnost

Od početka projekta, razmatrala se potreba za višejezičnim predstavljanjem prikupljenih podataka. Cijena prevođenja na pretpostavljenoj količini podataka nije zanemariva, pa je zaključeno kako aplikacija treba podržati višejezičnost, s jednostavnim naknadnim dodavanjem novih lokalizacija (engl. localisation, L10N), a prevođenje mogu raditi i sami obrtnici, kod ažuriranja podataka. Podaci objavljeni na raznim jezicima ne moraju biti isti, a prijevodi ne moraju biti napisani za sve jezike. Pretraživanje podataka radi se unutar korpusa podataka koji postoji na jeziku na kojem je napravljen upit. Drugim riječima, rezultat pretraživanja ovisi o aktivnoj lokalizaciji.

Problemi kod implementacije, u okruženju MySQL 4.0x i PHP 4.3x, nastaju stoga što obje tehnologije ne rade, normalno, s Unicode znakovima. Stranice su rađene u iso-8859-2 standardu, dok su slova u MySQL tablicama predstavljena windows-1250 kodnom stranicom (kako bi MySQL "korektno" radio sortiranja po "našim" slovima).

Serija postupaka koji omogućavaju višejezičnost aplikacije označavaju se I18N oznakom. Cijeli I18N problem, u ovoj aplikaciji, možemo razlomiti na manje dijelove:

Prema nekim praktičnim lokalizacijama, potrebno je predvidjeti cca 30% više prostora za tekstove (toliko prosječno varira dužina prevedinih tekstova). Ponekad je, u praksi, teško pronaći odgovarajući prijevod takve dužine, pa uvelike pomaže orijentacija na "plivajuće pozicioniranje" (engl. liquid design). Kod plivajućeg pozicioniranje elemenata na stranici, navodi se poredak elemenata i prijedlozi pregledniku oko njihove pozicije, a NE navodi se fiksna veličina elemenata.

U prvim (razvojnim) verzijama, radio sam jednu tablicu (u MySQL-u) po lokalizaciji. U tablici sam držao unikatnu oznaku (engl. id) i tekst u toj lokalizaciji, za sve statične dijelove stranica. Kasnije se ispostavilo kao puno bolje (fleksibilnije, brže) rješenje držanje tekstova u php datotekama (po modulima, tako da se uzimaju samo tekstovi modula s kojim se radi). Svaki modul ima L10N direktorij ispod kojeg su direktoriji po lokalizacijama.

Oznake lokalizacija

Oznake lokalizacija sastavljene su od oznake jezika i opcionalno, oznake države prema ISO 639-1 standardu (dva slova). Primjer oznake je pt za portugalski jezik, a pt-br za varijantu portugalskog koja se koristi u Brazilu.

Modularna struktura

Struktura site-a podijeljena je na module. Modularna struktura treba osigurati (idealno) međusobnu neovisnost modula. U lošijem slučaju, međusobna zavisnost treba biti dobro dokumentirana. Ako su moduli međusobno neovisni, omogućeno je dodavanje/ažuriranje pojedinih modula neovisno o ostatku site-a. Neovisnost modula ogleda se u:

  1. smještaju datoteka (svaki modul ima svoje poddirektorije koji se nazivaju prema oznaci modula)
  2. nazivu tablica u bazi (imaju svoj prefiks)
  3. vlastitoj konfiguraciji (svaki modul ima svoje parametre)

Osnovni (zajednički) modul naziva se PHP Library, a ima oznaku lib (u daljem tekstu kraće LIB-modul). Datoteke koje čine taj modul imaju zajednički dio (u komentaru na početku stranice):


    Project: PHP Library
    @package LIBRARY::

HOK-modul sadrži šifarnike (npr. cehovi, grupe, sekcije, djelatnosti), popis entiteta i njihovih vlasnika i slično. Na ovom site-u (možemo reći) kako on čini drugu razinu (ako LIB-modul čini prvu). Moduli koji barataju informacijama o entitetima nužno su zavisni o HOK-modulu. Kod prikaza ili ažuriranja pogona(radnji) u zavisnim modulima mora se kontrolirati status eniteta u HOK-modulu. To omogućava hok_adminu kontrolu nad entitetima, dakle posredno nad pogonima tog entiteta u svim zavisnim modulima.

PZ-modul (Proizvodno zanatstvo) jedan je primjer modula koji ovisi o HOK-modulu. Entitet koji je disabliran u HOK-modulu ne može biti prikazan (preciznije: njegovi pogoni) u pretraživanjima PZ-modula, niti mogu biti ažurirani podaci njegovih pogona.

PHP kod modula sastoji se od dva dijela:

URL-dio mora biti fizički postavljen u direktorije ispod DocumentRoot kod Apache web servera. Jezgra može biti potpuno odvojena (preporuka je pozicija iznad DocumentRoot-a). URL-dio pristupa jezgri, stoga treba podesiti definiciju ROOT_DIR u www/config/config.php prema poziciji jezgre.

URL-dio modula sadrži stranice kojima se pristupa preko URL-a i direktorij themes/default u kojem su datoteke za "default" temu (CSS-datoteke, slike itd). Ako postoji više tema, svaka ima svoj direktorij ispod themes direktorija. URL-dio modula može sadržavati druge direktorije (npr. direktorije za ažuriranje sadržaja). Jezgra modula u svom direktoriju ima strukturu direktorija:

DirektorijOpis
bllPHP datoteke koje čine Bussiness Logic Layer
configtemplate za konfiguraciju modula i konstante modula
dalPHP datoteke koje čine Data Access Layer
L10Nlokalizacija tekstova koji se pojavljuju na stranicama modula
testPHP Unit test kod
tpltemplate datoteke modula

Ovo je preporučena struktura i nazivlje direktorija. Moduli mogu imati dodatne direktorije (npr. LIB-modul odvaja svoje PLL (Presentation Logic Layer) datoteke u zaseban pll direktorij).

Konfiguraciju za pojedini site (moguće se relativnim path-om; vidi /docs/konfiguracija_subsite_a.txt) nalaze se u ROOT_DIR/config direktoriju i njegovim poddirektorijima (svaki modul ima svoj poddirektorij). Svaka konfiguracija ima svoju datoteku koja je imenovana prema URL-u (stroj.domena.tld.ini) gdje može biti još dodan dio za relativni path (ako nije default '/'; to je definirano u RELATIVE_DOC_ROOT; vidi /docs/konfiguracija_subsite_a.txt; ako postoji relativni path ime datoteke je stroj.domena.tld.rel_path.ini). Tako imenovane datoteke postoje u ROOT_DIR/config direktoriju i u svakom njegovom poddirektoriju (tj. svaki modul ima takvu konfiguracijsku datoteku). Izbor konfiguracije za pojedini site radi se izmjenom www/config/config.php datoteke, definicija MAIN_INI_FILE. Drugim riječima, svaka konfiguracija (svaki site) ima svoju definiciju MAIN_INI_FILE koja pokazuje koja se konfiguracija (koji skup ini datoteka) koristi. Side-effect ovakve organizacije omogućava da u ROOT_DIR/config stablu direktorija držimo sve moguće konfiguracije, a promjenom MAIN_INI_FILE izabiremo aktivnu.

Prestanak mog angažmana na projektu

Kompletno održavanje PHP aplikacija i dalji razvoj preuzela je firma Netgen d.o.o. tijekom 2004-te godine.

Pogledajte

Naslovna stranica