-Jasiu-
3.12.2012, 11:31:22
Witam,
Mam menu składające się z kilku elementów. Jednak chciałbym aby ich wyświetlanie było uwarnkowane od roli użytkownika w systemie. Id roli użytkownika przechowuje w tabeli, a następnie przypisuje je do jakieś zmiennej w aplikacji. I teraz pytanie: Czy mam obsłużyć to instrukcją if, że jeśli Id-roli=1 to wyświetla to i to itd? Czy może jakoś lepiej można to zrobić. Póki co mam 3 role w aplikacji.
viking
3.12.2012, 11:43:12
Zawsze to można zrobić lepiej. Zależy jaki jest Twój poziom. Przykładowo:
http://framework.zend.com/manual/1.12/en/z...troduction.html
-Jasiu-
3.12.2012, 12:18:45
Ale ja nie piszę w Zendzie. Czyste PHP.
viking
3.12.2012, 12:27:27
Pytanie było "Czy może jakoś lepiej można to zrobić". Akurat Zend_Acl jest niezależnym komponentem. A jak nie to w sieci znajdziesz całe mnóstwo klas
http://stackoverflow.com/questions/4415663...php-application
Niedawno w aplikacji też robiłem wyświetlanie pozycji menu w zależności od roli. U mnie było to nieco bardziej zakręcone. Rzadko bowiem który link jest tam jednoznaczny. Prowadzi on bowiem najczęściej do "linka agregującego", z którego dopiero można się dalej rozejść. Tak czy inaczej przebywanie na stronie z url, który jest "agregowany" przez określony element menu - podświetla go. Twój problem jest szczególnym jego przypadkiem, gdzie masz relację 1:1 do linka docelowego (brak linków agregowanych dodatkowo).
U mnie menu było dość statyczne, więc zawarłem strukturę w pliku konfiguracyjnym i dla każdeo najbardziej oddalonego liścia zdefiniowałem 2 indeksy: access i forbidden, wzajemnie się wykluczające (albo istnieje jeden albo drugi). Te, które zdefiniowane są w access, mogą dany element menu widzieć, pozostałe - nie. Te obecne w forbidden - nie, pozostałe - tak. Dodatkowo zrobiłem tak, że w trakcie generowania struktury sprawdzam, czy po operacjach związanych z uprawnieniami link "stracił" wszystkie związane z nim routingi. Jeśli tak, znikał z zasięgu widoczności. Bo po co wyświetlać pusty element menu, który stracił elementy docelowe? Posuwając się w górę można całkowicie "wyciąć" nawet całe, duże gałęzie. Oczywiście można optymalizować na poziomie każdego elementu, na każdym poziomie zagłębienia. Dla małych menu można jednak śmiało to zapamiętać i wrzucić do cache'u.
Utrzymanie takiego menu jest proste. Nowy element menu ma po prostu tablicę z określonym specyfikatorem i rolami które go tyczą. Brak przypisania ról czy specyfikatora to domyślnie brak uprawnień dla wszystkich lub widoczność tylko dla admina (ja wolę elementowi ją jawnie przypisać).. Próba wywołania linka o określonym routingu i jego nie znalezienie pośród wszystkich nie podświetlało nic. To co ja pisałęm ustawiało klasę active elementowi menu i można to było ręcznie na kilka sposobów zmieniać. Dopiero niepoprawne działanie tutaj mogło się zakończyć wyjątkiem.