Разработка

Компонент "Глоссарий" для CMS Bitrix

Компонент "Глоссарий" для CMS Bitrix

Техническое задание: Компонент “Глоссарий” для 1С-Битрикс

Общая информация

 Название компонента: `custom:glossary`

 Путь размещения: `/local/components/custom/glossary/`

 Назначение: Отображение терминов и определений с алфавитной навигацией и поиском

1. Функциональные требования

 Основные возможности:


- Вывод списка терминов из инфоблока с группировкой по буквам алфавита

- Алфавитная навигация (A-Z, А-Я) с подсчетом количества терминов на каждую букву

- Поиск по терминам через AJAX

- Детальный просмотр термина в модальном окне или на отдельной странице

- Поддержка SEF URL

- Адаптивная верстка


 Дополнительные функции:


- Возможность показа "похожих терминов"

- Экспорт глоссария в PDF/Excel

- Избранные термины (с использованием localStorage)

2. Структура файлов компонента

/local/components/custom/glossary/
├── .description.php          # Описание компонента
├── .parameters.php           # Настройки компонента
├── component.php             # Основная логика
├── ajax.php                  # AJAX-обработчик для поиска
├── templates/
│   └── .default/
│       ├── template.php      # Шаблон вывода
│       ├── style.css         # Стили
│       ├── script.js         # JavaScript
│       └── result_modifier.php # Модификатор результатов
└── lang/
    ├── ru/
    │   ├── .description.php
    │   └── .parameters.php
    └── en/
        ├── .description.php
        └── .parameters.php

3. Параметры компонента (.parameters.php)

 Основные параметры:
"IBLOCK_TYPE" => [
    "PARENT" => "BASE",
    "NAME" => "Тип инфоблока",
    "TYPE" => "LIST",
    "VALUES" => $arIBlockType,
    "REFRESH" => "Y"
]

"IBLOCK_ID" => [
    "PARENT" => "BASE",
    "NAME" => "Инфоблок",
    "TYPE" => "LIST",
    "VALUES" => $arIBlock
]

"ELEMENTS_COUNT" => [
    "PARENT" => "VISUAL",
    "NAME" => "Количество элементов на странице",
    "TYPE" => "STRING",
    "DEFAULT" => "50"
]

"SORT_FIELD" => [
    "PARENT" => "DATA_SOURCE",
    "NAME" => "Поле сортировки",
    "TYPE" => "LIST",
    "VALUES" => ["NAME" => "Название", "SORT" => "Индекс сортировки"]
]

"ALPHABET_TYPE" => [
    "PARENT" => "VISUAL",
    "NAME" => "Тип алфавита",
    "TYPE" => "LIST",
    "VALUES" => [
        "RU" => "Русский (А-Я)",
        "EN" => "Английский (A-Z)",
        "BOTH" => "Оба алфавита"
    ]
]
 SEF параметры:
"SEF_MODE" => ["Y", "N"]
"SEF_FOLDER" => "/glossary/"
"SEF_URL_TEMPLATES" => [
    "list" => "",
    "letter" => "#LETTER#/",
    "detail" => "#ELEMENT_CODE#/"
]
 Кеширование:
"CACHE_TYPE" => ["A", "Y", "N"]
"CACHE_TIME" => "3600"
"CACHE_GROUPS" => ["Y", "N"]

4. Структура инфоблока

 Обязательные поля:


- `NAME` - название термина

- `CODE` - символьный код

- `PREVIEW_TEXT` - краткое описание

- `DETAIL_TEXT` - полное описание

- `ACTIVE` - активность


 Дополнительные свойства:


- `SYNONYMS` (строка) - синонимы через запятую

- `CATEGORY` (список) - категория термина

- `RELATED_TERMS` (привязка к элементам) - связанные термины

5. Логика компонента (component.php)

 Основной алгоритм:
// 1. Проверка подключения модулей
if (!CModule::IncludeModule("iblock")) {
    ShowError("Модуль инфоблоков не установлен");
    return;
}

