Разработка кастомной темы 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>

Элемент navigation.php с активным состоянием

<?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 недель