Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Kwestia appletów w Waszych frameworkach, applet jako kontroller? z góry posiada te same prawa co kontroller :)
Athlan
post 7.10.2006, 19:18:58
Post #1





Grupa: Developerzy
Postów: 823
Pomógł: 12
Dołączył: 18.12.2005

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


Każdy rozwiązuje problem w inny sposób, tym razem chodzi mi o Applet.

W moim przypadku applet musi mieć dostęp do bazy danych i jakiegoś szablonu, czyli modelu i widoku. Takie same prawa ma wówczas Controller. Moj kontroler wygląda mniej wiecej tak:

  1. <?php
  2.  
  3. abstract class Vcontroller implements VcontrollerInterface
  4. {
  5. protected $_aData = array();
  6. protected $_oView = NULL;
  7. protected $_oConfiguration = NULL;
  8.  
  9. final public function __set($sName, $sValue)
  10. {
  11. $this->_aData[$sName] = $sValue;
  12. }
  13.  
  14. final public function __get($sName)
  15. {
  16. return (isset($this->_aData[$sName]) ? $this->_aData[$sName] : NULL);
  17. }
  18.  
  19. final public function setView($sName)
  20. {
  21. $sViewPatch = Vframe::patchView($sName);
  22. $sViewClass = $sName . V_APP_SURFIX_VIEW;
  23.  
  24. if(!Vframe::isUsable($sViewPatch))
  25. throw new VcontrollerException('View "'.$sName.'" does not exists (file "'.$sViewPatch.'" passed)!');
  26.  
  27. require_once($sViewPatch);
  28.  
  29. if(!class_exists($sViewClass, FALSE))
  30. throw new VcontrollerException('Class of view "'.$sViewClass.'" does not exists in file "'.$sViewPatch.'"!');
  31.  
  32. $oViewObject = new $sViewClass;
  33.  
  34. return $oViewObject;
  35. }
  36.  
  37. final public function setModel($sName)
  38. {
  39. $sModelPatch = Vframe::patchModel($sName);
  40. $sModelClass = $sName . V_APP_SURFIX_MODEL;
  41.  
  42. if(!Vframe::isUsable($sModelPatch))
  43. throw new VcontrollerException('Model "'.$sName.'" does not exists (file "'.$sModelPatch.'" passed)!');
  44.  
  45. require_once($sModelPatch);
  46.  
  47. if(!class_exists($sModelClass, FALSE))
  48. throw new VcontrollerException('Class of model "'.$sModelClass.'" does not exists in file "'.$sModelPatch.'"!');
  49.  
  50. $oModelObject = new $sModelClass;
  51.  
  52. return $oModelObject;
  53. }
  54.  
  55. final public function getApplet($sName, $sAction = NULL)
  56. {
  57. $sAppletPatch = Vframe::patchApplet($sName);
  58. $sAppletClass = $sName . V_APP_SURFIX_APPLET;
  59. $sAppletAction = (($sAction) ? $sAction : V_APP_DEFAULT_ACTION) . V_APP_SURFIX_ACTION;
  60.  
  61. if(!Vframe::isUsable($sAppletPatch))
  62. throw new VcontrollerException('Applet "'.$sName.'" does not exists (file "'.$sAppletPatch.'" passed)!');
  63.  
  64. require_once($sAppletPatch);
  65.  
  66. if(!class_exists($sAppletClass, FALSE))
  67. throw new VcontrollerException('Class of Applet "'.$sAppletClass.'" does not exists in file "'.$sAppletPatch.'"!');
  68.  
  69. $oAppletObject = new $sAppletClass;
  70.  
  71. if(!method_exists($oAppletObject, $sAppletAction))
  72. throw new VcontrollerException('Applet method "'.$sAppletAction.'" does not exists in class "'.$sAppletClass.'" ('.$sAppletPatch.')!');
  73.  
  74.  
  75. $oAppletObject->$sAppletAction()->display();
  76.  
  77. $sAppletContents = ob_get_contents();
  78.  
  79.  
  80. return $sAppletContents;
  81. }
  82.  
  83. public function getConfig($sConfigName = NULL)
  84. {
  85. if(!$this->_oConfiguration instanceof VconfigPattern)
  86. {
  87. $oConfig = new Vconfig();
  88.  
  89. $sCurrentConfig = ($sConfigName) ? $sConfigName : get_class($this);
  90.  
  91. if(!Vframe::isUsable(Vframe::patchConfig($sCurrentConfig)))
  92. return NULL;
  93.  
  94. if(!$oConfig->hasConfig($sCurrentConfig))
  95. $oConfig->setConfig($sCurrentConfig, $sCurrentConfig, FALSE, FALSE);
  96.  
  97. $this->_oConfiguration = $oConfig->getConfig($sCurrentConfig);
  98. }
  99.  
  100. return $this->_oConfiguration;
  101. }
  102. }
  103.  
  104. ?>


