Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Moduł do tworzenia elementów widoku
slawooo
post
Post #1





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

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


Chciałbym zaprezentować i poddać Waszej ocenie moduł ułatwiający oprogramowanie warstwy prezentacji (widoku) w modelu MVC.

W odróżnieniu od tego jak to standardowo bywa w różnych frameworkach PHP, tutaj widok nie jest "gołym" szablonem, nakładki typu smarty czy twig też nie mają z moim pomysłem nic wspólnego. Główna idea opiera się na potraktowaniu warstwy widoku jako kodu w pełni obiektowego, a więc korzystającego ze wszystkich korzyści z niego płynących, takich jak dziedziczenie, enkapsulacja itp.

Cała koncepcja opiera się na obiektach, które nazwałem komponentami. Chodzi tu po prostu o pewne odrębne elementy interfejsu - "komponenty" wizualne, rozumiane zupełnie dowolnie, jak np. menu, okno logowania, komentarze, galeria zdjęć czy cokolwiek innego widocznego na ekranie. Każdy z takich komponentów może składać się z zagnieżdżonych innych komponentów, a na samym "dole" znajdują się gotowe komponenty będące zwykłymi tagami HTML (lub w wyjątkowych przypadkach mogą to być też klasyczne szablony). Dzięki takiemu podejściu, budowanie elementów interfejsu jest prostsze, nie prowadzi do duplikowania kodu, no i kod nie wygląda jak oparty na include z PHP 4.x ;]

Moduł powstał przy tworzeniu aplikacji zbudowanej na frameworku kohana, ale bez większych akrobacji można go dopasować do własnych zastosowań.

Link do źródeł: https://github.com/SlawomirOlchawa/components

Ciekawy jestem Waszych opinii odnośnie takiego rozwiązania, odnośnie samego kodu również.
Przy okazji, jeśli ktoś spotkał się z podobnym podejściem w jakimś z frameworków to chętnie dowiem się więcej na ten temat.

Dla lepszego zrozumienia, przykładowe fragmenty kodu:

Widok:
  1. class Component_Category_Info extends Tag_Block
  2. {
  3. /**
  4.   * @var Model_Category
  5.   */
  6. protected $_category;
  7.  
  8. /**
  9.   * @param Model_Category $category
  10.   */
  11. public function __construct(Model_Category $category)
  12. {
  13. parent::__construct();
  14.  
  15. $this->_category = $category;
  16. Helper_Includer::addCSS('media/app/css/category.css');
  17. }
  18.  
  19. /**
  20.   * @return string
  21.   */
  22. protected function _render()
  23. {
  24. $this->addCSSClass('category_info');
  25.  
  26. $descriptionBlock = new Tag_Block($this->_category->description);
  27. $descriptionBlock->addCSSClass('lightBg');
  28. $descriptionBlock->addCSSClass('description');
  29.  
  30. $this->add($descriptionBlock);
  31.  
  32. return parent::_render();
  33. }
  34. }


Kontroler:
  1. class Controller_Category extends Controller_Entity
  2. {
  3. public function action_index()
  4. {
  5. $info = new Component_Category_Info($this->_entity);
  6. $info->cache($this->_entity->getURL().'/info');
  7. $this->layout->add($info);
  8. }
  9. }


Ten post edytował slawooo 5.11.2015, 02:08:34
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
slawooo
post
Post #2





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

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


  1. class Component_List extends Tag_Block
  2. {
  3. /**
  4.   * @var Model_Abstract_Entity
  5.   */
  6. protected $_entities;
  7.  
  8. /**
  9.   * @var string
  10.   */
  11. protected $_noResultsInfo = 'Brak wyników do wyświetlenia.';
  12.  
  13. /**
  14.   * @param Model_Abstract_Entity $entities
  15.   */
  16. public function __construct(Model_Abstract_Entity $entities)
  17. {
  18. parent::__construct();
  19.  
  20. $this->_entities = $entities;
  21. }
  22.  
  23. /**
  24.   * @param Model_Abstract_Entity $entity
  25.   * @return Tag_HyperLink
  26.   */
  27. protected function _getListItem(Model_Abstract_Entity $entity)
  28. {
  29. return new Tag_HyperLink($entity->name, $entity->getURL());
  30. }
  31.  
  32. /**
  33.   * @return string
  34.   */
  35. protected function _render()
  36. {
  37. $entityList = $this->_entities->findAll();
  38.  
  39. if ($entityList->count() === 0)
  40. {
  41. $info = new Tag_Paragraph($this->_noResultsInfo);
  42. $info->addCSSClass('light');
  43. $this->add($info);
  44. }
  45. else
  46. {
  47. $list = new Tag_List();
  48. $list->addCSSClass('light');
  49. $this->add($list);
  50.  
  51. foreach ($entityList as $entity)
  52. {
  53. $link = $this->_getListItem($entity);
  54. $list->add($link);
  55. }
  56. }
  57.  
  58. return parent::_render();
  59. }
  60. }


  1. class Component_ListWithPhotosSmall extends Component_List
  2. {
  3. /**
  4.   * @param Model_Abstract_Entity $entities
  5.   */
  6. public function __construct(Model_Abstract_Entity $entities)
  7. {
  8. parent::__construct($entities);
  9.  
  10. $this->addCSSClass('smallphoto_list');
  11.  
  12. Helper_Includer::addCSS('media/mod/photos/css/main.css');
  13. }
  14.  
  15. /**
  16.   * @param Model_Abstract_Entity $entity
  17.   * @return Tag_HyperLink
  18.   */
  19. protected function _getListItem(Model_Abstract_Entity $entity)
  20. {
  21. $tile = new Component_Photo_TileSmall($entity->main_photo);
  22. $name = new Tag_HyperLink(Text::limit_chars($entity->name,45), $entity->getURL());
  23. $name->addCSSClass('name');
  24.  
  25. $result = new Tag_Block();
  26. $result->add($tile);
  27. $result->add($name);
  28.  
  29. return $result;
  30. }
  31. }


Przykład komponentu zawierającego listę elementów. Komponent występuje w dwóch wersjach:
1) lista zawiera odnośniki tekstowe (klasa Component_List)
2) lista zawiera odnośniki graficzne (klasa Component_ListWithPhotosSmall)

Druga klasa dziedziczy po pierwszej całą logikę tworzenia i wyświetlania listy, nadpisując jedynie metodę wyświetlającą pojedynczy element listy.
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 16.10.2025 - 13:01