web-dev-qa-db-ja.com

前処理機能なしで現在のタイトルをパンくずリストに追加するにはどうすればよいですか?

前処理関数を使用せずにタイトルをパンくずリストに入れようとしています。 Drupal 8現在のタイトルをパンくずリストに追加する は、前処理関数を使用してそれを行う方法を示していますが、これは私がやろうとしていることではありません。

出力を次のようにしたい:

enter image description here

以下は、試してみてまだ機能していないものです。

breadcrumb.html.twig

{#
/**
 * @file
 * Theme override for a breadcrumb trail.
 *
 * Available variables:
 * - breadcrumb: Breadcrumb trail items.
 */
#}
{% if breadcrumb %}
    <nav class="breadcrumb" role="navigation" aria-labelledby="system-breadcrumb">
        <h2 id="system-breadcrumb" class="visually-hidden">{{ 'Breadcrumb'|t }}</h2>
        <ol>{{ 'You are here:'|t }}
            {% for item in breadcrumb %}
                <li>
                    {% if item.url %}

                        <a href="{{ item.url }}">{{ item.text }}</a>
                    {% else %}
                        {{ item.text }}
                    {% endif %}
                </li>
                {{ '>'|t }} {{title}}
            {% endfor %}
        </ol>
    </nav>
{% endif %}

そして、これは私が得ているものです:

enter image description here

{{ title }}を使用すると、何らかの理由でタイトルが表示されません。

何が悪いのですか?

ブレッドクラムのタイトルにタイトルが表示されないのはなぜですか?

5
itsdarrylnorris

{{title}}breadcrumb.html.twigの一部ではなかったため、前処理関数を使用する必要がある場合でも、私はこれを私の出力を達成するためにこれをやった:

mytheme.theme

<?php

function mytheme_preprocess_breadcrumb(&$variables){

        if(($node = \Drupal::routeMatch()->getParameter('node')) && $variables['breadcrumb']){
    // Adding the a divider of between home an the title of the page.
            $variables['breadcrumb'][] = array(
                'text' => '>'
            );
    // Adding the title of the page in the breadcrumb
            $variables['breadcrumb'][] = array(
                'text' => $node->getTitle(),
                'url' => $node->URL()
            );

        }
    }

breadcrumb.html.twig

{#
/**
 * @file
 * Theme override for a breadcrumb trail.
 *
 * Available variables:
 * - breadcrumb: Breadcrumb trail items.
 */
#}
{% if breadcrumb %}
    <nav class="breadcrumb" role="navigation" aria-labelledby="system-breadcrumb">
        <h2 id="system-breadcrumb" class="visually-hidden">{{ 'Breadcrumb'|t }}</h2>
        {{ 'You are here:'|t }}
        <div class="breadcrumb">
            {% for item in breadcrumb %}
                <span>
                    {% if item.url %}
                            <a href="{{ item.url }}">{{ item.text }}</a>
                    {% else %}
                        {{ item.text }}
                    {% endif %}
                </span>
            {% endfor %}
        </div>
    </nav>
{% endif %}

私がこの問題を解決する方法の詳細については、次のURLにアクセスしてください- Light Skeleton-Breadcrumb D8 Port

2
itsdarrylnorris

ブレッドクラムが他の場所でも使用されている場合に備えて、ブレッドクラム用の変更フックがあり、テーマを特定しない方法で変更できます。

私はこれをプロジェクトに実装しました:

/**
 * Implements hook_system_breadcrumb_alter().
 */
function yourmodule_system_breadcrumb_alter(array &$breadcrumb, RouteMatchInterface $route_match, array $context) {
  // Append the current page title to the breadcrumb for non-admin routes.
  if ($breadcrumb && !\Drupal::service('router.admin_context')->isAdminRoute()) {

    $title = \Drupal::service('title_resolver')
      ->getTitle($request, $route_match->getRouteObject());
    if (!empty($title)) {
      breadcrumb->addLink(Link::createFromRoute($title, '<none>'));
    }
  }
}

Drupal 8.2.xの編集

私はこのコードに多くのエラーを追加します。これは Drupal API で見られたパンくずリストを変更するための最良のアプローチだと思います。だからここにDrupal 8.2.xのコードがあります

/**
 * Implements hook_system_breadcrumb_alter().
 */
function YOURMODULE_system_breadcrumb_alter(\Drupal\Core\Breadcrumb\Breadcrumb &$breadcrumb, \Drupal\Core\Routing\RouteMatchInterface $route_match, array $context) {
  // Append the current page title to the breadcrumb for non-admin routes.
  if ($breadcrumb && !\Drupal::service('router.admin_context')->isAdminRoute()) {

    $title = \Drupal::service('title_resolver')->getTitle(\Drupal::request(), $route_match->getRouteObject());
    if (!empty($title)) {
      $breadcrumb->addLink(\Drupal\Core\Link::createFromRoute($title, '<none>'));
    }
  }
}
6
Berdir

デフォルトでは、変数{{title}}はbreadcrumb.html.twigで使用できません。 .themeファイルでHOOK_preprocess_breadcrumbを使用する必要があります。

PS:D8では、プリプロセッサ関数からのデータを表示しようとする場合にのみ、これは悪い習慣です。プリプロセッサに余分な変数を追加しようとするのは間違いありません。ここでさらに明確化 https://www.drupal.org/node/1920746

YOUYTHEME.themeファイル

function YOURTHEME_preprocess_breadcrumb(&$variables) {
  $request = \Drupal::request();
  $route_match = \Drupal::routeMatch();
  $page_title = \Drupal::service('title_resolver')->getTitle($request, $route_match->getRouteObject());

  //this variable will avaliable in twig file. 
  $variables['breadcrumb'][] = array(
    'text' => $page_title
  );
}
4
adal

あなたを助けることができる Current Page Crumb と呼ばれる新しいモジュールがあります。

現在のページクラムは、Drupal 8コアシステムブレッドクラムを拡張して、現在のページタイトルをテキストのみのブレッドクラムとして追加します。管理パスは変更されません。モジュールには構成がありません。

そして、著者は ブログ投稿 ソリューションについて話しました。

1

ロジックが前処理(YOURTHEME_preprocess_breadcrumb(&$variables))で発生するため、提案されたソリューションのいくつかはキャッシュに問題がある可能性があります。いくつかのcontribモジュールを使用するか、それらのソリューションを実装することをお勧めします。

Easy breadcrumbs :コアブレッドクラムを、ブレッドクラムのベストプラクティスに従う設定可能なブレッドクラムに置き換えます。

現在のページクラム :Drupal 8コアシステムブレッドクラムを拡張して、現在のページタイトルをテキストのみのブレッドクラムとして追加します。

1
Cristina

コアのブレッドクラムの前処理関数は次のとおりです。

function template_preprocess_breadcrumb(&$variables) {
  $variables['breadcrumb'] = array();
  /** @var \Drupal\Core\Link $link */
  foreach ($variables['links'] as $key => $link) {
    $variables['breadcrumb'][$key] = array('text' => $link->getText(), 'url' => $link->getUrl()->toString());
  }
}

それはパンくずリストのみを提供し、他には何も提供しません。したがって、他の変数を使用する場合は、独自の前処理関数の変数配列にそれらを配置する必要があります。

1
4k4