Довідка та документація
1. Сторінки
Сторінки — найважливіші елементи вашого сайту на Pubner. Кожен URL-маршрут відповідає певному шаблону сторінки. Коли відвідувач запитує URL, система завантажує відповідну сторінку, обробляє її Twig-код і вставляє результат у визначений макет.
Уявляйте сторінку як «тіло» вашого контенту. Вона містить лише те, що унікальне для конкретного URL (як-от текст статті чи певна форма), тоді як глобальні елементи (навігація чи футер) обробляються макетами й партіалами.
Вивести контент поточної сторінки всередині макета:
{% page %}
2. Партіали
Партіали — це повторно використовувані шматки HTML і Twig-логіки. Розбиваючи дизайн на партіали, ви тримаєте код за принципом DRY і добре структурованим. Щоб оновити футер сайту, ви змінюєте лише один файл партіала — і він миттєво оновлюється по всьому сайту.
Типові випадки використання партіалів: хедери, футери, віджети бічної панелі, картки товарів або складні UI-компоненти, що використовуються на різних сторінках.
Підключити партіал у макеті чи сторінці:
{% partial 'navigation.twig' %}
3. Макети та плейсхолдери
Макети визначають основну HTML-оболонку сайту (теги <html>, <head> та <body>). Один проєкт може мати кілька макетів (наприклад, один для публічного сайту, інший для кабінету клієнта).
Щоб зробити макети гнучкими, Pubner використовує плейсхолдери. Вони діють як «гачки», куди окремі сторінки можуть вставляти власний контент: SEO-метатеги, додаткові CSS-стилі чи скрипти трекінгу.
Визначити плейсхолдер у макеті:
{% placeholder styles %}
Передати контент у плейсхолдер з конкретної сторінки:
{% put styles %}
<style> .custom-hero { background: blue; } </style>
{% endput %}
put буде автоматично вставлено саме там, де плейсхолдер визначено у вашому макеті.4. Змінні та керівна логіка
Pubner працює на сучасному рушії шаблонів Twig. Це дозволяє писати чисті, безпечні та дуже динамічні шаблони без чистого PHP-коду.
Ви легко виводите змінні, застосовуєте фільтри для перетворення тексту, проходите масиви даних (як-от пости чи товари) у циклах і використовуєте умовну логіку, щоб показувати чи приховувати елементи залежно від стану чи сесії користувача.
Вивід змінних та використання умов:
{% if site().name %}
<h1>Welcome to {{ site().name }}</h1>
{% endif %}
5. Форми, ассети та UI-хелпери
Створення інтерактивних елементів на кшталт форм контактів чи підключення статичних ассетів (CSS/JS) спрощено завдяки вбудованим хелперам. Вони автоматично дбають про безпеку (CSRF-токени), маршрутизацію та стан сесії.
Ми також надаємо автоматичний генератор пагінації, що вставляє чистий адаптивний компонент сторінкування там, де потрібно, створюючи необхідні файли партіалів «на льоту», якщо їх ще немає.
Ініціалізувати безпечну форму:
{{ form({'action': 'contact.send', 'redirect': '/thanks'}).open() }}
{# Form inputs go here #}
{{ form().close() }}
Перевірити сповіщення про успіх/помилку форми:
{% if success() %}
<div class="alert-success">Message sent successfully!</div>
{% endif %}
Згенерувати посилання пагінації:
{{ paginator_links(records) }}
pagination.twig у вашій темі, якщо його ще немає.6. Маршрути та редіректи
Переміщення користувачів вашим застосунком має бути безпечним і передбачуваним. Pubner надає набір Twig-функцій для внутрішніх і зовнішніх редіректів прямо з шаблонів.
Крім того, ви можете використати хелпер request_is(), щоб легко визначати активний стан пунктів навігації — з підтримкою шаблонів-масок і локалізованих маршрутів.
Доступні хелпери редіректів:
{# Redirect to a specific URL #}
{{ redirect('/about') }}
{# Redirect to the previous page #}
{{ redirect_back() }}
{# Redirect only if the user is logged in (Guest protection) #}
{{ redirect_if_auth('/dashboard') }}
{# Safe redirect (Prevents external open-redirect vulnerabilities) #}
{{ redirect_safely(user_provided_url) }}
Перевірка активного маршруту (зручно для навбарів):
{% if request_is('about*', 'contact') %}
{# This will be true for /about, /about/team, and /contact #}
<a class="active">Company</a>
{% endif %}
Локалізовані URL через page_url():
{# Link to a record detail page (locale-aware) #}
<a href="{{ page_url('/news', record.slug) }}">Read more</a>
{# Link to a static page #}
<a href="{{ page_url('/about') }}">About Us</a>
{# Single-language → /news/my-post Multilingual → /ua/news/my-post #}
7. Локалізація та мови
Pubner із самого початку створений для глобальної аудиторії. Нативна система локалізації дозволяє перекладати статичні рядки тексту й будувати розумні перемикачі мов з мінімумом зусиль.
Об'єкт lang() дає повний контроль над структурою URL, автоматично додаючи чи оновлюючи мовний префікс у поточному URL зі збереженням параметрів запиту.
Переклад рядків тексту:
{{ t('btn_checkout', 'Proceed to Checkout') }}
Логіка перемикача мов:
{# Get current language code (e.g., 'en') #}
{{ lang().current() }}
{# Check if specific language is active #}
{% if lang().is('ua') %}...{% endif %}
{# Generate a URL for a different language (Keeps current path) #}
<a href="{{ lang().url('ua') }}">Українська</a>
8. Хелпери глобальних даних
Щоб побудувати справді динамічну платформу, потрібен доступ до середовища. Pubner надає глобальні хелпери для отримання конфігурації поточного сайту, даних авторизованого користувача та даних URL.
Ці хелпери миттєво отримують дані без потреби писати складні бекенд-контролери для кожного окремого подання.
Дані конфігурації сайту:
Site Name: {{ site('name') }}
Primary Email: {{ site().email }}
Available Locales: {{ site().locales | join(', ') }}
Авторизований користувач та запити:
{# Get logged-in user name (Returns null if guest) #}
{{ auth('name') }}
{# Get current URL Path parameter #}
{{ path('slug') }}
{# Get $_GET or $_POST request data #}
{{ request('search_query') }}
9. Колекції бази даних (білдери)
Справжня сила CMS — у запитах до даних. Білдери дозволяють запитувати записи, категорії та області вашої бази даних прямо на рівні шаблонів. Вони надзвичайно швидкі й автоматично враховують мультитенантні межі вашого сайту.
Ви можете передавати масиви фільтрів у ці білдери, щоб сортувати записи, фільтрувати за категоріями, обмежувати результати чи автоматично їх пагінувати.
Запит записів (напр., пости блогу чи товари):
{% set posts = records({
'area': 'blog',
'limit': 10,
'sort': '-published_at'
}).get() %}
'area' зі slug області, щоб обмежити запит. Для sort додайте перед полем - для спадання (напр. -published_at) або без нього для зростання.Запит категорій та областей:
{# Fetch Categories for a specific Area #}
{% set blog_categories = categories({'area': 'blog'}).get() %}
{# Fetch a specific structural Area #}
{% set portfolio_area = areas({'slug': 'portfolio'}).first() %}