legacy-knowledge-base
公開されました Jul. 2, 2025

テーマでカスタムナビゲーションメニューにアクセスする方法

written-by

Sarah Marley

How To articles are not official guidelines or officially supported documentation. They are community-contributed content and may not always reflect the latest updates to Liferay DXP. We welcome your feedback to improve How To articles!

While we make every effort to ensure this Knowledge Base is accurate, it may not always reflect the most recent updates or official guidelines.We appreciate your understanding and encourage you to reach out with any feedback or concerns.

legacy-article

learn-legacy-article-disclaimer-text

問題

  • DXP 7.0+では、UIからナビゲーションメニューを作成する機能(プロダクションメニュー)があります。 しかし、ナビゲーションメニューを1つ作成した後、テーマ内でメニュー項目を参照しようとしています。 デフォルトのメインナビはテーマでアクセスできる(init.ftlのnavItemsとして)ことは知っていますが、新しく作成したナビゲーションメニューからメニューアイテムを取得するために使用できるサービスコールはないでしょうか? ( つまり、レイアウトサービス = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService")
    他のオブジェクト(ユーザ、記事など)と同様に参照する方法があるはずだと思っています。

環境

  • Liferay DXP 7.0+

解決策

  • 一番必要なのは、ADTではなくテーマ内で参照する方法、つまり、テーマ内で新しいメニューオブジェクトを取得する必要があります。 それを入手するために電話するローカルサービスはありますか?
    サイトナビゲーションメニューにアクセスするために使用できるローカルサービスを指しているのであれば、以下のものが必要です:
    データベースの正確な値がわかっている場合、これらのサービスを次のように呼び出すことができます:
    <#assign ddmTemplateLocalService = serviceLocator.findService("com.liferay.dynamic.data.mapping.service.DDMTemplateLocalService")>
    <#assign template = ddmTemplateLocalService.fetchDDMTemplate(...)>
    <#assign siteNavigationMenuLocalService = serviceLocator.findService("com.liferay.site.navigation.service.SiteNavigationMenuLocalService")>
    <#assign navigationMenu = siteNavigationMenuLocalService.fetchSiteNavigationMenu(...)>
    しかし、SiteNavigationMenuをNavItemオブジェクトのリストに変換するAPIの多くは公開されていないため、APIを利用してもテーマからすべてを行うことはできません。
    テーマから全てを行うのではなく、開発者はNavigation Menu Template用のADT(Application Display Template)を作成することが期待されます。 ADTの内部では、entriesオブジェクトはNavItemオブジェクトのリストを含み、過去のLiferayのリリースでテーマで行ったのと同じ方法でそのリストを操作することができます。
    ADTを作成したら、テーマの中から liferay-site-navigation:navigation-menu タグライブラリを使用して、ADTの中のコードを実行することができます。 例として、次のようなものがあります(ADTやナビゲーションメニューに直接関係しないフィールドの詳細については、タグライブラリのドキュメントを参照してください):
    <@liferay_site_navigation["navigation-menu"]
    ddmTemplateGroupId=template.groupId
    ddmTemplateKey=template.templateKey
    displayDepth=1
    expandedLevels="auto"
    rootItemType="absolute"
    rootItemLevel=0
    siteNavigationMenuId=navigationMenu.siteNavigationMenuId />
  • Westeros Bank Themeも、テーマ内のナビゲーションメニューを変更した例です。 これは、ポートレットを埋め込むためのマクロを使用しています: https://github.com/liferay/liferay-portal/blob/7.2.x/modules/apps/frontend-theme-westeros-bank/frontend-theme-westeros-bank/src/templates/navigation.ftl
  • Liferay DXP FreeMarker Macros (Reference Examples)に記載されている例もご参照ください。
did-this-article-resolve-your-issue

legacy-knowledge-base