Chris@14
|
1 <?php
|
Chris@14
|
2
|
Chris@14
|
3 namespace Drupal\layout_builder\Routing;
|
Chris@14
|
4
|
Chris@14
|
5 use Drupal\Component\Utility\NestedArray;
|
Chris@17
|
6 use Drupal\layout_builder\DefaultsSectionStorageInterface;
|
Chris@14
|
7 use Drupal\layout_builder\OverridesSectionStorageInterface;
|
Chris@14
|
8 use Drupal\layout_builder\SectionStorage\SectionStorageDefinition;
|
Chris@14
|
9 use Symfony\Component\Routing\Route;
|
Chris@14
|
10 use Symfony\Component\Routing\RouteCollection;
|
Chris@14
|
11
|
Chris@14
|
12 /**
|
Chris@14
|
13 * Provides a trait for building routes for a Layout Builder UI.
|
Chris@14
|
14 */
|
Chris@14
|
15 trait LayoutBuilderRoutesTrait {
|
Chris@14
|
16
|
Chris@14
|
17 /**
|
Chris@14
|
18 * Builds the layout routes for the given values.
|
Chris@14
|
19 *
|
Chris@14
|
20 * @param \Symfony\Component\Routing\RouteCollection $collection
|
Chris@14
|
21 * The route collection.
|
Chris@14
|
22 * @param \Drupal\layout_builder\SectionStorage\SectionStorageDefinition $definition
|
Chris@14
|
23 * The definition of the section storage.
|
Chris@14
|
24 * @param string $path
|
Chris@14
|
25 * The path patten for the routes.
|
Chris@14
|
26 * @param array $defaults
|
Chris@14
|
27 * (optional) An array of default parameter values.
|
Chris@14
|
28 * @param array $requirements
|
Chris@14
|
29 * (optional) An array of requirements for parameters.
|
Chris@14
|
30 * @param array $options
|
Chris@14
|
31 * (optional) An array of options.
|
Chris@14
|
32 * @param string $route_name_prefix
|
Chris@14
|
33 * (optional) The prefix to use for the route name.
|
Chris@18
|
34 * @param string $entity_type_id
|
Chris@18
|
35 * (optional) The entity type ID, if available.
|
Chris@14
|
36 */
|
Chris@18
|
37 protected function buildLayoutRoutes(RouteCollection $collection, SectionStorageDefinition $definition, $path, array $defaults = [], array $requirements = [], array $options = [], $route_name_prefix = '', $entity_type_id = '') {
|
Chris@14
|
38 $type = $definition->id();
|
Chris@14
|
39 $defaults['section_storage_type'] = $type;
|
Chris@14
|
40 // Provide an empty value to allow the section storage to be upcast.
|
Chris@14
|
41 $defaults['section_storage'] = '';
|
Chris@14
|
42 // Trigger the layout builder access check.
|
Chris@17
|
43 $requirements['_layout_builder_access'] = 'view';
|
Chris@14
|
44 // Trigger the layout builder RouteEnhancer.
|
Chris@14
|
45 $options['_layout_builder'] = TRUE;
|
Chris@14
|
46 // Trigger the layout builder param converter.
|
Chris@14
|
47 $parameters['section_storage']['layout_builder_tempstore'] = TRUE;
|
Chris@14
|
48 // Merge the passed in options in after Layout Builder's parameters.
|
Chris@14
|
49 $options = NestedArray::mergeDeep(['parameters' => $parameters], $options);
|
Chris@14
|
50
|
Chris@14
|
51 if ($route_name_prefix) {
|
Chris@14
|
52 $route_name_prefix = "layout_builder.$type.$route_name_prefix";
|
Chris@14
|
53 }
|
Chris@14
|
54 else {
|
Chris@14
|
55 $route_name_prefix = "layout_builder.$type";
|
Chris@14
|
56 }
|
Chris@14
|
57
|
Chris@14
|
58 $main_defaults = $defaults;
|
Chris@18
|
59 $main_options = $options;
|
Chris@18
|
60 if ($entity_type_id) {
|
Chris@18
|
61 $main_defaults['_entity_form'] = "$entity_type_id.layout_builder";
|
Chris@18
|
62 }
|
Chris@18
|
63 else {
|
Chris@18
|
64 $main_defaults['_controller'] = '\Drupal\layout_builder\Controller\LayoutBuilderController::layout';
|
Chris@18
|
65 }
|
Chris@14
|
66 $main_defaults['_title_callback'] = '\Drupal\layout_builder\Controller\LayoutBuilderController::title';
|
Chris@14
|
67 $route = (new Route($path))
|
Chris@14
|
68 ->setDefaults($main_defaults)
|
Chris@14
|
69 ->setRequirements($requirements)
|
Chris@18
|
70 ->setOptions($main_options);
|
Chris@14
|
71 $collection->add("$route_name_prefix.view", $route);
|
Chris@14
|
72
|
Chris@18
|
73 $discard_changes_defaults = $defaults;
|
Chris@18
|
74 $discard_changes_defaults['_form'] = '\Drupal\layout_builder\Form\DiscardLayoutChangesForm';
|
Chris@18
|
75 $route = (new Route("$path/discard-changes"))
|
Chris@18
|
76 ->setDefaults($discard_changes_defaults)
|
Chris@14
|
77 ->setRequirements($requirements)
|
Chris@14
|
78 ->setOptions($options);
|
Chris@18
|
79 $collection->add("$route_name_prefix.discard_changes", $route);
|
Chris@14
|
80
|
Chris@14
|
81 if (is_subclass_of($definition->getClass(), OverridesSectionStorageInterface::class)) {
|
Chris@14
|
82 $revert_defaults = $defaults;
|
Chris@14
|
83 $revert_defaults['_form'] = '\Drupal\layout_builder\Form\RevertOverridesForm';
|
Chris@14
|
84 $route = (new Route("$path/revert"))
|
Chris@14
|
85 ->setDefaults($revert_defaults)
|
Chris@14
|
86 ->setRequirements($requirements)
|
Chris@14
|
87 ->setOptions($options);
|
Chris@14
|
88 $collection->add("$route_name_prefix.revert", $route);
|
Chris@14
|
89 }
|
Chris@17
|
90 elseif (is_subclass_of($definition->getClass(), DefaultsSectionStorageInterface::class)) {
|
Chris@17
|
91 $disable_defaults = $defaults;
|
Chris@17
|
92 $disable_defaults['_form'] = '\Drupal\layout_builder\Form\LayoutBuilderDisableForm';
|
Chris@17
|
93 $disable_options = $options;
|
Chris@17
|
94 unset($disable_options['_admin_route'], $disable_options['_layout_builder']);
|
Chris@17
|
95 $route = (new Route("$path/disable"))
|
Chris@17
|
96 ->setDefaults($disable_defaults)
|
Chris@17
|
97 ->setRequirements($requirements)
|
Chris@17
|
98 ->setOptions($disable_options);
|
Chris@17
|
99 $collection->add("$route_name_prefix.disable", $route);
|
Chris@17
|
100 }
|
Chris@14
|
101 }
|
Chris@14
|
102
|
Chris@14
|
103 }
|