diff --git a/core/lib/Drupal/Core/Menu/LocalActionDefault.php b/core/lib/Drupal/Core/Menu/LocalActionDefault.php index 5e161ec1de..ee3ef6a0b2 100644 --- a/core/lib/Drupal/Core/Menu/LocalActionDefault.php +++ b/core/lib/Drupal/Core/Menu/LocalActionDefault.php @@ -7,6 +7,7 @@ use Drupal\Core\Cache\CacheableDependencyInterface; use Drupal\Core\DependencyInjection\DependencySerializationTrait; use Drupal\Core\Plugin\ContainerFactoryPluginInterface; +use Drupal\Core\Routing\RedirectDestinationInterface; use Drupal\Core\Routing\RouteMatchInterface; use Drupal\Core\Routing\RouteProviderInterface; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -26,6 +27,13 @@ class LocalActionDefault extends PluginBase implements LocalActionInterface, Con */ protected $routeProvider; + /** + * The redirect destination. + * + * @var \Drupal\Core\Routing\RedirectDestinationInterface + */ + protected $redirectDestination; + /** * Constructs a LocalActionDefault object. * @@ -37,11 +45,18 @@ class LocalActionDefault extends PluginBase implements LocalActionInterface, Con * The plugin implementation definition. * @param \Drupal\Core\Routing\RouteProviderInterface $route_provider * The route provider to load routes by name. + * @param \Drupal\Core\Routing\RedirectDestinationInterface $redirect_destination + * The redirect destination. */ - public function __construct(array $configuration, $plugin_id, $plugin_definition, RouteProviderInterface $route_provider) { + public function __construct(array $configuration, $plugin_id, $plugin_definition, RouteProviderInterface $route_provider, RedirectDestinationInterface $redirect_destination = NULL) { parent::__construct($configuration, $plugin_id, $plugin_definition); $this->routeProvider = $route_provider; + if (is_null($redirect_destination)) { + @trigger_error('The redirect.destination service must be passed to LocalActionDefault::__construct(), it is required before Drupal 9.0.0.', E_USER_DEPRECATED); + $redirect_destination = \Drupal::service('redirect.destination'); + } + $this->redirectDestination = $redirect_destination; } /** @@ -52,7 +67,8 @@ public static function create(ContainerInterface $container, array $configuratio $configuration, $plugin_id, $plugin_definition, - $container->get('router.route_provider') + $container->get('router.route_provider'), + $container->get('redirect.destination') ); } @@ -119,7 +135,13 @@ public function getRouteParameters(RouteMatchInterface $route_match) { * {@inheritdoc} */ public function getOptions(RouteMatchInterface $route_match) { - return (array) $this->pluginDefinition['options']; + $options = (array) $this->pluginDefinition['options']; + + // Check if destination should be appended to the link. + if (!empty($options['add_destination'])) { + $options['query']['destination'] = $this->redirectDestination->get(); + } + return $options; } /** diff --git a/core/modules/menu_ui/menu_ui.links.action.yml b/core/modules/menu_ui/menu_ui.links.action.yml index c82f1eae04..443e6141e8 100644 --- a/core/modules/menu_ui/menu_ui.links.action.yml +++ b/core/modules/menu_ui/menu_ui.links.action.yml @@ -1,7 +1,8 @@ entity.menu.add_link_form: route_name: entity.menu.add_link_form title: 'Add link' - class: \Drupal\menu_ui\Plugin\Menu\LocalAction\MenuLinkAdd + options: + add_destination: true appears_on: - entity.menu.edit_form diff --git a/core/modules/menu_ui/src/Plugin/Menu/LocalAction/MenuLinkAdd.php b/core/modules/menu_ui/src/Plugin/Menu/LocalAction/MenuLinkAdd.php index 6424ff9f9d..ab47ce9726 100644 --- a/core/modules/menu_ui/src/Plugin/Menu/LocalAction/MenuLinkAdd.php +++ b/core/modules/menu_ui/src/Plugin/Menu/LocalAction/MenuLinkAdd.php @@ -2,6 +2,8 @@ namespace Drupal\menu_ui\Plugin\Menu\LocalAction; +@trigger_error('The ' . __NAMESPACE__ . '\MenuLinkAdd is deprecated in drupal:8.8.0. Instead, use `add_destination: true` option in declaration of action links.', E_USER_DEPRECATED); + use Drupal\Core\Menu\LocalActionDefault; use Drupal\Core\Routing\RedirectDestinationInterface; use Drupal\Core\Routing\RouteMatchInterface; @@ -10,6 +12,9 @@ /** * Modifies the 'Add link' local action to add a destination. + * + * @deprecated in drupal:8.8.0. Instead, use `add_destination: true` option + * in declaration of action links. */ class MenuLinkAdd extends LocalActionDefault { diff --git a/core/modules/menu_ui/tests/src/Functional/MenuUiTest.php b/core/modules/menu_ui/tests/src/Functional/MenuUiTest.php index 862f1ccb48..39e74fcb09 100644 --- a/core/modules/menu_ui/tests/src/Functional/MenuUiTest.php +++ b/core/modules/menu_ui/tests/src/Functional/MenuUiTest.php @@ -275,10 +275,19 @@ public function doMenuTests() { // Test the 'Add link' local action. $this->drupalGet(Url::fromRoute('entity.menu.edit_form', ['menu' => $menu_name])); + // Check if Add link button has destination parameter. + $this->assertSession()->linkByHrefExists('admin/structure/menu/manage/' . $menu_name . '/add?destination=' . Url::fromRoute('entity.menu.edit_form', ['menu' => $menu_name])->toString(), 0, "The add menu link button URL does not have destination parameter"); + // Clink on the link. $this->clickLink(t('Add link')); + // Test if destination parameter is in the URL. + $this->assertSession()->addressEquals('admin/structure/menu/manage/' . $menu_name . '/add?destination=' . Url::fromRoute('entity.menu.edit_form', ['menu' => $menu_name])->toString()); + + // Create link. $link_title = $this->randomString(); $this->drupalPostForm(NULL, ['link[0][uri]' => '/', 'title[0][value]' => $link_title], t('Save')); + // Test destination redirect after link creation. $this->assertUrl(Url::fromRoute('entity.menu.edit_form', ['menu' => $menu_name])); + // Test the 'Edit' operation. $this->clickLink(t('Edit')); $this->assertFieldByName('title[0][value]', $link_title); diff --git a/core/modules/system/tests/modules/menu_test/src/Plugin/Menu/LocalAction/TestLocalActionWithConfig.php b/core/modules/system/tests/modules/menu_test/src/Plugin/Menu/LocalAction/TestLocalActionWithConfig.php index 4f56977e86..0406fba83d 100644 --- a/core/modules/system/tests/modules/menu_test/src/Plugin/Menu/LocalAction/TestLocalActionWithConfig.php +++ b/core/modules/system/tests/modules/menu_test/src/Plugin/Menu/LocalAction/TestLocalActionWithConfig.php @@ -4,6 +4,7 @@ use Drupal\Core\Config\Config; use Drupal\Core\Menu\LocalActionDefault; +use Drupal\Core\Routing\RedirectDestinationInterface; use Drupal\Core\Routing\RouteProviderInterface; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\Request; @@ -38,9 +39,11 @@ public function getTitle(Request $request = NULL) { * The route provider to load routes by name. * @param \Drupal\Core\Config\Config $config * The 'menu_test.links.action' config. + * @param \Drupal\Core\Routing\RedirectDestinationInterface $redirect_destination + * The redirect destination. */ - public function __construct(array $configuration, $plugin_id, $plugin_definition, RouteProviderInterface $route_provider, Config $config) { - parent::__construct($configuration, $plugin_id, $plugin_definition, $route_provider); + public function __construct(array $configuration, $plugin_id, $plugin_definition, RouteProviderInterface $route_provider, Config $config, RedirectDestinationInterface $redirect_destination) { + parent::__construct($configuration, $plugin_id, $plugin_definition, $route_provider, $redirect_destination); $this->config = $config; } @@ -54,7 +57,8 @@ public static function create(ContainerInterface $container, array $configuratio $plugin_id, $plugin_definition, $container->get('router.route_provider'), - $container->get('config.factory')->get('menu_test.links.action') + $container->get('config.factory')->get('menu_test.links.action'), + $container->get('redirect.destination') ); } diff --git a/core/tests/Drupal/Tests/Core/Menu/LocalActionDefaultTest.php b/core/tests/Drupal/Tests/Core/Menu/LocalActionDefaultTest.php index dd92f0848d..0d57714967 100644 --- a/core/tests/Drupal/Tests/Core/Menu/LocalActionDefaultTest.php +++ b/core/tests/Drupal/Tests/Core/Menu/LocalActionDefaultTest.php @@ -57,18 +57,26 @@ class LocalActionDefaultTest extends UnitTestCase { */ protected $routeProvider; + /** + * The redirect destination. + * + * @var \Drupal\Core\Routing\RedirectDestinationInterface + */ + protected $redirectDestination; + protected function setUp() { parent::setUp(); $this->stringTranslation = $this->createMock('Drupal\Core\StringTranslation\TranslationInterface'); $this->routeProvider = $this->createMock('Drupal\Core\Routing\RouteProviderInterface'); + $this->redirectDestination = $this->createMock('Drupal\Core\Routing\RedirectDestinationInterface'); } /** * Setups the local action default. */ protected function setupLocalActionDefault() { - $this->localActionDefault = new LocalActionDefault($this->config, $this->pluginId, $this->pluginDefinition, $this->routeProvider); + $this->localActionDefault = new LocalActionDefault($this->config, $this->pluginId, $this->pluginDefinition, $this->routeProvider, $this->redirectDestination); } /**