Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pasek narzedzi, w ktorym dodatki moga sie rejestrowac
Forum PHP.pl > Forum > PHP
q.michal
Czesc wszystkim


Chcialbym stworzyc pasek narzedzi, ktory wyswietlalby sie na okreslonych stronach. Mialby mozliwosc dodawania w nim tabow, a w tych zakladkach przyciskow, pod ktore bylyby podlaczone okreslone akcje. Chcialbym takze dac mozliwosc dodatkom rejestrowania swoich kart i przyciskow. Dzieki temu, na takim pasku mozna byloby znalezc chociazby przycisk do edycji artykulu, jezeli dana podstrona bylaby wlasnie zaladowana.

Zastanawiam sie jak to rozwiazac. Z jednej strony wyobrazam sobie, ze najpierw tworzylbym pasek i z niego tworzyl karte:

  1. $toolbar = new Toolbar();
  2. $tab1 = $toolbar->addTab('Tab1 name');
  3. $tab2 = $toolbar->addTab('Tab2 name');


Nastepnie na jednej z takich zakladek moglbym dodawac przyciski i separatory:

  1. $tab1->addButton('icon1.png', 'Button1', 'http://wp.pl/');
  2. $tab1->addSeparator();
  3. $tab1->addButton('icon2.png', 'Button2', 'http://onet.pl/');


Zapis wydaje sie byc czytelny i zrozumialy. A moze jednak, powinienem uznac ze kazdy element takiego toolbara jest obiektem i podejsc do problemu od 2 strony, tj najpierw stworzyc, przyciski, pozniej umiescic je na tabie, ktory ostatecznie zaalokowac na pasku narzedzi?

  1. $tab1 = new Toolbar\Tab();
  2. $tab2 = new Toolbar\Tab();
  3.  
  4. $tab1->addElement(new Toolbar\Button('icon1.png', 'Button1', 'http://wp.pl/'));
  5. $tab1->addElement(new Toolbar\Separator());
  6. $tab1->addElement(new Toolbar\Button('icon2.png', 'Button2', 'http://onet.pl/'));
  7.  
  8. $toolbar = new Toolbar();
  9. $toolbar->addTab($tab1);
  10. $toolbar->addTab($tab2);



Ktora opcja jest wg Was lepsza i dlaczego? A moze polecicie jeszcze inne rozwiazanie?
Docelowo, chcialbym aby na pasku narzedzi mogly znalezc sie tylko zakladki, a na kazdej zakladce mogly byc umieszczone:
* przyciski,
* listy rozwijane
* przyciski z rozwijanymi menu
gitbejbe
dlaczego w ogóle budujesz elementy szablonu w phpie ? Wg mnie to bez sensu. Akce możesz przeciez elegancko obsłużyć w javascript/ajax a po stronie php'a zostanie tylko obsługa żądań. Zapis zmian wrzucasz do bazy i je wyciągasz wg twoich założeń
q.michal
No tak, ale jak dorzucisz do systemu jakis dodatek i bedzie on zaladowany podczas wyswietlania danej podstrony, to on musi zarejestrowac na tym toolbarze, swoje przyciski, ew. calego taba.
Wiec chcialem dac taka mozliwosc po stronie PHP, a pozniej odpowiednio wygenerowac widok.
gitbejbe
to przede wszystkim zastanów się na podstawie czego będzie go generował. Jeśli użytkownik sobie skonfiguruje jakieś tam przyciski, to rozumiem, że będzie miał możliwość zapisania tej konfiguracji. Skoro pojawia się zapis, to siłą rzeczy musisz wrzucić do bazy tą konfiguracje. Zrobisz to zapewne w ten sposób , że użytkownik o ID jakiś tam, ma np

  1. ['buttons' =>
  2. [ 1 => [ 'img' => 'costam.png',
  3. 'url' => 'www.costam.pl',
  4. 'action' => 'redirect',
  5. ....
  6. ],
  7. 2 -> [...]
  8.  
  9. ]
  10. ]


