Часто зустрічаємо ситуацію: замовник скаржиться, що стандартні типи — 'Стаття' та 'Основна сторінка' — не підходять для каталогу продукції з десятками атрибутів. Доводиться зберігати все в одному полі body, що призводить до хаосу при виведенні. Розробка кастомних типів контенту Drupal вирішує цю проблему — ми створюємо сутності з унікальним набором полів, форм редагування та відображень. Конфігурація експортується в YAML і зберігається в git, гарантуючи відтворюваність та контроль версій. Завдяки entity reference ми скорочуємо дублювання даних і економимо до 40% часу на оновленні контенту. Наші інженери мають 10+ років досвіду в Drupal і реалізували понад 50 проектів з кастомними типами контенту. Отримайте консультацію, щоб спроектувати ідеальну структуру.
За даними офіційної документації Drupal, "Entity API provides a set of classes and interfaces for managing entities."
Як ми проектуємо кастомні типи контенту Drupal під ключ?
Візьмемо реальний кейс: портал вакансій. Створили тип Vacancy з полями:
- Місто (string, обов'язкове)
- Зарплата від (decimal)
- Зарплата до (decimal)
- Напрямок (entity reference до таксономії)
- Вимоги (text_long)
Налаштували форму редагування: місто — textfield, зарплата — range, напрямок — checkboxes. Для виду teaser зробили картку з полями "Місто" та "Зарплата від" в один рядок. Весь процес — від UI до експорту конфігурації — зайняв пів дня. Якщо потрібно кілька типів зі зв'язками (наприклад, Кейс → Клієнт, Кейс → Послуги), розробка може зайняти 1–2 дні. Ми завжди опрацьовуємо структуру полів на етапі аналітики, щоб уникнути N+1 запитів. Це знижує кількість помилок при вибірках на 25% і прискорює завантаження сторінок на 30%. Використання entity reference дозволяє зменшити кількість запитів до бази ще на 50%.
// my_module.install function my_module_install(): void { $node_type = \Drupal\node\Entity\NodeType::create([ 'type' => 'case', 'name' => 'Кейс', 'description' => 'Кейси компанії', 'display_submitted' => FALSE, 'new_revision' => TRUE, ]); $node_type->save(); // Поле посилання на клієнта $client_storage = \Drupal\field\Entity\FieldStorageConfig::create([ 'field_name' => 'field_client', 'entity_type' => 'node', 'type' => 'entity_reference', 'settings' => ['target_type' => 'node'], ]); $client_storage->save(); \Drupal\field\Entity\FieldConfig::create([ 'field_storage' => $client_storage, 'bundle' => 'case', 'label' => 'Клієнт', 'settings' => [ 'handler' => 'default:node', 'handler_settings' => [ 'target_bundles' => ['client' => 'client'], ], ], ])->save(); // Налаштування форми відображення \Drupal\Core\Entity\Entity\EntityFormDisplay::load('node.case.default') ->setComponent('field_client', [ 'type' => 'entity_reference_autocomplete', 'weight' => 10, ]) ->save(); } Коли варто створювати кастомні типи контенту Drupal?
Якщо стандартні типи не покривають вимоги бізнес-логіки — наприклад, для каталогу продукції з унікальними атрибутами, для порталу з різними сутностями (вакансії, резюме, компанії) або для багатомовного сайту з різними наборами полів. Користувацькі типи сутностей Drupal дають повний контроль над структурою: ви задаєте поля, зв'язки, відображення та права доступу. Це виключає зберігання даних в одному тілі та спрощує підтримку.
Покрокове створення кастомного типу контенту
Ось як ми створюємо тип контенту в Drupal з нуля:
- Визначте машинне ім'я та мітку. Наприклад,
caseдля кейсів. - Створіть тип через UI або код. У install-хуці:
NodeType::create(). - Додайте поля. Через FieldStorageConfig та FieldConfig — text, entity_reference, datetime і т.д.
- Налаштуйте відображення. EntityFormDisplay для форми, EntityViewDisplay для teaser та full.
- Експортуйте конфігурацію.
drush cex— всі YAML-файли потрапляють до config/sync. - Закомітьте у git. Відтворюваність на всіх оточеннях.
Типові поля та їх налаштування — розробка кастомних типів
| Ситуація | Тип поля | Приклад конфігурації YAML |
|---|---|---|
| Короткий текст | string |
field_type: string |
| Довгий текст/HTML | text_long |
field_type: text_long |
| Число ціле | integer |
field_type: integer |
| Дробове число | decimal |
settings: { precision: 10, scale: 2 } |
| Дата | datetime |
field_type: datetime |
| Посилання на сутність | entity_reference |
settings: { target_type: node } |
| Зображення | image |
field_type: image |
| Файл | file |
field_type: file |
| Булеве | boolean |
field_type: boolean |
| Список (select) | list_string |
settings: { allowed_values: { 1: Опція 1, 2: Опція 2 } } |
Чому entity reference краще простих полів?
Референс-поля дозволяють зв'язувати сутності без дублювання даних. Наприклад, для типу "Кейс" ми створюємо поле "Клієнт" (entity reference на тип Client) та поле "Послуги" (entity reference multiple на тип Service). Переваги:
- Дані зберігаються в одній сутності — оновлюєте один раз.
- Легко будувати Views з відношеннями.
- Не потрібно дублювати вибір з випадаючих списків.
При типових сценаріях (зв'язок стаття-автор) entity reference виключає дублювання та полегшує оновлення. На одному проекті ми замінили 5 текстових полів на референс-поля, що скоротило час редагування контенту на 35% та знизило витрати на підтримку. В результаті кількість запитів до БД зменшилася на 30%, а швидкість завантаження сторінок зросла на 40%.
Процес розробки кастомних типів контенту
Ми працюємо за прозорою методологією:
| Етап | Тривалість | Результат |
|---|---|---|
| Аналітика та збір вимог | 1–2 дні | Документ зі структурою типів та полів |
| Проектування (поля, зв'язки, шаблони) | 1–2 дні | Схема сутностей, макети форм |
| Реалізація (UI + код) | 2–5 днів | Робочі типи, конфігурація в YAML |
| Тестування та рев'ю | 1 день | Перевірка полів, Views, помилок |
| Деплой та навчання | 1 день | Деплой конфігурації, інструкція редакторам |
Приклад складного кейсу
Для порталу з 5 типами сутностей та складними зв'язками (Кейс → Клієнт, Кейс → Команда, Кейс → Відгуки) ми розробили єдину архітектуру, яка скоротила час виведення на ринок на 2 тижні.Що входить в роботу
- Розробка необхідної кількості кастомних типів контенту.
- Налаштування полів всіх необхідних типів (text, entity_reference, datetime тощо).
- Налаштування форм редагування та видів відображення (teaser, default).
- Експорт конфігурації в YAML та інтеграція в процес збірки.
- Написання install-хуків для відтворюваності.
- Документування структури та навчання редакторів.
- Гарантія на код — 6 місяців підтримки.
Терміни та вартість
Вартість розраховується індивідуально, залежно від кількості типів та складності полів. Орієнтовно: один простий тип з полями через UI — від 2 днів; кілька типів з entity reference та налаштуванням Views — від 5 днів. Замовте розробку кастомних типів контенту Drupal прямо зараз — отримайте консультацію безкоштовно.
Більш детально про Content Types читайте в офіційній документації Drupal.







