Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

5 Stron V   1 2 3 > »   
Reply to this topicStart new topic
> [Framework] Rapide Framework, Framework MVC dla aplikacji PHP5
Prph
post 7.09.2006, 01:59:05
Post #1





Grupa: Zarejestrowani
Postów: 338
Pomógł: 2
Dołączył: 4.03.2006
Skąd: Łódź

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


Rapide Framework




Rapide Framework powstał na bazie rozwiązań stosowanych w kilku frameworkach. Organizację i sterowanie w dużej mierze oparto na Zend Framework. Kierowałem się przede wszystkim prostotą. Mojavi (tym bardziej Symphony) jest moim zdaniem zbyt rozległe. Po całej aplikacji krążą obiekty kontekstów, kontrolera głównego... Nie, nie - to nie jest to, czego szukałem.

Całe sterowanie w Rapide powierzono małemu i elastycznemu Front Kontrolerowi. Jądro podzielono na jak najmniejsze części pozwalające w przyszłości na szybką ich wymianę.

Na pierwsze spojrzenie Rapide działa identycznie jak Zend Framework. Jednak po głębszym zapoznaniu się z frameworkiem, okazuje się, że Rapide jest znacznie wygodniejsze.

Przede wszystkim Rapide poprawnie implementuje widok z MVC. W każdej chwili możemy zamienić widoki, aby prezentowane dane ukazały się np. w formacie CSV.

Ponadto wiele czynności zostało zautomatyzowanych, dzięki czemu nie musimy wczytywac konfiguracji do akcji, czy też martwić się o kontrolę dostępu.

Cechy frameworka
  • Implementacja MVC
  • Obsługa pomocników i appletów w widoku dzięki czemu szybko zamieścimy w aplikacji stałe elementy (takie jak menu) w pełni funkcjonalne (funkcjonalność zbliżona do kontrolera).
  • Kontrola dostępu na podstawie ACL i grupy użytkowników. Konfigurację przeprowadza się w pliku konfiguracyjnym kontrolera i polega ona na zdefiniowaniu grup, które mają dostęp lub nie.
Biblioteki dostarczane przez Rapide
  • Rapide_Controller
    Klasa bazowa dla kontrolerów. Zawiera szereg aliasów skracających czas tworzenie kontrolera.
  • Rapide_View
    Klasa widoku implementująca szablony php. Rapide dostarcza prostą
    oraz rozszerzoną klasę widoku, pozwalającą na dekorowanie treści o elementy stałe (np. stopka, menu).
  • Rapide_User
    Klasa danych sesyjnych. Umożliwia autentyfikacje użytkownika oraz składowanie danych w sesji.
    Zastępuje standardową tablicę $_SESSION. Umożliwia stosowanie handlerów, dzięki czemu sesja może
    być przechowywana w bazie danych.
  • Rapide_ACL
    Access Control List - system kontroli dostępu. Pozwala na definiowanie grup mająych dostęp (lub nie) do poszczególnych kontenerów (akcji).
  • Rapide_Registry
    Rejestr pozwalający na przechowywanie obiektów i wspódzielenie ich w całej aplikacji.
  • Rapide_Database_MySQL
    Sterownik bazy danych MySQL dostarczający prosty i szybki w użyciu interfejs zarządzający danymi w bazie.
  • Rapide_Language
    Prosta klasa języka. Dane przechowywane są w tablicach php.
  • Rapide_Validator
    Szereg klas z rodziny Rapide_Validator dostarczaja prostych i skutecznych mechanizmów
    walidacyjncyh dla danych.
  • Rapide_Form
    Klasa umożliwiająca szybki dostęp do danych przesłanych za pomocą formularzy. Obecnie bardzo skromna.
Zdaję sobie sprawę, że Rapide wcale nie musi być nadzwyczajnym frameworkiem. Napisałem go dla siebie. Zamieszczam go w sieci, ponieważ może przydać się osobom, które uczą się budowania frameworków.

Kod do pobrania: http://vgm.pl/adrianpawlikpl/rapide/

Tworzenie kontrolera

Kontrolery w aplikacji powinny dziedziczyć po abstrakcyjnej klasie Rapide_Controller. W zasadzie framework wymaga, aby kontrolery
implementowały interfejs Rapide_Controller_Interface.

Katalog kontrolerów definiowany jest w pliku konfiguracyjnym Rapide/config.php. Kontroler musi byź zapisany pod nazwą Kontroler.class.php.


Kontroler jest kontenerem dla wszystkich akcji. Dla przykładu: kontroler Nowosci będzie zawierał akcje Dodaj, Pokaz, Usun, Edytuj itd. Klasa kontrolera musi nosić nazwę Controller_Kontroler, natomiast metody będące akcjami - AkcjaAction.


Przykładowy kontroler

  1. <?php
  2. class Controller_Example extends Rapide_Controller
  3. {
  4. public function ExampleAction()
  5. {
  6. echo 'Example action from controller Example';
  7. }
  8. }
  9. ?>


Teraz wystarczy w przeglądarce wpisać adres: http://TwojAdres.pl/www/?controller=Exampl...;action=Example.
Rezultatem pracy frameworka będzie wyżej podany komunikat.

Metody klasy Rapide_Controller
Kontroler bazowy w Rapide został tak zaprojektowany, aby uprościć i przyśpieszyć budowę aplikacji. Poniższa lista zawiera metody, których warto używać:

getParameter($sParameter)
Zwraca parametr GET przekazany w adresie do kontrolera. W przypadku braku parametru wzraca null.


hasParameter($sParameter)
Zwraca wartość logiczną informującą, czy istnieje parametr GET przekazany w adresie.


getConfig()
Zwraca obiekt konfiguracji dla danego kontrolera. Dane konfiguracyjne pobierane są
z tablic php zapisanych w katalogu konfiguracji kontrolerów.


getView($sView)
Zwraca obiekt danego widoku. Widok pobierany jest z katalogu widoków.


