Веб мастер

COP_JOOMLA

1 1 1 1 1 1 1 1 1 1 Рейтинг 2.50

Хотите сделать более удобное меню в Панели управления Joomla? Нет ничего проще, несколько простых шагов и сможете делать с меню все что захотите.

Хотите сделать более удобное меню в Панели управления Joomla? Нет ничего проще, несколько простых шагов и сможете делать с меню все что захотите.

Существует много разных задач, в которых может помочь индивидуализация меню в панели управления. Одни из самых важных задач: сделать меню интуитивно понятным и вынести наиболее часто используемые пункты поближе. Так же можно убрать пункты меню, которые загромождают меню для остальных пользователей (не администраторов). Мы также можем убрать часть пунктов, которые не нужны пользователю в повседневной работе или пункты меню, с помощью которых обычный пользователь может нанести вред сайту.

Вы конечно же знаете, что меню панели управления нельзя изменять, Joomla позволяет управлять только меню на самом сайте, но не в панели управления. Но, в общем-то, не все так страшно, все, что необходимо для формирования меню (названия пунктов, ссылки и иерархия) находиться в шаблоне вывода модуля меню. Переопределяя его поведение, мы можем управлять меню в панели управления, так как захотим. Такой подход конечно требует умения программировать, но в целом внесение необходимых изменений доступны даже начинающему программисту PHP.

В Joomla 2.5 шаблон вывода меню состоит из трех файлов расположенных в каталоге administrator/modules/mod_menu/tmpl/: default.php, default_disabled.php иdefault_enabled.php. Файл default.php отвечает за выбор основного обработчика вывода меню, в зависимости от того в каком состоянии находится меню – включено или выключено. Если меню выключено, то подключается обработчикdefault_enabled.php. Если выключено, то default_disabled.php. В отключенном состоянии мы можем увидеть меню, когда редактируем какой-либо элемент в Joomla. В первую очередь нас интересует изменение включенного меню, но рекомендуем сделать изменения и выключенном, чтобы пункты меню не «скакали» при переходе от включенного меню к выключенному, и обратно.

В Joomla стандартным подходом для изменения поведения расширений считается перегрузка шаблона вывода расширения в шаблоне темы. Мы будем работать с шаблоном панели управления bluestork. Более подробно о перегрузке шаблонов вывода расширений поговорим в следующий раз, а сейчас нам достаточно знать, что нам необходимо скопировать необходимые нам файлы из каталога administrator/modules/mod_menu/tmpl/ в каталогadministrator/templates/bluestork/html/mod_menu/. Файл default.php, как уже говорилось выше, отвечает за выбор основного обработчика, его поведение нам не нужно менять, поэтому копировать его не будем. Нам нужно скопировать файлыdefault_disabled.php и default_enabled.php, которые мы и будем изменять. Если вы вдруг сделали ошибку, которую не можете исправить, можно или просто переименовать файл с ошибкой или скопировать из каталога модуля еще раз. Так что не бойтесь экспериментировать, в любой момент вы можете вернуть все как было.

1. Часть мы все подготовили, теперь можно перейти и к самому интересному: добавлению своих элементов в меню панели инструментов. Для начала давайте поизучаем файл default_enabled.php и выясним, как формируется меню и его элементы.

Этот фрагмент кода нам в этом поможет:

1 //
2 // Site SubMenu
3 //
4 $menu->addChild(
5     new JMenuNode(JText::_('JSITE'), '#'), true
6 );
7 $menu->addChild(
8     new JMenuNode(JText::_('MOD_MENU_CONTROL_PANEL'), 'index.php','class:cpanel')
9 );
10 ...
11 $menu->getParent();

Многие разработчики Joomla возможно уже поняли, как происходит формирование меню, если это не так, ничего страшного, сейчас мы с этим разберемся.

В 5 и 8 строках вызывается конструктор элемента меню JMenuNode, ему необходимо передать два параметра: название пункта и ссылка по которой нужно переходить при выборе этого пункта. Остальные параметры не обязательны, но их можно передавать, пример в 8 строке. Метод addChild (строка 4) добавляет в меню, только что созданный конструктором JMenuNode элемент меню, второй параметр в этом методе указывает, будет ли этот элемент родительским для других элементов. Если он равен true, то элемент будет родительским, иначе нет. В приведенном выше фрагменте кода в строка с 4–6 формируется родительские элемент меню, а в строках 7–9 формируется элемент меню который будет дочерним по отношению к предыдущему пункту и не будет иметь других дочерних пунктов. Нужно заметить, что когда мы создаем родительский элемент меню, мы как бы опускаемся на уровень вниз. И все последующие операции происходят на этом уровне и чтобы вернуться, нам нужно подняться на уровень верх. В 11 строке мы как раз это и делаем.

