Техническое задание: Компонент “Глоссарий” для 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?>
<!-- Модальное окно для детального просмотра -->
×
8. JavaScript функциональность
// AJAX поиск
// Модальные окна
// Избранное (localStorage)
// Навигация по клавишам
9. Требования к верстке
- Адаптивный дизайн (мобильные устройства)
- Поддержка accessibility (ARIA-атрибуты)
- CSS Grid/Flexbox для раскладки
- Анимации переходов
10. Оптимизация и производительность
- Кеширование запросов к БД
- Lazy loading для большого количества терминов
- Минификация CSS/JS
- Возможность подключения CDN для статики
Результат: Полнофункциональный компонент с файлами .description.php, .parameters.php, component.php, шаблоном, стилями и скриптами, готовый к установке и настройке в админке 1С-Битрикс.