menuStorage = $menu_storage; $this->entityTypeManager = $entity_type_manager; $this->stringTranslation = $string_translation; $this->configFactory = $config_factory; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container) { return new static( $container->get('entity_type.manager')->getStorage('menu'), $container->get('entity_type.manager'), $container->get('string_translation'), $container->get('config.factory') ); } /** * {@inheritdoc} */ public function buildConfigurationForm(array $form, FormStateInterface $form_state) { $form = $this->plugin->buildConfigurationForm([], $form_state); // Move the menu levels section to the bottom. $form['menu_levels']['#weight'] = 100; $form['entity_form'] = [ '#type' => 'details', '#title' => $this->t('Edit menu %label', ['%label' => $this->menu->label()]), '#open' => TRUE, '#access' => !$this->hasMenuOverrides() && $this->menu->access('edit'), ]; $form['entity_form'] += $this->getEntityForm($this->menu)->buildForm([], $form_state); // Print the menu link titles as text instead of a link. if (!empty($form['entity_form']['links']['links'])) { foreach (Element::children($form['entity_form']['links']['links']) as $child) { $title = $form['entity_form']['links']['links'][$child]['title'][1]['#title']; $form['entity_form']['links']['links'][$child]['title'][1] = ['#markup' => $title]; } } // Change the header text. $form['entity_form']['links']['links']['#header'][0] = $this->t('Link'); $form['entity_form']['links']['links']['#header'][1]['data'] = $this->t('On'); // Remove the label, ID, description, and buttons from the entity form. unset($form['entity_form']['label'], $form['entity_form']['id'], $form['entity_form']['description'], $form['entity_form']['actions']); // Since the overview form is further nested than expected, update the // #parents. See \Drupal\menu_ui\MenuForm::form(). $form_state->set('menu_overview_form_parents', ['settings', 'entity_form', 'links']); return $form; } /** * {@inheritdoc} */ public function validateConfigurationForm(array &$form, FormStateInterface $form_state) { $this->plugin->validateConfigurationForm($form, $form_state); if (!$this->hasMenuOverrides()) { $this->getEntityForm($this->menu)->validateForm($form, $form_state); } } /** * {@inheritdoc} */ public function submitConfigurationForm(array &$form, FormStateInterface $form_state) { $this->plugin->submitConfigurationForm($form, $form_state); if (!$this->hasMenuOverrides()) { $this->getEntityForm($this->menu)->submitForm($form, $form_state); $this->menu->save(); } } /** * Gets the entity form for this menu. * * @param \Drupal\system\MenuInterface $menu * The menu entity. * * @return \Drupal\Core\Entity\EntityFormInterface * The entity form. */ protected function getEntityForm(MenuInterface $menu) { $entity_form = $this->entityTypeManager->getFormObject('menu', 'edit'); $entity_form->setEntity($menu); return $entity_form; } /** * {@inheritdoc} */ public function setPlugin(PluginInspectionInterface $plugin) { $this->plugin = $plugin; $this->menu = $this->menuStorage->loadOverrideFree($this->plugin->getDerivativeId()); } /** * Determines if the menu has configuration overrides. * * @return bool * TRUE if the menu has configuration overrides, otherwise FALSE. */ protected function hasMenuOverrides() { // @todo Replace the following with $this->menu->hasOverrides() in https://www.drupal.org/project/drupal/issues/2910353 // and remove this function. return $this->configFactory->get($this->menu->getEntityType() ->getConfigPrefix() . '.' . $this->menu->id())->hasOverrides(); } }