Gdyby się głebiej zastanowić, mój applet zbudowany byłby z kontolera i akcji. Fajnie jakby nie wyświetlał danych z szablonu, ale je zwracał. Postanowiłem więc zrobić takie coś:

  1. <?php
  2.  
  3. abstract class Vapplet extends Vcontroller
  4. {
  5. public function display()
  6. {
  7. return;
  8. }
  9. }
  10.  
  11. ?>


Applet dziedziczy z kontrollera ale nie wyswietla danych (specjalnie mam funkcję display() która jest w modelu, bo tak jest wywoływany szablon akcji w dispatcherze.

zwróćmy jeszcze raz uwagę na odpalenie appletu w akcji:

  1. <?php
  2. final public function getApplet($sName, $sAction = NULL)
  3. {
  4. $sAppletPatch = Vframe::patchApplet($sName);
  5. $sAppletClass = $sName . V_APP_SURFIX_APPLET;
  6. $sAppletAction = (($sAction) ? $sAction : V_APP_DEFAULT_ACTION) . V_APP_SURFIX_ACTION;
  7.  
  8. if(!Vframe::isUsable($sAppletPatch))
  9. throw new VcontrollerException('Applet "'.$sName.'" does not exists (file "'.$sAppletPatch.'" passed)!');
  10.  
  11. require_once($sAppletPatch);
  12.  
  13. if(!class_exists($sAppletClass, FALSE))
  14. throw new VcontrollerException('Class of Applet "'.$sAppletClass.'" does not exists in file "'.$sAppletPatch.'"!');
  15.  
  16. $oAppletObject = new $sAppletClass;
  17.  
  18. if(!method_exists($oAppletObject, $sAppletAction))
  19. throw new VcontrollerException('Applet method "'.$sAppletAction.'" does not exists in class "'.$sAppletClass.'" ('.$sAppletPatch.')!');
  20.  
  21.  
  22. $oAppletObject->$sAppletAction()->display();
  23.  
  24. $sAppletContents = ob_get_contents();
  25.  
  26.  
  27. return $sAppletContents;
  28. }
  29. ?>


przypisanie tego jest równie proste:

  1. <?php
  2. class index_Vcontroller extends Vcontroller
  3. {
  4. public function index_Action()
  5. {
  6. $oView = $this->setView('example');
  7.  
  8. $oView->menu = $this->getApplet('menu_example');
  9.  
  10. return $oView;
  11. }
  12. }
  13. ?>


U mnie poki co wygląda to w zaprezentowany sposob.

Jak wygląda to w Waszych frameworkach?


--------------------
Portfolio: Vgroup.pl | athlan.pl | Test.php.pl - sprawdź się z wiedzy o PHP i ułóż własne pytania!
Pomogłem? Kliknij pod postem.
Go to the top of the page
+Quote Post
Turgon
post 8.10.2006, 09:41:45
Post #2





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

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


Po co grzebiesz się w takie applety ? Ja po prostu do każdego dorzucam generowanie bloków. Pobranie ich, a potem w szablonie jako tablica smile.gif


--------------------
Jah Music Is On My Mind !
Go to the top of the page
+Quote Post
Athlan
post 13.10.2006, 11:44:04
Post #3





Grupa: Developerzy
Postów: 823
Pomógł: 12
Dołączył: 18.12.2005

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


Cytat(Turgon @ 8.10.2006, 08:41:45 ) *
Po co grzebiesz się w takie applety ? Ja po prostu do każdego dorzucam generowanie bloków. Pobranie ich, a potem w szablonie jako tablica smile.gif


jak dla mnie to dobre rozwiązanie... potrzebuje tego w moich aplikacjach smile.gif

btw: a subtemplaty? ja w widoku do metody display() dorzuciłem sobie możliwość wpisania nazwy templatu do wykonania, a następnie zwrócenia przez ob_get_content() + return smile.gif mi tak wygodnie... no i praktycznie

pozdrawiam, Athlan smile.gif


--------------------
Portfolio: Vgroup.pl | athlan.pl | Test.php.pl - sprawdź się z wiedzy o PHP i ułóż własne pytania!
Pomogłem? Kliknij pod postem.
Go to the top of the page
+Quote Post
Turgon
post 13.10.2006, 19:15:17
Post #4





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

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


Może tak ci powiem. Robisz inny szablon includujesz i wiO !


--------------------
Jah Music Is On My Mind !
Go to the top of the page
+Quote Post
Athlan
post 14.10.2006, 19:43:52
Post #5





Grupa: Developerzy
Postów: 823
Pomógł: 12
Dołączył: 18.12.2005

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


u mnie to dziala tak:

  1. <?php
  2. public function display($sTemplate = NULL)
  3. {
  4. if($sTemplate)
  5. $sRender = $sTemplate;
  6. else
  7. {
  8. if(!isset($this->_sTemplate))
  9. throw new VviewException('Template has no specified!');
  10.  
  11. $sRender = $this->_sTemplate;
  12. }
  13.  
  14. $sTemplatePatch = Vframe::patchTemplate($sRender);
  15.  
  16. if(!Vframe::isUsable($sTemplatePatch))
  17. throw new VviewException('Template "'.$sTemplatePatch.'" does not exists!');
  18.  
  19.  
  20. require_once($sTemplatePatch);
  21.  
  22. $sContents = ob_get_clean();
  23.  
  24. return $sContents;
  25. }
  26. ?>


--------------------
Portfolio: Vgroup.pl | athlan.pl | Test.php.pl - sprawdź się z wiedzy o PHP i ułóż własne pytania!
Pomogłem? Kliknij pod postem.
Go to the top of the page
+Quote Post
Turgon
post 15.10.2006, 08:37:46
Post #6





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

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


Po co takie zamotanie ? Można to dużo łatwiej zrobić.


--------------------
Jah Music Is On My Mind !
Go to the top of the page
+Quote Post
NuLL
post 15.10.2006, 13:36:56
Post #7





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

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


Stopien waszej pracowitosci jest imponujący biggrin.gif
  1. <plugin:calendar>

Tak wyglada umieszczenie plugina w szablonie widoku snitch.gif Kazdy plugin to klasa zawierajaca metode perform i tyle biggrin.gif

BTW: Kto wpadl na nazwe aplet questionmark.gif laugh.gif

Turgon - w Mojavi tak to nazwali sie chlop zafascynowal winksmiley.jpg tongue.gif

Ten post edytował NuLL 15.10.2006, 15:41: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
Turgon
post 15.10.2006, 15:27:33
Post #8





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

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


Prph... A ja mu tłumaczę, że to bzdura.


--------------------
Jah Music Is On My Mind !
Go to the top of the page
+Quote Post
Prph
post 15.10.2006, 17:41:23
Post #9





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

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


Ja nazwalem to Applet, widac innym nazwa sie spodobala winksmiley.jpg Dlaczego Applet? Bo mi pasowala nazwa, a innej nie znalem.

NuLL dobrze prawi, jak powinno sie uzyc pluginu/apletu. IMHO, to widok, a raczej szablon powinien wywolac aplet, tj. umiescic go gdzie trzeba. Ja rozwiazalem to nastepujaco:

1. widok posiada helpery w posiacie metod, np: url(atrybuty) generujacy link, applet do wczytania apletu.
2. Applet ma podobna, ale nie taka sama funkcjonalnosc jak kontroler. Ma dostep do widokow, modeli i niech robi, co chce.

Jak koms sie chce, niech zajrzy do Rapide (link w sygnaturze).

Pozdrawiam, Adrian.
Go to the top of the page
+Quote Post
bim2
post 16.10.2006, 19:30:35
Post #10





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


A ja się ciekawiłem jak wykorzystać. Obejrzałem rapide literce po literce i jest super. Ale daj jakieś zastosowanie Apletów i Helperów ;]


