ALBIREO CMS
version: 2026.06.25

Сайдбары и виджеты в Albireo CMS

Сайдбар (sidebar) — это боковая колонка сайта. Как правило в ней отображается дополнительная информация, например список рубрик. На сайте может быть любое количество сайдбаров и они могут располагаться в произвольных местах, хотя обычно хватает одного сайдбара.

Каждый сайдбар наполняется виджетами. Виджет (widget) — это блок, который выводит какую-то информацию. Например виджет «text_block» используется для вывода произвольного html-кода.

Сайдбар

Наличие сайдбара зависит от используемого layout-файла (модульной сетки). С технической точки зрения в Albireo CMS сайдбар представляет собой html-тэг <aside>, внутри которого последовательно выводятся блоки виджетов.

Следующие модульные сетки рассчитаны на вывод сайдбара:

  • sidebar.php — правый сайдбар
  • sidebar-float.php — «плавающий» сайдбар
  • sidebar-left.php — левый сайдбар
  • sidebar-left-fixed.php — фиксированный сайдбар слева

Переключение модульной сетки происходит с помощью поля layout, например:

layout: sidebar.php

Виджеты

Виджеты задаются в конфигурации widgets.php. В Albireo CMS есть следующие виджеты:

  • text_block
  • favorites
  • pages
  • category
  • tags
  • vote

Все они располагаются в системном каталоге system/widgets, каждый в своём подкаталоге. Вы не должны их менять, но можете использовать как каркасы для своих виджетов, которые следует размещать в website/service/widgets аналогичным образом.

Если вы хотите переопределить стандартный виджет, то просто скопируйте его из системного каталога в свой website/service/widgets — Albireo CMS будет автоматически использовать именно его.

Конфигурация виджетов

Все виджеты настраиваются через конфигурацию widgets.php. При необходимости, можно указать свой файл конфигурации для произвольной страницы через поле widgets-config:

widgets-config: [CONFIG_DIR]widgets-my.php

Каждый виджет в конфигурации представляет собой массив данных такого формата:

[
    // название виджета — обязательный параметр
    'widget' => 'text_block',
    
    // условие вывода: если false, то виджет не выводится
    'show' => false,
    
    // можно привязать вывод к адресу
    // 'show' => (CURRENT_URL['url'] === ''),
    // 'show' => (CURRENT_URL['url'] === 'about'),
    
    // прочие параметры виджета зависят от виджета
    'header' => '<div class="widget-header">text block</div>',
    'text' => 'text',
],

Ключ widget обязательный, его имя совпадает с каталогом виджета. Ключ show служит для быстрого отключения вывода виджета. По умолчанию show равен true (показывать виджет).

Оформление виджетов

В целом дизайн и вывод зависят от самого виджета, но принято, что каждый блок виджета обрамляется html-блоком. За это отвечают два параметра конфигурации config.php:

// Начальный код виджетов
'widget-before' => '<div class="container-widget">',

// Завершающий код виджетов
'widget-after' => '</div>',

Внутри самого виджета часто используется заголовок, который определяет пользователь, поэтому для единого оформления применяется css-класс widget-header.

'header' => '<div class="widget-header">Заголовок виджета</div>',

При желании, пользователь может его переопределить как через поля страницы, так и в самой конфигурации виджета.

Виджет text_block

Это универсальный виджет предназначен для вывода произвольного текста и html-кода.

[
    // имя виджета
    'widget' => 'text_block',
    
    // заголовок
    'header' => '<div class="widget-header">Текстовый блок</div>',
    
    // произвольный текст или HTML
    'text' => 'text',
    
    // скрыть виджет при необходимости
    // 'show' => false,
],

Виджет favorites

Этот виджет предназначен для вывода произвольных ссылок в виде списка.

[
    // имя виджета
    'widget' => 'favorites',
    
    // заголовок
    'header' => '<div class="widget-header">' . lang('Favorites') . '</div>',
    
    // скрыть виджет при необходимости
    // 'show' => false,

    // класс для ссылки
    'link-class' => '',

    // оформление списка
    'block-start' => '<ul class="pad20-l square t90">',
    'block-end' => '</ul>',
    
    // оформление элемента списка
    'link-start' => '<li>',
    'link-end' => '</li>',

    // список ссылок: адрес => название
    'links' => [
        SITE_URL . 'link1' => 'Name1',
        SITE_URL . 'link2' => 'Name2',
        SITE_URL . 'link3' => 'Name3',
    ],
],
Функция lang() используется для языкового перевода.

Виджет pages

Многофункциональный виджет, с помощью которого можно выводить записи сайта по произвольным критериям.

[
    // имя виджета 
    'widget' => 'pages',
    
    // скрыть виджет при необходимости
    // 'show' => false,
    
    // заголовок
    'header' => '<div class="widget-header">' . lang('Random Posts') . '</div>',
    
    // оформление списка
    'block-start' => '<ul class="pad20-l mar5-t square t90">',
    'block-end' => '</ul>',

    // элементы списка
    'link-start' => '<li>',
    'link-end' => '</li>',
    'link-class' => '',
    'link-current-class' => 't-bold',
    
    // кол-во ссылок для вывода
    'limit' => 7, 

    // тип записей type: blog
    // поле 
    'fieldName' => 'type',
    
    // значение поля
    'fieldValue' => 'blog',
    
    // сортировка по полю записи
    'fieldSort' => 'title', 
    
    // порядок сортировки: asc (прямой), desc (обратный), rand (случайный)
    'fieldSortAlgorithm' => 'rand',
],

