Uwaga, uwaga, w celu rozwiania pewnych uwag i wątpliwości pojęcie framework zostało objęte cudzysłowiem ponieważ jest to framework po mojemu, jeżeli komuś się nie podoba to nie musi używać i nie, nie będę patrzeć na Zend Framework czy inne frameworki - ten jest inny!
Jednak jestem zwolennikiem Wolnego i Otwartego Oprogramowania dlatego postanowiłem, że podzielę się Swoją pracą z innymi ludźmi.
Hosting projektu zapewnia github.com, niestety muszę przyznać, że to mój pierwszy projekt hostowany na GIT i mam nadzieję, że nic nie zepsuje po drodzę ( jestem ostrożny )

=== TU TNIJ ===
Przejdę do rzeczy, konkrety, konkrety!
No i oczywiście dodam link do repozytorium projektu:
http://github.com/webnull/OpenWikiBlog
Jądro
Całość jest zbudowana w oparciu o jądro, a reszta to tylko moduły.
Jądro może nie waży zbyt wiele, ale jest na prawdę funkcjonalne.
Cechy jądra:
- Budowa jądra zakłada maksymalnie łatwą dla dewelopera obsługę modułów
- Obsługa "domyślnych modułów" - muszą mieć zaimplementowany uniwersalny interfejs
- "Module On Demand" - Pierwsza cecha również tyczy się zależności, moduły ładowane są wtedy kiedy potrzeba ( same się załadują - to poprawia wydajność )
- Tak zwany skrypt startowy, są w nim moduły które startują razem z skryptem domyślnie
- "CallThroughtKernel" - pozwala w skryptach startowych zamiast modułu podać tylko jego wewnętrzną funkcję aby wywołać ją później
- "Kernel Module Triggers" - czyli odpowiednie reguły które jeżeli się zgadzają to moduł zostanie załadowany ( uproszczona budowa zapewnia szybkość wykonywania kodu )
"Module On Demand"
Wystarczy odwołać się do modułu który nie został załadowany aby został załadowany

Kod
$Kernel -> module -> moduleFunction ( Arguments );
Powyższy przykład w razie gdy moduł "module" nie istnieje załaduje moduł oraz odwoła się do jego funkcji o zwróci porządaną wartość.
Skrypty startowe
$MODS['hooks'] = NuLL; // normalnie ładuje moduł 'cache_lifetime' => 120, 'template_dir' => 'websites/cube/templates', 'compile_dir' => 'websites/cube/templates_c', 'config_dir' => 'websites/cube/core', 'cache_dir' => 'websites/cube/cache' ); // ładuje moduł smarty z odpowiednimi argumentami $MODS['translator'] = array ( 'default_language' => 'english' ); // ładuje moduł translator z argumentami $MODS['mypage'] = array ( 'index' => 1 ); // ładuje mypage ze wskazaniem która strona to strona główna $MODS['menu'] = NuLL; // ładuje menu $MODS[] = array ( 'mypage', 'display', ''); // odwołuje się do modułu mypage i wykonuje display() z argumentem '' - inaczej CallThroughtKernel
Odnośnie skryptów startowych, na wiki jeszcze niema nic opisane ale obiecuję, że wkrótce opiszę każdy szczegół konfiguracji razem z "kolorowymi" przykładami ( gotowcami ) w miarę prosto i zwięźle.
Obsługa domyślnych modułów
Moduł może zdefiniować Siebie jako domyślny do wykonywania danej czynności, np. moduł MojErrorHandler może wywołać $Kernel->setAsDefault('MojErrorHandler', 'error_handler' );
Po zdefiniowaniu domyślnego modułu np. Error Handlera inne moduły będą go używać w taki sposób:
Kod
$Kernel->error_handler->log('asd');
"hooking" ( zaczep ) - czyli jak zmodyfikować prywatną zmienną wewnątrz funkcji innej klasy
Od niedawna ( dwa ostatnie commity ) dodałem moduł libhooks ( nazwa wywoławcza: hooks ).
Moduł pozwala zmodyfikować prywatną zmienną wewnątrz funkcji innego modułu jeżeli ten moduł na to pozwoli.
Jak to działa w praktyce?
Moduł który chce zmodyfikować dane innego modułu musi być załadowany najpierw.
Definiujemy zaczep o nazwie np. "moj_zaczep" podając dodatkowo nazwę klasy i funkcji która ma być wywołana do zmodyfikowania danych przekazanych z zaczepu.
Definicji dokonujemy w module który startuje najpierw.
Teraz startujemy moduł który posiada dane do zmodyfikowania przez inny moduł, wykonujemy zaczep wrzucając do niego dane które przejmie drugi moduł i zwróci "w poprawionej wersji".
Teraz prosty przykład:
modul_pierwszy { konstruktor_lub_dowolna_funkcja { // najlepiej konstruktor definiuj_zaczep ( 'liczba', 'modul_pierwszy', 'edytor_zaczepu' ); } edytor_zaczepu ( $dane ) { return ($dane+1); } }
modul_drugi { konstruktor_lub_dowolna_funkcja { $moja_liczba = 500; wykonaj_zaczep ( 'liczba', $moja_liczba ); echo $moja_liczba; // pokaże 501 ponieważ zaczep wykona funkcję modul_pierwszy->edytor_zaczepu($dane) i ustawi zwrócone dane funkcji w zmiennej $moja_liczba } }
Jak powstają nowe funkcje oraz moduły Kernela?
Oczywiście buduję własne strony na tym frameworku i jeżeli coś stoi na drodze to poprawiam to lub dodaję nową funkcjonalność i publikuję na bieżąco na githubie.
Zawsze jednak jeżeli jesteś chętny/chętna do współpracy to na prawdę zapraszam, z chęcią przejrzę każdą poprawkę i dodam do projektu.
Niestety nie posiadam teraz żadnego zewnętrznego hostingu, dlatego strona testowa ( mój warsztat ) nie zawsze jest dostępny, ale wtedy kiedy będzie to zapraszam: http://194.29.181.186/tuxplace-cube/
To jedna ze stron która działa na frameworku.
Zapraszam do ocen, oraz do pomocy przy pisaniu kodu (wnoszeniu poprawek jak i funkcjonalności nowej)

PS. OpenWikiBlog dlatego, że projekt miał być małym mechanizmem podobnym do bloga - jedynie tworzenie i edytowanie podstron HTML razem z panelem administracyjnym ale się rozrosło

-- WebNuLL