web-dev-qa-db-ja.com

ブレッドクラムのノードタイトルを置き換えるために、URLエイリアスを指定してメニューリンクタイトルを検索する

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 /ルートのスペースとメニューリンクコンテンツのスペースの間のギャップを埋める方法を尋ねると、応答がありませんでした。たぶん、これは、メニューをたどらないとそれができないことを意味します。そのアプローチから始めます。

2
rphair

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);
0
rphair

サンドボックスモジュール「wb_breadcrumbs」は私にトリックをもたらしました: https://www.drupal.org/sandbox/oles89/2367919

0
R K