diff --git a/core/modules/menu_link/config/schema/menu_link.schema.yml b/core/modules/menu_link/config/schema/menu_link.schema.yml index 10c6e5d..9b9aab4 100644 --- a/core/modules/menu_link/config/schema/menu_link.schema.yml +++ b/core/modules/menu_link/config/schema/menu_link.schema.yml @@ -7,9 +7,6 @@ field.field_settings.menu_link: label: 'Available menus' sequence: - type: string - parent: - type: string - label: 'Parent' field.value.menu_link: type: mapping @@ -18,9 +15,6 @@ field.value.menu_link: menu_name: type: string label: 'Value' - parent: - type: string - label: 'Text format' weight: type: integer label: 'Weight' diff --git a/core/modules/menu_link/src/Plugin/Field/FieldType/MenuLinkItem.php b/core/modules/menu_link/src/Plugin/Field/FieldType/MenuLinkItem.php index f2301df..16bcfa9 100644 --- a/core/modules/menu_link/src/Plugin/Field/FieldType/MenuLinkItem.php +++ b/core/modules/menu_link/src/Plugin/Field/FieldType/MenuLinkItem.php @@ -23,6 +23,15 @@ * label = @Translation("Menu link"), * description = @Translation("Stores a title, menu and parent to insert a link to the current entity."), * default_widget = "menu_link_default", + * column_groups = { + * "title-description-weight" = { + * "label" = @Translation("Title, Description, and Weight"), + * "translatable" = TRUE, + * "columns" = { + * "title", "description", "weight" + * } + * }, + * }, * list_class = "\Drupal\menu_link\Plugin\Field\MenuLinkItemList", * ) */ @@ -59,7 +68,6 @@ public static function defaultFieldSettings() { $settings = parent::defaultFieldSettings(); $settings['available_menus'] = ['main']; - $settings['parent'] = 'main:'; return $settings; } @@ -78,7 +86,6 @@ public function fieldSettingsForm(array $form, FormStateInterface $form_state) { '#options' => $menu_options, '#description' => $this->t('The menus available to place links in for this kind of entity.'), ]; - $form['parent'] = $this->menuParentFormSelector->getParentSelectOptions($this->getSetting('parent')); return $form; } @@ -179,6 +186,14 @@ public function delete() { * Saves the plugin definition. */ protected function doSave() { + // We only update the menu link definition when working with the original + // language value of the field, otherwise, we can never properly update or + // remove the menu link. + // @todo - use the FieldTranslationSynchronizer + // https://www.drupal.org/node/2403455 + if ($this->getLangcode() != $this->getEntity()->getUntranslated()->language()->getId()) { + return; + } $plugin_id = $this->getMenuPluginId(); // When the entity is saved via a plugin instance, we should not call the diff --git a/core/modules/menu_link/src/Plugin/Field/FieldWidget/MenuLinkWidget.php b/core/modules/menu_link/src/Plugin/Field/FieldWidget/MenuLinkWidget.php index 01041dc..6cbeb1a 100644 --- a/core/modules/menu_link/src/Plugin/Field/FieldWidget/MenuLinkWidget.php +++ b/core/modules/menu_link/src/Plugin/Field/FieldWidget/MenuLinkWidget.php @@ -7,6 +7,7 @@ namespace Drupal\menu_link\Plugin\Field\FieldWidget; +use Drupal\Core\Entity\ContentEntityFormInterface; use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Field\WidgetBase; @@ -87,11 +88,13 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen $available_menus = array_filter($items->getSetting('available_menus')); $available_menus = array_combine($available_menus, $available_menus); $menu_names = array_keys($available_menus); - $menu = !empty($items[$delta]->menu) ? $items[$delta]->menu : reset($menu_names); + $menu = !empty($items[$delta]->menu_name) ? $items[$delta]->menu_name : reset($menu_names); $parent = !empty($items[$delta]->parent) ? $items[$delta]->parent : ''; $default_menu_parent = "$menu:$parent"; $default_title = isset($items[$delta]->title) ? $items[$delta]->title : NULL; $default_description = isset($items[$delta]->description) ? $items[$delta]->description : NULL; + $form_object = $form_state->getFormObject(); + $in_translation_form = is_subclass_of($form_object, '\Drupal\Core\Entity\ContentEntityFormInterface') && !$form_object->isDefaultFormLangcode($form_state); /** @var \Drupal\Core\Entity\EntityInterface $entity */ $entity = $items->getParent()->getValue(); @@ -121,6 +124,8 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen '#title' => $this->t('Provide a menu link'), '#default_value' => (int) (bool) $has_plugin, '#attributes' => ['class' => ['menu-link-enabled']], + '#multilingual' => FALSE, + '#disabled' => $in_translation_form, ]; $element['menu'] = [ '#type' => 'details', @@ -141,6 +146,8 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen $element['menu_parent'] = $parent_element; $element['menu_parent']['#title'] = $this->t('Parent item'); $element['menu_parent']['#attributes']['class'][] = 'menu-parent-select'; + $element['menu_parent']['#multilingual'] = FALSE; + $element['menu_parent']['#disabled'] = $in_translation_form; $element['weight'] = [ '#type' => 'number', @@ -153,7 +160,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen } /** - * Pre-render callback: Builds a renderable array for menu links. + * Pre-render callback: Builds a renderable array for the menu link widget. * * @param array $element * A renderable array. diff --git a/core/modules/menu_link/src/Tests/MenuLinkFieldStandardTest.php b/core/modules/menu_link/src/Tests/MenuLinkFieldStandardTest.php new file mode 100644 index 0000000..8e6c578 --- /dev/null +++ b/core/modules/menu_link/src/Tests/MenuLinkFieldStandardTest.php @@ -0,0 +1,57 @@ +getPermissions()); + $this->adminUser = $this->drupalCreateUser($perms); + $this->drupalLogin($this->adminUser); + } + + public function testLinkEdit() { + // Ensure that the field_menu link got created. + $node = $this->drupalCreateNode(array( + 'type' => 'article', + 'title' => 'Foobar', + 'promote' => 1, + 'status' => 1, + )); + $this->drupalGet("node/{$node->id()}/edit"); + $this->assertNoFieldChecked('edit-field-menu-0-enabled'); + $title = $this->randomString(); + $edit = $this->translatePostValues([ + 'field_menu' => [ + 0 => [ + 'enabled' => 1, + 'title' => $title, + ] + ], + ]); + $this->drupalPostForm("node/{$node->id()}/edit", $edit, 'Save and keep published'); + $this->drupalGet("node/{$node->id()}/edit"); + $this->assertFieldChecked('edit-field-menu-0-enabled'); + $this->assertOptionSelected('edit-field-menu-0-menu-parent', 'main:'); + } +} \ No newline at end of file diff --git a/core/modules/system/src/Tests/Menu/BreadcrumbTest.php b/core/modules/system/src/Tests/Menu/BreadcrumbTest.php index 5ab6ecc..1c96240 100644 --- a/core/modules/system/src/Tests/Menu/BreadcrumbTest.php +++ b/core/modules/system/src/Tests/Menu/BreadcrumbTest.php @@ -163,7 +163,6 @@ function testBreadCrumbs() { $field_storage_config->save(); $field_config = FieldConfig::create(['entity_type' => 'node', 'bundle' => $type, 'field_name' => 'menu']); $field_config->settings['available_menus'] = array_combine($menus, $menus); - $field_config->settings['parent'] = 'tools:'; $field_config->save(); entity_get_form_display('node', $type, 'default') diff --git a/core/profiles/standard/config/install/field.field.node.article.field_menu.yml b/core/profiles/standard/config/install/field.field.node.article.field_menu.yml index f81abb6..f26a790 100644 --- a/core/profiles/standard/config/install/field.field.node.article.field_menu.yml +++ b/core/profiles/standard/config/install/field.field.node.article.field_menu.yml @@ -19,6 +19,5 @@ default_value_callback: '' settings: available_menus: - main - parent: 'main:' third_party_settings: { } field_type: menu_link diff --git a/core/profiles/standard/config/install/field.field.node.page.field_menu.yml b/core/profiles/standard/config/install/field.field.node.page.field_menu.yml index 732012f..d699227 100644 --- a/core/profiles/standard/config/install/field.field.node.page.field_menu.yml +++ b/core/profiles/standard/config/install/field.field.node.page.field_menu.yml @@ -19,6 +19,5 @@ default_value_callback: '' settings: available_menus: - main - parent: 'main:' third_party_settings: { } field_type: menu_link