Розробка сайту на CMS Kirby

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Розробка сайту на CMS Kirby
Середня
~5 робочих днів
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Розробка сайту на CMS Kirby

Kirby — файлова CMS на PHP без бази даних. Контент зберігається в папках та текстових файлах, шаблони — чистий PHP, панель управління вбудована та працює з коробки. Добре підходить для корпоративних сайтів, портфоліо, блогів, невеликих каталогів — там, де потрібна проста експлуатація без MySQL та міграцій.

Структура проекту

site/
├── blueprints/       # схеми полів панелі
│   ├── pages/
│   └── files/
├── collections/      # переиспользуемі набори сторінок
├── config/           # конфігурація, хуки, маршрути
├── models/           # розширені моделі сторінок
├── plugins/          # сторонні та користувацькі плагіни
├── snippets/         # переиспользуемі частини шаблонів
├── templates/        # шаблони сторінок
└── controllers/      # логіка перед рендерингом

content/
├── home/
│   └── home.txt
├── about/
│   └── about.txt
└── blog/
    ├── blog.txt
    ├── 2024-01-15_first-post/
    │   └── article.txt
    └── 2024-02-20_second-post/
        └── article.txt

Система шаблонів

Kirby зіставляє шаблон за назвою файлу контенту. Файл article.txt → шаблон templates/article.php:

<?php snippet('header') ?>

<article class="post">
    <header>
        <h1><?= $page->title()->html() ?></h1>
        <time datetime="<?= $page->date()->toDate('Y-m-d') ?>">
            <?= $page->date()->toDate('d.m.Y') ?>
        </time>
    </header>

    <div class="content">
        <?= $page->text()->kirbytext() ?>
    </div>

    <?php if ($page->tags()->isNotEmpty()): ?>
    <footer class="tags">
        <?php foreach ($page->tags()->split() as $tag): ?>
            <a href="<?= $site->url() ?>/blog/tag:<?= $tag ?>">
                <?= html($tag) ?>
            </a>
        <?php endforeach ?>
    </footer>
    <?php endif ?>
</article>

<?php snippet('footer') ?>

Blueprints — схеми полів

Blueprint описує, які поля доступні редактору для кожного типу сторінки:

# site/blueprints/pages/article.yml
title: Стаття

columns:
  main:
    width: 2/3
    sections:
      content:
        type: fields
        fields:
          title:
            type: text
            label: Заголовок
            required: true
          text:
            type: writer
            label: Текст статті
            inline: false
            marks:
              - bold
              - italic
              - link
              - code
          cover:
            type: files
            label: Обкладинка
            max: 1
            query: page.images

  sidebar:
    width: 1/3
    sections:
      meta:
        type: fields
        fields:
          date:
            type: date
            label: Дата публікації
            default: today
          tags:
            type: tags
            label: Теги
          seo_description:
            type: textarea
            label: SEO-опис
            maxlength: 160

Контроллери

Контроллер розділяє логіку від шаблону:

<?php
// site/controllers/blog.php
return function ($page, $site) {
    $tag = param('tag');

    $articles = $page->children()
        ->listed()
        ->when($tag, fn($pages) => $pages->filterBy('tags', $tag, ','))
        ->sortBy('date', 'desc')
        ->paginate(12);

    return [
        'articles'   => $articles,
        'pagination' => $articles->pagination(),
        'activeTag'  => $tag,
        'allTags'    => $page->children()->listed()->pluck('tags', ',', true),
    ];
};

Шаблон blog.php отримує $articles, $pagination і $activeTag як готові змінні.

Моделі сторінок

Додати методи до конкретного типу сторінок:

<?php
// site/models/article.php
class ArticlePage extends Page
{
    public function readingTime(): int
    {
        $words = str_word_count(strip_tags($this->text()->kirbytext()));
        return (int) ceil($words / 200);
    }

    public function isNew(): bool
    {
        return $this->date()->toDate('U') > strtotime('-30 days');
    }

    public function relatedArticles(int $limit = 3): Pages
    {
        $tags = $this->tags()->split();

        return $this->siblings()
            ->listed()
            ->not($this)
            ->filter(function ($article) use ($tags) {
                return count(array_intersect(
                    $article->tags()->split(),
                    $tags
                )) > 0;
            })
            ->sortBy('date', 'desc')
            ->limit($limit);
    }
}

У шаблоні: <?= $page->readingTime() ?> хв читання.

API та безголовий режим

Kirby видає JSON з коробки — достатньо додати розширення до URL:

GET /blog.json
GET /blog/first-post.json

Або налаштувати користувацькі маршрути:

// site/config/config.php
return [
    'api' => true,
    'routes' => [
        [
            'pattern' => 'api/articles',
            'action' => function () {
                $articles = page('blog')
                    ->children()
                    ->listed()
                    ->sortBy('date', 'desc')
                    ->limit(20);

                return [
                    'data' => $articles->toArray(function ($article) {
                        return [
                            'id'       => $article->id(),
                            'title'    => $article->title()->value(),
                            'date'     => $article->date()->toDate('Y-m-d'),
                            'excerpt'  => $article->text()->excerpt(200),
                            'url'      => $article->url(),
                        ];
                    }),
                ];
            },
        ],
    ],
];

Медіа та зображення

<?php if ($cover = $page->cover()->toFile()): ?>
<img
    src="<?= $cover->crop(800, 450)->url() ?>"
    srcset="
        <?= $cover->crop(400, 225)->url() ?> 400w,
        <?= $cover->crop(800, 450)->url() ?> 800w,
        <?= $cover->crop(1200, 675)->url() ?> 1200w
    "
    sizes="(max-width: 768px) 100vw, 800px"
    alt="<?= $cover->alt()->or($page->title())->html() ?>"
    loading="lazy"
>
<?php endif ?>

Kirby генерує похідні зображення на льоту і кешує їх в media/.

Продуктивність та кеш

// site/config/config.php
return [
    'cache' => [
        'pages' => [
            'active' => true,
            'type'   => 'file',
            'ignore' => fn($page) => $page->id() === 'search',
        ],
    ],
    'content' => [
        'locking' => false, // вимкнути блокування файлів в prod
    ],
];

Для високонавантажених сайтів кеш сторінок виносится в Redis через сторонній драйвер.

Терміни розробки

Корпоративний сайт 5–10 сторінок з нестандартним дизайном: 2–3 тижні. Блог або каталог з фільтрацією, пошуком та користувацькими полями: 3–5 тижнів. Якщо потрібна інтеграція з зовнішнім API або безголовий режим для фронтенд-фреймворку — додати 3–7 днів.