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 9b9aab4..54b7a45 100644 --- a/core/modules/menu_link/config/schema/menu_link.schema.yml +++ b/core/modules/menu_link/config/schema/menu_link.schema.yml @@ -7,6 +7,9 @@ field.field_settings.menu_link: label: 'Available menus' sequence: - type: string + default_menu_parent: + type: string + label: 'Default menu parent' field.value.menu_link: type: mapping @@ -15,6 +18,9 @@ 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/menu_link.module b/core/modules/menu_link/menu_link.module new file mode 100644 index 0000000..5706fdd --- /dev/null +++ b/core/modules/menu_link/menu_link.module @@ -0,0 +1,21 @@ +getType() == 'menu_link') { + // We only support posting one menu link at a time. + // @todo - this is a hack and should be managed by the field definition. + // https://www.drupal.org/node/2403703 + $form['field_storage']['cardinality_container']['cardinality']['#default_value'] = 1; + $form['field_storage']['cardinality_container']['#access'] = FALSE; + } +} \ No newline at end of file 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 16bcfa9..1ce63e4 100644 --- a/core/modules/menu_link/src/Plugin/Field/FieldType/MenuLinkItem.php +++ b/core/modules/menu_link/src/Plugin/Field/FieldType/MenuLinkItem.php @@ -68,6 +68,7 @@ public static function defaultFieldSettings() { $settings = parent::defaultFieldSettings(); $settings['available_menus'] = ['main']; + $settings['default_menu_parent'] = 'main:'; return $settings; } @@ -85,6 +86,23 @@ public function fieldSettingsForm(array $form, FormStateInterface $form_state) { '#default_value' => $this->getSetting('available_menus'), '#options' => $menu_options, '#description' => $this->t('The menus available to place links in for this kind of entity.'), + '#required' => TRUE, + ]; + + $parent_options = []; + // Make sure the setting is normalized to an associative array. + $available_menus = array_filter($this->getSetting('available_menus')); + $available_menus = array_combine($available_menus, $available_menus); + foreach ($available_menus as $name) { + if (isset($menu_options[$name])) { + $parent_options["$name:"] = $menu_options[$name]; + } + } + $form['default_menu_parent'] = [ + '#type' => 'select', + '#title' => $this->t('Default menu for new links'), + '#default_value' => $this->getSetting('default_menu_parent'), + '#options' => $parent_options, ]; return $form; 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 6cbeb1a..eda3ca1 100644 --- a/core/modules/menu_link/src/Plugin/Field/FieldWidget/MenuLinkWidget.php +++ b/core/modules/menu_link/src/Plugin/Field/FieldWidget/MenuLinkWidget.php @@ -88,11 +88,22 @@ 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_name) ? $items[$delta]->menu_name : reset($menu_names); - $parent = !empty($items[$delta]->parent) ? $items[$delta]->parent : ''; - $default_menu_parent = "$menu:$parent"; + + if (empty($items[$delta]->menu_name)) { + $default_menu_parent = $items->getSetting('default_menu_parent'); + if (empty($available_menus[rtrim($default_menu_parent, ':')])) { + $default_menu_parent = reset($menu_names) . ':'; + } + } + else { + $menu = $items[$delta]->menu_name; + $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; + // The widget form may be used to define default values, so make sure the + // form object is an entity form, rather than a configuration form. $form_object = $form_state->getFormObject(); $in_translation_form = is_subclass_of($form_object, '\Drupal\Core\Entity\ContentEntityFormInterface') && !$form_object->isDefaultFormLangcode($form_state); diff --git a/core/modules/menu_link/src/Plugin/Field/MenuLinkItemList.php b/core/modules/menu_link/src/Plugin/Field/MenuLinkItemList.php index aaeef0a..01e5acd 100644 --- a/core/modules/menu_link/src/Plugin/Field/MenuLinkItemList.php +++ b/core/modules/menu_link/src/Plugin/Field/MenuLinkItemList.php @@ -6,9 +6,11 @@ */ namespace Drupal\menu_link\Plugin\Field; + use Drupal\Core\Access\AccessResult; use Drupal\Core\Field\FieldItemList; use Drupal\Core\Session\AccountInterface; +use Drupal\Core\Form\FormStateInterface; /** * Defines a custom menu link item list for better access checking. @@ -18,6 +20,13 @@ class MenuLinkItemList extends FieldItemList { /** * {@inheritdoc} */ + public function defaultValuesForm(array &$form, FormStateInterface $form_state) { + // We don't want to use any default values form. + } + + /** + * {@inheritdoc} + */ public function defaultAccess($operation = 'view', AccountInterface $account = NULL) { if ($operation == 'edit') { return AccessResult::allowedIfHasPermission($account, 'administer menu'); diff --git a/core/modules/menu_link/src/Tests/MenuLinkFieldStandardTest.php b/core/modules/menu_link/src/Tests/MenuLinkFieldStandardTest.php index a2d4562..3d669c1 100644 --- a/core/modules/menu_link/src/Tests/MenuLinkFieldStandardTest.php +++ b/core/modules/menu_link/src/Tests/MenuLinkFieldStandardTest.php @@ -35,6 +35,9 @@ protected function setUp() { $this->drupalLogin($this->adminUser); } + /** + * Tests field CRUD on the node form and field configurations. + */ public function testLinkEdit() { // Ensure that the field_menu link got created. $node = $this->drupalCreateNode(array( @@ -49,7 +52,7 @@ public function testLinkEdit() { $edit = $this->translatePostValues([ 'field_menu' => [ 0 => [ - 'enabled' => 1, + 'enabled' => TRUE, 'title' => $title, ] ], @@ -58,5 +61,29 @@ public function testLinkEdit() { $this->drupalGet("node/{$node->id()}/edit"); $this->assertFieldChecked('edit-field-menu-0-enabled'); $this->assertOptionSelected('edit-field-menu-0-menu-parent', 'main:'); + // Enable another menu. + $edit = $this->translatePostValues([ + 'field' => [ + 'settings' => [ + 'available_menus' => [ + 'footer' => TRUE, + 'main' => TRUE, + ], + ], + ], + ]); + $this->drupalPostForm('admin/structure/types/manage/article/fields/node.article.field_menu', $edit, 'Save settings'); + $this->drupalGet("node/{$node->id()}/edit"); + $this->assertOptionSelected('edit-field-menu-0-menu-parent', 'main:'); + $edit = $this->translatePostValues([ + 'field_menu' => [ + 0 => [ + 'menu_parent' => 'footer:', + ] + ], + ]); + $this->drupalPostForm("node/{$node->id()}/edit", $edit, 'Save and keep published'); + $this->drupalGet("node/{$node->id()}/edit"); + $this->assertOptionSelected('edit-field-menu-0-menu-parent', 'footer:'); } } \ 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 1c96240..f30046a 100644 --- a/core/modules/system/src/Tests/Menu/BreadcrumbTest.php +++ b/core/modules/system/src/Tests/Menu/BreadcrumbTest.php @@ -163,6 +163,7 @@ 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['default_menu_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 f26a790..178853b 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,5 +19,6 @@ default_value_callback: '' settings: available_menus: - main + default_menu_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 d699227..c8445a1 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,5 +19,6 @@ default_value_callback: '' settings: available_menus: - main + default_menu_parent: 'main:' third_party_settings: { } field_type: menu_link