Розробка кастомної теми Concrete CMS

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

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

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

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

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Розробка кастомної теми Concrete CMS
Середня
~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

Розробка кастомної теми Concrete CMS

Тема в Concrete CMS — це директорія з PHP-шаблонами, CSS та JS. Тема може поставлятися як папка в application/themes/ або як частина пакету в packages/my-theme/themes/. Пакетний підхід переважніший — дозволяє розповсюджувати та версіонувати тему з усіма залежностями.

Структура теми

packages/my-theme/
  controller.php              # контролер пакету
  themes/
    my-theme/
      page_types/             # шаблони типів сторінок
        home.php
        default.php
        service-detail.php
      elements/               # частини шаблону (header, footer, nav)
        header.php
        footer.php
        navigation.php
      blocks/                 # переопредління шаблонів блоків
        content/
          templates/
            two-column.php
      css/
        main.css
      js/
        app.js
      thumbnail.png           # превью теми (360×270)
      description.txt
      page.php                # базовий шаблон (fallback)
      view.php                # головний layout (deprecated, але підтримується)

Базовий шаблон page.php

page.php — головний layout, в який вставляється вміст типу сторінки:

<?php
// packages/my-theme/themes/my-theme/page.php
defined('C5_EXECUTE') or die('Access Denied.');
?>
<!DOCTYPE html>
<html lang="<?= Localization::activeLocale() ?>">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title><?= $c->getCollectionName() ?> | <?= $site->getName() ?></title>
    <?php
    $html = Loader::helper('html');
    echo $html->css('main.css', 'my-theme');
    ?>
    <?php View::element('header_required', ['disableTrackingCode' => false]) ?>
</head>
<body class="<?= $c->getPageWrapperClass() ?>">
<?php View::element('header', [], 'my-theme') ?>
<main id="main-content">
    <?php echo $innerContent ?>
</main>
<?php View::element('footer', [], 'my-theme') ?>
<?php echo $html->javascript('app.js', 'my-theme') ?>
<?php View::element('footer_required') ?>
</body>
</html>

$innerContent — змінна, в яку Concrete CMS вставляє вміст шаблону типу сторінки.

Шаблон типу сторінки

<?php
// page_types/service-detail.php
defined('C5_EXECUTE') or die('Access Denied.');

$a_hero    = new Area('Hero');
$a_content = new Area('Main Content');
$a_related = new Area('Related Services');

$heroImage = $c->getAttribute('hero_image');
$intro     = $c->getAttribute('intro_text');
?>
<section class="hero <?= $heroImage ? 'hero--has-image' : '' ?>">
    <?php if ($heroImage): ?>
        <img src="<?= $heroImage->getURL() ?>" alt="<?= h($c->getCollectionName()) ?>">
    <?php endif; ?>
    <div class="hero__content">
        <h1><?= h($c->getCollectionName()) ?></h1>
        <?php if ($intro): ?><p><?= h($intro) ?></p><?php endif; ?>
    </div>
</section>

<div class="container layout-sidebar">
    <article class="content">
        <?php $a_content->display($c) ?>
    </article>
    <aside class="sidebar">
        <?php $a_related->display($c) ?>
    </aside>
</div>

Елемент навігації з активним станом

<?php
// elements/navigation.php
defined('C5_EXECUTE') or die('Access Denied.');

$navHelper = Loader::helper('navigation');
$pages     = Page::getByPath('/')->getCollectionChildren();
?>
<nav class="main-nav">
    <ul>
        <?php foreach ($pages as $navPage): ?>
            <?php
            $isActive = ($c->getCollectionID() == $navPage->getCollectionID()
                      || $navHelper->isParentPage($c, $navPage));
            ?>
            <li class="<?= $isActive ? 'active' : '' ?>">
                <a href="<?= $navPage->getCollectionLink() ?>">
                    <?= h($navPage->getCollectionName()) ?>
                </a>
            </li>
        <?php endforeach; ?>
    </ul>
</nav>

Переопредління шаблону блока

Concrete CMS дозволяє створити альтернативний шаблон для будь-якого вбудованого блока:

// packages/my-theme/themes/my-theme/blocks/content/templates/two-column.php
// Альтернативний шаблон блока Content (HTML)
defined('C5_EXECUTE') or die('Access Denied.');
?>
<div class="content-block two-col">
    <div class="col"><?= $content ?></div>
</div>

Редактор бачить цей шаблон у випадаючому списку при виборі блока Content.

Автоматичний конфігураційний файл теми

<?php
// themes/my-theme/page_theme.php — реєстрація типів сторінок та областей
namespace Application\Theme\MyTheme;

use Concrete\Core\Page\Theme\Theme;

class PageTheme extends Theme {
    public function getThemeName(): string { return 'My Theme'; }
    public function getThemeDescription(): string { return 'Корпоративна тема'; }

    public function registerAssets(): void {
        $this->providesAsset('css', 'main.css');
        $this->providesAsset('javascript', 'app.js');
        $this->requireAsset('javascript', 'jquery');
    }
}

Адаптивність та Asset Pipeline

Для збірки CSS/JS використовують Vite або Webpack, вивід в themes/my-theme/css/ та js/. У page.php підключають через $html->css() / $html->javascript() — Concrete CMS додає версійний хеш автоматично.

Сроки розробки теми

Робота Срок
Базова тема з макету (5–7 типів сторінок) 2–4 тижні
Адаптивна тема з кастомними елементами 3–6 тижнів
Повна тема з пакетом, блоками, атрибутами 5–10 тижнів