Генератор ссылок
Краткое содержание
Генераторы ссылок используются для автоматического создания веб-ссылок на объекты. Они вызываются автоматически, когда объекты выбираются в редактируемых областях документов (editables) типа «Link», в документах типа «Link» и в тегах ссылок внутри самих объектов.
Кроме того, наличие генератора ссылок активирует вкладку Preview (Предпросмотр) для объектов данных.
Генераторы ссылок определяются на уровне класса, есть два способа сделать это.
Указать полное имя PHP-класса либо указать имя сервиса Symfony (с префиксом @).

services:
# ---------------------------------------------------------
# Link Generators for DataObjects
# ---------------------------------------------------------
App\Website\LinkGenerator\CategoryLinkGenerator:
public: true
App\Website\LinkGenerator\ProductLinkGenerator:
public: true
...
Пример реализации генератора ссылок
<?php
namespace App\Website\LinkGenerator;
use App\Model\Product\AccessoryPart;
use App\Model\Product\Car;
use App\Website\Tool\Text;
use Pimcore\Bundle\EcommerceFrameworkBundle\Model\ProductInterface;
use Pimcore\Model\DataObject;
use Pimcore\Model\DataObject\ClassDefinition\LinkGeneratorInterface;
use Pimcore\Bundle\EcommerceFrameworkBundle\Model\DefaultMockup;
class ProductLinkGenerator extends AbstractProductLinkGenerator implements LinkGeneratorInterface
{
public function generate(object $object, array $params = []): string
{
if (!($object instanceof Car || $object instanceof AccessoryPart)) {
throw new \InvalidArgumentException('Given object is no Car');
}
return $this->doGenerate($object, $params);
}
public function generateWithMockup(ProductInterface $object, array $params = []): string
{
return $this->doGenerate($object, $params);
}
protected function doGenerate(ProductInterface $object, array $params): string
{
return DataObject\Service::useInheritedValues(true, function () use ($object, $params) {
return $this->pimcoreUrl->__invoke(
[
'productname' => Text::toUrl($object->getOSName() ? $object->getOSName() : 'product'),
'product' => $object->getId(),
'path' => $this->getNavigationPath($object->getMainCategory(), $params['rootCategory'] ?? null),
'page' => null
],
'shop-detail',
true
);
});
}
}
Примечание: Если вы хотите поддерживать мокапы или произвольные объекты, вы можете изменить typehint на:
public function generate(object $object, array $params = []): string
{
//...
}
Генератор ссылок получит объект, на который ссылается ссылка, и дополнительные данные в зависимости от контекста. Это может быть документ (если он встроен в документ), объект, если он встроен в объект, содержащий тег или определение поля в качестве контекста.
Пример:
public function generate(Concrete $object, array $params = []): string
{
if (isset($params['document']) && $params['document'] instanceof Document) {
// параметр содержит контекстную информацию
$documentPath = $params['document']->getFullPath();
}
...
}
Пример документа

$d = Document\Link::getById(203);
echo($d->getHref());
это привело бы к следующему результату
/en/shop/Products/Cars/Sports-Cars/Jaguar-E-Type~p9
Использование в шаблонах
path() / url()
<ul class="foo">
{% for car in carList %}
<li><a href="{{ path(car) }}">{{ car.getName() }}</a></li>
{% endfor %}
</ul>
pimcoreUrl
<ul class="foo">
{% for car in carList %}
<li><a href="{{ path('pimcore_element', {'element': car}) }}">{{ car.getName() }}</a></li>
{% endfor %}
</ul>
Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.