diff --git a/core/lib/Drupal/Core/Breadcrumb/BreadcrumbBuilderInterface.php b/core/lib/Drupal/Core/Breadcrumb/BreadcrumbBuilderInterface.php new file mode 100644 index 0000000..7aae91a --- /dev/null +++ b/core/lib/Drupal/Core/Breadcrumb/BreadcrumbBuilderInterface.php @@ -0,0 +1,24 @@ +builders[$priority][] = $builder; + // The internal $this->builders array always needs to be correctly sorted. + // Builders with high priority are first in the array. + krsort($this->builders); + } + + /** + * Implements Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface::build(). + * + * @param \Symfony\Component\HttpFoundation\Request $request + * The HttpRequest object representing the current request. + */ + public function build(Request $request) { + // Call the build method of all breadcrumb builders. + foreach ($this->builders as $priority => $builders) { + foreach ($builders as $builder) { + $breadcrumb = $builder->build($request); + if (isset($breadcrumb) && is_array($breadcrumb)) { + return $breadcrumb; + } + } + } + } +} diff --git a/core/lib/Drupal/Core/CoreBundle.php b/core/lib/Drupal/Core/CoreBundle.php index 8734772..b5c336c 100644 --- a/core/lib/Drupal/Core/CoreBundle.php +++ b/core/lib/Drupal/Core/CoreBundle.php @@ -16,6 +16,7 @@ use Drupal\Core\DependencyInjection\Compiler\RegisterRouteEnhancersPass; use Drupal\Core\DependencyInjection\Compiler\RegisterParamConvertersPass; use Drupal\Core\DependencyInjection\Compiler\RegisterServicesForDestructionPass; +use Drupal\Core\DependencyInjection\Compiler\RegisterBreadcrumbBuilderPass; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\Reference; @@ -47,6 +48,8 @@ public function build(ContainerBuilder $container) { $this->registerTwig($container); $this->registerModuleHandler($container); + $this->registerBreadcrumbBuilders($container); + $container->addCompilerPass(new RegisterMatchersPass()); $container->addCompilerPass(new RegisterRouteFiltersPass()); // Add a compiler pass for registering event subscribers. @@ -118,4 +121,19 @@ public static function registerTwig(ContainerBuilder $container) { ->addMethodCall('addExtension', array(new Definition('Twig_Extension_Debug'))); } + /** + * Register breadcrumb builder services. + */ + protected function registerBreadcrumbBuilders(ContainerBuilder $container) { + $container->register('breadcrumb', 'Drupal\Core\Breadcrumb\BreadcrumbManager'); + + // Register the breadcrumb builder from the menu_link module. + $container->register('menu_link_breadcrumb', 'Drupal\menu_link\MenuLinkBreadcrumbBuilder') + ->addArgument(new Reference('request')) + ->addTag('breadcrumb_builder', array('priority' => 200)); + + // Add the compiler pass that will process the tagged services. + $container->addCompilerPass(new RegisterBreadcrumbBuilderPass()); + } + } diff --git a/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterBreadcrumbBuilderPass.php b/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterBreadcrumbBuilderPass.php new file mode 100644 index 0000000..c123b53 --- /dev/null +++ b/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterBreadcrumbBuilderPass.php @@ -0,0 +1,30 @@ +hasDefinition('breadcrumb')) { + return; + } + $manager = $container->getDefinition('breadcrumb'); + foreach ($container->findTaggedServiceIds('breadcrumb_builder') as $id => $attributes) { + $priority = isset($attributes[0]['priority']) ? $attributes[0]['priority'] : 0; + $manager->addMethodCall('addBuilder', array(new Reference($id), $priority)); + } + } +} diff --git a/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkBreadcrumbBuilder.php b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkBreadcrumbBuilder.php new file mode 100644 index 0000000..992b6da --- /dev/null +++ b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkBreadcrumbBuilder.php @@ -0,0 +1,29 @@ +register('menu_link_breadcrumb', 'Drupal\menu_link\MenuLinkBreadcrumbBuilder') + ->addArgument(new Reference('request')) + ->addTag('breadcrumb_builder', array('priority' => 200)); + } +} diff --git a/core/modules/system/lib/Drupal/system/Plugin/block/block/SystemBreadcrumbBlock.php b/core/modules/system/lib/Drupal/system/Plugin/block/block/SystemBreadcrumbBlock.php new file mode 100644 index 0000000..c2776f2 --- /dev/null +++ b/core/modules/system/lib/Drupal/system/Plugin/block/block/SystemBreadcrumbBlock.php @@ -0,0 +1,46 @@ +build($request); + if (isset($breadcrumb) && is_array($breadcrumb)) { + return array( + '#theme' => 'breadcrumb', + '#breadcrumb' => $breadcrumb, + ); + } + } +}