Кейс: закрытый раздел для скачивания технической документации по препаратам
Исходная задача
Клиенту требовалось создать на сайте закрытый раздел с технической документацией по препаратам. Раздел должен был быть доступен по отдельной ссылке и закрыт от публичного доступа, чтобы документы могли получать только авторизованные пользователи с подтверждёнными правами.
До разработки функционала документы приходилось передавать вручную: пользователи запрашивали сертификаты, декларации, паспорта безопасности и другие материалы у сотрудников клиента, после чего менеджеры искали нужные файлы и отправляли их отдельно. Такой процесс занимал время, создавал повторные обращения и повышал риск отправки неактуальных документов.
Клиент хотел получить удобный интерфейс, похожий на структуру файлового хранилища: пользователь заходит на страницу, видит список препаратов, выбирает нужный препарат или несколько препаратов и скачивает документы архивом.
Цель проекта
Создать закрытую страницу на сайте, где пользователи смогут самостоятельно получать актуальные документы по препаратам без участия менеджеров.
Основные задачи:
-
ограничить доступ к разделу только для разрешённой группы пользователей;
-
вывести список препаратов с документами;
-
дать возможность скачать все документы по одному препарату ZIP-архивом;
-
дать возможность выбрать отдельные документы внутри препарата;
-
реализовать массовое скачивание документов по нескольким препаратам;
-
сформировать общий архив по всем препаратам;
-
сохранить понятную структуру файлов внутри архива: документы должны раскладываться по папкам с названиями препаратов;
-
защитить прямой доступ к файлам и выдавать документы только после проверки прав.
Пользователи раздела
Раздел предназначен для авторизованных пользователей, которым клиент предоставляет доступ к технической документации. В первую очередь это партнёры, субподрядчики или покупатели, которым нужно получать актуальные документы по препаратам.
Пользователь получает доступ после авторизации на сайте. Если пользователь не авторизован, вместо списка документов отображается форма входа. Если пользователь авторизован, но не входит в разрешённую группу, он видит сообщение о запрете доступа.
Для проекта настроена проверка доступа по группе пользователей: работать с разделом могут администраторы и пользователи группы №7.
Структура закрытого раздела
Раздел реализован на странице:
/docs/
На странице выводится список препаратов. Для каждого препарата доступны действия:
-
скачать все документы по препарату ZIP-архивом;
-
открыть модальное окно и выбрать отдельные документы;
-
отметить препарат чекбоксом для массового скачивания документов по нескольким препаратам.
В верхней части страницы размещены массовые действия:
-
«Скачать документы на все препараты одним архивом»;
-
«Скачать документы выбранных препаратов ZIP».
Кнопка скачивания выбранных препаратов изначально скрыта. Когда пользователь отмечает хотя бы один препарат, кнопка общего архива скрывается, а вместо неё появляется кнопка скачивания выбранных препаратов.
Работа с документами
Документы хранятся в свойствах элементов инфоблока. Каждый препарат является отдельным элементом, а документы привязываются к нему через файловое свойство DOCS.
Для одного препарата может быть загружен один или несколько документов. Количество файлов не ограничивается логикой интерфейса: клиент может добавлять, заменять и обновлять документы через административную панель сайта.
Пользователь может работать с документами несколькими способами:
-
Скачать все документы по конкретному препарату.
-
Открыть список документов препарата в модальном окне.
-
Скачать один конкретный файл.
-
Отметить несколько документов внутри препарата и скачать только выбранные.
-
Отметить несколько препаратов и скачать все документы по ним одним архивом.
-
Скачать документы по всем препаратам одним общим архивом.
При формировании архива документы автоматически раскладываются по папкам с названиями препаратов. Это позволяет сохранить понятную структуру и быстро найти нужные материалы после скачивания.
Модальное окно выбора документов
Чтобы не перегружать страницу, список файлов по каждому препарату не выводится сразу при загрузке. Документы подгружаются AJAX-запросом только после клика на кнопку «Выбрать документы».
В модальном окне пользователь видит список файлов выбранного препарата. Если документов несколько, рядом с каждым отображается чекбокс. Пользователь может отметить только нужные документы и скачать их архивом через кнопку «Скачать выбранные».
Если у препарата только один документ, кнопка «Скачать выбранные» не выводится, так как выбор не требуется. В этом случае пользователь может скачать файл напрямую через кнопку «Скачать документ».
Массовое скачивание по препаратам
Для удобной работы с большим количеством документов реализован выбор препаратов через чекбоксы.
Если пользователь не выбрал ни одного препарата, ему доступна кнопка «Скачать документы на все препараты одним архивом». При нажатии система формирует ZIP-архив со всеми документами по всем препаратам.
Если пользователь выбирает один или несколько препаратов, кнопка общего архива скрывается и появляется кнопка «Скачать документы выбранных препаратов ZIP». В этом случае в архив попадают только документы отмеченных препаратов.
Внутри архива документы группируются по папкам:
Общий архив.zip
Препарат 1/
документ 1.pdf
документ 2.docx
Препарат 2/
декларация.pdf
паспорт безопасности.pdf
Предупреждение при большом количестве выбранных препаратов
Чтобы предупредить пользователя о возможной длительной загрузке, добавлено модальное предупреждение.
Когда пользователь выбирает 10-й препарат, появляется сообщение о том, что формирование и скачивание архива может занять много времени. В модальном окне доступны две кнопки:
-
«Скачать выбранное» — сразу запускает скачивание архива по выбранным препаратам;
-
«Продолжить выбор» — закрывает предупреждение и позволяет выбирать препараты дальше.
Предупреждение повторяется при выборе 20-го, 30-го, 40-го препарата и далее каждые 10 выбранных позиций. Логика учитывает текущее количество выбранных чекбоксов при каждом изменении: если пользователь снял часть отметок, а затем снова дошёл до порогового значения, предупреждение появится повторно.
Техническая реализация
Раздел реализован на сайте под управлением 1С-Битрикс. Для вывода списка препаратов используется компонент bitrix:news.list.
В целях оптимизации файловое свойство DOCS не загружается сразу для всех элементов списка. На странице может быть до 1000 препаратов, поэтому предварительная загрузка всех документов могла бы замедлять работу раздела. Вместо этого реализована ленивая AJAX-загрузка: список документов конкретного препарата запрашивается только при открытии модального окна.
Для проекта разработаны отдельные серверные обработчики:
-
/docs/get_documents.php — получает список документов конкретного препарата для модального окна;
-
/docs/download_file.php — скачивает один документ;
-
/docs/download_zip.php — формирует ZIP по одному препарату или выбранным документам;
-
/docs/download_zip_bulk.php — формирует ZIP по всем или выбранным препаратам.
ZIP-архивы формируются стандартными средствами PHP без сторонних библиотек. Временные архивы создаются в каталоге /docs/zipfile и удаляются после скачивания, чтобы не занимать место на сервере.
Безопасность
Раздел закрыт от неавторизованных пользователей. Доступ к странице и ко всем AJAX-обработчикам проверяется отдельно.
Перед просмотром или скачиванием документов система проверяет:
-
авторизован ли пользователь;
-
входит ли пользователь в разрешённую группу;
-
является ли пользователь администратором;
-
корректна ли сессия Битрикс;
-
корректна ли подпись переданных параметров;
-
относится ли запрошенный файл к выбранному препарату.
Прямые ссылки на файлы из /upload/iblock/ не используются для скачивания. Одиночные документы отдаются через защищённый PHP-обработчик /docs/download_file.php. Это позволяет не открывать документы публично и исключить скачивание файла без проверки прав.
Даже если пользователь узнает технический ID файла, он не сможет скачать его через обработчик, если этот файл не привязан к выбранному препарату в свойстве DOCS.
Оптимизация производительности
Так как раздел может содержать большое количество препаратов и документов, особое внимание было уделено скорости загрузки страницы.
Основные решения:
-
документы не загружаются вместе со списком препаратов;
-
список файлов подгружается только по клику;
-
результат AJAX-загрузки кешируется на стороне браузера в рамках текущей страницы;
-
ZIP формируется на диске, а не в оперативной памяти;
-
временные архивы удаляются после скачивания;
-
для массового скачивания добавлено предупреждение при выборе большого количества препаратов.
Такой подход позволяет сохранить быструю загрузку основной страницы и при этом поддерживать работу с большим объёмом файлов.
Управление документами
Сотрудники клиента могут управлять документами через административную панель сайта. Документы привязаны к конкретным препаратам через файловое свойство элемента инфоблока.
При необходимости можно заменить один устаревший файл, не изменяя остальные документы препарата. Это важно для сертификатов и деклараций с ограниченным сроком действия: если один документ обновился, администратор заменяет только его, а остальные материалы остаются на месте.
Участие программиста для стандартного добавления или замены документов не требуется.
Результат для клиента
Клиент получил закрытый раздел для самостоятельного распространения технической документации. Пользователи могут получать нужные документы в любое время без обращения к менеджерам.
Что изменилось после внедрения:
-
документы стали доступны в единой закрытой точке;
-
снизилась нагрузка на сотрудников, которые раньше вручную искали и отправляли файлы;
-
пользователи могут скачивать документы по одному препарату, нескольким препаратам или всем препаратам сразу;
-
появилась возможность выбирать только нужные файлы внутри препарата;
-
архивы формируются автоматически и сохраняют понятную структуру по папкам;
-
прямой доступ к файлам закрыт, скачивание проходит через проверку прав;
-
обновление документов выполняется через административную панель сайта.
Функционал решил исходную бизнес-задачу: упростил передачу документов партнёрам и клиентам, сократил ручные операции и повысил контроль над доступом к технической документации.
Возможности развития
В дальнейшем раздел можно расширить дополнительными возможностями:
-
добавить поиск по названию препарата или документа;
-
вывести дату загрузки и срок действия документа;
-
добавить статусы актуальности сертификатов;
-
реализовать уведомления об истечении срока действия документов;
-
добавить журнал скачиваний;
-
настроить статистику по пользователям и документам;
-
реализовать разные уровни доступа для отдельных групп пользователей;
-
добавить интеграцию с CRM, 1С или внутренней системой клиента.
Другие статьи