diff --git a/composer.json b/composer.json index fa2e460..915179b 100644 --- a/composer.json +++ b/composer.json @@ -8,6 +8,7 @@ "drupal/conflict": "^1-beta" }, "require-dev": { + "drupal/menu_item_extras": "^2.0.0", "drupal/paragraphs": "^1.1.0" }, "license": "GPL-2.0+" diff --git a/multiversion.info.yml b/multiversion.info.yml index 9bb702f..8b0e019 100644 --- a/multiversion.info.yml +++ b/multiversion.info.yml @@ -12,6 +12,7 @@ test_dependencies: - paragraphs:paragraphs - entity_reference_revisions:entity_reference_revisions - poll:poll + - menu_item_extras:menu_item_extras # Information added by Drupal.org packaging script on 2019-01-18 version: '8.x-1.0-beta28' diff --git a/multiversion.module b/multiversion.module index d4c94b0..0fe85ef 100644 --- a/multiversion.module +++ b/multiversion.module @@ -73,7 +73,13 @@ function multiversion_entity_type_alter(array &$entity_types) { break; case 'menu_link_content': - $entity_type->setClass('Drupal\multiversion\Entity\MenuLinkContent'); + // The menu item extras module overrides the menu_link_content class. + if ($entity_type->getClass() == 'Drupal\menu_item_extras\Entity\MenuItemExtrasMenuLinkContent') { + $entity_type->setClass('Drupal\multiversion\Entity\MenuItemExtrasMenuLinkContent'); + } + else { + $entity_type->setClass('Drupal\multiversion\Entity\MenuLinkContent'); + } $entity_type->setHandlerClass('storage', "$namespace\\MenuLinkContentStorage"); break; diff --git a/src/Entity/MenuItemExtrasMenuLinkContent.php b/src/Entity/MenuItemExtrasMenuLinkContent.php new file mode 100644 index 0000000..92b2748 --- /dev/null +++ b/src/Entity/MenuItemExtrasMenuLinkContent.php @@ -0,0 +1,14 @@ +uuid() . ':' . $this->id(); - } - - /** - * {@inheritdoc} - */ - public function preSave(EntityStorageInterface $storage) { - parent::preSave($storage); - - $parent = $this->parent->value; - if ($parent && strpos($parent, 'menu_link_content') === 0) { - list($content_type_id, $parent_uuid, $parent_id) = explode(':', $parent); - if (empty($parent_id) && $content_type_id == 'menu_link_content') { - $parents = $storage->loadByProperties(['uuid' => $parent_uuid]); - if (!empty($parents)) { - $parent = reset($parents); - $parent_id = $parent->id(); - $this->parent->value = "$content_type_id:$parent_uuid:$parent_id"; - } - } - } - } - - /** - * {@inheritdoc} - */ - public function getPluginDefinition() { - $definition = parent::getPluginDefinition(); - $definition['class'] = 'Drupal\multiversion\Plugin\Menu\MenuLinkContent'; - return $definition; - } + use MenuLinkContentTrait; } diff --git a/src/Entity/MenuLinkContentTrait.php b/src/Entity/MenuLinkContentTrait.php new file mode 100644 index 0000000..10bfb42 --- /dev/null +++ b/src/Entity/MenuLinkContentTrait.php @@ -0,0 +1,59 @@ +uuid() . ':' . $this->id(); + } + + /** + * Acts on an entity before the presave hook is invoked. + * + * @see \Drupal\Core\Entity\EntityInterface::preSave() + */ + public function preSave(EntityStorageInterface $storage) { + $parent = $this->parent->value; + if ($parent && strpos($parent, 'menu_link_content') === 0) { + list($content_type_id, $parent_uuid, $parent_id) = explode(':', $parent); + if (empty($parent_id) && $content_type_id == 'menu_link_content') { + $parents = $storage->loadByProperties(['uuid' => $parent_uuid]); + if (!empty($parents)) { + $parent = reset($parents); + $parent_id = $parent->id(); + $this->parent->value = "$content_type_id:$parent_uuid:$parent_id"; + } + } + } + } + + /** + * Builds up the menu link plugin definition for this entity. + * + * @return array + * The plugin definition corresponding to this entity. + * + * @see \Drupal\menu_link_content\MenuLinkContentInterface::getPluginDefinition + */ + public function getPluginDefinition() { + $definition = parent::getPluginDefinition(); + $definition['class'] = 'Drupal\multiversion\Plugin\Menu\MenuLinkContent'; + return $definition; + } + +} diff --git a/tests/src/Functional/MenuItemExtrasMenuLinkTest.php b/tests/src/Functional/MenuItemExtrasMenuLinkTest.php new file mode 100644 index 0000000..586784f --- /dev/null +++ b/tests/src/Functional/MenuItemExtrasMenuLinkTest.php @@ -0,0 +1,19 @@ +workspaceManager = \Drupal::service('workspace.manager'); + $web_user = $this->drupalCreateUser(['administer menu', 'administer workspaces']); + $this->drupalLogin($web_user); + $this->drupalPlaceBlock('system_menu_block:main'); + + $this->initialWorkspace = $this->workspaceManager->getActiveWorkspace(); + $this->newWorkspace = Workspace::create(['machine_name' => 'foo', 'label' => 'Foo', 'type' => 'basic']); + $this->newWorkspace->save(); + } + + public function testMenuLinksInDifferentWorkspaces() { + /** @var \Drupal\menu_link_content\MenuLinkContentInterface $pineapple */ + $pineapple = MenuLinkContent::create([ + 'menu_name' => 'main', + 'link' => 'route:user.page', + 'title' => 'Pineapple' + ]); + $pineapple->save(); + + $this->assertEqual( + $pineapple->get('workspace')->target_id, + $this->initialWorkspace->id(), + 'Pineapple in initial workspace' + ); + + $this->assertNotEqual( + $pineapple->get('workspace')->target_id, + $this->newWorkspace->id(), + 'Pineapple not in new workspace' + ); + + $this->workspaceManager->setActiveWorkspace($this->newWorkspace); + + // Save another menu link. + /** @var \Drupal\menu_link_content\MenuLinkContentInterface $pear */ + $pear = MenuLinkContent::create([ + 'menu_name' => 'main', + 'link' => 'route:user.page', + 'title' => 'Pear', + ]); + $pear->save(); + + $this->assertEqual( + $pear->get('workspace')->target_id, + $this->newWorkspace->id(), + 'Pear in new workspace' + ); + + $this->assertNotEqual( + $pear->get('workspace')->target_id, + $this->initialWorkspace->id(), + 'Pear not in initial workspace' + ); + } + +}