Drupal 8では、ノードのURLやルートやパラメータなどのその他の情報を考慮して、ノードのメニューリンクタイトルをどのように決定できますか?
これは、コアパスベースのブレッドクラム( PathBasedBreadcrumbBuilder.php
)を変更して、ノードのTitleフィールドではなく、ノードのメニューリンクタイトルをブレッドクラムリンクテキストとして使用するためです。デフォルトのD8ブレッドクラムは、冗長なタイトルの深いメニューでは非常に長いため、これは一般的な要件でなければなりません。たとえば、次のものが必要です。
ホーム>デザイン> Drupal
d8のデフォルトの代わりに:
ホーム>設計サービスの概要> Drupal 8:すべてに最適なCMS
「Drupal」サブメニューのすべてのノード。
デフォルトのブレッドクラムサービスメソッドPathBasedBreadcrumbBuilder::build
は、注入された一連のサービスを使用してノードURLの各祖先パス名へのルートを検索およびチェックし、最終的にTitleResolver::getTitle
がこれらのルートのタイトルを取得します。代わりに、対応するMenuLinkContent
を検索する方法が必要なので、MenuLinkContent::getTitle
を介してメニュータイトルを取得できます。
私はDrupal Module Development forum( change Breadcrumbs from Node Title to Menu Link Title )の問題の概要を説明しようとしましたが、 URL /ルートのスペースとメニューリンクコンテンツのスペースの間のギャップを埋める方法を尋ねると、応答がありませんでした。たぶん、これは、メニューをたどらないとそれができないことを意味します。そのアプローチから始めます。
RouteMatch
(たとえば、ブレッドクラムビルダーに$route_match
引数を渡す)がある場合、MenuLinkManager
サービス(@plugin.manager.menu.link
)を使用できます。モジュールに挿入されたものは、次のように使用できます(たとえば、main
メニューの場合):
$route_name = $route_match->getRouteName();
$route_parameters = $route_match->getRawParameters()->all();
$route_links = $this->menuLinkManager->
loadLinksByRoute($route_name, $route_parameters, 'main');
$route_link = reset($route_links);
$menu_title = $route_link->getTitle();
$menu_url = $route_link->getUrlObject();
パンくずリストの実装に関して:そのリンクとそのすべての祖先は、パンくずリストに表示されるのとは逆の順序でプラグインIDとしてMenuLinkManager::getParentIds
からも利用できます。
$menu_plugin_id = $route_link->getPluginId();
$menu_parents = $this->menuLinkManager->getParentIds($menu_plugin_id);
サンドボックスモジュール「wb_breadcrumbs」は私にトリックをもたらしました: https://www.drupal.org/sandbox/oles89/2367919