Ну с теорией в общем-то все, перейдем к практике. Добавим наше меню перед пунктом «Справка». Для этого найдем в коде файла строки (у меня это 344 строка):

1 //
2 // Help Submenu
3 //

И перед ними добавим следующий код (не забывайте, что мы работаем с файлами расположенными в каталоге administrator/modules/mod_menu/tmpl/):

1 //
2 // My Submenu
3 //
4 $menu->addChild(
5     new JMenuNode(JText::_('MOD_MENU_MY_TOP_MENU'), '#'), true
6 );
7 $menu->addChild(
8     new JMenuNode(JText::_('MOD_MENU_MY_ELEMENT1'), 'index.php?option=com_menus&view=items&menutype=mainmenu', 'class:panel')
9 );
10 $menu->addChild(
11     new JMenuNode(JText::_('MOD_MENU_MY_ELEMENT2'), 'index.php?option=com_content&view=article&layout=edit', 'class:panel')
12 );
13 $menu->getParent();

Сохраняемся и едем в панель управления смотреть, что у нас получилось. Если вы все сделали правильно, то без труда увидите картинку как у меня:

Все хорошо, только названия не очень понятные, можно конечно вместоJText::_()сразу написать необходимые названия, но это не подходит под философию Joomla. Для этого существуют языковые файлы. Именно поэтому Joomla и ее расширения переведены на множество различных языков.

2. Часть мы остановились на функции JText::_(), эта функция отвечает за локализацию, или другими словами за перевод на другие языки.

Файлы локализации для панели управления находятся в каталогеadministrator/language. В нем находятся каталоги с названиями языка, например:en-GB – английский язык, ru-RU – русский язык. И соотвественно уже в этих каталогах находятся сами языковые файлы. Они представляют из себя обычные текстовые файлы. Эти файлы должны иметь расширение ini, начинаться с префикса языка, для которого они предназначены, иметь кодировку UTF-8 без заголовка BOM. В названии файлы между префиксом языка и расширением содержится название расширения, к которому относиться данный языковой модуль.
Мы работаем с модулем панели управления mod_menu, следовательно, нас интересует языковой файл ru-RU.mod_menu.ini, который располагается в каталогеadministrator/language/ru-RU/.

Добавим в конце этого файла строки:

1 MOD_MENU_MY_TOP_MENU="Мое меню"
2 MOD_MENU_MY_ELEMENT1="Редактирование основного меню"
3 MOD_MENU_MY_ELEMENT2="Создать материал"

Как видно, сначала идет строка, которую мы указывали в функции JText::_(), а затем через знак равенства в прямых кавычках перевод, то есть тот текст, который должен отображаться.

Мы практические закончили, но остался один нюанс: При включенном меню мы видим пункт «Мое меню», а при выключенном, например, когда происходит редактирование какого-либо элемента, не видим. В общем-то в этом нет ничего страшного, но оставив без изменения выклеенное меню, мы рискуем ввести в заблуждение пользователей для которых оно создано и спровоцировать шквал вопросов, которые нам совсем нужны. Так что лучше потратим еще немного времени и добавим необходимый функционал в выключенное меню.

Как уже говорилось, за формирование выключенного меню отвечает файлdefault_disabled.php. Так как выключенное меню не позволяет показывать, раскрывающееся меню, то нам достаточно будет сформировать только пункт выключенный пункт меню «Мое меню».

Открываем для редактирования файл administrator/templates/bluestork/html/mod_menu/ default_disabled.php , и находим следующие строки:

1 //
2 // Help Submenu
3 //

Перед ними вставляем следующий код:

1 //
2 // My Submenu
3 //
4 $menu->addChild(new JMenuNode(JText::_('MOD_MENU_MY_TOP_MENU'), null,'disabled'));

В второй части мы уже рассматривали подобный код, сейчас остановимся только на отличиях. За место ссылки мы используем значение null, а зачем нам ссылка в выключенном меню. Также мы не стали указывать, что меню содержит дочерние пункты и наконец, в конструкторе элемента меню JMenuNode в третьем параметре мы явно указали, что меню выключено 'disabled'.

