Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [skrypt] "framework" OpenWikiBlog, Wolne oprogramowanie
Babcia@Stefa
post
Post #1





Grupa: Zarejestrowani
Postów: 654
Pomógł: 17
Dołączył: 19.03.2006
Skąd: z kosmosu ;)

Ostrzeżenie: (0%)
-----


Witam, ostatnio na własne potrzeby zacząłem pisać coś w czym będę się czuć swobodnie pisząc kolejne aplikacje internetowe, to tak zwany "szkielet".

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 ) (IMG:style_emoticons/default/smile.gif)

=== 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 (IMG:style_emoticons/default/smile.gif)

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

  1. $MODS['admin'] = array ( 'k_TRIGGERS' => array (array(1=>$_GET['page'], 2=>9))); // jeżeli $_GET['page'] == 9 to moduł zostanie załadowany
  2. $MODS['hooks'] = NuLL; // normalnie ładuje moduł
  3. $MODS['smarty'] = array ( 'caching' => false,
  4. 'cache_lifetime' => 120,
  5. 'template_dir' => 'websites/cube/templates',
  6. 'compile_dir' => 'websites/cube/templates_c',
  7. 'config_dir' => 'websites/cube/core',
  8. 'cache_dir' => 'websites/cube/cache' ); // ładuje moduł smarty z odpowiednimi argumentami
  9. $MODS['translator'] = array ( 'default_language' => 'english' ); // ładuje moduł translator z argumentami
  10. $MODS['mypage'] = array ( 'index' => 1 ); // ładuje mypage ze wskazaniem która strona to strona główna
  11. $MODS['menu'] = NuLL; // ładuje menu
  12. $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:
  1. modul_pierwszy {
  2. konstruktor_lub_dowolna_funkcja { // najlepiej konstruktor
  3. definiuj_zaczep ( 'liczba', 'modul_pierwszy', 'edytor_zaczepu' );
  4. }
  5.  
  6. edytor_zaczepu ( $dane ) {
  7. return ($dane+1);
  8. }
  9. }


  1. modul_drugi {
  2. konstruktor_lub_dowolna_funkcja {
  3. $moja_liczba = 500;
  4. echo $moja_liczba; // pokaże 500
  5. wykonaj_zaczep ( 'liczba', $moja_liczba );
  6. 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
  7. }
  8. }


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) (IMG:style_emoticons/default/smile.gif)

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 (IMG:style_emoticons/default/smile.gif)

-- WebNuLL

Ten post edytował Babcia@Stefa 1.09.2010, 13:31:44
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Zyx
post
Post #2





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

Ostrzeżenie: (0%)
-----


Małe info - poszczególne fragmenty mogą być adresowane do różnych rozmówców.

Ad. referencji -> po pierwsze, używanie referencji do "oszczędzania pamięci" i "zwiększenia wydajności" to jedno wielkie nieporozumienie z takiego prostego powodu, że PHP posiada wbudowany mechanizm leniwego kopiowania, tj. właściwa kopia robiona jest dopiero wtedy, gdy dane mają ulec modyfikacji. Gdy dane są pobierane "tylko do odczytu", odczytywana jest dokładnie ta sama wartość, a ponieważ PHP nie musi tworzyć dodatkowych struktur danych na utrzymywanie referencji, takie coś jest nie tylko szybsze, ale paradoksalnie oszczędniejsze pamięciowo. Ponadto nie realizujesz nawet tego, co piszesz, bo w wielu miejscach owszem, argumenty przekazujesz przez referencję, ale później już robisz zwykłe przypisanie.

Ad. systemu szablonów -> widzisz, gdybyś używał standardowego nazewnictwa, nie musiałbyś nic dostosowywać z nową wersją, chyba że pomiędzy wydaniami ze zmienionym pierwszym numerkiem. Korzystam z wielu różnych bibliotek, które właśnie dzięki temu, że zachowują pewne wspólne konwencje, mogą być bez problemu używane razem i aktualizacja sprowadza się w zasadzie do wgrania nowych plików. Natomiast czym jest standardowe nazewnictwo ->
- http://www.zyxist.com/pokaz.php/standaryzacja_php
- http://groups.google.com/group/php-standar...-proposal?pli=1

Ad. klasy tłumaczeń -> a co ma format PO czy "XML" (w cudzysłowiu, bo nie ma czegoś takiego, jak "format XML". XML to meta-język, w którym dopiero można jakiś język opisać) do MessageFormattera, kiedy jedno i drugie zajmuje się zupełnie innymi rzeczami?
- PO - składowanie i zarządzanie tekstami do tłumaczenia
- MessageFormatter - formatowanie konkretnej wiadomości
Jedno drugiego nie wyklucza - możesz mieć teksty w formacie MessageFormattera, który jest dużo dokładniejszy, niż printf() (zwłaszcza w takich rzeczach, jak np. obsługa liczby mnogiej), zapisane w pliku PO. W ogóle poczytaj sobie nieco o tej klasie, a zwłaszcza na jakiej bibliotece bazuje to rozszerzenie (i ilu producentów i aplikacji z niej korzysta), bo Twoje słowa zupełnie nie pokrywają się z rzeczywistością.

Ad. różnych "opcjonalnych dodatków" - moim zdaniem warto zastanowić się czy niektóre z takich dodatków faktycznie są potrzebne. Już kilkakrotnie przekonałem się, że czasem lepiej jest powiedzieć "ma być tak i koniec", ponieważ w przeciwnym wypadku będziesz miał na każdym kroku mnóstwo dylematów "OK, jak ten moduł jest wyłączony, to mogę to zrobić prosto, ale ponieważ gość może go sobie włączyć, wtedy muszę to przewidzieć i dopisać tu jeszcze 154 ify, by obsłużyć wszystkie możliwe kombinacje".

