3 namespace Drupal\layout_builder\Routing;
5 use Drupal\Component\Utility\NestedArray;
6 use Drupal\layout_builder\DefaultsSectionStorageInterface;
7 use Drupal\layout_builder\OverridesSectionStorageInterface;
8 use Drupal\layout_builder\SectionStorage\SectionStorageDefinition;
9 use Symfony\Component\Routing\Route;
10 use Symfony\Component\Routing\RouteCollection;
13 * Provides a trait for building routes for a Layout Builder UI.
16 * Layout Builder is currently experimental and should only be leveraged by
17 * experimental modules and development releases of contributed modules.
18 * See https://www.drupal.org/core/experimental for more information.
20 trait LayoutBuilderRoutesTrait {
23 * Builds the layout routes for the given values.
25 * @param \Symfony\Component\Routing\RouteCollection $collection
26 * The route collection.
27 * @param \Drupal\layout_builder\SectionStorage\SectionStorageDefinition $definition
28 * The definition of the section storage.
30 * The path patten for the routes.
31 * @param array $defaults
32 * (optional) An array of default parameter values.
33 * @param array $requirements
34 * (optional) An array of requirements for parameters.
35 * @param array $options
36 * (optional) An array of options.
37 * @param string $route_name_prefix
38 * (optional) The prefix to use for the route name.
40 protected function buildLayoutRoutes(RouteCollection $collection, SectionStorageDefinition $definition, $path, array $defaults = [], array $requirements = [], array $options = [], $route_name_prefix = '') {
41 $type = $definition->id();
42 $defaults['section_storage_type'] = $type;
43 // Provide an empty value to allow the section storage to be upcast.
44 $defaults['section_storage'] = '';
45 // Trigger the layout builder access check.
46 $requirements['_has_layout_section'] = 'true';
47 $requirements['_layout_builder_access'] = 'view';
48 // Trigger the layout builder RouteEnhancer.
49 $options['_layout_builder'] = TRUE;
50 // Trigger the layout builder param converter.
51 $parameters['section_storage']['layout_builder_tempstore'] = TRUE;
52 // Merge the passed in options in after Layout Builder's parameters.
53 $options = NestedArray::mergeDeep(['parameters' => $parameters], $options);
55 if ($route_name_prefix) {
56 $route_name_prefix = "layout_builder.$type.$route_name_prefix";
59 $route_name_prefix = "layout_builder.$type";
62 $main_defaults = $defaults;
63 $main_defaults['is_rebuilding'] = FALSE;
64 $main_defaults['_controller'] = '\Drupal\layout_builder\Controller\LayoutBuilderController::layout';
65 $main_defaults['_title_callback'] = '\Drupal\layout_builder\Controller\LayoutBuilderController::title';
66 $route = (new Route($path))
67 ->setDefaults($main_defaults)
68 ->setRequirements($requirements)
69 ->setOptions($options);
70 $collection->add("$route_name_prefix.view", $route);
72 $save_defaults = $defaults;
73 $save_defaults['_controller'] = '\Drupal\layout_builder\Controller\LayoutBuilderController::saveLayout';
74 $route = (new Route("$path/save"))
75 ->setDefaults($save_defaults)
76 ->setRequirements($requirements)
77 ->setOptions($options);
78 $collection->add("$route_name_prefix.save", $route);
80 $cancel_defaults = $defaults;
81 $cancel_defaults['_controller'] = '\Drupal\layout_builder\Controller\LayoutBuilderController::cancelLayout';
82 $route = (new Route("$path/cancel"))
83 ->setDefaults($cancel_defaults)
84 ->setRequirements($requirements)
85 ->setOptions($options);
86 $collection->add("$route_name_prefix.cancel", $route);
88 if (is_subclass_of($definition->getClass(), OverridesSectionStorageInterface::class)) {
89 $revert_defaults = $defaults;
90 $revert_defaults['_form'] = '\Drupal\layout_builder\Form\RevertOverridesForm';
91 $route = (new Route("$path/revert"))
92 ->setDefaults($revert_defaults)
93 ->setRequirements($requirements)
94 ->setOptions($options);
95 $collection->add("$route_name_prefix.revert", $route);
97 elseif (is_subclass_of($definition->getClass(), DefaultsSectionStorageInterface::class)) {
98 $disable_defaults = $defaults;
99 $disable_defaults['_form'] = '\Drupal\layout_builder\Form\LayoutBuilderDisableForm';
100 $disable_options = $options;
101 unset($disable_options['_admin_route'], $disable_options['_layout_builder']);
102 $route = (new Route("$path/disable"))
103 ->setDefaults($disable_defaults)
104 ->setRequirements($requirements)
105 ->setOptions($disable_options);
106 $collection->add("$route_name_prefix.disable", $route);