3. Часть мы разобрались, как пользоваться языковыми файлами и, как добавить пункт к выключенному меню.

Но не будем останавливаться на достигнутом и избавим наших пользователей от пунктов меню, которые им не нужны. Не важно, по каким причинам, наша это прихоть или желание заказчика.

Давай для простоты объяснения, определимся, что для всех групп пользователей кроме группы «Супер-пользователи» должны быть доступны: из меню «Сайт» – пункты «Панель управления», «Мой профиль», «Выйти», меню «Материалы» – полностью, меню «Мое меню» – полностью и меню «Справка» – полностью. Практически такой набор пунктов меню мы получим, если у пользователя будет группа «Менеджер». За исключением одного но, там не нужен пункт меню «Компоненты» которое включено для этой группы.
Ни и теперь, сформулировав задачу мы снова обратимся файлу формирования включенного меню default_enabled.php. Так хотелось опять полезть в дебри кода и быстро все исправить, но в Joomla мы можем управлять правами группы и, все, что нам необходимо – это просто запретить использовать расширения находящиеся в пункте меню «Компоненты».

Рассмотри на примере компонента «Баннеры». Заходим в «Менеджер баннеров»: Меню > Компоненты > Баннеры:

В правом верхнем меню выбираем «Настройки», в всплывающем окне «Настройки менеджера баннеров» выбираем закладку «Права» и выбираем группу «Менеджеры»:
Настройки менеджера баннеров
Для всех действий выбираем «Запрещено», сохраняемся. Вот и все для всех пользователей группы «Менеджер» компонент «Баннеры» не доступен. Проделав такую операцию со всеми компонентами, расположенными в пункте меню «Компоненты» мы сможем избавиться и от самого пункта «Компоненты», Если в нем не будет подпунктов, то он просто не будет отображаться.

Но, все таки существуют задачи, в которых может понадобиться правкаdefault_enabled.php. Например, можно захотеть дать доступ к компоненту «Баннеры», но при этом убрать пункт меню «Компоненты». В данной ситуации мы не можем запретить доступ к компоненту «Баннеры», следовательно пункт «Компоненты» будет отображаться. Для решения этой задачи, найдем в файле формирования меню следующие строки:

1 //
2 // Components Submenu
3 //
4 // Get the authorised components and sub-menus.
5 $components = ModMenuHelper::getComponents( true );
6 // Check if there are any components, otherwise, don't render the menu
7 if ($components)
8 {

В этом куске кода, в 5 строке, проверяется, есть ли компоненты для вывода и если есть, то дальше идет формирование пункта «Компоненты». Нам нужно отключить формирование, если пользователь принадлежит группе «Менеджеры». В «Менеджер пользователей: Группы пользователей» на нужно посмотреть ID этой группы – он равен 6. Получить список групп пользователя можно так: $user->get('groups') – это будет массив со всеми группами, к которым принадлежит пользователь. И теперь мы можем изменить приведенный выше код, чтобы для группы «Менеджеры» пункт меню «Компоненты» не выводился:, исправляем 7 строку на:

1 if ($components and !in_array(6, $user->get('groups')))

Вообще, данный код некорректен с логической точки зрения, потому, что если пользователь будет принадлежать помимо группы «Менеджеры» еще и к группе «Администратор», то у него тоже отключится вывод формирование пункта «Компоненты». Но, как иллюстрацию применения такого подхода этим можно пренебречь. Вообще для решения подобной задачи можно было пойти от противного не запретить какой-то группе, а разрешить определенным группам. В нашем случае это бы выглядело так: разрешить пользователям из групп «Супер-пользователи» (ID=8) и «Администраторы» (ID=7) показывать пункт меню «Компоненты». И соответственно строка 7 была бы такой:

1 if ($components and (in_array(7, $user->get('groups')) or in_array(8,$user->get('groups'))))

или такой

1 if ($components and !empty(array_intersect(array(7,8), $user->get('groups'))))
 

Коментарии

FORM_HEADER


FORM_CAPTCHA
FORM_CAPTCHA_REFRESH

На нашем сайте вы можете читать коментировать бесплатно и без регистрации  , при том узнавать новую и полезную информацию. При использовании текстовых материалов сайта, гиперссылка на источник - обязательна! Вся информация на сайте, представлена исключительно в ознакомительных целях.

COP_JOOMLA
COP_JOOMLA
Украина онлайн
Счетчик PR-CY.Rank

  

Путь:
COP_JOOMLA