Menu Item Extras

追加のEntityを必要とせず、Drupal CoreのMenu Link Content Entityを使用してメニュー項目に追加フィールドを提供します。

menu_item_extras
39,114 sites
185
drupal.org

インストール

Drupal 11, 10 v3.1.0
composer require 'drupal/menu_item_extras:^3.1'
Drupal 9 v3.0.2
composer require 'drupal/menu_item_extras:^3.0'

概要

Menu Item ExtrasはDrupal Coreのメニューシステムを拡張し、メニュー項目にカスタムフィールドを追加できるようにします。別のEntityに依存するメガメニューソリューションとは異なり、このModuleは組み込みのMenu Link Content Entityを活用し、各メニューをBundleとして扱います。このアプローチにより、サイトビルダーは標準のField UIインターフェースを通じて、任意のフィールドタイプ(テキスト、画像、タクソノミー参照など)をメニュー項目に直接追加できます。

このModuleは項目ごとのView Modeサポートを導入し、個々のメニューリンクに対して異なる表示設定を可能にします。また、メニュー名、メニューレベル、View Modeに基づいた拡張テンプレート候補を提供し、テーマ開発者にメニュー項目のレンダリングを細かく制御する機能を与えます。

主な技術的側面には、メニューがmenu_link_content EntityのBundleになる自動Entity Type変更、表示内でのサブメニュー配置を制御するための「Children」擬似フィールド、アクティブトレイル対応メニューレンダリング用のカスタムCache Contextが含まれます。

Features

  • DrupalのField UIを使用してメニュー項目にカスタムフィールドを追加可能(テキスト、画像、Entity参照など)
  • 個々のメニュー項目に異なる表示設定を可能にする項目ごとのView Mode選択
  • 各メニューがmenu_link_content EntityのBundleとして機能するメニュー固有のバンドル化
  • メニュー名、メニューレベル、View Mode、リージョン配置に基づく拡張テンプレート候補
  • 親メニュー項目の表示内でサブメニュー項目の位置を制御するChildren擬似フィールド
  • アクティブメニュー項目ID用のカスタム引数デフォルトPluginによるViews統合
  • メニュー追加データをクリアするためのDrushコマンドサポート
  • 孤立データを防ぐためのアンインストール検証
  • 最適化されたメニューレンダリングのためのアクティブトレイル対応Cache Context
  • Module依存関係を自動的に追加する設定エクスポート処理

Use Cases

リッチコンテンツを含むメガメニュー

メインナビゲーションメニューに画像、本文テキスト、タクソノミー参照フィールドを追加してメガメニューを作成。View Mode機能を使用して、異なるメニューレベルで異なるコンテンツを表示できます。例えば、トップレベル項目にはアイキャッチ画像を、子項目にはテキスト説明を表示します。

項目ごとのプロモーションバナー

メニュー項目にプロモーションバナー画像フィールドを追加。View Mode設定を使用して、特集として指定された特定のメニュー項目にのみバナーを表示し、他の項目は通常表示にします。

関連コンテンツを含むカテゴリナビゲーション

コンテンツやタクソノミー用語を指すEntity参照フィールドをメニュー項目に追加。別個のメガメニューBlockを作成せずに、ドロップダウンメニュー内に関連製品、記事、カテゴリを直接表示します。

リージョン別メニュースタイリング

リージョンベースのテンプレート候補(menu--extras--main--header.html.twig vs menu--extras--main--footer.html.twig)を使用して、同じメニューをヘッダーリージョンとフッターリージョンで異なる表示にします。

メニュー位置に基づくコンテキストViews

Views引数デフォルトPluginを使用して、現在アクティブなメニュー項目に関連するコンテンツを表示するBlockを作成。ナビゲーションコンテキストに基づいて変化する動的サイドバーやコンテンツエリアを実現します。

Tips

  • 「表示の管理」の'Children'擬似フィールドを使用して、親項目のカスタムフィールドに対するサブメニュー項目の表示位置を制御できます
  • menu_link_content Entity用のカスタムView Modeを作成して、特集メニュー項目と通常のメニュー項目で異なる表示を実現できます
  • テンプレートで{{ item.entity }}経由でメニュー項目Entityにアクセスし、フィールド値に基づいて条件付き表示が可能です: {% if item.entity.field_featured.value == '1' %}
  • テンプレート候補にはメニューレベルが含まれており、第1レベルとより深いナビゲーションで異なるマークアップが可能です: menu-link-content--main--menu-level-0--default.html.twig
  • Moduleは適切なCache Contextを自動的に追加しますが、複雑なカスタム実装では menu_item_extras_link_item_content_active_trails Cache Contextを考慮する必要がある場合があります

Technical Details