getModel($sModel)
Zwraca obiekt wybranego modelu. Model pobierany jest z katalogu widoków.


getUser()
Zwraca obiekt User, który pozwala na zapis danych sesyjnych.


getLanguage()
Zwraca obiekt języka. Dane językowe dla kontrolera ładowane są wcześniej w pluginie
Rapide_Plugin_Language.


forward($sController = null, $sAction = null, array $aParameters = array())
Pozwala na określenie następnej akcji do wykonania. Pozostawienie wartości pustych spowoduje
forwarodwanie na domyślny kontroler.


redirect($sController = null, $sAction = null, array $aParameters = array())
Pozwala wykonać przekierowanie na inną akcję. Pozostawienie wartości pustych spowoduje
przekierowanie na domyślny kontroler.


Każdy kontroler posiada domyślną akcję Index. Jest ona wywoływana, jeżeli akcja nie zostanie
określona.


Przykładowe kody

Kontroler User - akcja zmiany hasla dla zalogowanego uzytkownika

  1. <?php
  2.  
  3. class Controller_User extends Rapide_Controller
  4. {
  5. public function PasswordAction()
  6. {
  7. $oForm = new Rapide_Form;
  8.  
  9. if(!$oForm->isSubmitted())
  10. return $this->getView('UserPassword');
  11.  
  12. $sPassword = $oForm->get('password');
  13. $sPassword2 = $oForm->get('password2');
  14.  
  15. if($sPassword != $sPassword2)
  16. {
  17. $aErrors[] = $this->getLanguage('Controller', 'User', 'Password', 'Error', 'Match');
  18.  
  19. $oView = $this->getView('UserPassword');
  20. $oView->errors = $aErrors;
  21.  
  22. return $oView;
  23. }
  24.  
  25. $iUser = $this->getUser()->id;
  26.  
  27. $oUser = $this->getModel('User');
  28. $oUser->load($iUser);
  29.  
  30. $oUser->password($sPassword);
  31. $oUser->save();
  32.  
  33. $this->redirect();
  34. }
  35. }
  36.  
  37. ?>


Widok i szablon widoku dla tej akcji

  1. <?php
  2. class View_UserPassword extends Rapide_View_Html_Extended
  3. {
  4. public function __construct()
  5. {
  6. $this->setTemplate('UserPassword');
  7. }
  8. }
  9. ?>


  1. <?php $this->title = $this->lang('Controller', 'User', 'Password', 'Title'); ?>
  2.  
  3. <h1><?= $this->lang('Controller', 'User', 'Password', 'Header') ?></h1>
  4.  
  5. <?php require_once('formErrors.inc.php'); ?>
  6.  
  7. <form action="" method="post">
  8. <p>
  9. <?= $this->lang('Controller', 'User', 'Password', 'Password') ?>: <br/>
  10. <input type="password" name="password">
  11. </p>
  12.  
  13. <p>
  14. <?= $this->lang('Controller', 'User', 'Password', 'Password2') ?>: <br/>
  15. <input type="password" name="password2">
  16. </p>
  17.  
  18. <p>
  19. <input type="submit" name="submit" value="<?= $this->lang('Form', 'Submit') ?>">
  20. </p>
  21. </form>


Jak już wspomniałem - framework napisałem dla siebie. Mam nadzieję, że komuś może się przydać, chociaż w celach edukacyjnych.

Pozdrawiam, Adrian J. Pawlik.

Ten post edytował Prph 5.11.2006, 19:56:50
Go to the top of the page
+Quote Post
Quickest
post 7.09.2006, 14:15:48
Post #2





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 7.09.2006

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


Świetny framework - podoba mi się... bardzo ciekawe rozwiązania w nim zastosowałeś, gratuluję pomysłów i przemyśleń! smile.gif

Przeglądam go już troszkę i kilka pytań mi się narzuciło, mianowicie...

Jak działa u Ciebie dokładnie:
- Access Control List - system kontroli dostępu - mógłbyś podać jakiś przykład w kodzie jak to działa i jak to definujesz w którym miejscu gotowej aplikacji?

- interesuje mnie jeszcze działanie łańcucha akcji bo też widzę, że jest ciekawie rozwiązane... czy dzielisz akcje na akcje logiczne i akcje widoki? Czy po prostu gdy ostatnia akcja się zakończy, to przekazuje ona dane do uaktywnionego przez nią widoku. Jak to u Ciebie dokładnie wygląda z akcją ostatnią wyświetlającą wynik działania akcji wcześniejszych?
Może też jakiś przykładowy kod.

- jaka jest dokładna różnica między metodą forward a redirect klasy Rapide_Controller, czy nie lepiej zastosować tylko samą metodę forward? Możesz mi wytłumaczyć, hmm... w jakiś prosy sposób cel tego, bo do końca nie rozumiem tej kwestii.

Ten post edytował Quickest 7.09.2006, 14:17:42
Go to the top of the page
+Quote Post
hwao
post 7.09.2006, 15:11:07
Post #3


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




Wyglada praktycznie tak samo jak Zend Framework. Kod jest ładnie napisany, no ale jest bardzo wzorowany na wspomnianym framework'u.

@
Quickest: Pewnie tak samo jak w ZF, forward zmienia kacje a redirect zmienia akcje z kontrolerem.
Go to the top of the page
+Quote Post
Turgon
post 7.09.2006, 15:26:20
Post #4





Grupa: Zarejestrowani
Postów: 800
Pomógł: 0
Dołączył: 26.11.2005
Skąd: Nowy Sącz

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


Rzut na sam widok katalogów wygląda jak Zend.
Powiem szczerze, że też wzoruje się na zorganizowaniu Zenda, jednakże ja piszę trochę inaczej. Dopisuje obiekty których wyżej wspomniany framework nie posiada. Mam też inny styl. Upraszczam go maksymalnie.


--------------------
Jah Music Is On My Mind !
Go to the top of the page
+Quote Post
Prph
post 7.09.2006, 15:49:05
Post #5





Grupa: Zarejestrowani
Postów: 338
Pomógł: 2
Dołączył: 4.03.2006
Skąd: Łódź

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


Cytat(Quickest @ 7.09.2006, 13:15:48 ) *
Jak działa u Ciebie dokładnie:
- Access Control List - system kontroli dostępu - mógłbyś podać jakiś przykład w kodzie jak to działa i jak to definujesz w którym miejscu gotowej aplikacji?


System kontroli prezentowany jest przez klase ACL. Klasa acl przyjmuje definicje dostepu, ktore reprezentowane sa przez klase ACL_Access. Wszystko przeprowadza plugin: Rapide_Plugin_ACL. Jego dzialanie jest nastepujace:
1. Pobierz informacje z konfiguracji kontrolera jakie grupy maja miec dostep.
2. Dodaj definicje Access do ACLa
3. Pobierz informacje, ktore sa zablokowane.
4. Dodaj definicje do ACLa.
5. ACL sprawdza czy obecny uzytkownik ma prawa do danej akcji, jezeli nie - zwraca akcje Error403.


Przejrzyj kod ow plugina - wszystko jest ladnie zaprezentowane. Pamietaj, ze konfiguracja kontrolera trzymana jest w katalogu Configs jako plik z tablica php.

Cytat(Quickest @ 7.09.2006, 13:15:48 ) *
- interesuje mnie jeszcze działanie łańcucha akcji bo też widzę, że jest ciekawie rozwiązane... czy dzielisz akcje na akcje logiczne i akcje widoki? Czy po prostu gdy ostatnia akcja się zakończy, to przekazuje ona dane do uaktywnionego przez nią widoku. Jak to u Ciebie dokładnie wygląda z akcją ostatnią wyświetlającą wynik działania akcji wcześniejszych?
Może też jakiś przykładowy kod.


Nie mam podzialu na akcje. Jezeli ktos wyswietli widok a nastepnie ustawia kolejna akcje - na ekranie dostanie wynik 2 akcji. O tym nalezy pamietac. Jezeli korzystamy z widoku, to w chwili kiedy chcemy go wyswietli, zwyczajnie zwracamy go. Zobacz przykladowe kody - tam zwracam widok, a Rapide go wyswietla.

Cytat(Quickest @ 7.09.2006, 13:15:48 ) *
- jaka jest dokładna różnica między metodą forward a redirect klasy Rapide_Controller, czy nie lepiej zastosować tylko samą metodę forward? Możesz mi wytłumaczyć, hmm... w jakiś prosy sposób cel tego, bo do końca nie rozumiem tej kwestii.


Forward: Przekaze tzw. Token (blasa zawierajaca kontroler, akcje i parametry akcji). Rapide uruchomi nastepna akcje. Nie nastapi przeladowanie strony.

Redirect: Nie przekazuje tokena - wysyla naglowek Location do przegladarki. Przegladarka wtedy wlaczy inna strone.

Kiedy stosowac jedno, kiedy drugie? W sumie i jedno i drugie mozna stosowac zawsze. Redirect powodue przeladowanie strony, forward nie. Ale po redirect na pasku przegladarki mamy adres obecnej akcji (tej na ktora przekierowalismy). Po forward na pasku znajduje sie ten sam adres - starej akcji.

@hwao, @Turgon: Tak, jak wspomnailem wzorowalem go na Zend Framework. Oto powody:

1. Struktura katalogow - swietne rozwiazanie, latwy __autoload,
2. Male, elastyczne klasy
3. Te klasy wspoldzialaja ze soba naprawde luzno.

Wcale nie oznacza, ze Rapide jest skopiowanym kodem z Zenda. Wiele kodu sie zgadza, a jednak nie wzorowalem sie na Zend. Na pewno zaczerpnalem pomysly z: Front kontroler, dispatcherem, pluginami i konfigiem. No pomysl na uzycie helperow takze zobaczylem w Zend. W zasadzie napisalem helpery, a pozneij zobaczylem ze w Zend jest to zrobione niemal idenycznie.

Pozdrawiam, Adrian.
Go to the top of the page
+Quote Post
splatch
post 7.09.2006, 18:13:49
Post #6





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

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


Przede wszystkim - brak jakiejkolwiek dokumentacji w kodzie strasznie utrudnia jego przeglądanie.. pomijam fakt, że póki co jeszcze brakuje przykładowej aplikacji

Cytat(Prph @ 7.09.2006, 02:59:05 ) *
Rapide Framework powstał na bazie rozwiązań stosowanych w kilku frameworkach. Organizację i sterowanie w dużej mierze oparto na Zend Framework. Kierowałem się przede wszystkim prostotą. Mojavi (tym bardziej Symphony) jest moim zdaniem zbyt rozległe. Po całej aplikacji krążą obiekty kontekstów, kontrolera głównego... Nie, nie - to nie jest to, czego szukałem.

Kontekst. Jeden kontekst. W Mojavi 3.0 kontekst był singletonem. W 4.0 nie było go wogóle, w jego miejsce był użyty ServiceLocator.

Cytat(Prph @ 7.09.2006, 02:59:05 ) *
Całe sterowanie w Rapide powierzono małemu i elastycznemu Front Kontrolerowi. Jądro podzielono na jak najmniejsze części pozwalające w przyszłości na szybką ich wymianę.

To niewątpliwa zaleta. Widziałem, że używasz interfejsów w miejsce klas abstrakcyjnych. Troche mnie dziwi i zaskakuje konwencja nazewnicza i aż takie wyróżnienie interfejsów. Z mojego punktu widzenia nie ma większego sensu aż tak rozbijać nazw, bo tworzą się przez to strasznie długie łańcuchy. Czy nie lepiej użyć
Rapide_Router zamiast Rapide_Router_Interface?

Cytat(Prph @ 7.09.2006, 02:59:05 ) *
Przede wszystkim Rapide poprawnie implementuje widok z MVC. W każdej chwili możemy zamienić widoki, aby prezentowane dane ukazały się np. w formacie CSV.

Widok widokiem, implementacji MVC jest wiele. smile.gif Nie wiem czy zauważyłeś, ale w Mojavi 4 nie było konieczności dziedziczenia ze SmartyView/HtmlView, ponieważ były użyte Renderery. Dzięki nim możesz w bardzo prosty sposób tworzyć różne fragmenty stron w wielu technologiach. U Ciebie widzę jeszcze zaszłość po Mojavi 3, gdzie dziedziczenie jest wymuszone. Przydatną rzeczą jest również rozbicie widoków w zależności od content-type. Jest to bardzo fajna sprawa, ponieważ w połączeniu z routes, które powinny dawać możliwość zmiany typu outputu daje to nieprawdopodobne wręcz możliwości.
Co do Apletów - rozważyć należy czy to jest element widoku? Myślę, że Aplet jest mimo wszystko częścią, która jest bardziej zbliżona kontrolerowi. Dlaczego? W chwili obecnej decyzję o tym, co ma się stać z Apletem pozostawiasz widokowi. To niedobrze, zgodnie z filozofią OOP obiekt powinien wiedzieć sam co ma ze sobą zrobić. Rozważ to czy nie użyć "layoutu" w połączeniu z rejestrowaniem Apletów podatnych na zdażenia. W Javie jest taka technologia, która zwie się Portlety. Jest to rozszeżenie a właściwie zawężenie Servletów. Na portlecie można wykonać kilka akcji - hide/show, valid etc.

Cytat(Prph @ 7.09.2006, 02:59:05 ) *
Ponadto wiele czynności zostało zautomatyzowanych, dzięki czemu nie musimy wczytywac konfiguracji do akcji, czy też martwić się o kontrolę dostępu.

Z tym, że póki co przykładów brak winksmiley.jpg

Cytat(Prph @ 7.09.2006, 02:59:05 ) *
[*]Rapide_User
Klasa danych sesyjnych. Umożliwia autentyfikacje użytkownika oraz składowanie danych w sesji.
Zastępuje standardową tablicę $_SESSION. Umożliwia stosowanie handlerów, dzięki czemu sesja może
być przechowywana w bazie danych.

To nie jest poprawne podejście. User w Mojavi to nie jest handler sesji. To są dane obecnego użytkownika, jego sesja. To, jakiego handlera użyje programista nie powinno być zależne od frameworka. Fakt, framework może oferować taką funkcjonalność, ale nie w tak ścisłym związku z sesją.

Cytat(Prph @ 7.09.2006, 02:59:05 ) *
[*]Rapide_ACL
Access Control List - system kontroli dostępu. Pozwala na definiowanie grup mająych dostęp (lub nie) do poszczególnych kontenerów (akcji).

Przykład?

Cytat(Prph @ 7.09.2006, 02:59:05 ) *
[*]Rapide_Database_MySQL
Sterownik bazy danych MySQL dostarczający prosty i szybki w użyciu interfejs zarządzający danymi w bazie.

Myślę, że w chwili obecnej tworzenie kolejnego poziomu abstrakcji do bazy danych to pomyłka. W chwili, gdy PDO jest i na pewno zostanie powinieneś bardziej się skupić na jego rozszeżaniu. Ponadto PDO jest znacznie szybsze niż natywne funkcje php.

Cytat(Prph @ 7.09.2006, 02:59:05 ) *
[*]Rapide_Language
Prosta klasa języka. Dane przechowywane są w tablicach php.

A może obsługa gettexta?

Cytat(Prph @ 7.09.2006, 02:59:05 ) *
[*]Rapide_Validator
Szereg klas z rodziny Rapide_Validator dostarczaja prostych i skutecznych mechanizmów
walidacyjncyh dla danych.

Przykład? Konfiguracja?

Cytat(Prph @ 7.09.2006, 02:59:05 ) *
[*]Rapide_Form
Klasa umożliwiająca szybki dostęp do danych przesłanych za pomocą formularzy. Obecnie bardzo skromna.
[/list]

Przykład? Inna sprawa to to, że nie ma sensu wiązać się aż tak bardzo z tą klasą. Dlaczego? Lepsze jest dostarczenie mechanizmów, które ułatwiają prezentacje błędów niż wiązanie widoku z formularzem.
Po co mi klasa, która tylko i wyłącznie tworzy mi input? Po to by określić validator? Wolę to wyłączyć do oddzielnego pliku i tam to trzymać, tak bym mógł w jednym miejscu zmieniać zasady sprawdzania np nazwiska.

Mam nadzieje, że te uwagi będą dla Ciebie przydatne i dzięki nim Twój framework stanie się lepszy.

Pozdrawiam,


--------------------
Łukasz Dywicki
Independent Java and open source software consultant.
Blog - Java, OSGi, integracja oprogramowania..
Go to the top of the page
+Quote Post
Quickest
post 7.09.2006, 18:18:32
Post #7





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 7.09.2006

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


Nadal nie rozumiem, tych praw dostępu, może dlatego, że pierwszy raz mam z tym do czynienia...
Jak wygląda taka konfiguracja pliku kontrolera?questionmark.gif Przykład?

Przypuśmy plik konfiguracyjny kontrollera z przykładu:

np. /application/Config/Controller/example.php

  1. <?php
  2. $aConfig = array(array('example' => array('Security' => array('Groups' =>
  3. array('Deny' => array('banned_user', 'moderators'), 'Allow' => array('admins'))))));
  4. ?>


Tak wygląda przykładowy plik konfiguracyjny?questionmark.gif yyy...? worriedsmiley.gif

hmm... może za dużo nad tym siedzę i mam już mętlik w głowie i wszystko mi się miesza. Mianowicie nie rozumiem jednej rzeczy. ... na podstawie jakich danych user jest identyfikowany czy może mieć dostęp do danej metody?

