Files
Chamilo/vendor/sonata-project/admin-bundle/Admin/BreadcrumbsBuilder.php
2025-04-10 12:24:57 +02:00

179 lines
5.0 KiB
PHP

<?php
/*
* This file is part of the Sonata Project package.
*
* (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Sonata\AdminBundle\Admin;
use Knp\Menu\ItemInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
/**
* Stateless breadcrumbs builder (each method needs an Admin object).
*
* @author Grégoire Paris <postmaster@greg0ire.fr>
*/
final class BreadcrumbsBuilder implements BreadcrumbsBuilderInterface
{
/**
* @var string[]
*/
protected $config = [];
/**
* @param string[] $config
*/
public function __construct(array $config = [])
{
$resolver = new OptionsResolver();
$this->configureOptions($resolver);
$this->config = $resolver->resolve($config);
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'child_admin_route' => 'edit',
]);
}
/**
* {@inheritdoc}
*/
public function getBreadcrumbs(AdminInterface $admin, $action)
{
$breadcrumbs = [];
if ($admin->isChild()) {
return $this->getBreadcrumbs($admin->getParent(), $action);
}
$menu = $this->buildBreadcrumbs($admin, $action);
do {
$breadcrumbs[] = $menu;
} while ($menu = $menu->getParent());
$breadcrumbs = array_reverse($breadcrumbs);
array_shift($breadcrumbs);
return $breadcrumbs;
}
/**
* {@inheritdoc}
* NEXT_MAJOR : make this method private.
*/
public function buildBreadcrumbs(AdminInterface $admin, $action, ItemInterface $menu = null)
{
if (!$menu) {
$menu = $admin->getMenuFactory()->createItem('root');
$menu = $menu->addChild(
'link_breadcrumb_dashboard',
[
'uri' => $admin->getRouteGenerator()->generate('sonata_admin_dashboard'),
'extras' => ['translation_domain' => 'SonataAdminBundle'],
]
);
}
$menu = $this->createMenuItem(
$admin,
$menu,
sprintf('%s_list', $admin->getClassnameLabel()),
$admin->getTranslationDomain(),
[
'uri' => $admin->hasRoute('list') && $admin->hasAccess('list') ?
$admin->generateUrl('list') :
null,
]
);
$childAdmin = $admin->getCurrentChildAdmin();
if ($childAdmin) {
$id = $admin->getRequest()->get($admin->getIdParameter());
$menu = $menu->addChild(
$admin->toString($admin->getSubject()),
[
'uri' => $admin->hasRoute($this->config['child_admin_route']) && $admin->hasAccess($this->config['child_admin_route'], $admin->getSubject()) ?
$admin->generateUrl($this->config['child_admin_route'], ['id' => $id]) :
null,
'extras' => [
'translation_domain' => false,
],
]
);
$menu->setExtra('safe_label', false);
return $this->buildBreadcrumbs($childAdmin, $action, $menu);
}
if ('list' === $action) {
$menu->setUri(false);
} elseif ('create' !== $action && $admin->hasSubject()) {
$menu = $menu->addChild($admin->toString($admin->getSubject()), [
'extras' => [
'translation_domain' => false,
],
]);
} else {
$menu = $this->createMenuItem(
$admin,
$menu,
sprintf('%s_%s', $admin->getClassnameLabel(), $action),
$admin->getTranslationDomain()
);
}
return $menu;
}
/**
* Creates a new menu item from a simple name. The name is normalized and
* translated with the specified translation domain.
*
* @param AdminInterface $admin used for translation
* @param ItemInterface $menu will be modified and returned
* @param string $name the source of the final label
* @param string $translationDomain for label translation
* @param array $options menu item options
*
* @return ItemInterface
*/
private function createMenuItem(
AdminInterface $admin,
ItemInterface $menu,
$name,
$translationDomain = null,
$options = []
) {
$options = array_merge([
'extras' => [
'translation_domain' => $translationDomain,
],
], $options);
return $menu->addChild(
$admin->getLabelTranslatorStrategy()->getLabel(
$name,
'breadcrumb',
'link'
),
$options
);
}
}