Pull merge.
[yaffs-website] / web / core / modules / layout_builder / src / Routing / LayoutBuilderRoutesTrait.php
1 <?php
2
3 namespace Drupal\layout_builder\Routing;
4
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;
11
12 /**
13  * Provides a trait for building routes for a Layout Builder UI.
14  *
15  * @internal
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.
19  */
20 trait LayoutBuilderRoutesTrait {
21
22   /**
23    * Builds the layout routes for the given values.
24    *
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.
29    * @param string $path
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.
39    */
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);
54
55     if ($route_name_prefix) {
56       $route_name_prefix = "layout_builder.$type.$route_name_prefix";
57     }
58     else {
59       $route_name_prefix = "layout_builder.$type";
60     }
61
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);
71
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);
79
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);
87
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);
96     }
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);
107     }
108   }
109
110 }