Кастомные настройки сайта в Drupal

На сайте всегда (или почти всегда) возникает задача управления настройками вроде телефон, email, какие то текстовые элементы, вроде копирайта, адрес организации и т.п.

С точки зрения данных — требуется объект в терминах шаблонов проектирования — синглтон. Т.к. нам нужен всего один экземпляр.

Из готовых модулей для реализации этой концепции можно использовать модуль config_pages.

Другой подход так же традиционный — это создание модуля с конфигурацией, где описываются нужные нам поля. Далее выполняется создание и программирование кастомной формы для редактирования этой конфигурации. И уже в коде — это использование config API, для доступа к непосредственным данным.

Такую конфигу можно экспортировать/импортировать, что может быть как достоинством, так и проблемой.

План Б: нода + сервис

Я иногда использую третий подход, который позволяет избежать работы над программированием формы (а также настройки маршрута, и прав доступа к этой форме). Он заключается в том, что мы создаём дополнительный тип публикации, где объявляем, используя конструктор, нужные поля.

Код всё равно кое-какой придется написать, т.к. доступ к данным их этой публикации я оформляю в виде сервиса.

Администратором создаётся всего одна публикация этого типа, а редакторы ограничиваются в праве удалять или создавать их, но могут при этом редактировать уже существующие.

Далее более подробно.

Первый шаг

Создаём новый тип публикации, объявляем поля — пусть это будет публикация с машинным именем constants, и содержит поле field_email, где мы будем хранить публичный емайл адрес для контактов.

Второй шаг

Создание сервиса. Лучше оформить этот код в виде независимого кастомного модуля (для примера my_constants).

my_constants.info.yml

Сервис объявляется в файле my_constants.services.yml

Здесь указано, что код сервиса my_constants.get_constants должен быть реализован в виде класса в файле /src/Constants.php. Если это не какой то особенный сервис, то для реализации нет нужды расширять существующий класс или интерфейс, мы имеем дело с обычным классом.

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

Вот пример кода сервиса.

/src/Constants.php

CID — это ключ кеша в таблице cache_default.

Третий шаг — настройка

Ограничиваем права редакторов на создание и удаление публикаций этого типа, но выдать разрешение на редактирование (раздел user persmissions в админке).

Далее администратор создаёт одну публикацию, так мы укладываемся в концепцию singleton.

Четвертый шаг — использование

При создании кеша я использую тег node:NID, чтобы при изменении констант, редактировании публикации, сервис пересоздавал свои данные. Публичный метод getMail(), можно использовать для получения емейла из созданных нами констант сайта.

К примеру в теме:

Преимущества и недостатки

На мой взгляд — меньше рутины, проще добавить и утилизировать поля, не используются лишние контриб. модули, мы используем базовые возможности drupal из коробки.

Минусом может быть то, что константы не являются часть codebase, как если бы они были в конфигурации сайта и могли бы быть импортированы/экспортированы, вместе с конфиг файлами. Но эти данные — по сути контент, и они не должны быть частью codebase.

Иногда поля удобнее сразу рендерить, это делается штатно через сервис renderer:

Написать комментарий

Мало букафф? Читайте есчо !

Добавляем в page cache зависимость от значения cookie

Март 4, 2025 г.

Модуль page_cache использует http_middleware, чтобы зацепиться за объект request и произвести кеширование страницы. Работает он для анонимных пользователей. ...

Читать

 

Комментарии к «Кастомные настройки сайта в Drupal»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: