diff --git a/config/schema/menu_position.schema.yml b/config/schema/menu_position.schema.yml index 0a24454..3f9e656 100644 --- a/config/schema/menu_position.schema.yml +++ b/config/schema/menu_position.schema.yml @@ -8,6 +8,12 @@ menu_position.menu_position_rule.*: label: type: label label: 'Label' + menu_name: + type: string + label: 'The name of the menu used in this rule' + parent: + type: string + label: 'The parent menu plugin ID used for this rule' menu_link: type: string label: 'The menu link plugin id for this rule' diff --git a/src/Entity/MenuPositionRule.php b/src/Entity/MenuPositionRule.php index 8abf2ee..e992918 100644 --- a/src/Entity/MenuPositionRule.php +++ b/src/Entity/MenuPositionRule.php @@ -169,6 +169,19 @@ class MenuPositionRule extends ConfigEntityBase implements MenuPositionRuleInter /** * {@inheritdoc} */ + public function getMenuName() { + return $this->menu_name; + } + /** + * {@inheritdoc} + */ + public function getParent() { + return $this->parent; + } + + /** + * {@inheritdoc} + */ public function getWeight() { return $this->weight; } @@ -204,6 +217,20 @@ class MenuPositionRule extends ConfigEntityBase implements MenuPositionRuleInter /** * {@inheritdoc} */ + public function setMenuName($menu_name) { + $this->menu_name = $menu_name; + } + + /** + * {@inheritdoc} + */ + public function setParent($parent) { + $this->parent = $parent; + } + + /** + * {@inheritdoc} + */ public function setWeight($weight) { $this->weight = $weight; } diff --git a/src/Form/MenuPositionRuleForm.php b/src/Form/MenuPositionRuleForm.php index ab9501c..f8b3666 100644 --- a/src/Form/MenuPositionRuleForm.php +++ b/src/Form/MenuPositionRuleForm.php @@ -20,6 +20,13 @@ use Symfony\Component\DependencyInjection\ContainerInterface; class MenuPositionRuleForm extends EntityForm { /** + * The menu link manager. + * + * @var \Drupal\Core\Menu\MenuLinkManagerInterface. + */ + protected $menu_link_manager; + + /** * @param \Drupal\Core\Entity\Query\QueryFactory $entity_query * The entity query. */ @@ -207,14 +214,16 @@ class MenuPositionRuleForm extends EntityForm { */ public function save(array $form, FormStateInterface $form_state) { // Get menu position rule. + /* @var \Drupal\menu_position\Entity\MenuPositionRule $rule */ $rule = $this->entity; $is_new = $rule->isNew(); $menu_link_id = 'menu_position_link:' . $rule->id(); if (!$this->menu_link_manager->hasDefinition($menu_link_id)) { + $rule->setMenuLink($menu_link_id); + $rule->save(); // Let the deriver generate the menu link. $this->menu_link_manager->rebuild(); - $this->setMenuLink($menu_link_id); } $definition = $this->menu_link_manager->getDefinition($menu_link_id); $menu_link = $this->menu_link_manager->updateDefinition($menu_link_id, [ diff --git a/src/Form/MenuPositionRuleOrderForm.php b/src/Form/MenuPositionRuleOrderForm.php index 9b53357..f675415 100644 --- a/src/Form/MenuPositionRuleOrderForm.php +++ b/src/Form/MenuPositionRuleOrderForm.php @@ -26,6 +26,13 @@ class MenuPositionRuleOrderForm extends FormBase { */ protected $entityTypeManager; + /** + * The menu link manager. + * + * @var \Drupal\Core\Menu\MenuLinkManagerInterface. + */ + protected $menu_link_manager; + public function __construct( QueryFactory $entity_query, MenuLinkManagerInterface $menu_link_manager, @@ -89,6 +96,8 @@ class MenuPositionRuleOrderForm extends FormBase { // Display table of rules. foreach ($rules as $rule) { + /* @var \Drupal\menu_position\Entity\MenuPositionRule $rule */ + /* @var \Drupal\menu_position\Plugin\Menu\MenuPositionLink $menu_link */ $menu_link = $rule->getMenuLinkPlugin(); $parent = $this->menu_link_manager->createInstance($menu_link->getParent()); // @todo Because we're in a loop, try to cache this unless the entity diff --git a/src/MenuPositionRuleInterface.php b/src/MenuPositionRuleInterface.php index 06f0c68..294ab77 100644 --- a/src/MenuPositionRuleInterface.php +++ b/src/MenuPositionRuleInterface.php @@ -47,6 +47,20 @@ interface MenuPositionRuleInterface extends ConfigEntityInterface { public function getMenuLink(); /** + * Returns the menu name + * @return string + * The menu name + */ + public function getMenuName(); + + /** + * Returns the parent menu item + * @return string + * The parent menu item + */ + public function getParent(); + + /** * Returns weight for the particular menu position rule * @return integer * Weight for the particular rule @@ -84,6 +98,20 @@ interface MenuPositionRuleInterface extends ConfigEntityInterface { public function setMenuLink($menu_link); /** + * Sets the menu name + * @return string $menu_name + * The menu name + */ + public function setMenuName($menu_name); + + /** + * Sets the parent link id + * @return string $parent_link_id + * The parent menu link id + */ + public function setParent($parent); + + /** * Sets weight for the particular menu position rule * @param integer $weight * Weight for the particular rule diff --git a/src/Plugin/Derivative/MenuPositionLink.php b/src/Plugin/Derivative/MenuPositionLink.php index 0be72c9..79b9ecf 100644 --- a/src/Plugin/Derivative/MenuPositionLink.php +++ b/src/Plugin/Derivative/MenuPositionLink.php @@ -47,6 +47,8 @@ class MenuPositionLink extends DeriverBase implements ContainerDeriverInterface // Reset the discovered definitions. $this->derivatives = []; foreach ($this->storage->loadMultiple() as $menu_position_rule) { + /* @var \Drupal\menu_position\Entity\MenuPositionRule $menu_position_rule */ + /* @var \Drupal\menu_position\Plugin\Menu\MenuPositionLink $menu_link */ if ($menu_link = $menu_position_rule->getMenuLinkPlugin()) { // Link already exists, use that. $definition = $menu_link->getPluginDefinition(); @@ -58,8 +60,8 @@ class MenuPositionLink extends DeriverBase implements ContainerDeriverInterface 'title' => t('@label (menu position rule)', [ '@label' => $menu_position_rule->getLabel(), ]), - 'menu_name' => 'main', - 'parent' => '', + 'menu_name' => $menu_position_rule->getMenuName(), + 'parent' => $menu_position_rule->getParent(), 'weight' => 0, 'metadata' => [ 'entity_id' => $menu_position_rule->id(),