Главная Дорабатываем панель управления 1С-Битрикс. Часть 1. Меню

Дорабатываем панель управления 1С-Битрикс. Часть 1. Меню

Раздел: Web-разработка, CMS, 18 октября 2008 8 комментариев
Дорабатываем панель управления 1С-Битрикс. Часть 1. Меню

Битрикс безусловно хорошая 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/. Если лень рисовать свои иконки, можно взять из других модулей (я скопировал из модуля “Статистика”).

Все! Меню готово:

Дорабатываем панель управления 1С-Битрикс. Часть 1. Меню

Смотрите также:

8 комментариев

  1. Alex_K пишет:

    Это ведь модификация ядра? При обновлениях затрется?

  2. Knave пишет:

    Да, но вероятность что затрется низкая, т.к. меняются файлы, которые “расположены далеко от центра ядра” :) и меняются редко.

  3. [...] Меню мы уже сделали. Начнем с одно “фишечки” Битрикса. Как вы помните из предыдущей статьи (и могли заметить это в самом Битриксе), ссылки выглядять как “learn_report_questions.php?lang=”.LANG, т.е. полностью ссылка будет выглядеть как “/bitrix/admin/learn_report_questions.php?lang=ru”? например. [...]

  4. Co пишет:

    Огромный минус в том, что при обновлении модуля “Обучения” файл меню затрется. Есть два варианта решения.

    Вариант 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.

  5. Knave пишет:

    Да, есть такой варинат. Но при все своей правильности он менее гибкий.

  6. Co пишет:

    Вариант 3. Самый лучший.

    Добавить обработчик на событие OnBuildGlobalMenu. Обработчик должен вернуть массив пунктов. Т.о. можно добавить свои пункты практически в любое место дерева.

  7. Knave пишет:

    Co, большое спасибо за информацию! Полезное событие :) Намного больше возможностей, чем при использовании .left.menu.php

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

  8. bitrixoid пишет:

    А так можно в любом модуле сделать? т.е. можно даже добавить там где Файлы и папки пункт дополнительный?

Оставить комментарий


© 2008–2010 Копилефт и все такое...