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

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

投稿者

Sarah Marley

knowledge-article-header-disclaimer-how-to

knowledge-article-header-disclaimer

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