src/Core/Framework/Adapter/Twig/Extension/BuildBreadcrumbExtension.php line 62
<?php declare(strict_types=1);
namespace Shopware\Core\Framework\Adapter\Twig\Extension;
use Shopware\Core\Content\Category\CategoryCollection;
use Shopware\Core\Content\Category\CategoryEntity;
use Shopware\Core\Content\Category\Service\CategoryBreadcrumbBuilder;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\Log\Package;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;
#[Package('core')]
class BuildBreadcrumbExtension extends AbstractExtension
{
/**
* @internal
*/
public function __construct(
private readonly CategoryBreadcrumbBuilder $categoryBreadcrumbBuilder,
private readonly EntityRepository $categoryRepository
) {
}
public function getFunctions(): array
{
return [
new TwigFunction('sw_breadcrumb_full', $this->getFullBreadcrumb(...), ['needs_context' => true]),
];
}
/**
* @param array<string, mixed> $twigContext
*
* @return array<string, CategoryEntity>
*/
public function getFullBreadcrumb(array $twigContext, CategoryEntity $category, Context $context): array
{
$salesChannel = null;
if (\array_key_exists('context', $twigContext) && $twigContext['context'] instanceof SalesChannelContext) {
$salesChannel = $twigContext['context']->getSalesChannel();
}
$seoBreadcrumb = $this->categoryBreadcrumbBuilder->build($category, $salesChannel);
if ($seoBreadcrumb === null) {
return [];
}
/** @var list<string> $categoryIds */
$categoryIds = array_keys($seoBreadcrumb);
if (empty($categoryIds)) {
return [];
}
$criteria = new Criteria($categoryIds);
$criteria->setTitle('breadcrumb-extension');
/** @var CategoryCollection $categories */
$categories = $this->categoryRepository->search($criteria, $context)->getEntities();
$breadcrumb = [];
foreach ($categoryIds as $categoryId) {
if ($categories->get($categoryId) === null) {
continue;
}
$breadcrumb[$categoryId] = $categories->get($categoryId);
}
return $breadcrumb;
}
}