Что это такое

Pimcore — мощная open‑source MDM (и не только) система, с которой у меня накопился немалый опыт. В компании SVK.Digital, в которой я являюсь техническим директором, мы занимаемся заказной разработкой и автоматизацией бизнеса и уже несколько лет внедряем Pimcore на крупных предприятиях. В этой статье я хотел поделиться своим опытом, познакомив читателя с возможностями этого приложения.

Мне даже немного обидно, что в рунете незаслуженно мало информации об этом замечательном продукте. Хоть его и можно обозвать неприличным словом low‑code в какой‑то мере, но мне даже как программисту нравится работать с Pimcore (дальше по тексту расскажу о важных для меня особенностях), да и простор для программирования огромный.

Система построена на популярном PHP фреймворке Symfony и позволяет использовать его в полную силу. Это важно — PHP программисту не придется изучать очередной велосипед, да и качество кода и системы выше, чем если бы команда системы пыталась изобрести все свое и «с нуля».

У Pimcore есть две версии — Community и Enterprise. Вторая, очевидно, платная. Но уверяю вас — бесплатной более чем достаточно, никаких ограничений базового функционала там нет: https://pimcore.com/editions . А если нужно что‑то особенное, это нетрудно дописать — в статье это тоже рассмотрим.

Какую задачу решает

Решает задачу централизованного управления данными, их контроля и обогащения. Самый простой пример: использование Pimcore в качестве (внезапно) PIM (Product information management) системы. Допустим у вас есть магазин, нужно где‑то агрегировать данные от поставщиков, заставлять копирайтеров придумывать описания товаров, переводчиков их переводить, загружать картинки, и чтобы потом ответственный человек это все дело проверил. Затем эти данные нужно отдавать в другие системы, например в витрины интернет‑магазинов.

Все это Pimcore может из коробки, имея еще какое‑то невероятное количество возможностей, часть которых мы сегодня и рассмотрим.

Но важно понимать, что на PIM все не ограничивается — никакой привязки к именно «продуктам» в системе нет, вы сами вольны создавать любые объекты с любыми полями и связями между ними, поэтому можно завести в нее в прямом смысле любые данные.

Как раз с заведения объектов мы и начнем, это центральная часть всей системы.

Все скриншоты сделаны с открытой демки продукта: https://pimcore.com/en/try

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

Классы

Все объекты в Pimcore должны иметь какой‑то класс, именно он определяет свойства объекта.

Заведение класса выглядит так:

Мы в одном интерфейсе создаем атрибуты и лейаут — как это будет выглядеть для пользователя:

С лейаутами есть крутая фишка — их можно делать много и разных, например переводчику не нужно изменять и видеть ничего, кроме названия и описания, поэтому можно сделать отдельный лейаут только с этими полями и назначить его для роли пользователя. Лейауты можно менять и программно в зависимости от ваших условий

Уверен, что многие из вас на этом этапе напряглись: тыкать мышкой? Как это деплоить? Как с этим работать в коде? Наверняка все на массивах? Что с производительностью?

Вот тут пошли плюшки уже для разработчиков.

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

Во‑вторых, для каждого класса генерируются PHP‑классы с типизированными сеттерами и гетерами, поэтому работа c DAO выглядит прилично:

<?php

use \Pimcore\Model\DataObject;

// Create a new object
$newObject = new DataObject\Myclassname(); 
$newObject->setKey(\Pimcore\Model\Element\Service::getValidKey('New Name', 'object'));
$newObject->setParentId(123);
$newObject->setName("New Name");

Еще примеры можно посмотреть здесь.

В‑третьих, на каждый класс создается свои таблички в БД со своими колонками, а не хранится в одной помойке, поэтому с производительностью все хорошо (миллион объектов одного типа работают достойно). Плюс можно при настройке атрибута проставить ему галочку Индекс, тогда в БД будет создан индекс по этому полю.

По самим типам полей и элементов лейаута — их очень много (список смотрим тут), на все случаи жизни: начиная от простых текстовых, числовых с единицами измерения, релейшенами и заканчивая коллекциями полей, Classification Store (key‑value хранилище) и прикреплением Object Bricks — отдельные объекты‑кирпичики со своими полями.
Подробно почитать про Object Bricks и Classification Store можно тут.

Но если вам этого мало — многие из полей расширяемые, например для селекта можно запрограммировать свой провайдер данных, или сделать вычисляемое поле.

И конечно, можно запрограммировать свой тип данных.

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

Созданные объекты отображаются табличкой, которую можно настраивать, выгружать, сортировать и искать по почти всем полям:

API

