Розробка кастомного блоку Concrete CMS

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

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

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

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

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Розробка кастомного блоку Concrete CMS
Середня
~2-3 робочих дні
Часті питання

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

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

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

  • 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

Блок (Block) — базовий елемент контенту в Concrete CMS. Вбудовані блоки (Content, Image, Form) покривають типові завдання, але нестандартна функціональність вимагає розробки власних блоків. Кастомний блок — це PHP-клас з формою редагування, шаблоном виводу та схемою зберігання даних.

Структура блока

Блок розташовується в packages/my-package/blocks/my-block/ або application/blocks/my-block/:

blocks/feature-card/
  controller.php     # логіка, валідація, CRUD
  db.xml             # схема таблиці БД
  add.php            # форма додавання блока
  edit.php           # форма редагування (зазвичай include add.php)
  view.php           # шаблон виводу на сторінці
  icon.png           # іконка (48×48)
  templates/         # альтернативні шаблони виводу
    compact.php

db.xml — схема зберігання даних

<?xml version="1.0"?>
<schema version="0.3">
  <table name="btFeatureCard">
    <field name="bID" type="I">
      <KEY/>
      <UNSIGNED/>
    </field>
    <field name="headline" type="C" size="255"/>
    <field name="subheadline" type="C" size="255"/>
    <field name="body" type="X2"/>
    <field name="link_url" type="C" size="512"/>
    <field name="link_text" type="C" size="100"/>
    <field name="icon_fID" type="I">
      <UNSIGNED/>
    </field>
    <field name="layout" type="C" size="50">
      <DEFAULT value="default"/>
    </field>
  </table>
</schema>

Concrete CMS автоматично створює та оновлює таблиці при встановленні/оновленні пакету.

controller.php

<?php
namespace Concrete\Package\MyPackage\Block\FeatureCard;

use Concrete\Core\Block\BlockController;
use Concrete\Core\File\File;

defined('C5_EXECUTE') or die('Access Denied.');

class Controller extends BlockController {

    protected $btTable            = 'btFeatureCard';
    protected $btInterfaceWidth   = 600;
    protected $btInterfaceHeight  = 500;
    protected $btCacheBlockRecord = true;
    protected $btCacheBlockOutput = true;

    public function getBlockTypeName(): string        { return 'Feature Card'; }
    public function getBlockTypeDescription(): string { return 'Карточка переваги з іконкою та посиланням'; }

    public function add(): void {
        $this->set('layout_options', ['default' => 'Стандартний', 'horizontal' => 'Горизонтальний']);
    }

    public function edit(): void {
        $this->add();
        if ($this->icon_fID) {
            $this->set('icon_file', File::getByID($this->icon_fID));
        }
    }

    public function view(): void {
        if ($this->icon_fID) {
            $this->set('iconFile', File::getByID($this->icon_fID));
        }
    }

    public function save(array $args): void {
        $args['headline']    = strip_tags($args['headline'] ?? '');
        $args['subheadline'] = strip_tags($args['subheadline'] ?? '');
        $args['body']        = $args['body'] ?? '';
        $args['link_url']    = filter_var($args['link_url'] ?? '', FILTER_SANITIZE_URL);
        $args['link_text']   = strip_tags($args['link_text'] ?? '');
        $args['icon_fID']    = (int)($args['icon_fID'] ?? 0);
        $args['layout']      = in_array($args['layout'], ['default', 'horizontal']) ? $args['layout'] : 'default';
        parent::save($args);
    }

    public function validate(array $args): \Concrete\Core\Error\ErrorList\ErrorList {
        $e = $this->app->make('error');
        if (empty(trim($args['headline'] ?? ''))) {
            $e->add('Заголовок обов\'язків');
        }
        return $e;
    }
}

Кешування блока

Параметри кешу задаються в контролері:

protected $btCacheBlockRecord        = true;  // кеш запису БД
protected $btCacheBlockOutput        = true;  // кеш HTML-виводу
protected $btCacheBlockOutputLifetime = 3600; // TTL у секундах
// При наявності редактуємого контенту:
protected $btCacheBlockOutputOnPost = false;  // не кешувати після POST

Сроки розробки блока

Складність Опис Срок
Простий Текст + зображення + посилання 4–8 ч
Середній Список елементів, галерея, табы 1–2 дні
Складний Інтеграція з API, кастомний JS 2–5 днів