Битрикс безусловно хорошая CMS, но иногда возникает потребность доработать ее: добавить новые возможности, функции, страницы. Я попытаюсь на примере реального проекта показать, как модифицировать Битрикс, добавив новые страницы и пункты меню в админку Битрикса используя максимум из доступных API-функций панели управления.
Дорабатывать будем раздел “Сервисы”, модуль “Обучение”. Любой другой делается по аналогии.
Задача ставилась такая: добавить в модуль “Обучение” отчеты о прохождении тестов (всего пять видов).
1. Пункты меню
Первое что нужно сделать – обеспечить доступ к страницам из бокового меню. Для этого (напоминаю, что работаем мы с “Сервис” -> “Обучение”) открываем файл /bitrix/modules/learning/admin/menu.php.
Находим место, куда хотим добавить пункт меню. Например, за вывод пункта “Попытки” отвечает кусок кода:
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. | //Attempts Array( "text" => GetMessage("LEARNING_MENU_ATTEMPT"), "url" => "learn_attempt_admin.php?lang=".LANG, "title" => GetMessage("LEARNING_MENU_ATTEMPT_ALT"), "items_id" => "menu_learning_attempt", "icon" => "learning_menu_icon_attempts", "page_icon" => "learning_page_icon_attempts", "more_url" => Array( "learn_attempt_edit.php", "learn_test_result_edit.php", "learn_test_result_admin.php", ), ), |
Сразу после него добавляем наш пункт. Т.к. отчетов пять и каждый на отдельной странице, то струтура добавляемого меню будет такой:
Отчеты
| – По вопросам
| – По тестам
| – По сотрудникам
| – По подразделениям
| – По должностям
Код выглядит так:
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. | //Reports Array( "text" => GetMessage("LEARNING_MENU_REPORT"), "url" => "learn_reports.php?lang=".LANG, "title" => GetMessage("LEARNING_MENU_REPORT_ALT"), "items_id" => "menu_learning_reports", "icon" => "learning_menu_icon_reports", "page_icon" => "learning_page_icon_reports", "more_url" => Array( ), "items" => Array( Array( "text" => GetMessage("LEARNING_MENU_REPORT_QUESTIONS"), "url" => "learn_report_questions.php?lang=".LANG, "title" => GetMessage("LEARNING_MENU_REPORT_QUESTIONS_ALT"), "items_id" => "menu_learning_reports_questions", "icon" => "learning_menu_icon_reports_report", "page_icon" => "learning_page_icon_reports", "more_url" => Array(), ), Array( "text" => GetMessage("LEARNING_MENU_REPORT_TESTS"), "url" => "learn_report_tests.php?lang=".LANG, "title" => GetMessage("LEARNING_MENU_REPORT_TESTS_ALT"), "items_id" => "menu_learning_reports_test", "icon" => "learning_menu_icon_reports_report", "page_icon" => "learning_page_icon_reports", "more_url" => Array(), ), Array( "text" => GetMessage("LEARNING_MENU_REPORT_USERS"), "url" => "learn_report_users.php?lang=".LANG, "title" => GetMessage("LEARNING_MENU_REPORT_USERS_ALT"), "items_id" => "menu_learning_reports_users", "icon" => "learning_menu_icon_reports_report", "page_icon" => "learning_page_icon_reports", "more_url" => Array(), ), Array( "text" => GetMessage("LEARNING_MENU_REPORT_SUBDIVISIONS"), "url" => "learn_report_subdivisions.php?lang=".LANG, "title" => GetMessage("LEARNING_MENU_REPORT_SUBDIVISIONS_ALT"), "items_id" => "menu_learning_reports_subdivisions", "icon" => "learning_menu_icon_reports_report", "page_icon" => "learning_page_icon_reports", "more_url" => Array(), ), Array( "text" => GetMessage("LEARNING_MENU_REPORT_POSTS"), "url" => "learn_report_posts.php?lang=".LANG, "title" => GetMessage("LEARNING_MENU_REPORT_POSTS_ALT"), "items_id" => "menu_learning_reports_posts", "icon" => "learning_menu_icon_reports_report", "page_icon" => "learning_page_icon_reports", "more_url" => Array(), ), ), ), |
После сохранения не спешите обновлять страницу и смотреть на результат. Все равно ничего не увидите :). Важный шаг – добавление строк в языковые файлы.
2. Перевод
Править нужно файлы (вместо ru и en могут быть идентификаторы других языков. установленных в Битриксе, например ua):
/bitrix/modules/learning/lang/ru/admin/menu.php
/bitrix/modules/learning/lang/en/admin/menu.php
Обратите внимание на вызов GetMessage(“LEARNING_MENU_REPORT”), это и есть получение языковой строки. Соответственно в языковые файлы нужно добавить
1. | $MESS ['LEARNING_MENU_REPORT'] = "Отчеты"; |
и т.д. для каждой строки. Этим шагом мы разобрались с параметрами “text” и “title” (Название ссылки и всплывающая подсказка).
Движемся дальше.
Параметр “url”, как не трудно догадаться, содержит ссылку на страницу; “items_id” – идентификатор пункта; “icon” содержит идентификатор иконки для меню, “page_icon” – то же самое, но для страницы.
3. Иконки
Описания классов будем хранить в /bitrix/themes/.default/learning.css. Делается все по аналогии с уже существующими CSS-классами:
1. 2. | #learning_page_icon_reports {background-image:url(icons/learning/title_reports.gif);} #learning_menu_icon_reports {background-image:url(icons/learning/mnu_reports.gif);} |
и т.д. Рисунки в данном случае хранятся в /bitrix/themes/.default/icons/learning/. Если лень рисовать свои иконки, можно взять из других модулей (я скопировал из модуля “Статистика”).
Все! Меню готово:

Это ведь модификация ядра? При обновлениях затрется?
Да, но вероятность что затрется низкая, т.к. меняются файлы, которые “расположены далеко от центра ядра” :) и меняются редко.
[...] Меню мы уже сделали. Начнем с одно “фишечки” Битрикса. Как вы помните из предыдущей статьи (и могли заметить это в самом Битриксе), ссылки выглядять как “learn_report_questions.php?lang=”.LANG, т.е. полностью ссылка будет выглядеть как “/bitrix/admin/learn_report_questions.php?lang=ru”? например. [...]
Огромный минус в том, что при обновлении модуля “Обучения” файл меню затрется. Есть два варианта решения.
Вариант 1: Создать файл меню .left.menu.php в /bitrix/admin/ следующего содержания:
$aMenuLinks = Array(
Array(
"Отчеты",
"",
Array(),
Array("SECTION_ID"=>"learning", "SEPARATOR" => "Y", "SORT" => 700),
""
),
Array(
"Отчет 1",
"/bitrix/admin/my_learning_report_1.php",
Array(),
Array(),
""
),
Array(
"Отчет 2",
"/bitrix/admin/my_learning_report_2.php",
Array(),
Array(),
""
),
Array(
"Отчет 3",
"/bitrix/admin/my_learning_report_2.php",
Array(),
Array(),
""
),
);
Вариант 2: создать фиктивный модуль (/bitrix/modules/my_module/), в котором будет файл меню (/bitrix/modules/my_module/admin/menu.php).
Отмечу, что формат массива меню в первом и во втором варианте отличаются. В первом варианте формат такой же как и в публичном меню.
Также рекомендую название страниц админки делать более уникальными: вместо файла learn_report_posts.php, например, сделать prefix_learn_report_posts.php.
Да, есть такой варинат. Но при все своей правильности он менее гибкий.
Вариант 3. Самый лучший.
Добавить обработчик на событие OnBuildGlobalMenu. Обработчик должен вернуть массив пунктов. Т.о. можно добавить свои пункты практически в любое место дерева.
Co, большое спасибо за информацию! Полезное событие :) Намного больше возможностей, чем при использовании .left.menu.php
Однако, я вот так сходу не смог придумать структуру массива, чтобы добавить меню в раздел обучение.
А так можно в любом модуле сделать? т.е. можно даже добавить там где Файлы и папки пункт дополнительный?
Цели
Автомобиль
В процессе
Планштный ПК
В процессе
Разделы
Популярные записи
Свежие комментарии
Архив
Друзья