Admin Pages 4
メニューの編集 /admin/structure/menu/manage/{menu}

メニュー項目からすべての追加フィールドデータ(view_mode値)を削除する「関連データをクリア」ボタンが追加された標準のメニュー編集フォーム。Moduleのアンインストール前やメニューカスタマイズのリセット時に便利です。

View Modeの管理 /admin/structure/menu/manage/{menu}/view_modes_settings/default

各メニュー項目にView Modeを一括で割り当てるための表形式インターフェースを提供。すべてのメニューリンクをツリー構造で表示し、各項目にView Mode選択ドロップダウンを備え、個別のメニュー項目を編集せずに素早く設定できます。

メニュー追加データクリアの確認 /admin/structure/menu/manage/{menu}/clear

メニュー編集ページで「関連データをクリア」をクリックした際に表示される確認フォーム。指定されたメニュー内のすべての項目の追加データ(view_modeフィールド値)の削除を確認します。

メニュー項目追加データの削除 /admin/modules/uninstall/extra_data/menu_item_extras

Moduleアンインストール時にアクセス可能な管理アクションルート。すべてのメニューからすべての追加データをクリアし、Moduleのクリーンなアンインストールを可能にします。

Hooks 10
hook_entity_type_build

menu_link_content Entityを変更して、メニューをBundleとして使用し、Views Data、フォーム、リンクテンプレート用のカスタムハンドラーを設定します。

hook_entity_base_field_info

項目ごとのView Mode選択用に、menu_link_content Entityに'view_mode'ベースフィールドを追加します。

hook_theme

menu__extras、menu_link_content、menu_levelsテンプレート用のテーマHookを定義します。

hook_preprocess_block

メニューBlockを変更してベースの'menu'テーマを使用し、テンプレート候補用のリージョンデータを渡します。

hook_theme_suggestions_menu_link_content

View Mode、メニュー名、メニューレベル、Entity IDに基づいてMenu Link Content用のテンプレート候補を提供します。

hook_theme_suggestions_menu_levels

メニュー名とレベルに基づいてメニューレベル用のテンプレート候補を提供します。

hook_theme_suggestions_menu

リージョンベースの候補を含む、追加フィールドを持つメニュー用の候補を追加します。

hook_preprocess_menu

追加フィールドを持つメニューのメニューツリーを処理し、各項目にレンダリングされたコンテンツを追加します。

hook_entity_extra_field_info

メニュー項目表示でのサブメニュー位置を制御するための'children'擬似フィールドを作成します。

hook_entity_view_alter

デフォルトのメニューリンクフィールド(title、description、weight、expanded、enabled)をレンダー出力から非表示にします。

Drush Commands 1
drush menu-item-extras-clear-extra-data

特定のメニューまたはすべてのメニューのメニュー関連追加データ(view_modeフィールド値)をクリアします。

Troubleshooting 5
Moduleをアンインストールできない - 追加データが存在するというエラー

任意のメニューの編集ページに移動して「関連データをクリア」をクリックするか、アンインストール検証メッセージで提供されるリンク /admin/modules/uninstall/extra_data/menu_item_extras を使用してください。Drushも使用できます: drush mie:clear_data all

追加フィールドがメニュー項目編集フォームに表示されない

「サイト構築」>「メニュー」>「[メニュー名]」>「フィールドの管理」でフィールドを追加したことを確認してください。また、メニューBundleの「フォーム表示の管理」でフィールドが有効になっていることも確認してください。

フィールド値がメニュー出力に表示されない

メニューBundleの「表示の管理」設定を確認し、フィールドが非表示になっていないことを確認してください。また、{{ content }}または特定のフィールド値を出力するテンプレートを使用していることも確認してください。

テンプレートが適用されない

適切なテンプレート命名を確認してください: メニューレベルにはmenu--extras--[menu-name].html.twig、項目にはmenu-link-content--[menu-name]--[view-mode].html.twig。テンプレート追加後はCacheをクリアしてください。

メニュー間でメニュー項目を移動した後に変更が反映されない

メニュー項目を別のメニューに移動すると、フィールドがBundle固有であるため、カスタムフィールドデータがクリアされます(設計上の仕様)。移動後にフィールドデータを再入力してください。

Security Notes 3
  • ModuleはDrupal Coreの権限システムを使用します - データクリアを含むすべての管理操作には'administer menu'権限が必要です
  • カスタムテンプレートでフィールド値を使用する際は、Twigの自動エスケープまたは明示的な|escapeフィルターを使用して適切にエスケープする必要があります
  • RESTまたはJSON:APIでメニューフィールドを公開する場合、Moduleは標準でRESTサポートを提供しないため、フィールドアクセス設定を確認してください