diff -u b/core/lib/Drupal/Core/ParamConverter/ParamConverterManager.php b/core/lib/Drupal/Core/ParamConverter/ParamConverterManager.php --- b/core/lib/Drupal/Core/ParamConverter/ParamConverterManager.php +++ b/core/lib/Drupal/Core/ParamConverter/ParamConverterManager.php @@ -65,12 +65,10 @@ $options = $route->getOptions(); $parameter_options = isset($options['parameters']) ? $options['parameters'] : array(); - // For each parameter without explicit options, default its type to the + // For each parameter without an explicit type, default it to the // parameter name. foreach ($route->compile()->getVariables() as $parameter_name) { - if (!isset($parameter_options[$parameter_name])) { - $parameter_options[$parameter_name] = array('type' => $parameter_name); - } + $parameter_options[$parameter_name] += array('type' => $parameter_name); } // Invoke each registered converter. only in patch2: unchanged: --- a/core/modules/views/views_ui/lib/Drupal/views_ui/ParamConverter/ViewUIConverter.php +++ b/core/modules/views/views_ui/lib/Drupal/views_ui/ParamConverter/ViewUIConverter.php @@ -36,72 +36,43 @@ public function __construct(TempStoreFactory $temp_store_factory) { } /** - * Tries to upcast every view entity to a decorated ViewUI object. + * Implements \Drupal\Core\ParamConverter\ParamConverterInterface::convert(). * - * The key refers to the portion of the route that is a view entity that - * should be prepared for the Views UI. If there is a non-null value, it will - * be used as the collection of a temp store object used for loading. - * - * Example: - * - * pattern: '/some/{view}/and/{foo}/and/{bar}' - * options: - * converters: - * foo: 'view' - * tempstore: - * view: 'views' - * foo: NULL - * - * The values for {view} and {foo} will be converted to view entities prepared - * for the Views UI, with {view} being loaded from the views temp store, but - * it will not touch the value for {bar}. - * - * Note: This requires that the placeholder either be named {view}, or that a - * converter is specified as done above for {foo}. - * - * It will still process variables which are marked as converted. It will mark - * any variable it processes as converted. - * - * @param array &$variables - * Array of values to convert to their corresponding objects, if applicable. - * @param \Symfony\Component\Routing\Route $route - * The route object. - * @param array &$converted - * Array collecting the names of all variables which have been - * altered by a converter. + * For every route parameter that uses a 'tempstore' option and has already + * been upcast to a View, this converter upcasts it further to a decorated + * ViewUI object. */ - public function process(array &$variables, Route $route, array &$converted) { - // If nothing was specified to convert, return. - $options = $route->getOptions(); - if (!isset($options['tempstore'])) { - return; - } - - foreach ($options['tempstore'] as $name => $collection) { - // Only convert if the variable is a view. - if ($variables[$name] instanceof ViewStorageInterface) { + public function convert($unconverted_parameters, $parameter_options, Route $route, array $defaults) { + $converted = array(); + foreach ($parameter_options as $parameter_name => $options) { + // Many things, not just Views, can use the tempstore. Here, we are only + // interested in upcasting Views. We are relying on an earlier converter + // (e.g., Drupal\Core\ParamConverter\EntityConverter) to have converted + // the desired parameters to View entities, so we must grab it out of + // $defaults, rather than $unconverted_parameters. + if (isset($options['tempstore']) && ($defaults[$parameter_name] instanceof ViewStorageInterface)) { + $collection = $options['tempstore']; + $saved_view = $defaults[$parameter_name]; // Get the temp store for this variable if it needs one. // Attempt to load the view from the temp store, synchronize its // status with the existing view, and store the lock metadata. - if ($collection && ($temp_store = $this->tempStoreFactory->get($collection)) && ($view = $temp_store->get($variables[$name]->id()))) { - if ($variables[$name]->status()) { + if (($temp_store = $this->tempStoreFactory->get($collection)) && ($view = $temp_store->get($saved_view->id()))) { + if ($saved_view->status()) { $view->enable(); } else { $view->disable(); } - $view->locked = $temp_store->getMetadata($variables[$name]->id()); + $view->locked = $temp_store->getMetadata($saved_view->id()); } // Otherwise, decorate the existing view for use in the UI. else { - $view = new ViewUI($variables[$name]); + $view = new ViewUI($saved_view); } - - // Store the new view and mark this variable as converted. - $variables[$name] = $view; - $converted[] = $name; + $converted[$parameter_name] = $view; } } + return $converted; } } only in patch2: unchanged: --- a/core/modules/views/views_ui/views_ui.routing.yml +++ b/core/modules/views/views_ui/views_ui.routing.yml @@ -72,8 +72,9 @@ views_ui.autocomplete: views_ui.edit: pattern: '/admin/structure/views/view/{view}' options: - tempstore: - view: 'views' + parameters: + view: + tempstore: 'views' defaults: _controller: '\Drupal\views_ui\Routing\ViewsUIController::edit' requirements: @@ -82,8 +83,9 @@ views_ui.edit: views_ui.edit.display: pattern: '/admin/structure/views/view/{view}/edit/{display_id}' options: - tempstore: - view: 'views' + parameters: + view: + tempstore: 'views' defaults: _controller: '\Drupal\views_ui\Routing\ViewsUIController::edit' display_id: NULL @@ -93,8 +95,9 @@ views_ui.edit.display: views_ui.preview: pattern: '/admin/structure/views/view/{view}/preview/{display_id}' options: - tempstore: - view: 'views' + parameters: + view: + tempstore: 'views' defaults: _controller: '\Drupal\views_ui\Routing\ViewsUIController::preview' display_id: NULL @@ -112,8 +115,9 @@ views_ui.breakLock: views_ui.form.addItem: pattern: '/admin/structure/views/{js}/add-item/{view}/{display_id}/{type}' options: - tempstore: - view: 'views' + parameters: + view: + tempstore: 'views' defaults: _controller: '\Drupal\views_ui\Form\Ajax\AddItem::getForm' requirements: @@ -123,8 +127,9 @@ views_ui.form.addItem: views_ui.form.editDetails: pattern: '/admin/structure/views/{js}/edit-details/{view}/{display_id}' options: - tempstore: - view: 'views' + parameters: + view: + tempstore: 'views' defaults: _controller: '\Drupal\views_ui\Form\Ajax\EditDetails::getForm' requirements: @@ -134,8 +139,9 @@ views_ui.form.editDetails: views_ui.form.reorderDisplays: pattern: '/admin/structure/views/{js}/reorder-displays/{view}/{display_id}' options: - tempstore: - view: 'views' + parameters: + view: + tempstore: 'views' defaults: _controller: '\Drupal\views_ui\Form\Ajax\ReorderDisplays::getForm' requirements: @@ -145,8 +151,9 @@ views_ui.form.reorderDisplays: views_ui.form.analyze: pattern: '/admin/structure/views/{js}/analyze/{view}/{display_id}' options: - tempstore: - view: 'views' + parameters: + view: + tempstore: 'views' defaults: _controller: '\Drupal\views_ui\Form\Ajax\Analyze::getForm' requirements: @@ -156,8 +163,9 @@ views_ui.form.analyze: views_ui.form.rearrange: pattern: '/admin/structure/views/{js}/rearrange/{view}/{display_id}/{type}' options: - tempstore: - view: 'views' + parameters: + view: + tempstore: 'views' defaults: _controller: '\Drupal\views_ui\Form\Ajax\Rearrange::getForm' requirements: @@ -167,8 +175,9 @@ views_ui.form.rearrange: views_ui.form.rearrangeFilter: pattern: '/admin/structure/views/{js}/rearrange-filter/{view}/{display_id}' options: - tempstore: - view: 'views' + parameters: + view: + tempstore: 'views' defaults: _controller: '\Drupal\views_ui\Form\Ajax\RearrangeFilter::getForm' requirements: @@ -178,8 +187,9 @@ views_ui.form.rearrangeFilter: views_ui.form.display: pattern: '/admin/structure/views/{js}/display/{view}/{display_id}/{type}' options: - tempstore: - view: 'views' + parameters: + view: + tempstore: 'views' defaults: _controller: '\Drupal\views_ui\Form\Ajax\Display::getForm' requirements: @@ -189,8 +199,9 @@ views_ui.form.display: views_ui.form.configItem: pattern: '/admin/structure/views/{js}/config-item/{view}/{display_id}/{type}/{id}' options: - tempstore: - view: 'views' + parameters: + view: + tempstore: 'views' defaults: _controller: '\Drupal\views_ui\Form\Ajax\ConfigItem::getForm' requirements: @@ -200,8 +211,9 @@ views_ui.form.configItem: views_ui.form.configItemExtra: pattern: '/admin/structure/views/{js}/config-item-extra/{view}/{display_id}/{type}/{id}' options: - tempstore: - view: 'views' + parameters: + view: + tempstore: 'views' defaults: _controller: '\Drupal\views_ui\Form\Ajax\ConfigItemExtra::getForm' requirements: @@ -211,8 +223,9 @@ views_ui.form.configItemExtra: views_ui.form.configItemGroup: pattern: '/admin/structure/views/{js}/config-item-group/{view}/{display_id}/{type}/{id}' options: - tempstore: - view: 'views' + parameters: + view: + tempstore: 'views' defaults: _controller: '\Drupal\views_ui\Form\Ajax\ConfigItemGroup::getForm' form_state: NULL