После того, как мы завели наши объекты встает вопрос, как их будут получать другие системы?

Для этого есть официальный bundle Datahub. Он позволяет также мышкой создать полноценный API на GraphQL, конфигурируя какие данные каких объектов можно получить:

Эти настройки также сохраняются в файлы и их легко деплоить.

Для тестирования есть встроенный редактор GraphQL:

Datahub легко расширяемый, например можно поставить бандл Datahub Importer и настроить автоматический импорт из разных источников (локальный, SFTP, HTTP) и форматов (CSV, XLSX, JSON, XML).

Ну и вы всегда можете сделать свой бандл, который будет отдавать данные в нужном виде куда угодно.

Расширение Pimcore

Я уже говорил, что система построена на базе Symfony, и как раз для расширения Pimcore нужно писать Symfony Bundle. Есть неплохая документация, как это сделать.

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

Единственное, админка написана на ExtJS — тут придется приноровиться, если с ним раньше не работали:)

Ограничений нет, тот же Datahub — это тоже отдельный бандл. Как раз при реализации своего бандла можно подглядывать в готовые официальные.

DAM система

В Pimcore есть полноценное управление ресурсами. Умеет редактировать изображения и большинство популярных форматов, генерировать превью, и многое другое.
В качестве хранилища можно использовать S3 контейнер.

Пользователи и права

Настройка прав гибкая — вплоть до того, какие языки может редактировать пользователь или группа и какие объекты в каких папках видеть \ изменять, к каким разделам системы есть доступ:

Другие фичи

Версионирование — для всех объектов хранятся версии, можно из просматривать и переключаться между ними:

Отчеты — пишем sql запрос (или провайдер данных), на основе которого строится красивый отчет по нужным данным:

Workflow — настройка флоу для объектов и ресурсов, использует Symfony Workflow.

И куча других возможностей.

Готовые бандлы и сообщество

В статье не раз упоминалась установка готовых бандлов, их для Pimcore много — https://pimcore.com/en/developers/marketplace . Как официальных, так и сделанных сообществом. Поэтому первым делом гуглим, нет ли бандла, который решит ваши проблемы, прежде, чем делать свой.

Например есть хороший бандл оценки качества заполненности объектов Data Quality Bundle, заполняем правила и видим, какие объекты требуют внимания:

Все разработка ведется в github, через Issues можно взаимодействовать с разработчиками и помогать развивать проект. Отвечают оперативно и адекватно.

Можно следить за будущими релизами.

Есть неплохая документация

Заключение

Это далеко не все, что умеет Pimcore - я рассказал только о самых базовых вещах. Например CMS и E-Commerce Framework я вообще не затронул, это большая отдельная история, потому что хотел рассказать именно про MDM систему. 

Рекомендую посмотреть демо системы: https://pimcore.com/en/try

Надеюсь, я смог зажечь в вас интерес к продукту этой статьей!

Сергей Никитченко, SVK.digital

Комментарии (4)


  1. blockdog
    20.04.2023 14:58
    +1

    Спасибо за статью! А какие есть варианты по импорту данных? Допустим, я сформировал свою систему моделей данных (то, в каком виде оно нужно мне) внутри пимкора, и у меня есть сотня разноформатных (Excel-прайсы, XML, API, парсинг каталогов на сайте и т. д.) "поставщиков". Как я все эти разнородные данные сливаю внутрь пимкора? Как я строю ассоциации (вот эта колонка в таблице, или вот это свойство в json, или вот этот xpath соответствуют вот такому свойству модели в пимкоре)?


    1. NikitchenkoSergey Автор
      20.04.2023 14:58
      +1

      Если данные не нужно сильно модифицировать, то можно использовать вот этот бандл для датахаба. Там можно размапить колонки на поля объектов, есть набор трансформеров, которые можно пайпланить. Но это подойдет для простых кейсов.

      Интерфейс

      Но если нужно импортировать с какой-то хитрой логикой, мы делаем свой бандл с консольными командами (и/или интерфейсом в админке) и через DAO спокойненько создаем/обновляем объекты. Как и писал в статье - оно удобное, типизированное, IDE все понимает :)


  1. Yaro
    20.04.2023 14:58

    Я правильно понимаю, что ограничение DataHub в community версии только в отсутствии Rest Api и экспорта файлов?


    1. NikitchenkoSergey Автор
      20.04.2023 14:58
      +1

      Все верно, готовый бандл экспорта только для платной лицензии - https://pimcore.com/docs/data-hub-file-export/current/ , придется искать альтернативу или набросать свой бандл под вашу задачу.

      В бесплатной есть GraphQL, поэтому отсутствие REST не проблема.