Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Menu panelu admina - warstwa prezentacji
Forum PHP.pl > Forum > PHP
WebCM
Jest panel admina. Aby uniezależnić warstwę logiki od prezentacji, menu powinno być wyświetlane w szablonach. Jednak nie wszystkie moduły są dostępne dla każdego użytkownika - to zależy od jego uprawnień. Jeśli gdzieś nie ma dostępu, po prostu nie pokazujmy mu linku. Jak to rozwiązać?

1. Sposób. Pozycje zależą od warstwy logiki
Warstwa logiki narzuca budowę menu.

Kod PHP:
  1. #Build module list
  2. $modules = array(
  3. array($lang['cats'], 'cats', 'C'),
  4. array($lang['polls'], 'polls', 'Q'),
  5. array($lang['ipages'], 'pages', 'P'),
  6. array($lang['users'], 'users', 'U'),
  7. array($lang['groups'], 'groups', 'G'),
  8. array($lang['log'], 'log', 'L'),
  9. array($lang['mailing'], 'mailing', 'M'),
  10. array($lang['config'], 'config', 'CFG'),
  11. array($lang['nav'], 'menu', 'N'),
  12. array($lang['dbcopy'], 'db', 'DB'),
  13. array($lang['plugs'], 'plugins', 'E')
  14. );
  15.  
  16. #Pobierz wpisy menu dla rozszerzeń
  17. $res = $db->query('...zapytanie...');
  18. foreach($res as $x)
  19. {
  20. $modules[] = array($x['text'],$x['file'],$x['ID']);
  21. }
  22.  
  23. #Zbuduj menu tak, aby pojawiły się tylko wpisy, do jakich admin ma dostęp
  24. $menu = array();
  25. foreach($modules as $x)
  26. {
  27. if(ma_dostep($x[2])) $menu[] = array('text'=>$x[0],'url'=>url($x[1],null,'admin'),'class'=>$x[1]);
  28. }
  29.  
  30. #Dodaj do szablonu zmienną $menu
  31. $szablon->dodaj('menu', $menu);
Szablon:
  1. <!-- START menu -->
  2. <a href="{url}" class="A{class}">{text}</a>
  3. <!-- STOP -->

+ Po dodaniu lub usunięciu modułu nie trzeba edytować szablonu skórki
+ Można wprowadzić możliwość zmiany kolejności elementów w menu
- Zmiana układu menu jest praktycznie niemożliwa
- W przypadku podziału na bloki wpłynie negatywnie na wydajność

Można posegregować linki w grupy, co ułatwia zmianę układu menu (np. na rozwijane menu), ale wciąż są duże ograniczenia (np. rozwijane menu wielopoziomowe), więcej obliczeń w warstwie logiki i podwójna pętla w szablonie:
  1. <!-- START blok_menu -->
  2. <!-- START link_menu -->
  3. <a href="{url}" class="A{class}">{text}</a>
  4. <!-- STOP -->
  5. <!-- STOP -->

2. Sposób. Wszystko w szablonach.
Nie budujemy menu w warstwie logiki. Wszystkim zajmują się szablony:
  1. <div id="menu">
  2. <!-- IF ma_dostep(C) -->
  3. <a href="url(kategorie)">{lang.kategorie}</a>
  4. <!-- END -->
  5. <!-- IF ma_dostep(G) -->
  6. <a href="url(grupy)">{lang.grupy}</a>
  7. <!-- END -->
  8. <!-- IF link_menu --> <!-- można wcześniej zdefiniować dodatkowe zmienne -->
  9. <a href="{link_menu}">{lang.menu}</a>
  10. <!-- END -->
  11. </div>

+ Można dowolnie zmodyfikować układ menu w szablonie
+ Warstwa logiki nie narzuca nam konkretnego układu i kolejności
- Trudniejsza edycja szablonu - elementy warstwy logiki w szablonie
- Kiedy dodamy lub usuniemy moduł panelu admina, trzeba poprawić szablon wszystkich skórek!

Jak widać, oba rozwiązania mają swoje wady. Które jest najbardziej optymalne i elastyczne według was?
memory
Cytat
- Zmiana układu menu jest praktycznie niemożliwa

Co przez to rozumiesz?
cim
Witam,

ja stosuję oba podejścia, ale w różnych miejscach:
1. dla menu strony do widoku trafia tablica z elementami tylko dla danego użytkownika (dotyczy to aplikacji i autorskiego CMS, który generuje strukturę menu biorąc pod uwagę uprawnienia bieżącego użytkownika; uważam, że wygodniej pobierać częściowo odfiltrowane dane z bazy i obrabiać je w PHP niż w szablonach)
2. dla przycisków na stronie stosuję zmienne z isUprawnienieA, isUprawnienieB,...

Pozdrawiam
WebCM
Cytat(memory @ 3.07.2013, 20:14:47 ) *
Co przez to rozumiesz?

Załóżmy, że zamiast listy chcemy menu rozwijane:

Treść | Społeczność | Pomoc | Ustawienia | Rozszerzenia

Warstwa logiki przekazuje do szablonu tablicę 2D z dostępnymi modułami:

Artykuły | adres do modułu | klasa_art
Galeria | adres do modułu | klasa_gal
...itd...

Nie ma podziału na grupy. Otrzymujemy płaską listę.

Problem można obejść, dzieląc moduły na grupy. Wciąż jest to sztywny podział. Warstwa logiki przekazuje do szablonu tablicę 3D z dostępnymi modułami w oddzielnych grupach.

A teraz w menu rozwijanym chcemy dodać własne linki, np. "Dodaj artykuł". Jedno kliknięcie mniej. Można wstawić go na sztywno, sprawdzić uprawnienia w szablonie, ale zaraz, przecież my wyświetlamy menu w pętli! Poniższy kod tylko wprowadza zamieszanie:
Kod
<!-- IF nazwa_modulu IS "Artykuły" -->link<!-- ELSEIF nazwa_modulu IS "Pliki" -->inny link<!-- END -->

A teraz chcemy zmienić kolejność linków lub wymyślić inny układ. Całkowicie przebudować interfejs. Na nic zda się lista modułów przekazana przez warstwę logiki.
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.