Jak rozumieć metody: isAuthenticated() oraz setAuthenticated() w klasie Rapide_Userquestionmark.gif?
Czy one nie powinny być wywoływane w trakcie sprawdzania danych user'a o zalogowaniu?questionmark.gif
Albo może inne pytanie... jeżeli autoryzacja się nie powiedzie to przekierowujemy usera na akcję z formularzem logowania? worriedsmiley.gif

Ehh... wszystko już mi się to miesza jak widać blink.gif , może ktoś mi rzuci światło na to, jak to dokładnie wygląda np. z akcją logowania usera na stronę w powyższym frameworku sad.gif

Ten post edytował Quickest 7.09.2006, 18:21:55
Go to the top of the page
+Quote Post
Prph
post 7.09.2006, 19:06:38
Post #8





Grupa: Zarejestrowani
Postów: 338
Pomógł: 2
Dołączył: 4.03.2006
Skąd: Łódź

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


Wszystko przez to ze nie udostepnilem dokumentacji. Nie umiem pisac dokumentacji :/

Konfiguracja kontroli dostępu

Konfiguracja jest zapisywana w pliku konfiguracyjnym kontrolera. Domyslnie jest to application/Config/Controller/Nazwa.php

Przykladowy plik wygląda następująco:

  1. <?php
  2.  
  3. $aConfig['Actions']['Password'] = array
  4. (
  5. 'Security' => array
  6. (
  7. 'Groups' = array
  8. (
  9. 'Allow' => array('admin', 'moderator'),
  10. 'Deny' => array('nieproszony_gosc')
  11. )
  12. )
  13. );
  14.  
  15. ?>


W tym przypadku dostęp będą mieli użytkownicy którzy posiadają grupy admin i moderator, ale nie posiadają grupy nieproszony_gosc. Czyli np. jezeli mamy uzytkownika Adrian z grupą moderator, to on uzyska dostęp. Jeżeli mamy użytkownika Joasia z grupami admin i nieproszony_gosc, to Joasia nie dostanie dostępu.

Autentyfikacja uzytkownika odbywa sie w klasie Rapide_User. Za pomoca metody isAuthenticated() klasa informuje, czy użytkownik sie zalogował (o tym za chwile). Ponadto metoda getGroups zwraca tablice z grupami, jakie ma użytkownik.

Można zdefiniować, aby dana akcja wymagała jedynie zalogowania użytkownika. Czyli nie musi ustawiać jakie grupy mają dostęp. Wystarczy wówczas zapisać taką konfigurację:


  1. <?php
  2. $aConfig['Actions']['Password'] = array
  3. (
  4. 'Security' => true
  5. );
  6. ?>


Wartosc Security moze byc dowolna. Wazne zeby sekcja Security byla utworzona.

Oczywiście, wszystko nabiera sensu w chwili, kiedy użytkownik się zaloguje. Niżej przedstawiam akcję logowania:

  1. <?php
  2.  
  3. class Controller_Auth extends Rapide_Controller
  4. {
  5. public function LoginAction()
  6. {
  7. $oForm = new Rapide_Form;
  8.  
  9. /*
  10. Check the form. If it has not been submitted,
  11. display the form.
  12. */
  13.  
  14. if(!$oForm->isSubmitted())
  15. {
  16. return $this->getView('AuthLogin');
  17. }
  18.  
  19. $sLogin = $oForm->get('login');
  20. $sPassword = $oForm->get('password');
  21.  
  22. /*
  23.  Check the data and display the form on failure.
  24. */
  25.  
  26. if(empty($sLogin) || empty($sPassword))
  27. {
  28. $aErrors[] = $this->getLanguage()->get('Controller', 'Auth', 'Login', 'Error', 'Empty');
  29.  
  30. $oView = $this->getView('AuthLogin');
  31. $oView->errors = $aErrors;
  32.  
  33. return $oView;
  34. }
  35.  
  36. /*
  37.  Check the login using DAO.
  38. */
  39.  
  40. $oUserDAO = $this->getModel('UserDAO');
  41.  
  42. $iUser = $oUserDAO->getIdByLogin($sLogin, $sPassword);
  43.  
  44. if(!$iUser)
  45. {
  46. $aErrors[] = $this->getLanguage()->get('Controller', 'Auth', 'Login', 'Error', 'Data');
  47.  
  48. $oView = $this->getView('AuthLogin');
  49. $oView->errors = $aErrors;
  50.  
  51. return $oView;
  52. }
  53.  
  54. /*
  55.  Everything is correct. Set the user and forward
  56.  to default action.
  57. */
  58.  
  59. $oUserModel = $this->getModel('User');
  60. $oUserModel->load($iUser);
  61.  
  62. $aGroups = $oUserModel->groups();
  63.  
  64. $oUser = $this->getUser();
  65. $oUser->setAuthenticated();
  66. $oUser->setGroups($aGroups);
  67.  
  68. // Set additional data
  69.  
  70. $oUser->id = $iUser;
  71. $oUser->firstName = $oUserModel->firstName();
  72. $oUser->lastName = $oUserModel->lastName();
  73.  
  74. $this->forward();
  75. }
  76.  
  77. public function logoutAction()
  78. {
  79. $this->getUser()->destroy();
  80. $this->forward();
  81. }
  82. }
  83.  
  84. ?>


Ostatnie linie akcji Login przedstawiaja sposob autentykacji użytkownika oraz ustawienie dodatkowych informaacji (np imie i nazwisko).
Go to the top of the page
+Quote Post
Quickest
post 7.09.2006, 21:41:51
Post #9





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 7.09.2006

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


Teraz już wszystko jasne jak słońce, gdy zobaczyłem kod smile.gif
Zaczyna mi się coraz bardziej podobać ten framework :roll2:

Jeszcze dwa pytania jakie mi się nasuwają to:

Cytat(Prph @ 7.09.2006, 02:59:05 ) *
[*]Obsługa pomocników i appletów w widoku dzięki czemu szybko zamieścimy w aplikacji stałe elementy (takie jak menu) w pełni funkcjonalne (funkcjonalność zbliżona do kontrolera).


no właśnie... a interesują mnie jak zamieścić stałe elementy typu np. pytania ankiety itp. tzn. jak dokładnie działają Applety, jak są obsługiwane?questionmark.gif worriedsmiley.gif

I kolejne pytanie z serii "sto pytań do twórcy"... w którym miejscu wykorzystujesz Rapid_Log w frameworku i też może mały przykład?
Go to the top of the page
+Quote Post
Prph
post 8.09.2006, 09:07:52
Post #10





Grupa: Zarejestrowani
Postów: 338
Pomógł: 2
Dołączył: 4.03.2006
Skąd: Łódź

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


W szablonie mamy możliwość używania tzw. pomocników. Pomocnicy, jak wskazuje nazwa, pomagają nam w generowaniu szablonu. Pomocnikiem może być np. metoda generująca ładną datę, albo przycisk.

W Rapdie pomocnicy są obiektami. Ich klasy znajdują się w katalogu Rapide/View/Helper/. Dostep do pomocnika jest następujący:

  1. <?php
  2. // plik z szablonem:
  3.  
  4. echo $this->url('Kontroler', 'JakasAkcja', array('paremetr' => 'wartosc'));
  5. ?>


Url jest pomocnikiem prosto z Rapide. Pierwszy parametr, to kontroler, drugi akcja, a trzeci to tablica asocjacyjna parametrow. Wynik bedzie nastepujacy:



W ten sposob mamy pewnosc ze zawsze wygenerujemy poprawny adres url, zgodny z naszym Routerem (Router jest obiektem, ktory wyciaga z adresu nazwe kontroler, akjce i parametry - czyli parsuje przejazany adres url).

Jak tworzyc wlasne klasy pomocnikow?

1. Utworz plik o nazwie Pomocnik.class.php w katalogu Rapide/Rapide/View/Helper lub application/View/Helper/.
2. Nazwa klasy pomocnika musi byc w formacie View_Helper_Pomocnik.
3. klasa musi posiadac metode execute, do ktorej przejazane zostana argumenty.

Przyklad pomocnika

  1. <?php
  2.  
  3. class Rapide_View_Helper_Url extends Rapide_View_Helper
  4. {
  5. public function execute($sController = null, $sAction = null, array $aParameters = array())
  6. {
  7. return Rapide_Controller_Front::getInstance()
  8.  ->getRouter()
  9.  ->url($sController, $sAction, $aParameters);
  10. }
  11. }
  12.  
  13. ?>


A i dodam, ze helper zapisany w katalogu Rapide, nie aplikacji musi miec nazwe klasy w formacie Rapide_View_Helper.

Aplety

Do osadzania stalych elementow, jak menu, sonda etc uzywa sie apletow. Aplet ma funkcjinalnosc zblizona do kontrolera - ma dostep do widoku, modelu, konfiguracji, Usera (sesji) i jezyka.

Aplety zapisujemy podobnie jak helpery, ale tylko w katalogu application/View/Applet/
Plik musi nazywac sie MojAplet.class.php. Nazwa klasy: View_Applet_MojAplet.

Przykladowy aplet:

  1. <?php
  2.  
  3. class View_Applet_User extends Rapide_View_Applet
  4. {
  5. public function execute()
  6. {
  7. if(!$this->getUser()->isAuthenticated())
  8. return;
  9.  
  10. $oView = $this->getView('Applet');
  11. $oView->setTemplate('AppletUser');
  12.  
  13. return $oView->fetch();
  14. }
  15. }
  16.  
  17. ?>


NAlezy pamietac, ze Aplet nie wyswietla szablonu - zwraca go metoda Fetch.
Aplet ma podobne metody jak kontroler. Aplety dzidziczymy z Rapide_View_Applet i polecam zapoznac sie z ta klasa - jest prosta, wiadac metody. Konfiguracje Apletu zapisujemy tak jak kontrolera, ale w katalogu Config/Applet/

Dlaczego stosuje tutaj setTemplate? Normalnie powinienem zrovic to w widoku, bo co interesuje Kontrolera jaki jest szablon. nie on wyswietla dane, tylko widok i to widok powinien wiedziec. Ale w przypadku apletow mozna tak zrobic, bo:

1. Aplety i tak najczesciej beda HTML.
2. Po co robic 10 widokow, mozna zrobic jeden Applet i ustawiac w nim szablon.
3. Aplet jest na tyle mala czescia aplikacji, ze mozna w nim ustawiac szablon - dla prostosty.

Dodam, ze aplet ma jedna metode - Execute i to ona zosanie wywolana.

Z szablonu aplet wywoluje sie nastepujaco:
  1. <?php
  2. // korzystamy z pomocnika Applet:
  3.  
  4. echo $this->applet('MenuBoczne');
  5. ?>



Pozdrawiam, Adrian.

Ten post edytował Prph 8.09.2006, 09:08:36
Go to the top of the page
+Quote Post
NuLL
post 9.09.2006, 02:03:49
Post #11





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

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


A tak na raty skaczac po plikach snitch.gif
form.class.php
  1. <?php
  2. private function _trim(array & $aArray)
  3. {
  4. foreach($aArray as $sKey => $mValue)
  5. {
  6. if(is_string($mValue))
  7. {
  8. $aArray[$sKey] = trim($mValue);
  9. }
  10. }
  11. }
  12. ?>

array_map" title="Zobacz w manualu php" target="_manual - piszac frame'a przydaje sie b.dobra znajomosc samego php

File.class.php - kontrolujesz czy $_FILES zawiera dany klucz - czyli z klasy formularza mam zwracac wartosc o niestniejacym indeksie questionmark.gif Rozumiem pikne E_WARNING questionmark.gif