--------------------
Go to the top of the page
+Quote Post
Prph
post 17.10.2006, 15:27:14
Post #11





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

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


Witam,

Helpery uruchamiane są z szablonów, jak zwykłe metody obiektu $this:

  1. <a class="button" href="<?= $this->url('User', 'Add') ?>">Dodaj</a>


W tym przykładzie: helper URL. Generuje poprawny url (tj. zgodny z routerem) z podanych argumentów: kontrolera, akcji i tablicy asocjacyjnej parametrów.

Jak wspomniałem, dostępny jest helper, który ładuje aplet:

  1. <?= $this->applet('Menu') ?>


Helper Menu może wyglądać następująco:

  1. <?php
  2.  
  3. class View_Applet_Menu 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('AppletMenu');
  12.  
  13. return $oView->fetch();
  14. }
  15. }
  16.  
  17. ?>


Jak widać, sprawdza, czy użytkownik jest zalogowany. Jeżeli tak - zwróci zawartość menu w postaci kodu HTML. Aplety mogą korzystać z widoku oraz modelu. Dziedziczą z ogolnej klasy:

  1. <?php
  2.  
  3. abstract class Rapide_View_Applet implements Rapide_View_Applet_Interface
  4. {
  5. public function getController();
  6. public function getAction();
  7.  
  8. public function getParameters();
  9. public function getParameter($sParameter);
  10.  
  11. public function getConfig();
  12.  
  13. public function getView($sView);
  14. public function getModel($sModel);
  15.  
  16. public function getUser();
  17. public function getLanguage();
  18. }
  19.  
  20. ?>


Pozdrawiam, Adrian.
Go to the top of the page
+Quote Post
Athlan
post 22.10.2006, 16:33:16
Post #12





Grupa: Developerzy
Postów: 823
Pomógł: 12
Dołączył: 18.12.2005

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


Prph... ano super pomysł, z poziomu szablonu... hmmm, w sumie to by mi było wygodniej haha.gif

btw słyszałem gdzieś "applet" spodobało mi się i tak nazwałem tą funkcjonalność w moim frameworku, komuś się coś niepodoba? Jak zwał tak zwał, ważne ocb...

no to ide kodzić smile.gif


--------------------
Portfolio: Vgroup.pl | athlan.pl | Test.php.pl - sprawdź się z wiedzy o PHP i ułóż własne pytania!
Pomogłem? Kliknij pod postem.
Go to the top of the page
+Quote Post

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.06.2024 - 13:17