menuLinkManager = $menu_link_manager; $this->menuParentSelector = $menu_parent_selector; $this->stringTranslation = $string_translation; $this->moduleHandler = $module_handler; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container) { return new static( $container->get('plugin.manager.menu.link'), $container->get('menu.parent_form_selector'), $container->get('string_translation'), $container->get('module_handler') ); } /** * {@inheritdoc} */ public function setMenuLinkInstance(MenuLinkInterface $menu_link) { $this->menuLink = $menu_link; } /** * {@inheritdoc} */ public function buildConfigurationForm(array $form, FormStateInterface $form_state) { $form['#title'] = $this->t('Edit menu link %title', ['%title' => $this->menuLink->getTitle()]); $provider = $this->menuLink->getProvider(); $form['info'] = [ '#type' => 'item', '#title' => $this->t('This link is provided by the @name module. The title and path cannot be edited.', ['@name' => $this->moduleHandler->getName($provider)]), ]; $form['id'] = [ '#type' => 'value', '#value' => $this->menuLink->getPluginId(), ]; $link = [ '#type' => 'link', '#title' => $this->menuLink->getTitle(), '#url' => $this->menuLink->getUrlObject(), ]; $form['path'] = [ 'link' => $link, '#type' => 'item', '#title' => $this->t('Link'), ]; $form['enabled'] = [ '#type' => 'checkbox', '#title' => $this->t('Enable menu link'), '#description' => $this->t('Menu links that are not enabled will not be listed in any menu.'), '#default_value' => $this->menuLink->isEnabled(), ]; $form['expanded'] = [ '#type' => 'checkbox', '#title' => t('Show as expanded'), '#description' => $this->t('If selected and this menu link has children, the menu will always appear expanded.'), '#default_value' => $this->menuLink->isExpanded(), ]; $menu_parent = $this->menuLink->getMenuName() . ':' . $this->menuLink->getParent(); $form['menu_parent'] = $this->menuParentSelector->parentSelectElement($menu_parent, $this->menuLink->getPluginId()); $form['menu_parent']['#title'] = $this->t('Parent link'); $form['menu_parent']['#description'] = $this->t('The maximum depth for a link and all its children is fixed. Some menu links may not be available as parents if selecting them would exceed this limit.'); $form['menu_parent']['#attributes']['class'][] = 'menu-title-select'; $delta = max(abs($this->menuLink->getWeight()), 50); $form['weight'] = [ '#type' => 'number', '#min' => -$delta, '#max' => $delta, '#default_value' => $this->menuLink->getWeight(), '#title' => $this->t('Weight'), '#description' => $this->t('Link weight among links in the same menu at the same depth. In the menu, the links with high weight will sink and links with a low weight will be positioned nearer the top.'), ]; return $form; } /** * {@inheritdoc} */ public function extractFormValues(array &$form, FormStateInterface $form_state) { // Start from the complete, original, definition. $new_definition = $this->menuLink->getPluginDefinition(); // Since the ID may not be present in the definition used to construct the // plugin, add it here so it's available to any consumers of this method. $new_definition['id'] = $form_state->getValue('id'); $new_definition['enabled'] = $form_state->getValue('enabled') ? 1 : 0; $new_definition['weight'] = (int) $form_state->getValue('weight'); $new_definition['expanded'] = $form_state->getValue('expanded') ? 1 : 0; list($menu_name, $parent) = explode(':', $form_state->getValue('menu_parent'), 2); if (!empty($menu_name)) { $new_definition['menu_name'] = $menu_name; } if (isset($parent)) { $new_definition['parent'] = $parent; } return $new_definition; } /** * {@inheritdoc} */ public function validateConfigurationForm(array &$form, FormStateInterface $form_state) { } /** * {@inheritdoc} */ public function submitConfigurationForm(array &$form, FormStateInterface $form_state) { $new_definition = $this->extractFormValues($form, $form_state); return $this->menuLinkManager->updateDefinition($this->menuLink->getPluginId(), $new_definition); } }