class Rapide_Util_Syntaxer_Php - z php wywalili f-cje highlight_ questionmark.gif Ja nic nie wiem rolleyes.gif

Raz z kodzie stosujesz array_key_exists raz isset - zdecyduj sie winksmiley.jpg

Ten post edytował NuLL 9.09.2006, 02:04:26


--------------------
Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
Go to the top of the page
+Quote Post
Prph
post 9.09.2006, 07:58:36
Post #12





Grupa: Zarejestrowani
Postów: 338
Pomógł: 2
Dołączył: 4.03.2006
Skąd: Łódź

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


Cytat(NuLL @ 9.09.2006, 01:03:49 ) *
array_map" title="Zobacz w manualu php" target="_manual - piszac frame'a przydaje sie b.dobra znajomosc samego php


Racja, jest array_map. Zapomnialem o nim worriedsmiley.gif

Cytat(NuLL @ 9.09.2006, 01:03:49 ) *
File.class.php - kontrolujesz czy $_FILES zawiera dany klucz - czyli z klasy formularza mam zwracac wartosc o niestniejacym indeksie questionmark.gif Rozumiem pikne E_WARNING questionmark.gif

Jezelu juz to NOTICE, ale nie bardzo Cie rozumiem. piknie przy poraniu, czy przy sprawdzaniu? Przy tym drugim na pewno nie piknie.

Cytat(NuLL @ 9.09.2006, 01:03:49 ) *
class Rapide_Util_Syntaxer_Php - z php wywalili f-cje highlight_ questionmark.gif Ja nic nie wiem rolleyes.gif

A tu mnie zaskoczyles (mile). O tym nie wiedzialem. Ciekawa funkcja, chociaz piszac cos wlasnego mam kontrole nad kolorami.

Cytat(NuLL @ 9.09.2006, 01:03:49 ) *
Raz z kodzie stosujesz array_key_exists raz isset - zdecyduj sie winksmiley.jpg


Tak wiem. Jest jeszcze kilka rzeczy w ktorch nie jestem konsekwentny, ale to oczywiscie jest do poprawy.

Dziekuje za uwagi NuLL.

Pozdrawiam, Adrian.
Go to the top of the page
+Quote Post
hwao
post 9.09.2006, 08:17:10
Post #13


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




Rapide_Util_Syntaxer_Php

Zaskoczyłeś mnie... rozumie sens pisania takiej funkcji do SQL (ostanio taka pisalem) ale dla php?

php udostepnia 2 mechanizmy, jeden to tokenizer a drugi to wyzej wspomniany highlight_string/file w 1 mozesz dodolnie pokolorowac, w 2 masz tez sporo pole manewru, gdyz mozesz ustawic sobie jaki chcesz kolor (tylko tam masz juz pare sekcji).

Cytat
Raz z kodzie stosujesz array_key_exists raz isset - zdecyduj sie winksmiley.jpg

isSet" title="Zobacz w manualu php" target="_manual() jest sporo szybszy (pare razu) od array_key_exists" title="Zobacz w manualu php" target="_manual()
Go to the top of the page
+Quote Post
seaquest
post 9.09.2006, 08:21:06
Post #14





Grupa: Przyjaciele php.pl
Postów: 790
Pomógł: 7
Dołączył: 6.02.2003
Skąd: Polska

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


Cytat(Prph)
A tu mnie zaskoczyles (mile). O tym nie wiedzialem. Ciekawa funkcja, chociaz piszac cos wlasnego mam kontrole nad kolorami.


A w highlight nie masz? Poza tym Twoja klasa na pewno robi to dużo wolniej niż funkcja.


--------------------
Michał Płachta
Warsztat: Mac OS X Leopard, PostgreSQL, Text Mate, Retrospectiva + SVN
Go to the top of the page
+Quote Post
Prph
post 9.09.2006, 08:58:38
Post #15





Grupa: Zarejestrowani
Postów: 338
Pomógł: 2
Dołączył: 4.03.2006
Skąd: Łódź

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


@hwao: dzieki za informacje. Mialem pozniej zabrac sie za przetesotwanie obu funkcji.

@seaquest: w wolnej chwili zapoznam sie highlightem. Jak wspomnialem po prostu nie wieedzialem, ze w php jest taka funkcja. Chociaz cos kojarze. No nie wazne... zapomnialem o niej. Dziekuje za informacje.

Adrian.
Go to the top of the page
+Quote Post
thornag
post 11.09.2006, 12:37:02
Post #16





Grupa: Zarejestrowani
Postów: 504
Pomógł: 2
Dołączył: 31.03.2006
Skąd: Londyn

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


Ja am takie pytanie:

Tutaj odwolujemy sie do metody klasy rapide jak do metody statycznej
  1. <?php
  2. $oController = Rapide::getController($oToken->getController());
  3. ?>


A tak wyglada deklaracja tej metody:
  1. <?php
  2. public function getController($sController)
  3. {
  4. if(!self::controllerExists($sController))
  5. {
  6. $sError = sprintf('Controller %s does not exist', $sController);
  7. throw new Rapide_Exception($sError);
  8. }
  9.  
  10. /**
  11.  * Attention: Controller's file loaded in self::controllerExists().
  12.  */
  13.  
  14. $sControllerClass = 'Controller_' . $sController;
  15. return new $sControllerClass;
  16. }
  17. ?>


Metoda nie jest zadeklaroweana jakos attyczna, a jednak odwolujesz sie do niej jak do statycznej. Co pominalem ?

I nastepne:

Tutaj jest kawalek routera:
  1. <?php
  2. class Rapide_Router implements Rapide_Router_Interface
  3. {
  4. public function execute()
  5. {
  6. if(isset($_GET[_ROUTER_CONTROLLER_ACCESSOR]))
  7. $sController = $_GET[_ROUTER_CONTROLLER_ACCESSOR];
  8. else
  9. $sController = _ROUTER_CONTROLLER_DEFAULT;
  10.  
  11. if(isset($_GET[_ROUTER_ACTION_ACCESSOR]))
  12. $sAction = $_GET[_ROUTER_ACTION_ACCESSOR];
  13. else
  14. $sAction = 'Index';
  15.  
  16. $oToken = new Rapide_Dispatcher_Token(ucfirst($sController), ucfirst($sAction), $_GET);
  17.  
  18. if(!Rapide_Controller_Front::getInstance()
  19.  ->getDispatcher()
  20.  ->isDispatchable($oToken))
  21. {
  22. $oToken = new Rapide_Dispatcher_Token('Error', 'Error404');
  23. }
  24.  
  25. return $oToken;
  26. }
  27. ?>


Jesli nie jest podana akcja w URLu albo akcja jest bledna ustawiana jest akcja index.

Tutaj mamy zragment controllera

  1. <?php
  2. public function IndexAction()
  3. {
  4. $this->forward();
  5. }
  6. ?>


I deklaracja forward

  1. <?php
  2. public function forward($sController = null, $sAction = null, array $aParameters = array())
  3. {
  4. if(!isset($sController))
  5. {
  6. $sController = _ROUTER_CONTROLLER_DEFAULT;
  7. $sAction = 'Index';
  8. }
  9.  
  10. $this->_oNextToken = new Rapide_Dispatcher_Token($sController, $sAction, $aParameters);
  11. }
  12. ?>


Z tego co widze, to jesli forward jest pusty to poleci defaultowy kontrolelr z akcja index. Akcja index robi pusty forward ? powinno sie zapletlic, co znow pominalem smile.gif ?

Ten post edytował thornag 11.09.2006, 12:51:19


--------------------
"Wizja czasu jest szeroka, lecz kiedy sie przez nia przechodzi, czas staje sie waskimi drzwiami"

Go to the top of the page
+Quote Post
Prph
post 11.09.2006, 22:00:44
Post #17





Grupa: Zarejestrowani
Postów: 338
Pomógł: 2
Dołączył: 4.03.2006
Skąd: Łódź

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


Ad1. Przeoczenie. Powinno byc static. Dzieki.

Ad2. Nie zapetli sie. Wybierze kontroler Index, akcje index. Jezeli akcja nie zostala okreslona wybierze domyslnie index. Ta jest definiowana domyslnie w bazowej klasie kontrolera i forwarduje na domyslny kontroler. Wymagane jest aby kontroler index mial zdefionowana wlasna metode indexAction.

Adrian.
Go to the top of the page
+Quote Post
Apo
post 17.09.2006, 16:44:17
Post #18





Grupa: Zarejestrowani
Postów: 426
Pomógł: 1
Dołączył: 2.10.2005

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


Prph a mógłbyś wyjaśnić bardziej działanie klasy Rapide_View_Html_Extended, kiedy jest wywoływana, zasada jej działania itp smile.gif

Pozdrawiam
Go to the top of the page
+Quote Post
Prph
post 17.09.2006, 18:50:03
Post #19





Grupa: Zarejestrowani
Postów: 338
Pomógł: 2
Dołączył: 4.03.2006
Skąd: Łódź

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


Widok rozszerzony sluzy do dekorowania tresci. Wezmy pod uwage taki przyklad:

Mamy stopke, naglowek i menu boczne. Nasza tresc wyswietlana jest w srodku (taki standardowy przyklad). Wiadomo, ze widoki uzywaja szablonow (w Rapide sa to szablony php). Zalozny, ze mamy akcje Pokaz nowosci oraz dodaj nowosc. Nie byloby wygodnie, gdyby kazdy ten szablon byl postaci:

  1. <div id="top">
  2. <h1>Naglowek strony</h1>
  3. </div>
  4.  
  5. <div id="zawartosc">
  6.  
  7. <!-- Tu nasz szablon dla akcji -->
  8.  
  9. </div>
  10.  
  11. </body>
  12. </html>


W tym celu uzyjemy widoku rozszerzonego. Utworzymy szablon glowny o nazwie Main.php. Jego zawartosc bedzie taka jak przedstawiona wyzej. W miejscu, gdzie jest zawartosc wyswietlamy zmienna $this->content.

W rezultacie nasz widok zostanie udekoroweany o szablon Main.php. Nazwa tego szablonu zdefiniowana jest jako stala w samej klasie widoku.

Przyklad naszego widoku:

  1. <?php
  2. class View_MojWidok extends Rapide_View_Html_Extended
  3. {
  4. public function __construct()
  5. {
  6. $this->setTemplate('SzablonDlaAkcji');
  7. }
  8. }
  9. ?>


Ponadto szablon dekorujacy mozemy okreslic metoda setMainTemplate($nazwa).

Szablony akcji moga potrzebowac zaladowac css lub javascript. Sluza do tego helpery css i js:

  1. <?php
  2. // szablon akcji
  3.  
  4. $this->css('CssDlaTejAkcji.css');
  5. $this->js('JSDlaTejAkcji.js');
  6. ?>


Wybrane pliki musza znajdowac sie w katalogu szablonu odpowiednio w css/ i js/

Dodam jeszcze, ze widok rozszerzony nie jesy wykonywany w jakis inny sposob. Po prostu programista swoj widok nie dziedziczy po Rapide_View_Html a po Rapide_View_Html_Extended.

Pozdrawiam, Adrian.

Ten post edytował Prph 17.09.2006, 18:51:21
Go to the top of the page
+Quote Post
dzobert
post 5.11.2006, 17:42:18
Post #20





Grupa: Zarejestrowani
Postów: 46
Pomógł: 1
Dołączył: 30.06.2006
Skąd: okolice Warszawy

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


Czy jest jeszcze jakieś miejsce skąd można pobrać Rapide framework. Pytam ponieważ link podany w sygnaturze prph jest 'nieaktualny'
Go to the top of the page
+Quote Post

5 Stron V   1 2 3 > » 
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 00:04