jeśli użytkownik ponownie wejdzie na stronę, na której powinien zobaczyć swoją konfiguracje, to wybierasz z bazy zapis, w php'ie go obrabiasz dla widoku i tyle. Tak więc Twoja klasę - jeśli uważasz ją za konieczną, napisałbym w kierunku obróbki dla gotowego zestawu danych. Wrzucasz całą konfiguracje przy tworzeniu obiektu, a klasa sama wszystko obrabia wg Twoich założeń i zwraca Ci gotowe dane dla widoku, które wyświetlisz sobie gdzie i jak chcesz. Proponuje rozbić klasę na abstrakcyjną - główną, oraz klasy po niej dziedziczące - czyli wszystkie elementy, które toolbar będzie posiadał. Klasa główna będzie rozpoznawać po wprowadzonych danych, jakie klasy dziedziczące wywołać. W ten sposób łatwo będziesz mógł dodawać nowe elementy jak i modyfikować już istniejące.
q.michal
Bardziej chodzilo mi o sam dodatek. Przykladowo piszesz dodatek wyswietlajacy na stronie artykuly, wiec taki dodatek moglby zarejestrowac swoje przyciski na toolbarze. Dzieki temu, po zalogowaniu sie jako administrator nie mialbys przyciskow do edycji, badz usuniecia artykulu obok jego nazwy na stronie, tylko na globalnym pasku narzedzi na tabie 'Artykuly'. Tutaj nie decydowalby uzytkownik, czy administrator strony, tylko osoba tworzaca dane rozszerzenie do systemu. Taki toolbar dawalby mozliwosc wykonania podstawowych czynnosci administracyjnych, bez koniecznosci logowania sie do panelu administratora, ale to jakie przyciski by sie tam znalazly, zalezaloby od wlaczonych dodatkow.

Wyobrazalem sobie zatem, ze np z rejestru, dodatek bedzie mogl pobrac sobie objekt toolbara i dodac do niego dowolna ilosc zakladek/przyciskow, a nastepnie na tej podstawie wygenerowany zostanie widok.
gitbejbe
Nie zrozumiałem wcześniej do końca tego co chcesz zrobić. W takim razie powinieneś poczytać o wzorcu Registry.
q.michal
Powracajac do pierwotnego pytania. Zastanawiam sie jak to rozwiazac od strony designu.
Czy wybrac wariant A, tj. z objektu toolbara tworzyc taby, a z tabow przyciski i separatory, czy wariant B - przyjac ze wszystko jest objektem i przekazywac objekty przyciskow/separatorow/list/itp do taba a taby do toolbara?

Ktos moze sie wypowiedziec, co bedzie bardziej optymalne, ew. jakie moze niesc za soba limity?
gitbejbe
To wg mnie 2 sposób będzie lepszy. Napisałbym to w tym kierunku:

  1. abstract class toolbar {
  2.  
  3. private $toolbar = array();
  4.  
  5. public function createElement(string $elementName, array $data){
  6.  
  7. switch($elementName){
  8. case 'tab': require_once('toolbarTab.php'); return new toolbarTab($data);
  9. case 'button': require_once('toolbarButton.php'); return new toolbarButton($data);
  10. ...
  11. default: throw new Exception('wrong element name.');
  12. }
  13. }
  14.  
  15. private function save($name, $element){
  16. $this->toolbar[$name] = $element
  17. }
  18.  
  19. public function getToolbar(){
  20. return $this->toolbar;
  21. }
  22.  
  23. public function getToolbarElement($name){
  24. return $this->toolbar[$name];
  25. }
  26.  
  27. abstract public function addElement();
  28. abstract public function execute();
  29. }
  30.  
  31.  
  32. class toolbarTab extends toolbar{
  33.  
  34. private $tab = array('data' => [], 'elements' => []);
  35.  
  36. // nie sugeruj się takimi rzeczami, piszę ogólnikowo
  37. function __construct(array $data){
  38. $this->tab['data'] = $data;
  39. }
  40.  
  41. public function addElement($elementObj){
  42. $this->tab['elements'][] = $elementObj->execute();
  43. }
  44.  
  45. public function execute(){
  46. return $this->tab;
  47. }
  48. }
  49.  
  50. $toolbar = new toolbar();
  51.  
  52. $toolbarTab = $toolbar->createElement('tab', [data1, data2]);
  53. $toolbarTab->addElement($toolbar->create('button', [data1, data2]));
  54.  
  55. $toolbar->save('tab1', $toolbarTab->execute());
  56.  
  57. $toolbarAllElements = $toolbar->getToolbar();
  58.  

To tylko bardzo ubogi przykład. Sorki za ewentualne błędy w składni, ostatnio dużo pisze w innych językach

EDIT: Lepiej by to wyglądało jednak w oparciu o interface'y niż dziedziczenie - w tym konkretnym przykładzie. Mam teraz na biurku browarka, tak więc nie chce mi się teraz tego poprawiać. Mam nadzieje jednak że wiesz o co mi chodzi
q.michal
Wszystko jasne, wielkie dzieki!
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.