W pierwszej chwili można sobie pomyśleć, co ma piernik do wiatraka, ale jednak… Okazuje się, że w pewnych sytuacjach szablon Joomla! może przeszkodzić w działaniu systemu kontroli dostępu wbudowanego w Joomla!.
Aby w pełni zrozumieć ten wpis musisz wiedzieć, czym są Template Overrides w Joomla!. Robert Matuszewski już o tym napisał na swoim blogu, więc warto przeczytać, jeśli jest to dla Ciebie nowość.
Przejdźmy do sedna sprawy. Otóż po ustawieniu wszelkich praw dostępu do treści może się okazać, że użytkownik, który powinien mieć możliwość edycji artykułów ze strony frontowej nie widzi przycisku edycji. Wiele osób w tym momencie może stracić wiele godzin na próbach zażegnania problemu, gdyż rozwiązania należy szukać w dość nieoczekiwanym miejscu – w szablonie.
Poprawka
Na początek należy się przyjrzeć części kodu odpowiedzialnej za wyświetlanie linku edycji artykułu.
Plik: /templates/nazwaszablonu/html/com_content/category/blog_item.php
1 2 3 4 5 |
[cc lang="php" escaped="true"] <?php if ($canEdit) : ?> <?php echo JHtml::_('icon.edit', $this->item, $params); ?> <?php endif; ?> [/cc] |
Szybka analiza kodu i już wiemy, że ikona edycji pojawia się tylko wtedy, gdy zmienna $canEdit ma wartość true. Aby zrozumieć, jak generowana jest wartość tej zmiennej przechodzimy na początek pliku, gdzie mma taki kod:
1 2 3 |
[cc lang="php" escaped="true"] $canEdit = $this->user->authorise('core.edit', 'com_content.frontpage.'.$this->item->id); [/cc] |
Zdarzyć się może także taka wersja:
1 2 3 |
[cc lang="php" escaped="true"] $canEdit = $this->user->authorise('core.edit', 'com_content.article.'.$this->item->id); [/cc] |
Oznacza to, że w tabeli z prawami dostępu sprawdzane jest, czy użytkownik ma prawa „edit” do tego artykułu. Jeśli tak jest, to zmienna zwróci true.
Problemem jest to, że oprócz prawa dostępu „edit” mamy również np. „edit own„, czyli możliwość edycji tylko własnych artykułów. W takim momencie zmienna przyjmie wartość „false„, co już jest problemem. Rozwiązaniem jest zamiana kodu w górnej części pliku na:
1 2 3 |
[cc lang="php" escaped="true"] $canEdit = $this->item->params->get('access-edit'); [/cc] |
co jest jednoznaczne ze sprawdzeniem wszystkich potrzebnych praw do treści. Mamy więc kuloodporne rozwiązanie.
Aby uniknąć podobnych problemów zawsze warto sprawdzać aktualizacje Template Overrides u dużych dostawców szablonów, którzy szybko łatają błędy. Dobrym pomysłem jest wrzucanie kolejnych wersji szablonów takich jak Gantry (RocketTheme) na Git i obserwowanie zmian w kodzie.