如何将字段添加到菜单项


11

我需要建立一个主菜单,它是常规菜单的子集。设计团队认为,最好让用户仅在主菜单中拥有最重要的链接,而不要拥有所有内容。有些链接是顶层菜单,有些是子菜单。为此,我希望能够将一个字段作为下拉列表添加到菜单链接项表单中。创建链接时,用户可以使用此下拉菜单选择“ promoteToMainMenuAsBigLink”或“ promoteToMainMenuAsSmallLink”,也可以不使用任何下拉菜单而不在主菜单上显示该项目。

我正在寻找与此Drupal 7解决方案类似的解决方案,但针对Drupal 8。

我希望能够在表menu_link_content_data中的“扩展”旁边添加一列。我希望不必将此信息记录在d7解决方案中所示的其他表中。

我能够在构建的自定义模块中向链接表单添加字段,仅出于测试目的,我仅添加了以以下内容开头的文本字段:

custom_menu.module:

function custom_menu_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  if($form_id == 'menu_link_content_menu_link_content_form') {
    $form['promoteToMainMenu'] = array(
      '#type' => 'textfield',
      '#title' => t('Promote to main menu'),
      '#description' => t('Promote link menu to main menu.'),
      '#default_value' => '',
      '#weight' => -9
    );
  }
}

该字段确实以链接形式显示,但从未记录。

有人可以帮我弄这个吗?


听起来不太可能,自定义菜单链接项是内容实体(api.drupal.org/api/drupal/…)。这意味着您需要使用一个钩子来添加字段(也许是api.drupal.org/api/drupal/…),然后运行更新功能来更新架构。
2016年

Answers:



11

您可以使用以下代码hook_entity_base_field_infomenu_link_content实体添加其他字段:

/**
 * Implements hook_entity_base_field_info().
 */
function HOOK_entity_base_field_info(EntityTypeInterface $entity_type) {
  $fields = [];

  if ($entity_type->id() == 'menu_link_content') {
    $fields['FIELD_NAME'] = BaseFieldDefinition::create('FIELD_TYPE')
      ->setLabel(t('FIELD_LABEL'))
      ->setDescription(t('FIELD_DESCRIPTION '))
      ->setDisplayOptions('form',array('type' => 'FIELD_TYPE', 'weight' => 0));
  }

  return $fields;
}

有关的更多详细信息,请参见https://www.drupal.org/docs/8/api/entity-api/defining-and-using-content-entity-field-definitionsBaseFieldDefinition

之后,您需要hook_form_menu_link_content_menu_link_content_form_alter()向表单添加一个字段。


5
您不必通过表单alter添加字段。您可以简单地使用BaseFieldDefinition->setDisplayOptions()方法:...->setDisplayOptions('form', [ ... ])
milkovsky

1
如何创建图像场?我找不到具有此字段类型的示例,因此需要它。使用此工具时,我可以看到图像上传字段,但是当我尝试保存菜单项时,我得到:Drupal \ Core \ Entity \ EntityStorageException:SQLSTATE [42S22]:找不到列:1054未知列'field_menu_image__target_id'也在刷新页面以进行添加时我在日志中看到的菜单项形式:注意:未定义的索引:field_menu_image__height注意:未定义的索引:field_menu_image__width等...图像字段类型的任何示例吗?谢谢
blastoise

5
我已经解决了这个问题。/update.php无法正常工作,因此永远不会创建专栏。我已经使用drush来更新数据库:drush Updatedb --entity-updates
blastoise

1
您在hook_form_menu_link_content_menu_link_content_form_alter()中添加了什么内容?
马特

3

不幸的是,@ MatthieuScarset表示,在Drupal 8中,默认情况下确实没有菜单链接的字段UI。但是menu_link_content它是Drupal 8中的内容实体,因此可以向其中添加字段。

选项#1当然,您可以按照@Decipher的建议进行编程。

选项#2但是,还有另一种变通方法是为菜单链接临时启用字段UI:

  1. 打开 Drupal\menu_link_content\Entity\MenuLinkContent
  2. 添加field_ui_base_route = "entity.menu.add_link_form"到注释
  3. 重建缓存
  4. 访问 /admin/structure/menu/manage/main/add/fields
  5. 管理所有字段,显示
  6. 导出您的站点配置(drush cex -y)。
  7. field_ui_base_route = "entity.menu.add_link_form"从以下位置的注释中删除Drupal\menu_link_content\Entity\MenuLinkContent
  8. 重建缓存。

我尝试过这种方法。起初看起来不错,但是当我尝试创建新字段时出现错误:创建字段菜单图像时出现问题:尝试创建没有捆绑的字段“ field_menu_image”。我现在正在尝试以编程方式实现这一目标,但是如果这也能奏效的话会更好。
blastoise


0

正如@Mykhailo Gurei所建议的那样,“附加菜单项”是实现这一目标的一种方法。

但就我而言,我必须添加额外的字段并使用Mega菜单模块。我使用的是“我们超级菜单”,因此无法使用“菜单项附加功能”。只是菜单没有显示在前端(某些模板覆盖了问题)。

因此,适用于“我们超级菜单”的其他选项是“菜单项内容字段”:

https://www.drupal.org/project/menu_item_fields

具有相同的功能,并且与We mega菜单模块没有冲突。


-2

不幸的是,Drupal 8核心开发人员尚未使菜单链接成为可现场使用的。因此,暂时无法在菜单链接中添加字段。

站点构建者的“变通方法”是创建一个可以具有自定义字段的自定义词汇表。


4
错误。MenuLinkContent是可设置字段的内容实体。
milkovsky

1
您将如何向MenuLinkContent添加新字段?
MatthieuScarset

1
请参阅上面的答案。它们都说明了如何向MenuLinkContent添加新字段。
milkovsky


1
因此要明确@milkovsky是。MenuLinkContent不是可字段化的内容实体。
MatthieuScarset
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.