Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Framework] Rapide Framework
Forum PHP.pl > Inne > Oceny
Stron: 1, 2
Prph
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.
Quickest
Ś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.
hwao
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.
Turgon
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.
Prph
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.
splatch
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,
Quickest
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
Prph
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).
Quickest
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?
Prph
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.
NuLL
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
Prph
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.
hwao
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()
seaquest
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.
Prph
@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.
thornag
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 ?
Prph
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.
Apo
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
Prph
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.
dzobert
Czy jest jeszcze jakieś miejsce skąd można pobrać Rapide framework. Pytam ponieważ link podany w sygnaturze prph jest 'nieaktualny'
Prph
Witam!

Przepraszam, za zly adres - skocznczyl mi sie termin serwera. Nowy adres (tymczasem) http://vgm.pl/adrianpawlikpl/rapide/

Pracuje nad Rapide 0.3. Niestety mam teraz troche pracy na uczelni i w... pracy winksmiley.jpg Mam nadzieje, ze w niedlugim czasie cos zaprezentuje. Wersja 0.3 dostepna bedzie takze przez SVN.

Pozdrawiam, Adrian.
darektbg
Witam
Przeglądając kod wywnioskowałem, że obsługa formularzy odbywa się w sposób:
1) Kontroler, a właściwie jego akcja tworzy obiekt klasy Rapie_Form za pomocą operatora New.
2) Następnie zwraca za pomocą metody getView() obiekt danego widoku.
3) Konstruktor danej klasy widoku wywołuje metodę setTemplate(), która otwiera szablon.
4) W szablonie znajduje się formularz:
  1. <form action="" method="post">
  2.  
  3. </form>

5) Po dane z formularza przechwyci router i kieruje do klasy Rapie_Form
6) Dostęp do tych danych ma akcja kontrolera z pkt. 1 za pomocą metod klasy Rapie_Form

Tylko nie wiem czy moje myślenie jest prawidłowe

Pozdrawiam
Darektbg
envp
Świetnie, ale gdzie w Applecie dostęp do modelu?
Prph
@darektbg:
Tak mniej wiecej to wyglada. Pracuje nad dokumentacja i tutorialami dla Rapide. Niestaty, jak juz wczesnij na forum wspomnialem - mam teraz ciezki okres na uczelni i jedyne sen moge poswiecic na pisanie dokumentacji winksmiley.jpg

