Форматировщик путей (Path Formatter)
Краткое содержание
- Path Formatter — это инструмент, позволяющий отображать понятную для пользователя информацию об объекте вместо технического пути в интерфейсе Pimcore. Это актуально для таких типов данных, как «Many-To-One» (многие к одному), «Many-To-Many (Object)» (многие ко многим) и других подобных связей.
- Для получения «красивого» пути система использует Ajax-запросы по требованию (то есть после рендеринга элементов в интерфейсе).
Пример
В данном примере мы хотим отобразить заголовок из метаданных медиа-ассета вместо его стандартного пути в системе.


Конфигурация через редактор класса
Просто укажите службу Formatter в редакторе класса.

Образец класса-форматировщика
<?php
namespace App\PathFormatter;
use Pimcore\Model\Asset;
use Pimcore\Model\Element\ElementInterface;
use Pimcore\Model\DataObject\BlogArticle;
use Pimcore\Model\DataObject\ClassDefinition\Data;
use Pimcore\Model\DataObject\ClassDefinition\PathFormatterInterface;
use Pimcore\Model\DataObject\Concrete;
use Pimcore\Model\DataObject\News;
class TheFormatter implements PathFormatterInterface
{
/**
* @param array $result Массив, содержащий текущую информацию о путях. Измените его или оставьте как есть.
* @param ElementInterface $source Исходный объект, в котором находится поле.
* @param array $targets Список узлов, описывающих целевые элементы (связанные объекты/ассеты).
* @param array $params Опциональные параметры. Могут содержать контекстную информацию.
*
* @return array Результирующий список имен для отображения.
*/
public function formatPath(array $result, ElementInterface $source, array $targets, array $params): array
{
/** @var Data $fd */
$fd = $params['fd'];
$context = $params['context'];
foreach ($targets as $key => $item) {
$newPath = ($item['path'] ?? $item['fullpath']) . ' - ' . time();
if (isset($context['language'])) {
$newPath .= ' ' . $context['language'];
}
if ($item['type'] === 'object') {
$targetObject = Concrete::getById($item['id']);
if ($targetObject instanceof News) {
$newPath = $targetObject->getTitle() . ' - ' . $targetObject->getShortText();
} else if ($targetObject instanceof BlogArticle) {
$newPath = $targetObject->getTitle();
}
} elseif ($item['type'] === 'asset') {
$asset = Asset::getById($item['id']);
if ($asset) {
$title = $asset->getMetadata('title');
if (!$title) {
$title = 'this asset does not have a title, use ' . $newPath . ' instead';
}
if ($fd instanceof Data\ManyToManyRelation) {
$newPath = '<img src="' . $asset . '" style="width: 25px; height: 18px;" />' . $title;
} else {
$newPath = $title;
}
}
}
// Важно сохранять тот же ключ ($key), чтобы соответствие путей работало корректно
$result[$key] = $newPath;
}
return $result;
}
}
Примечание по поводу пакетного назначения
При использовании функции пакетного редактирования, параметр containerType будет иметь значение batch, а ID объекта будет соответствовать ID папки, в которой производятся массовые изменения.
Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.