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
SHiP
post
Post #2





Grupa: Zarejestrowani
Postów: 697
Pomógł: 47
Dołączył: 19.12.2003
Skąd: Lublin

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


@mike: zgadzam się i sądzę, że ilość komentarzy należy zmniejszać do minimum. Czasem jednak skomplikowanie algorytmu/wyrazenia regularnego etc. jest tak duże, że trzeba to opisać w kilku słowach (IMG:style_emoticons/default/winksmiley.jpg) . Po prostu są ludzie, którzy twierdzą inaczej.

@zyx: Czepiasz się szczegółów. Chodziło po prostu o trzymanie tłumaczeń w pliku PO lub w pliku xml(i tutaj np xliff). Wybacz ale Twój wcześniejszy post można było odebrać jakby php 5.3 miało wbudowany system tłumaczący. W dalszym ciągu jednak proszę o przykład, ponieważ klasa zastosowana przez Babcia@Stefa nie jest tragiczna, a obsługę MessageFormattera może w każdej chwili dodać(np gdy 5.3 będzie bardziej popularne).
Go to the top of the page
+Quote Post
Babcia@Stefa
post
Post #3





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

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


Cytat(SHiP @ 1.09.2010, 22:21:14 ) *
@mike: zgadzam się i sądzę, że ilość komentarzy należy zmniejszać do minimum. Czasem jednak skomplikowanie algorytmu/wyrazenia regularnego etc. jest tak duże, że trzeba to opisać w kilku słowach (IMG:style_emoticons/default/winksmiley.jpg) . Po prostu są ludzie, którzy twierdzą inaczej.

@zyx: Czepiasz się szczegółów. Chodziło po prostu o trzymanie tłumaczeń w pliku PO lub w pliku xml(i tutaj np xliff). Wybacz ale Twój wcześniejszy post można było odebrać jakby php 5.3 miało wbudowany system tłumaczący. W dalszym ciągu jednak proszę o przykład, ponieważ klasa zastosowana przez Babcia@Stefa nie jest tragiczna, a obsługę MessageFormattera może w każdej chwili dodać(np gdy 5.3 będzie bardziej popularne).


Jest coś takiego jak sprawdzanie wersji PHP przez skrypt (co może być jednak wyłączone na niektórych serwerach dlatego odpada), ale jest także class_exists które może sprawdzić czy klasa MessageFormattera istnieje - jeżeli tak to załadować i przygotować do używania a jeżeli nie to usuwać syntax MessageFormattera ( "{" i "}" ) wyrażeniami regularnymi.

-- WebNuLL

Ten post edytował Babcia@Stefa 2.09.2010, 17:56:52
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:11