@envp:
getModel(). W wersji 0.3 (dostepnej na svn: http://code.google.com/p/rapideframework/source) mozna uzywac kontrolerow jako apletow (nazwa zmieniona na pluginy widoku). Sluzy do tego helper plugin:

  1. <?php
  2. $this->plugin('Menu', 'Admin'); //zalaczy wynik dzialania akcji Admin kontrolera Menu.
  3. ?>


Funkcjonalnosc pluginu jest oczywiscie taka jak kontrolera, tylko oczywiscie forwardowanie nie dziala.

Jak juz wspomnialem - pracuje nad dokumentacja i strona frameworka.

Pozdrawiam, Adrian.
envp
Zauważyłem pewną nieścisłość - aplet wywoływany z kontrolera nie podlega 'Plugionwaniu' co może eliminuje wyświetlanie np. sondy dla wybranej grupy userów...
Prph
Owszem, pluginy nie sa obslugiwane. Ale IMHO to nie jest potrzebne. Wczesniej myslalem, że moze uzycie jezyka bedzie trudne poniewaz pliki jezykowe dla danej akcji ladowal plugin Language. Obecnie Obiekt Language jest na tyle elastyczny i samowystarczalny, ze nie musimy nic ladowac. Wystarczy odwolac sie do jezyka przez metode get obiektu Language:

  1. <?php
  2. $sError = $this->getLanguage()->get('User', 'Add', 'Error_Name');
  3. ?>


Wynikiem bedzie pole Error_Name z tabeli jezyka z pliku Add z katalogu User.

Pozdrawiam, Adrian.

Witam,

Rapide zaczyna rozwijac sie coraz bardziej (pomimo braku mojego wolnego czasu). Od jakiegos czasu pracuje nad wersja 0.3. Zmiany jakie nastapily w stosunku do wersji 0.1, to:

1. obiekt Language - teraz bardziej elastyczny. Dynamicznie laduje pliki jezykowe w trakcie odwolania sie do jezyka. Dzieki temu nie trzeba uzywac pluginu Language Front Kontrolera, a ponadto jezyk jest dostepny teraz dokladnie z dowolnego miejsca aplikacji. Wczesniej praktycznie tylko kontrolery oraz aplety moglu go uzywac.

2. aplety = pluginy widoku - przede wszystkim zmiana nazwy aplety na pluginy widoku. Ponadto pluginy sa nadal dostepne we frameworku, ale nie ma juz samej klasy pluginow. Pluginy byly bardzo podobne do kontrolerow, wiec uzywa sie kontrolerow w tym celu. Oczywiscie w przypadku pluginow nie mamy mozliwosci skorzystania z forwardowania, ale to nie jest nam potrzebne. Pluginy laduje helper "plugin". Pierwszy parametr to nazwa kontrolera, drugi - nazwa akcji, ktora nie jest obowiazkowa (zostanie uzyta akcja Index).

3. pelna obsluga pluginow w Front kontrolerze - takze dla preDispatchLoop, jak i dla postDispatchLoop.

4. niewielkie zmiany w obsludze MySQL - glownie zmiany nazw metod.

5. Walidatory - glowny walidator (Rapide_Validator) otrzymal metody do sprawdzania poprawnosci liczb, przez co walidator sluzacy do tego calu zostal usuniety.

Zostala uruchomiona strona frameworka: Rapide.pl. Obecnie nic, oprocz adresu do zrodel, tam nie ma. Chcialem podziekowac Panu Jakubowi Kozickiemu za zasponsorowanie domeny. W czasem postaram sie zamiescic tam jakas dokumentacje i tutoriale.

Pozdrawiam,
Adrian.
Jarod
Czy ktoś kto korzysta z svn mógłby pobrać nanowszą wersja i udostępnić w zipie ?
dr_bonzo
A tak trudno w koncu zaczac korzystac z svn'a? svn + tortoise svn i jazda.
Prph
Cytat(J4r0d @ 3.12.2006, 12:43:46 ) *
Czy ktoś kto korzysta z svn mógłby pobrać nanowszą wersja i udostępnić w zipie ?


W tar.gz: http://vgm.pl/rapide/snapshot/

Pozdrawiam, Adrian.
Jarod
Cytat(Prph @ 3.12.2006, 20:08:14 ) *


Archiwum jest uszkodzone :/
Prph
Wyslalem nowe.

Adrian.

Wczoraj poprawilem kilka bladow zgloszonych przez Kube Kozickiego. Najczesciej byly to "literowki", no i same pluginy nie dzialaly zbyt dobrze. Poprawki oczywiscie dostepne na SVN. W zamieszczonym archiwum takze sa poprawkil

Pozdrawiam, Adrian.
AxZx
a masz moze przyklad aplikcji zbudowanej za pomoca Rapide?

i jeszcze takie pytanie
czy dodawanie jakis tekstow w szablonie musi byc takie dlugie?
  1. <?= $this->lang('Controller', 'User', 'Password', 'Password') ?>: <br/>


nie mogloby byc tak ze jezeli ladujesz jakis widok to razem z nim ladujesz plik z tlumaczeniami, albo pobierasz odpowiednie tlumaczenia z bazy otrzymujac tablice ktorej mozesz juz normalnie uzywac w szablonie.
  1. <?= $this->lang('Password') ?>: <br/>

moze da sie tak?
Prph
Cytat(AxZx @ 3.01.2007, 16:21:54 ) *
a masz moze przyklad aplikcji zbudowanej za pomoca Rapide?


O ile Rapide jest w zasadzie skonczone (framework gotowy, ale wszystko wychodzi dopiero w praniu), to dokumentacji i przykladow nadal brak. Do projektu dolaczyl sie Jakub Kozicki, ktory obiecal pomoc przy dokumentacji. Wiem, ze pisze teraz projekt na Rapide. Moze uda mi sie go przekonac do udostepnienia fragmentow kodu.

Ja sam pisalem jakis czas temu Newsletter. Nie zostal ukonczony, popniewaz byl jedynie proba frameworka. Problem teraz jest taki, ze nie jest kompatybilny z najnowsza wersja Rapide, w ktorej nieco zmienilismy API. Przede wszystkim usuniecie apletow na rzecz kontrolerow, ktore mozna osadzac w szablonie, jako pluginy widoku (np. kontroler Menu, akcja Administrator wyswietla w danym miejscu menu administratora).

Cytat(AxZx @ 3.01.2007, 16:21:54 ) *
i jeszcze takie pytanie
czy dodawanie jakis tekstow w szablonie musi byc takie dlugie?
  1. <?= $this->lang('Controller', 'User', 'Password', 'Password') ?>: <br/>


Oczywiscie, ze nie musi... Taki efekt jest uzyskany przez mocny podzial plikow jezykowych. W zasadzie kazda akcja zawiera wlasny plik. Nie jest to jednak narzutem ze strony Rapide. Mozna bez problemu wszystkie tlumaczenia zamiescic w pliku nazwaJezyka.php w katalogu Language/. Mozna tez inaczej rozmiescic pliki jezykowe, np:

Language/
Polish/
Nowosci.php
Uzytkownicy.php

Teraz wystarczy:

  1. <?= $this->lang('Nowosci', 'Autor') ?>
  2. <?= $this->lang('Uzytkownicy', 'JakisKlucz');


Zaleta Language z Rapide jest elastytcznosc. Nie musimy martwic sie o ladowanie jezykow. Jezeli odwolujemy sie do jakiegos klucza w jezyku, a on nie istnieje, Rapide sprobuje odnalesc pliki jezykowe dla tego klucza. Kolejne odwolania juz nie powoduja poszukiwania pliku, bo jest on zaladowany.

Wczesniej odpowiedni plugin frontkontrolera byl odpowiedzialny za ladowanie plikow jezykowych. W praktyce okazalo sie to malo wygodne.

Naklonie Kube Kozickiego, aby pomagal rozwiazywac problemy z Rapide. Sam zapoznal sie z Rapide, przeczytal dokladnie kod, zglosil kilka poprawek, kilka ulepszen. Jego porady moga byc naprawde cenne.

Pozdrawiam,
Adrian.
nrm
Czy Rapide ma aspiracje (i plany) stać się poważnym frameworkiem czy zostanie jednoosobowym prywatnym projektem (jakich wiele)?
envp
Hm z tego co wiem to tworzą go 2 osoby, dodatkowo kilka osób udziela wsparcia w postaci znajdowania bugów w kodzie. Poza tym ile frameworków stało się poważnymi w ciągu dwóch meisięcy ?
Prph
Cytat(normanos @ 10.01.2007, 19:48:09 ) *
Czy Rapide ma aspiracje (i plany) stać się poważnym frameworkiem czy zostanie jednoosobowym prywatnym projektem (jakich wiele)?


Ma plany i aspiracje. Obecnie tworza go 2 osoby. Ja - Adrian Pawlik oraz Jakub Kozicki. Wszystkie osoby chetne do rozwoju frameworka sa bardzo mile widziane. W najblizszych planach jest przede wszystkim stworzenie dobrej dokumentacji, przykladow aplikacji, tutoriali oraz samej strony projektu. Z racji, ze ja i Kuba studiujemy, a stycznen dla stydentow jest jak wyrocznia, czasu mamy niewiele.

Na www.rapide.pl beda widoczne wieksze zmiany w projekcie.

Pozdrawiam, Adrian.
nrm
Cytat(envp @ 10.01.2007, 21:32:50 ) *
Hm z tego co wiem to tworzą go 2 osoby, dodatkowo kilka osób udziela wsparcia w postaci znajdowania bugów w kodzie. Poza tym ile frameworków stało się poważnymi w ciągu dwóch meisięcy ?

oj, od razu odebrałeś to jako atak a ja poważne pytanie zadałem.

Cytat(Prph @ 10.01.2007, 22:00:30 ) *
Ma plany i aspiracje. Obecnie tworza go 2 osoby. Ja - Adrian Pawlik oraz Jakub Kozicki. Wszystkie osoby chetne do rozwoju frameworka sa bardzo mile widziane. W najblizszych planach jest przede wszystkim stworzenie dobrej dokumentacji, przykladow aplikacji, tutoriali oraz samej strony projektu. Z racji, ze ja i Kuba studiujemy, a stycznen dla stydentow jest jak wyrocznia, czasu mamy niewiele.

Na www.rapide.pl beda widoczne wieksze zmiany w projekcie.

Pozdrawiam, Adrian.


framewroków ci u nas dostatek ale tak na prawdę większość NIE nadaję się do produkcyjnego wykorzystania. Przy tych wybijających się zaraz powstaje jakaś społeczność ale albo lider musi sie mocno poświęcić albo oddaje więcej władzy w ręce ludu (svn, zespół dev).

Tak jest niestety choćby w przypadku CodeIgniter - framework lekki, ciekawy, niestety JEDNOOSOBOWY, autor głuchy na prośby SVNa, włączenia w to większej ilości osób etc.

Stąd moje pytanie - bo przejrzałem pobieżnie Rapide i wygląda obiecująco ale w chwili obecnej po prostu wygląda na prywatny projekcik jakich wiele (ostatnio inna osoba na forum pokazała podobny własny framework).

Sugeruje:
- ustalenie jakiegoś kierunku rozwoju
- choćby wstępna roadmape, nie musi miec konkretnych dat, byle uwzględniała w/w kierunki rozwoju, komponenty z jakimis miesiącami/kwartałem?
- SVN (widze, że jest, nawet pobralem najnowsza wersje)
- forum (!)
- dokumentacje (exclamation.gif!)

Osobiście jestem za słaby w teorii aby wam pomóc (starość nie radość), nie mniej jestem dobry w testowaniu i pisaniu różnych przedziwnych aplikacji na tych frameworkach więc mogę pomóc o ile zostaną spełnione w/w punkty winksmiley.jpg

pozdrawiam, wytrwalosci zycze.
Turgon
Co do Forum i Dokumentacji ja mogę się tym zająć biggrin.gif Z resztą pomóc też przy kodzie biggrin.gif Napisałem już z 5 Frame'ów i wszystkie poszły do kosza... Choć Rapide ma kilka wad, to wyjdzie na ludzi biggrin.gif
Prph
Witam,

Od lutego na pewno wiele sie zmieni. Zakonczy sie sesja i ja i Kuba bedziemy mieli wiecej czasu. Rapide jest otwarty na nowe propozycje i kolejne osoby. Wcale nie trzeba byc wymiataczem z php, zeby udzielic sie w projekcie. Trzeba zrobic dobra strone projektu, tj. funkcjonalna, czytelna i profesjonalna oczywiscie. Jezeli ktos chcialby sie podjac, serdecznie zapraszam. W zamian oczywiscie nazwisko na liscie autorow/deweloperow.

Pozdrawiam, Adrian.
Turgon
Prph: Gdzie się zgłaszać:D?
Prph
Cytat(Turgon @ 12.01.2007, 10:37:07 ) *
Prph: Gdzie się zgłaszać:D?


Hmm, chyba do mnie smile.gif
nrm
to ja poczekam aż będzie już coś wiadomo winksmiley.jpg z tych punktów które wymieniłem.
krzyszbi
witam
framework zapowiada się ciekawie smile.gif
ale mam dwa pytanka
1. skąd można pobrać aktualną i spakowaną do zip-a rar-a gz-ta wersje bo na stronie owszem da się przeglądać kod w przeglądarce ale nigdzie nie znalazłem linka do archiwum sad.gif może źle szukam
2. i czy jest możliwość korzystania z nice-url w Rapide questionmark.gif bo jak narazie widziałem że linki są budowane w stylu [bhttp://twojadres.pl/www/?controller=Example&action=Example[/b] a jak nie ma to pewnie trzeba będzie napisać i może z tego coś fajnego wyjść smile.gif
envp
Witam,

W projekcie Rapide ruszyło oficjalne forum dostępne tutaj

Zapraszam wszystkich.

Ps. Jeżeli naruszyłem regulamin proszę o usunięcie posta i z góry przepraszam.
nrm
super, tylko postawiliście by to na czymś porządnym: punBB albo (imho super) Simple Machines Forum. jak wroce w pon to tam do was zajrze.
Turgon
Normanos: ja to im mówiłem, ale jak widać propozycja została odrzucona. Ja proponowałem myBB.
Prph
Cytat(krzyszbi @ 12.01.2007, 14:41:40 ) *
witam
framework zapowiada się ciekawie smile.gif
ale mam dwa pytanka
1. skąd można pobrać aktualną i spakowaną do zip-a rar-a gz-ta wersje bo na stronie owszem da się przeglądać kod w przeglądarce ale nigdzie nie znalazłem linka do archiwum sad.gif może źle szukam
2. i czy jest możliwość korzystania z nice-url w Rapide questionmark.gif bo jak narazie widziałem że linki są budowane w stylu http://twojadres.pl/www/?controller=Exampl...;action=Example a jak nie ma to pewnie trzeba będzie napisać i może z tego coś fajnego wyjść smile.gif


Ad1. Zaraz chyba cos napisze do tworzenia snapshota. Mozna sciagnac za pomoca SVN.
Ad2. Jest mozliwosc. Banalnie proste:
- Kazac uzywac Front kontrolerowi Rapide_Router_Rewrite
- utowrzyc .htaccess kierujacy wszystk co trzeba na index.php

Jeszcze dzis ruszy nowe forum.

Pozdrawiam, Adrian.


Pod adresem http://rapide.pl/snapshot/ dostępna najnowsza wersja Rapide. Snapshot tworzony jest każdego dnia.

Adrian.
eS...
Czekam na forum i na jakieś przykłady/tutorial jako że jestem na etapie szukania frameworka i nauki korzystania z MVC.
envp
Forum zostanie zmienione na inne w najbliższym czasie.
Turgon
Zasadniczo na co ?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.