Комбинируя ключи fieldName, fieldValue, fieldSort и fieldSortAlgorithm можно получить разные выборки записей. Например вывод последних записей сайта по дате:

...
    'fieldName' => 'type',
    'fieldValue' => 'blog',

    'fieldSort' => 'date_unix',
    'fieldSortAlgorithm' => 'desc',
...

Разрешенные поля fieldName (см. Структура таблицы file_info):

file, slug, slug_pattern, method, date_unix, date_pub_unix, date, type, category, tags, draft, rss, sitemap, favorite, title, header, subdirs, image_large, page_url, _order, _group, hierarchy, info, doc_menu_path, file_mtime, frozen
Получение записей происходит через стандартную функцию getPages() с sqlResult: true.

Виджет category

Этот виджет выводит список рубрик сайта.

[
    // имя виджета 
    'widget' => 'category',
    
    // скрыть виджет при необходимости
    // 'show' => false,
    
    // заголовок
    'header' => '<div class="widget-header">' . lang('Categories') . '</div>',
    
    // оформление списка
    'block-start' => '<ul class="pad20-l mar5-t square t90">',
    'block-end' => '</ul>',
    
    // класс текущей рубрики
    'current-class' => 't-bold',
    
    // сдвиг для каждого уровня иерархии в px
    'level-shift' => 20,
    
    // Критерий сортировки: 'order' (по алфавиту), 'count' (по количеству) - см. sortArray()
    'sort' => 'order', 
    
    // порядок сортировки см. sortArray()
    'sort-method' => 'number-asc',
],

Виджет tags

Виджет выводит список меток. Обычно они представляют собой «облако», отсортированное по количеству записей или в алфавитном порядке.

[
    // имя виджета 
    'widget' => 'tags',
    
    // скрыть виджет при необходимости
    // 'show' => false,
    
    // заголовок
    'header' => '<div class="widget-header">' . lang('Tags') . '</div>',
    
    // оформление блока
    'block-start' => '',
    'block-end' => '',
    
    // кол-во меток
    'limit' => 20,
    
    // класс метки по умолчанию
    'link-class' => 't90 b-inline pad5-rl rounded mar5-b mar5-r hover-no-underline bg-primary150 hover-bg-primary700 t-primary700 hover-t-primary50 dark:bg-primary700 dark:hover-bg-primary200 dark:t-primary100 dark:hover-t-primary750',
    
    // класс выделенной метки
    'current-class' => 't90 b-inline pad5-rl rounded mar5-b mar5-r hover-no-underline bg-primary500 hover-bg-primary700 t-primary50 hover-t-primary100 dark:bg-primary100 dark:hover-bg-primary200 dark:t-primary750 dark:hover-t-primary700',
    
    // сортировка: 'alpha' (по алфавиту), 'count' (по кол-ву записей)
    'sort' => 'alpha', 
],

Виджет vote

Виджет выводит голосование из одноименного модуля Vote.

[
    // имя виджета 
    'widget' => 'vote',
    
    // скрыть виджет при необходимости
    // 'show' => false,
    
    // название голосования
    'vote' => 'favorite_language',
    
    // заголовок (используется подстановка {question} вместо названия голосования)
    'header' => '<div class="widget-header">{question}</div>',
    
    // формат вывода результата голосования (подстановка {option} вариант ответа, {count} кол-во голосов)
    'result-start' => '<ul class="pad20-l mar5-t square t90">',
    'result-end' => '</ul>',
    'result-option' => '<li>{option}: {count}</li>',
    
    // формат элемента выбора варианта голосования
    'option' => '<label class="t90"><input type="radio" name="option" value="{option}" required> {option}</label><br>',
    
    // формат кнопки голосования (можно опустить, будет использовано форматирование по умолчанию)
    // 'button' => '<div class="mar10-tb"><button class="button" type="submit" :disabled="voted">' . lang('Vote') . '</button></div>',
],

Сами голосования определяются в конфигурационном файла votes.php:

...
// уникальный ключ голосования
'favorite_language' => [
    // вопрос
    'question' => 'Какой язык программирования вам нравится больше?',
    
    // варианты ответов
    'options' => ['PHP', 'Python', 'JavaScript', 'C++', 'Java', 'Go', 'C#'],
],
...
Следует отметить, что модуль Vote предлагает простое голосование, которое содержит самые примитивные методы защиты от «накрутки» голосов. Если нужно голосование с полноценным учетом голосов, защитой и статистикой, то лучше использовать другие системы голосования.

Использование виджета вне сайдбара

Хотя виджеты обычно не используются вне сайдбара, поскольку это противоречит их назначению, но формально вы можете выполнить любой виджет вне сайдбара. Для этого используйте функцию widgetRun():

// имя и данные для виджета
echo widgetRun('text_block',
    [
        'header' => '<h3>My header</h3>',
        'text' => 'text',
    ]
);

Вывод сайдбара в произвольном месте

Вывод сайдбара возможен вне layout-файла. Если используется конфигурация виджетов по умолчанию, то можно использовать такой php-код:

echo implodeWrap(
        data: widgets(),
        before: getConfig('widget-before'),
        after: getConfig('widget-after')
    );

Для кастомизации, можно указать другой файл конфигурации виджетов и обрамляющий html-код блоков виджета:

echo implodeWrap(
        data: widgets(CONFIG_DIR . 'widgets-my.php'),
        before: '<div class="mar30-tb pad20 bg-primary100">',
        after: '</div>'
    );

Подобным образом можно определить любое количество сайдбаров и отдельные виджеты для них.