web-dev-qa-db-ja.com

メニュー項目にフィールドを追加する方法

通常のメニューのサブセットであるメインメニューを作成する必要があります。設計チームは、ユーザーがメインメニューに最も重要なリンクのみを持ち、すべてを持たないほうがよいと考えています。一部のリンクはトップレベルのメニューであり、一部はサブメニューです。このため、ドロップダウンとしてメニューリンクアイテムフォームにフィールドを追加できることを望んでいました。リンクを作成するとき、ユーザーはこのドロップダウンを使用して "promoteToMainMenuAsBigLink"または "promoteToMainMenuAsSmallLink"を作成するか、何も指定しないでメインメニューに項目を表示しないようにすることができます。

私はこれと同様のソリューションを探しています Drupal 7ソリューション がDrupal 8。

「expanded」の横のテーブル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
    );
  }
}

フィールドは確かにリンクフォームに表示されますが、記録されることはありません。

誰かがこれを手伝ってくれる?

11
Guillaume Bois

Menu Item Extras モジュールを確認してください。

14
Mykhailo Gurei

hook_entity_base_field_infoを使用して、次のコードでmenu_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;
}

BaseFieldDefinitionの詳細については、 https://www.drupal.org/docs/8/api/entity-api/defining-and-using-content-entity-field-definitions を参照してください。

その後、フォームにフィールドを追加するためにhook_form_menu_link_content_menu_link_content_form_alter()が必要になります。

11
Decipher

残念ながら、実際にはDrupal 8には、@ MatthieuScarsetが言ったように、メニューリンクのフィールド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. キャッシュを再構築します。
3
milkovsky

Colossal Men を使用して、コアメニューモジュールの代わりにフィールドを追加できます。

2
David Barratt

「メニュー項目の追加」は、@ Mykhailo Gureiが提案したように、これを達成する1つの方法です。

しかし、私の場合は、フィールドを追加し、Megaメニューモジュールを使用する必要がありました。 「私たちはメガメニュー」を使っていましたが、「メニュー項目の追加」は機能しません。単にメニューがフロントエンドに表示されません(一部のテンプレートは問題を上書きします)。

したがって、「We mega menu」で機能する他のオプションは「Menu item content fields」です。

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

同じ機能があり、Weメガメニューモジュールと競合しません。

0
MilanG