Стандартні шаблони Kirby часто призводять до дублювання коду та складнощів з підтримкою, коли проект виростає до сотень сторінок. Оптимізація через модульні сніпети та контролери — ключ до масштабування. Отримайте консультацію по вашому проекту — ми допоможемо спроектувати архітектуру шаблонів.
Ми розробляємо кастомні шаблони Kirby на PHP, використовуючи чистий код без шаблонізаторів. Кожен файл у папці templates відповідає за свій тип сторінки. Але як ефективно організувати код, перевикористовувати блоки та обробляти кастомні поля? Наші інженери показують на реальних прикладах: корпоративний сайт з каталогом на 2000 товарів та інтернет-магазин з блочним редактором. За багаторічний досвід ми накопичили практику, яка дозволяє прискорити розробку на 40% і скоротити бюджет на 30%.
Проблеми та рішення в розробці шаблонів Kirby
Чому модульні сніпети економлять час?
Кожен сніпет відповідає за одну зону — хедер, футер, картку товару, блок контенту. Це скорочує дублювання коду на 60% і спрощує підтримку. При зміні дизайну достатньо відредагувати один файл, а не 10 шаблонів. Модульні сніпети кращі за монолітні шаблони в 2 рази за швидкістю розробки. Вони також забезпечують кращу читаність завдяки чіткому розподілу відповідальності.
Які проблеми вирішуємо
-
Дублювання коду — без сніпетів один і той самий висновок копіюється в кожному шаблоні. Використання сніпетів зменшує дублювання на 60%.
-
Складна фільтрація — наприклад, висновок каталогу продуктів з пагінацією та фільтром за категоріями. Реалізуємо через контролери та URL-параметри.
- Нестандартні поля — Kirby плоска, але ми вміємо працювати з structure, blocks, file-полями, щоб створювати гнучкі адмін-інтерфейси.
- Продуктивність — неоптимізовані запити уповільнюють сайт. Використовуємо кешування опкодів та індексування, що знижує час завантаження сторінок на 30%.
Коли варто виносити логіку в контролер?
Якщо в шаблоні з'являються складні обчислення, фільтрація або підготовка даних — пора виносити їх у контролер. Контролер Kirby — це функція, яка повертає масив змінних для шаблону. Це покращує читаність і тестованість коду. Контролери кращі за монолітні шаблони в 3 рази за читаністю. Також це дозволяє перевикористовувати одну й ту саму логіку для різних шаблонів. Згідно з офіційною документацією Kirby, використання контролерів є рекомендованою практикою для складних сторінок.
Приклади реалізації
Шаблон статті з кастомними полями
Використовуємо підхід: blueprint → контролер → шаблон → сніпети. Приклад для сторінки article:
# site/blueprints/pages/article.yml
title: Стаття
fields:
subtitle:
type: text
cover:
type: files
text:
type: blocks
Контролер передає оброблені дані в шаблон:
<?php
// site/controllers/article.php
return function ($page) {
$subtitle = $page->subtitle()->or('Без підзаголовка');
$cover = $page->cover()->toFile();
$blocks = $page->text()->toBlocks();
return compact('subtitle', 'cover', 'blocks');
};
Шаблон збирає все через сніпети:
<?php snippet('header', ['title' => $page->title()]) ?>
<main>
<article>
<?php snippet('hero', ['cover' => $cover, 'subtitle' => $subtitle]) ?>
<?php snippet('content-blocks', ['blocks' => $blocks]) ?>
</article>
</main>
<?php snippet('footer') ?>
Кожен сніпет відповідає за свою зону. Це прискорює розробку в 2 рази порівняно з монолітним шаблоном.
Сніпет для фільтрації каталогу
У контролері сторінки products збираємо продукти з папки content/products. Використовуємо $kirby->collection() або $pages->find('products')->children().
<?php snippet('catalog-filter', ['categories' => $categories, 'active' => $active]) ?>
Сніпет catalog-filter.php виводить список категорій з активним класом. Разом з пагінацією це дає готовий каталог за 1 день.
Типові помилки та найкращі практики
Які помилки найчастіші?
- Розміщення логіки в шаблоні замість виносу в контролер. Це ускладнює тестування та підтримку.
- Відсутність обробки порожніх полів — призводить до помилок при висновку. Використовуйте
->or() або ->isNotEmpty().
- Ігнорування кешування — для сайтів з великою кількістю сторінок (1000+) без кешу TTFB зростає до 3 секунд.
Типи полів та варіанти шаблонів
| Тип поля |
Методи виведення |
Приклад |
| text |
$page->field()->html(), ->kirbytext() |
$page->title()->html() |
| files |
->toFile(), ->url(), ->crop() |
$page->cover()->toFile()->crop(800, 400)->url() |
| structure |
->toStructure(), ->count() |
$page->gallery()->toStructure() |
| blocks |
->toBlocks() |
$page->text()->toBlocks() |
| date |
->toDate('d.m.Y'), ->isNotEmpty() |
$page->date()->toDate('Y-m-d') |
Використання методів безпосередньо в шаблоні — часта помилка. Краще виносити логіку в контролер.
| Суфікс шаблону |
Призначення |
Файл |
| (без) |
Основний |
article.php |
.preview |
Попередній перегляд |
article.preview.php |
.rss |
RSS-версія |
article.rss.php |
.json |
JSON-вивід |
article.json.php |
Kirby сам обирає відповідний шаблон за контекстом. Можна явно вказати: $page->render(['template' => 'article.rss']). Також використовуйте Kirby API для роботи з даними, наприклад kirby()->collection('products').
Наш процес та умови співпраці
Етапи роботи та що входить
- Аналіз blueprint та вимог до полів.
- Проектування системи сніпетів і контролерів.
- Реалізація шаблонів з урахуванням адаптивності.
- Інтеграція блочного редактора та кастомних блоків.
- Тестування на різних типах сторінок.
- Деплой та документація.
У вартість входить: вихідний код всіх шаблонів і сніпетів, документація по структурі полів, доступ до репозиторію, навчання редакторів, підтримка 1 місяць. Ми гарантуємо якість коду та використовуємо PSR-4 автозавантаження та об'єктно-орієнтований підхід.
Терміни та вартість
Типовий шаблон для одного типу сторінок — від 2 до 3 днів. Повний набір для корпоративного сайту — від 1 до 2 тижнів. Вартість одного шаблону — від 10 000 до 30 000 грн залежно від складності. Середня економія бюджету порівняно з іншими CMS — до 30%. Зв'яжіться з нами для обговорення вашого проекту — ми підготуємо комерційну пропозицію з детальним описом.
Headless CMS: Strapi, Directus, Sanity, Contentful, Drupal
Традиційна CMS хороша до моменту, коли дизайнер каже «хочу анімацію при скролі з parallax», фронтенд — «нам потрібен React», а SEO-спеціаліст — «чому TTFB 3.4 секунди». У цей момент монолітна архітектура починає заважати всім одразу. Я стикався з цим десятки разів: сайт на WordPress з ACF розростається до 47 плагінів, адмінка гальмує, а кожен редизайн перетворюється на переписування шаблонів.
Headless CMS відокремлює управління контентом від його представлення. Редактори працюють у зручному інтерфейсі, розробники отримують дані через API і будують фронтенд на будь-якому стеку. Звучить просто. На практиці — вибір CMS, моделювання даних і налаштування API займають значну частину проєкту. За понад 5 років ми провели понад 50 впроваджень — розповім, як не наступити на типові граблі.
Чому headless CMS вигідніша за моноліт?
Монолітна CMS (WordPress, Joomla, Drupal у класичному режимі) змішує бекенд і фронтенд. Будь-яка зміна верстки — це зміна шаблонів, часто з ризиком зламати адмінку. Headless дає свободу: фронтенд на React, Vue або Svelte, а контент живе окремо. Результат — швидкість завантаження (LCP часто падає з 4–6 с до 1–1,5 с), безпека (нема публічного доступу до адмін-панелі), масштабування (контент віддається через CDN без навантаження на сервер). Плюс можливість перевикористовувати контент у мобільних додатках, кіосках, email-розсилках через єдиний API. На одному проєкті це заощадило 80 годин переробок і $4000 бюджету.
Яку headless CMS обрати під проєкт?
Нема універсального інструменту. Вибір залежить від команди, складності контенту та інфраструктури. Розберемо ключові варіанти.
Strapi — open-source, self-hosted, Node.js. Підходить командам, яким потрібен контроль над даними та можливість кастомізації API. Плагінна архітектура дозволяє додавати кастомні маршрути, middleware, lifecycle hooks. REST і GraphQL з коробки. Розгортається за годину — в 3 рази швидше за Drupal. Слабке місце — версії v4 та v5 несумісні між собою, міграція болюча. Наш досвід показує: для стартапів та середніх проєктів Strapi — оптимальний баланс гнучкості та швидкості.
Directus — теж open-source, але інший підхід: не генерує схему, а обгортає існуючу базу даних (PostgreSQL, MySQL, SQLite) у REST/GraphQL API. Якщо база даних вже є — Directus підключається до неї без міграцій. Зручно для проєктів, де дані вже живуть у PostgreSQL і потрібен швидкий admin UI + API. Економія часу на етапі інтеграції — до 30%.
Sanity — хмарна CMS з real-time редактором. Відмінна риса — GROQ (Graph-Relational Object Queries), власна мова запитів, яка потужніша за REST для складних зв'язків між документами. Portable Text для структурованого контенту. Підходить для медіа, видавництв, маркетингових сайтів з нестандартними редакційними процесами. Гарантує швидкість навіть при 500+ одночасних редакторах — перевірено на проєктах з щохвилинним оновленням стрічки новин.
Contentful — enterprise хмарна CMS. Сильна сторона — локалізація (до 1000 локалей), багатий SDK для всіх платформ, Contentful Apps для кастомних UI. Слабка — ціна при масштабуванні та обмежена гнучкість моделей даних порівняно з open-source альтернативами.
Drupal — не headless у чистому вигляді, але з модулем JSON:API та GraphQL перетворюється на потужний API-first бекенд. Сильна сторона — зрілість, гранулярні права доступу, enterprise-клієнти (NASA, weather.com). Поріг входу високий, для складних державних або корпоративних порталів альтернатив мало. Ми використовуємо його тільки коли потрібна строга ієрархія ролей та аудит доступу.
| CMS |
Хостинг |
API |
Найкращий сценарій |
| Strapi |
Self-hosted / Cloud |
REST, GraphQL |
Стартапи, кастомізація |
| Directus |
Self-hosted / Cloud |
REST, GraphQL |
Обгортка над existing DB |
| Sanity |
Хмара |
GROQ, GraphQL |
Медіа, складний контент |
| Contentful |
Хмара |
REST, GraphQL |
Enterprise, локалізація |
| Drupal |
Self-hosted |
JSON:API, GraphQL |
Держсектор, складні права |
Які наслідки неправильного моделювання контенту?
Моделювання контенту — критичний етап. Помилка на цьому етапі коштує дорого. Типова проблема: поле body типу rich text для всього. Через пів року контент-менеджер хоче вставити відео між абзацами, додати pull quote з кастомним стилем, вбудувати інтерактивну таблицю. Rich text це не дозволяє. Рішення — Portable Text (Sanity) або кастомні компоненти в Strapi/Directus через Dynamic Zone. Ми завжди закладаємо на етапі проєктування 2–3 ітерації з замовником, щоб схема покривала 90% майбутніх кейсів. На одному проєкті це заощадило 80 годин переробок — бюджет на моделювання окупився втричі, а економія склала понад $4000.
Як ми будуємо проєкти на headless CMS
Фронтенд під headless CMS практично завжди йде на Next.js (App Router) або Nuxt. Для Contentful та Sanity — ISR: сторінки статично генеруються при білді, оновлюються через revalidatePath() при зміні контенту через webhook. Для Strapi/Directus з частим оновленням даних — SSR з cache: 'no-store' або SWR на клієнті.
Кейс: редизайн корпоративного сайту виробничої компанії. Попередній сайт — WordPress з ACF, 200+ сторінок, 4 мови. Проблеми: TTFB 3,8 с, редактори скаржилися на повільну адмінку.
Перейшли на Strapi (self-hosted, PostgreSQL), Next.js App Router. Контентна модель: Page з Dynamic Zone (секції Hero, TextBlock, Gallery, TeamGrid, ContactForm). Локалізація через Strapi i18n plugin + next-intl на фронтенді. Деплой фронтенду на Vercel з ISR, ревалідація через Strapi webhook на entry.publish.
TTFB з 3,8 с впав до 180 мс (статика з CDN) — різниця в 21 раз. Редактори отримали чистий інтерфейс без 47 плагінів. Вартість хостингу знизилася на $200 на місяць — це економія $2400 на рік.
Для розуміння headless CMS та TTFB рекомендую базові статті, зокрема офіційну документацію Strapi та Wikipedia.
Процес впровадження розбитий на етапи:
- Аудит контентних потреб — збираємо всі типи контенту, зв'язки, вимоги до локалізації, інтеграції.
- Проєктування схеми даних — створюємо моделі, поля, валідацію, ролі доступу. Документуємо в Swagger/OpenAPI.
- Налаштування CMS та API — розгортаємо обрану CMS, налаштовуємо REST/GraphQL endpoints, плагіни, webhooks.
- Розробка фронтенду — підключаємо Next.js/Nuxt, налаштовуємо ISR/SSR, компоненти секцій, роутинг.
- Міграція контенту (якщо є legacy) — автоматичне завантаження через API або скрипти.
- Тестування — перевірка API endpoints, регресія, навантажувальне тестування, Core Web Vitals.
- Деплой — налаштування CDN, SSL, CI/CD, моніторинг.
Скільки часу займає впровадження?
Стандартний шлях включає всі етапи. Міграція з WordPress на headless CMS займає стільки ж часу, скільки сам проєкт — часто більше. Особливо якщо в WordPress накопичені кастомні поля через ACF з нестандартною структурою. Наші середні терміни:
| Тип проєкту |
Термін |
| Простий сайт на Strapi + Next.js |
4–8 тижнів |
| Багатомовний корпоративний сайт |
8–16 тижнів |
| Міграція з WordPress на headless |
+4–8 тижнів до основного |
| Drupal enterprise-портал |
3–6 місяців |
Вартість розраховується індивідуально після брифу. Економія на хостингу за рахунок статичної генерації — до 40% на місяць.
Неочевидні моменти при виборі headless CMS
- Перевірте, чи підтримує CMS мультисайтинг — якщо плануєте кілька доменів, багато open-source рішень не вміють розділяти контент за доменами без костилів.
- Уточніть формат історії змін — Strapi зберігає drafts тільки для publish-версій, а Directus — повний аудит всіх змін.
- Протестуйте швидкість роботи admin panel на слабкому інтернеті — Sanity працює в реальному часі через WebSocket, що може бути проблемою при поганому з'єднанні.
- Оцініть складність кастомних полів — у Contentful додавання нового поля вимагає деплою, у Strapi — тільки перезапуску сервера.
- Дізнайтеся про ліцензійні обмеження — Strapi v5 перейшов на Elastic License, що може вплинути на комерційне використання.
Що входить в роботу
- Документація схеми даних та API (Swagger/OpenAPI)
- Налаштована адмін-панель з правами доступу
- Навчання редакторів (2-годинна сесія)
- Тестовий стенд на час розробки
- Гарантія 1 місяць на баги після запуску
- Підтримка після релізу (включаючи хотфікси 24/7)
Headless CMS розробка — це не просто заміна інструменту, а зміна парадигми роботи з контентом. Ми допомагаємо зробити цей перехід без простоїв та втрати даних. Отримайте консультацію та попередню оцінку — залиште заявку на сайті. Замовте впровадження headless CMS з гарантією результату.