Создание первого проекта
В этом разделе вы узнаете основы Pimcore, необходимые для начала разработки.
Создание CMS-страниц с использованием Documents
В первой части вы познакомитесь с основами создания CMS‑страниц с помощью Pimcore Documents.
Создание шаблона, макета и контроллера
Новый контроллер
Прежде всего, нам нужен контроллер.
Назовём его ContentController.php.
Файл нужно поместить в каталог /src/Controller.
<?php
namespace App\Controller;
use Pimcore\Controller\FrontendController;
use Symfony\Bridge\Twig\Attribute\Template;
use Symfony\Component\HttpFoundation\Request;
class ContentController extends FrontendController
{
#[Template('content/default.html.twig')]
public function defaultAction(Request $request): array
{
return [];
}
}
На данный момент у нас есть только один экшен под названием defaultAction().
мы можем поместить какой‑то собственный код или присвоить значения шаблону. В этом примере нам не нужен какой‑либо пользовательский код в контроллере, поэтому действие пока остаётся пустым.
Создание шаблона
Теперь создадим шаблон для нашей страницы:
- Создайте новую папку в
/templatesи назовите её как контроллер (используя формат snake_case) (в случае сcontent). - Поместите в эту папку новый Twig‑шаблон и назовите его как наше действие (используя формат snake_case) (
default.html.twig).
Затем можно поместить в шаблон какой‑нибудь код шаблона, например:
{% extends 'layout.html.twig' %}
{% block content %}
<h1>{{ pimcore_input("headline", {"width": 540}) }}</h1>
{% for i in pimcore_iterate_block(pimcore_block('contentblock')) %}
<h2>{{ pimcore_input('subline') }}</h2>
{{ pimcore_wysiwyg('content') }}
{% endfor %}
{% endblock %}
По умолчанию Pimcore использует движок Twig Symfony, поэтому у вас полный набор возможностей Symfony шаблонов. Кроме того, есть Pimcore‑специфичные расширения, так называемые editables, которые добавляют редактируемые части (placeholder) в layout и некоторые вспомогательные шаблонные функции.
Для подробностей по editables (например pimcore_input, pimcore_block, ...) смотрите раздел editables.
Добавление макета (layout)
Мы можем использовать наследование шаблонов Symfony и функциональность layout чтобы обернуть нашу страницу содержимым другого шаблона, который содержит основную навигацию, сайдбар и т. п., используя:
{% extends 'layout.html.twig' %}
Мы указываем движку, что хотим использовать макет layout.html.twig.
Создайте новый Twig‑шаблон в папке /templates и назовите его layout.html.twig.
Затем мы также можем добавить в него немного HTML-кода и шаблонного кода:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Example</title>
<style>
body {
padding: 0;
margin: 0;
font-family: "Lucida Sans Unicode", Arial;
font-size: 14px;
}
#site {
margin: 0 auto;
width: 600px;
padding: 30px 0 0 0;
color: #65615E;
}
h1, h2, h3 {
font-size: 18px;
padding: 0 0 5px 0;
border-bottom: 1px solid #001428;
margin-bottom: 5px;
}
h3 {
font-size: 14px;
padding: 15px 0 5px 0;
margin-bottom: 5px;
border-color: #cccccc;
}
img {
border: 0;
}
p {
padding: 0 0 5px 0;
}
a {
color: #000;
}
#logo {
text-align: center;
padding: 50px 0;
}
#logo hr {
display: block;
height: 1px;
overflow: hidden;
background: #BBB;
border: 0;
padding: 0;
margin: 30px 0 20px 0;
}
.claim {
text-transform: uppercase;
color: #BBB;
}
#site ul {
padding: 10px 0 10px 20px;
list-style: circle;
}
.buttons {
margin-bottom: 100px;
text-align: center;
}
.buttons a {
display: inline-block;
background: #6428b4;
color: #fff;
padding: 5px 10px;
margin-right: 10px;
width: 40%;
border-radius: 2px;
text-decoration: none;
}
.buttons a:hover {
background: #1C8BC1;
}
.buttons a:last-child {
margin: 0;
}
</style>
</head>
<body>
<div id="site">
<div id="logo">
<a href="http://www.pimcore.com/"><img src="/bundles/pimcoreadmin/img/logo-claim-gray.svg"
style="width: 400px;"/></a>
<hr/>
</div>
{{ block('content') }}
</div>
</body>
</html>
Код {{ block('content') }} — это placeholder, куда будет вставлено содержимое страницы.
Сведение всего этого воедино с помощью Pimcore Documents
Теперь нужно подключить действие к странице в бекенде Pimcore, чтобы страница знала, какое действие (и шаблон) нужно выполнить. Сначала щелкните правой кнопкой мыши на Home в панели Documents и выберите Add Page > Blank, чтобы добавить новую страницу.