// 2. Обработка параметров
$arParams = array_merge([
    "IBLOCK_ID" => 0,
    "ELEMENTS_COUNT" => 50,
    "ALPHABET_TYPE" => "RU",
    "SORT_FIELD" => "NAME",
    "CACHE_TIME" => 3600
], $arParams);

// 3. SEF обработка
if ($arParams["SEF_MODE"] == "Y") {
    // Определение текущей страницы и параметров из URL
}

// 4. Получение текущей буквы
$currentLetter = $_GET['letter'] ?? '';

// 5. Кеширование
if ($this->StartResultCache()) {

    // 6. Формирование фильтра
    $arFilter = [
        "IBLOCK_ID" => $arParams["IBLOCK_ID"],
        "ACTIVE" => "Y"
    ];

    if ($currentLetter) {
        $arFilter["NAME"] = $currentLetter . "%";
    }

    // 7. Получение элементов
    $rsElements = CIBlockElement::GetList(
        [$arParams["SORT_FIELD"] => "ASC"],
        $arFilter,
        false,
        ["nTopCount" => $arParams["ELEMENTS_COUNT"]],
        ["ID", "NAME", "CODE", "PREVIEW_TEXT", "DETAIL_PAGE_URL"]
    );

    // 8. Формирование результата
    $arResult["ITEMS"] = [];
    $arResult["LETTERS_STAT"] = [];

    while ($arElement = $rsElements->GetNext()) {
        $firstLetter = mb_substr($arElement["NAME"], 0, 1);
        $arResult["LETTERS_STAT"][$firstLetter]++;

        if (!$currentLetter || $firstLetter == $currentLetter) {
            $arResult["ITEMS"][] = $arElement;
        }
    }

    // 9. Формирование алфавита
    $arResult["ALPHABET"] = $this->generateAlphabet($arParams["ALPHABET_TYPE"]);
    $arResult["CURRENT_LETTER"] = $currentLetter;

    $this->EndResultCache();
}

6. AJAX обработка (ajax.php)

// Поиск терминов по названию
if ($_POST['action'] == 'search') {
    $searchQuery = htmlspecialchars($_POST['query']);

    $arFilter = [
        "IBLOCK_ID" => $_POST['iblock_id'],
        "ACTIVE" => "Y",
        [
            "LOGIC" => "OR",
            "NAME" => "%" . $searchQuery . "%",
            "PREVIEW_TEXT" => "%" . $searchQuery . "%"
        ]
    ];

    // Возврат JSON с результатами
}

7. Шаблон вывода (template.php)

 Структура шаблона:

    <!-- Поиск -->




    <!-- Алфавитная навигация -->

        <?foreach($arResult["ALPHABET"] as $letter => $data):?>
            ["
               class="letter-link <?=$letter == $arResult['CURRENT_LETTER'] ? 'active' : ''?>">
                <?=$letter?>
                <?if($data['COUNT']):?>
                    (<?=$data['COUNT']?>)
                <?endif?>
            ](<?=$data[)
        <?endforeach?>


    <!-- Список терминов -->

        <?if(!empty($arResult["ITEMS"])):?>
            <?foreach($arResult["ITEMS"] as $item):?>


###
                        ["><?=$item['NAME']?>](<?=$item[)


                    <?=$item['PREVIEW_TEXT']?>



            <?endforeach?>
        <?else:?>
            Термины не найдены


        <?endif?>


    <!-- Модальное окно для детального просмотра -->


            &times;



8. JavaScript функциональность

// AJAX поиск
// Модальные окна
// Избранное (localStorage)
// Навигация по клавишам

9. Требования к верстке

- Адаптивный дизайн (мобильные устройства)

- Поддержка accessibility (ARIA-атрибуты)

- CSS Grid/Flexbox для раскладки

- Анимации переходов

10. Оптимизация и производительность

- Кеширование запросов к БД

- Lazy loading для большого количества терминов

- Минификация CSS/JS

- Возможность подключения CDN для статики

Результат: Полнофункциональный компонент с файлами .description.php, .parameters.php, component.php, шаблоном, стилями и скриптами, готовый к установке и настройке в админке 1С-Битрикс.