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


11

通常のメニューのサブセットであるメインメニューを作成する必要があります。設計チームは、ユーザーがメインメニューに最も重要なリンクのみを持ち、すべてを持たないほうがよいと考えています。一部のリンクはトップレベルのメニューであり、一部はサブメニューです。このため、ドロップダウンとしてメニューリンクアイテムフォームにフィールドを追加できることを望んでいました。リンクを作成するとき、ユーザーはこのドロップダウンを使用して "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
    );
  }
}

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

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


ありそうにありませんが、カスタムメニューリンクアイテムはコンテンツエンティティです(api.drupal.org/api/drupal/…)。つまり、フィールド(多分api.drupal.org/api/drupal/…)を追加するためにフックを使用してから、更新関数を実行してスキーマを更新する必要があります。
Eyal

回答:


14

メニュー項目の補足モジュールを確認してください


2
これは間違いなく進むべき道であり、このモジュールのv2.0以降では、メニューリンクが完全にフィールド可能なエンティティに変わります。コロッサルメニューよりも優れたソリューションです。コアメニューシステムを置き換えるのではなく、強化するためです。
Hudri

1
+1は、たとえばメニューバーに今日の日付を含める
のに最適

1
すべての記事があります備えていますlembergsolutions.com/blog/...は
Mykhailo Gurei

11

次のコードを使用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;
}

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

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


5
フォーム変更を介してフィールドを追加する必要はありません。次のBaseFieldDefinition->setDisplayOptions()メソッドを使用するだけです...->setDisplayOptions('form', [ ... ])
milkovsky 2017年

1
画像フィールドを作成するにはどうすればよいですか?このフィールドタイプの例が見つからないため、必要です。これを使用すると画像アップロードフィールドが表示されますが、メニューアイテムを保存しようとすると、Drupal \ Core \ Entity \ EntityStorageException:SQLSTATE [42S22]:Column not found:1054 Unknown column 'field_menu_image__target_id'また、ページを更新して追加ログに表示されるメニュー項目のフォーム:通知:未定義のインデックス:field_menu_image__height通知:未定義のインデックス:field_menu_image__widthなど...画像フィールドタイプの例はありますか?ありがとう
blastoise 2017年

5
私はこの問題を解決しました。/update.phpが機能しないため、列がクレートされることはありません。私はdbrushを使用してdbを更新しました:drush updatedb --entity-updates
blastoise 2017年

1
フィールドを追加するには、hook_form_menu_link_content_menu_link_content_form_alter()に何を入れますか?
Matt

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. キャッシュを再構築します。

私はこのアプローチを試みました。最初は問題ないように見えますが、新しいフィールドを作成しようとすると、次のエラーが発生します。私は今、これをプログラムで達成しようとしていますが、これもうまくいくとよいでしょう。
ブラストワーズ2017年


0

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

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

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

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

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


-2

残念ながら、Drupal 8コア開発者はメニューリンクをフィールド化できませんでした。したがって、現時点ではメニューリンクにフィールドを追加することはできません。

サイトビルダーの「回避策」は、カスタムフィールドを持つことができるカスタム語彙を作成することです。


4
違う。MenuLinkContentはフィールド化可能なコンテンツエンティティです。
milkovsky 2017年

1
MenuLinkContentに新しいフィールドを追加するにはどうしますか?
MatthieuScarset 2017年

1
上記の回答を参照してください。どちらも、MenuLinkContentに新しいフィールドを追加する方法を説明しています。
milkovsky 2017年

2
メニュー項目の追加
Mykhailo

1
明確にするために@milkovsky Trueです。MenuLinkContentはフィールド化可能なコンテンツエンティティではありません。
MatthieuScarset
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.