Ad. PHP 5.3 -> zanim webnull skończy ten "framework", jeszcze wody w Wiśle upłynie. Dziwne, że jakoś nikt nie ma oporów przed polecaniem przestrzeni nazw, tak jak inni nie mają oporów przed ich stosowaniem, a tu się czepiacie o jedną głupią klasę. A potem się będzie biadolenie na blogach, że "PHP 5.3 jest już tyle czasu, a wciąż kupa skryptów nie korzysta z jego dobrodziejstw", tak jak to z PHP 4 było. Zresztą, po co mają to wprowadzać na hostingach, skoro programiści nie znają nawet podstawowych informacji o tym, co w tej wersji wprowadzono i mają podejście, że "po co mają się uczyć, skoro hostingowcy tego nie wprowadzają"? To się nazywa samospełniającą się przepowiednią i ja osobiście nie mam zamiaru w niej brać udziału. Jak ktoś chce być zacofańcem, a potem na to samo zacofanie narzekać, to było mi miło, ja się mu kłaniać nie zamierzam.
Go to the top of the page
+Quote Post

Posty w temacie
- Babcia@Stefa   [skrypt] "framework" OpenWikiBlog   1.09.2010, 12:50:34
- - SHiP   Nie przeglądałem dokładnie ale jak wrócę z pracy t...   1.09.2010, 14:21:35
- - Spawnm   czemu w index.php masz session_start() ? query()...   1.09.2010, 14:37:04
|- - Babcia@Stefa   Cytat(Spawnm @ 1.09.2010, 14:37:04 ) ...   1.09.2010, 14:51:12
- - Zyx   Uwagi na szybko: 1. Jaki jest sens używania niest...   1.09.2010, 15:18:26
- - Babcia@Stefa   Cytat(Zyx)Po co Ci w tym i w wielu innych miejscac...   1.09.2010, 15:33:11
- - erix   Cytatklepiesz wszystko od A do Z, tymczasem PHP 5....   1.09.2010, 16:39:51
|- - SHiP   Cytat(erix @ 1.09.2010, 16:39:51 ) Ta...   1.09.2010, 18:45:15
- - Babcia@Stefa   Cytat(erix)Huh, domniemam że u Ciebie coś w stylu ...   1.09.2010, 17:48:47
- - mike   Zamiast komentować kod włóż wysiłek w jego poprawę...   1.09.2010, 18:02:37
|- - Babcia@Stefa   Cytat(mike @ 1.09.2010, 18:02:37 ) Za...   1.09.2010, 18:28:56
|- - phpion   Cytat(Babcia@Stefa @ 1.09.2010, 19:28...   1.09.2010, 18:38:18
|- - mike   Cytat(Babcia@Stefa @ 1.09.2010, 19:28...   1.09.2010, 19:36:56
- - Babcia@Stefa   Dzięki phpion, zapomniałem o "moim" stan...   1.09.2010, 18:41:55
- - Babcia@Stefa   Dzięki SHiP, poprawione. Wszelkie poprawki jakie ...   1.09.2010, 18:52:55
- - erix   CytatProszę zatem przeczytać cały post, nie tylko ...   1.09.2010, 19:18:13
- - Babcia@Stefa   Cytat(erix)Coś innego, czyli? Zachęć mnie. Podaj j...   1.09.2010, 19:24:05
- - SHiP   @erix: Podejrzewam, że so = shared object - http:/...   1.09.2010, 19:24:29
|- - phpion   Cytat(SHiP @ 1.09.2010, 20:24:29 ) je...   1.09.2010, 19:44:19
- - Babcia@Stefa   Cytat(SHiP)Po co ta zmienna $APP ? Nie potra...   1.09.2010, 19:35:42
- - SHiP   @mike: wcale tak nie jest. Niektórzy przyjmują, że...   1.09.2010, 19:48:59
- - erix   CytatNie muszę podawać argumentów, masz kod. No wł...   1.09.2010, 19:53:14
- - Zyx   Małe info - poszczególne fragmenty mogą być adreso...   1.09.2010, 20:15:23
- - mike   ~SHiP wybacz ale nazwiska sygnatariuszy manifestu ...   1.09.2010, 20:19:45
- - Babcia@Stefa   Cytat(SHiP)Pomijam fakt, że w tym projekcie część ...   1.09.2010, 20:48:05
- - SHiP   @mike: zgadzam się i sądzę, że ilość komentarzy na...   1.09.2010, 22:21:14
|- - Babcia@Stefa   Cytat(SHiP @ 1.09.2010, 22:21:14 ) @m...   2.09.2010, 17:56:11
- - nospor   a ja sie poczepiam trochę bazki [SQL] pobierz, pla...   2.09.2010, 20:01:08
- - erix   Cytat4) `restrictip` varchar(200) NOT NULL...   2.09.2010, 20:34:07
|- - Babcia@Stefa   Cytat(erix @ 2.09.2010, 19:34:07 ) Ju...   2.09.2010, 21:14:38
|- - mike   Cytat(Babcia@Stefa @ 2.09.2010, 22:14...   3.09.2010, 10:26:00
- - erix   Cytata ile hash ma znaków tego nie liczyłem narazi...   2.09.2010, 21:59:35


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 10.06.2026 - 10:10