Выберите вкладку Settings во вновь открывшейся вкладке. Выберите Controller::Action и шаблон, если он отличается от схемы именования контроллера/экшена.

Вы можете протестировать новый контроллер и действие после сохранения документа (нажмите Save & Publish). Перейдите на вкладку Edit, чтобы увидеть страницу с доступными редактируемыми placeholder'ами.

Введение в ассеты
В разделе Assets хранятся все бинарные файлы: изображения, видео, офисные файлы, PDF и т. п. Их можно загружать, хранить и управлять ими. Вы можете организовать их в структуру папок и назначать дополнительные метаданные. Один и тот же ассет можно использовать и ссылаться на него в нескольких местах — например, в документах или объектах.
Для изображений или видео всегда загружайте одну версию в максимально возможном качестве. Миниатюры для разных каналов вывода создаются Pimcore автоматически на основе конфигураций.
Для этого туториала добавьте хотя бы один файл, который вы будете использовать в объекте позже.
Способы загрузки файлов:
- Перетащите файлы из файлового проводника в браузер в нужную папку ассетов
- Кликните правой кнопкой на Home и выберите подходящий метод загрузки

Введение в объекты
Мы уже создали контроллер, действие и представление, так что можем добавлять текст из админ-панели на страницы. В этой главе мы создадим простую базу данных продуктов и будем использовать её на CMS‑страницах. Объекты используются для хранения любой структурированной информации независимо от канала вывода и могут быть использованы везде в проекте.
Создание модели/определения класса
Перейдите: Settings -> Object -> Classes и нажмите на кнопку Add Class.

Так вы создадите новый класс/модель product — представление сущности, включая схему в базе данных и сгенерированный PHP класс, который можно использовать для создания, обновления, списка и удаления сущностей.
Более подробную информацию можно найти в разделе объектов
Класс product должен иметь следующие атрибуты: SKU, picture, name и description. Шаги для добавления полей:
- Перейдите на страницу редактирования класса product
- Кликните правой кнопкой на Base и выберите Add Layout Component -> Panel - это основная панель/контейнер для атрибутов продукта
- Чтобы добавить атрибуты:
- Кликните правой кнопкой на Panel, затем Add data component -> Text -> Input, затем поменяйте имя компонента на sku (на панели редактирования с правой стороны)
- Аналогично добавьте поле name
- добавьте текстовый компонент WYSIWYG для description. Правый клик, выберите Add data component -> Text -> WYSIWYG. Поменяйте имя на description.
- Для картинки используйте компонент Other -> Image. Назовите атрибут picture.
Если всё сделано правильно, новый класс будет выглядеть как на изображении:

Важно: каждый сгенерированный класс в админ‑панели Pimcore имеет связанный PHP‑класс с геттерами и сеттерами. Файловое представление PHP‑класса для нашего класса можно найти в var/classes/DataObject/Product.php
Добавление нового объекта
Мы подготовили класс для продуктов. Теперь можно создавать объекты:
- Откройте секцию Objects в левой панели и нажмите правую кнопку рядом с Home (можно также создавать структуру директорий).
- Выберите Add object -> product и укажите имя, например: tshirt
- Заполните поля sku, name и description.
- Нажмите Save & Publish
Вероятно, это выглядит так, как показано ниже:

Последним шагом добавьте фото.
Можно использовать кнопку загрузки () или перетащить файл из раздела Assets.
Нажмите кнопку Save & Publish.
Готово.

Собираем всё вместе
Давайте сложим все воедино и подключим продукты к CMS.
Обновление контроллера и шаблона
Добавим ещё одно действие productAction в контроллер ContentController:
<?php
namespace App\Controller;
use Pimcore\Controller\FrontendController;
use Symfony\Bridge\Twig\Attribute\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class ContentController extends FrontendController
{
#[Template('content/default.html.twig')]
public function defaultAction (Request $request): array
{
return [];
}
public function productAction(Request $request): Response
{
return $this->render('content/product.html.twig');
}
}
Затем нам также понадобится новый шаблон для нашего действия с продуктом: templates/content/product.html.twig
{% extends 'layout.html.twig' %}
{% block content %}
<h1>{{ pimcore_input("headline", {"width": 540}) }}</h1>
<div class="product-info">
{% if editmode %}
{{ pimcore_relation("product") }}
{% else %}
<!-- Product information-->
{% endif %}
</div>
{% endblock %}
{{ editmode }} — стандартная переменная (всегда установлена), которая проверяет, вызвано ли представление из админки Pimcore. Это даёт возможность выполнять одно поведение в режиме редактирования и другое на фронтенде.
{{ pimcore_relation("product") }} — один из доступных заполнителей редактируемых элементов. Он используется для создания 1 к 1связей. Интересная альтернатива — editable типа Renderlet.
Нажмите здесь, чтобы ознакомиться с полным списком доступных редактируемых элементов в Pimcore.
Добавить объект Product в документ
Последний шаг — показать продукт в теле созданного документа.
Давайте вернемся к разделу документов. Кликните правой кнопкой на Home и выберите Add Page > Empty Page.
В настройках (Settings) выберите action product и контроллер Content, сохраните и перейдите на вкладку Edit.
Вы увидите новый editable элемент (relation), который мы добавили в шаблоне product выше.
Перетащите объект product в этот editable и нажмите Save & Publish.

Посмотрим результат на фронтенде...
Откройте страницу продукта, например: http://pimcore.local/tshirt где tshirt - это идентификатор товара (название отображается в дереве документов).
Пока мы не реализовали вывод данных продукта во фронтенде, страница не содержит информации о продукте.
Добавьте несколько строк в шаблон (templates/content/product.html.twig):
{% extends 'layout.html.twig' %}
{% block content %}
<h1>{{ pimcore_input("headline", {"width": 540}) }}</h1>
<div class="product-info">
{% if editmode %}
{{ pimcore_relation("product") }}
{% else %}
{% set product = pimcore_relation("product").element %}
{% if product %}
<h2>{{ product.name }}</h2>
<div class="content">
{{ product.description|raw }}
</div>
{% endif %}
{% endif %}
</div>
{% endblock %}
Теперь вы можете получить связанный объект, используя метод getElement().
Таким образом вы получаете доступ ко всем данным связанного объекта (name, description, ...).
Добавление конфигурации миниатюр
Чтобы показать изображение продукта в представлении, сначала добавьте конфигурацию thumbnail. С помощью thumbnail конфигураций Pimcore автоматически рендерит оптимизированные изображения для определённых каналов вывода (включая высокое разрешение @2x).
Добавление конфигурации миниатюр может быть достигнуто путем добавления конфигурации, как показано ниже. На данный момент просто добавьте конфигурацию с именем content.
![]()
Показ изображения в представлении
И, наконец, выведите изображение продукта:
<div class="content">
{% if product.picture %}
{{ product.picture.thumbnail("content").html|raw }}
{% endif %}
{{ product.description|raw }}
</div>
Класс Image предоставляет полезные атрибуты и методы.
Метод thumbnail.html возвращает тег <img> или <picture> (если в конфигурации используются медиа‑запросы) с корректным путём к изображению и автоматически устанавливает атрибут alt на основе метаданных ассета.
Теперь страница продукта должна выглядеть так:

Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.