Розробка кастомної теми Pico (Twig)

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

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

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

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

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Розробка кастомної теми Pico (Twig)
Проста
~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

Розробка користувацької теми Pico (Twig)

Тема Pico — директорія в themes/ з Twig-шаблонами та статикою. Мінімальна тема складається з одного файлу index.twig. Повна тема для реального проекту включає кілька шаблонів, часткові блоки та стилі.

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

themes/my-theme/
  index.twig          # базовий шаблон (використовується за замовчуванням)
  blog.twig           # шаблон типу сторінки блог
  post.twig           # шаблон окремого посту
  service.twig        # шаблон сторінки послуги
  404.twig            # сторінка помилки
  partials/
    header.twig
    footer.twig
    nav.twig
    meta.twig
  css/
    theme.css
  js/
    theme.js
  images/
  theme.yml           # метадані теми

Змінні Pico у Twig

Pico передає в кожен шаблон стандартний набір змінних:

{{ site_title }}          {# назва сайту з config.yml #}
{{ base_url }}            {# корінь сайту #}
{{ theme_url }}           {# URL директорії теми #}
{{ meta.title }}          {# заголовок поточної сторінки #}
{{ meta.description }}    {# опис з frontmatter #}
{{ meta.date }}           {# дата сторінки #}
{{ meta.template }}       {# назва шаблону #}
{{ content }}             {# HTML-вміст сторінки #}
{{ pages }}               {# масив всіх сторінок #}
{{ current_page }}        {# об'єкт поточної сторінки #}
{{ prev_page }}           {# попередня сторінка в тій же директорії #}
{{ next_page }}           {# наступна сторінка #}
{{ is_front_page }}       {# true якщо головна сторінка #}

Базовий шаблон index.twig

<!DOCTYPE html>
<html lang="uk">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>
        {{ meta.title ? meta.title ~ ' | ' : '' }}{{ site_title }}
    </title>
    {% if meta.description %}
    <meta name="description" content="{{ meta.description }}">
    {% endif %}
    <link rel="stylesheet" href="{{ theme_url }}/css/theme.css">
</head>
<body class="{{ meta.template ?: 'default' }}{% if is_front_page %} front-page{% endif %}">

    {% include theme_url ~ '/partials/nav.twig' %}

    <main>
        <h1>{{ meta.title }}</h1>
        {{ content }}
    </main>

    {% include theme_url ~ '/partials/footer.twig' %}

    <script src="{{ theme_url }}/js/theme.js" defer></script>
</body>
</html>

Навігація

{# partials/nav.twig #}
<nav>
    <a href="{{ base_url }}" class="{{ is_front_page ? 'active' : '' }}">
        {{ site_title }}
    </a>
    <ul>
    {% for page in pages %}
        {# Показати тільки сторінки першого рівня #}
        {% if page.id|split('/')|length == 1 and not page.hidden %}
        <li>
            <a href="{{ page.url }}"
               class="{{ current_page.id starts with page.id ? 'active' : '' }}">
                {{ page.title }}
            </a>
        </li>
        {% endif %}
    {% endfor %}
    </ul>
</nav>

Шаблон блога зі списком постів

{# blog.twig #}
<!DOCTYPE html>
<html lang="uk">
<head>
    <meta charset="utf-8">
    <title>{{ meta.title }} | {{ site_title }}</title>
    <link rel="stylesheet" href="{{ theme_url }}/css/theme.css">
</head>
<body class="blog-index">
{% include theme_url ~ '/partials/nav.twig' %}

<main class="container">
    <h1>{{ meta.title }}</h1>
    {{ content }}

    <div class="posts-grid">
    {% for page in pages %}
        {% if page.id starts with 'blog/' and page.id != 'blog/' and not page.hidden %}
        <article class="post-card">
            {% if page.meta.date %}
            <time datetime="{{ page.meta.date|date('Y-m-d') }}">
                {{ page.meta.date|date('d.m.Y') }}
            </time>
            {% endif %}
            <h2><a href="{{ page.url }}">{{ page.title }}</a></h2>
            {% if page.meta.description %}
            <p>{{ page.meta.description }}</p>
            {% endif %}
        </article>
        {% endif %}
    {% endfor %}
    </div>
</main>

{% include theme_url ~ '/partials/footer.twig' %}
</body>
</html>

Переключення шаблону через frontmatter

---
Title: Послуги
Template: service
---

Pico шукає шаблон service.twig в темі. Якщо не знайдено — використовує index.twig.

theme.yml

# themes/my-theme/theme.yml
name: Моя тема
version: 1.0.0
author: Ім'я розробника

Робота з користувацькими мета-полями

Pico передає всі frontmatter-поля в об'єкт meta:

---
Title: Заголовок
Hero_image: hero.jpg
Show_sidebar: true
Custom_field: значення
---
{% if meta.hero_image %}
    <img src="{{ base_url }}/content/services/{{ meta.hero_image }}" alt="{{ meta.title }}">
{% endif %}

{% if meta.show_sidebar %}
    {% include theme_url ~ '/partials/sidebar.twig' %}
{% endif %}

Імена полів у шаблоні — нижний регістр незалежно від написання в frontmatter.