コンテンツタイプによってページタイトルを上書きする方法


12

私が使用しているpagetitleページのタイトルをレンダリングするためにコアモジュールを。ただし、特定のコンテンツタイプについては、ページメインのタイトルは、コンテンツタイプラベル(「ニュース」など)であり、ノードラベル(「Drupal 8リリース!」など)ではありません。

それを達成する簡単な方法はありますか?私の最初の推測は、を使用することtemplate_preprocess_page_titleでした$variablesが、ノード、ノードタイプなどについてのコンテキストはまったくありません...


ノードにアクセスすると、ページタイトルにこのノードのコンテンツタイプラベルが表示されるというのはどういう意味ですか?
MrD 2016年

ノードにアクセスすると、ページのタイトルはノードのタイトルになります(例:「Drupal 8リリース!」。コンテンツタイプのタイトル(例:「ニュース」)にしたい)
Filipe Miguel Fonseca

回答:


25

Ivan Jarosが述べたように使用できますhook_preprocess_page_title

コンテキストを取得するには、最初にルートからノードをロードする必要があります。

function yourtheme_preprocess_page_title(&$variables) {

  // Load the node entity from current route
  if ($node = \Drupal::routeMatch()->getParameter('node')) {

    // Load the label of the bundle
    $bundle_label = \Drupal::entityTypeManager()
      ->getStorage('node_type')
      ->load($node->bundle())
      ->label();

    // Set the page title
    $variables['title'] = $bundle_label;
  }
}

これを特定のコンテンツタイプで使用したいだけの場合は、を使用$node->bundle()して、機械で読み取り可能な名前を取得し、それをチェックできます。


1
これにより、のタイトルが変更されますblock_title。ただし、ページタイトルは上書きされません。ページタイトルをタイトルブロックと同じ値に設定する方法
Malabya Tewari

4

Linusは、前処理機能に対してそれを正しく理解しましたが、私はこれを現在のノードを取得するために個人的に使用します(より短くて簡単に見えるので...)

$node = \Drupal::request()->attributes->get('node')

次に、ノードのタイトルにアクセスするには、次を使用します。

$title = $node->getTitle()

または別のカスタムフィールドにアクセスするには(値を使用):

$node->get('field_MYFIELD')->value

実際には、通常のノード前処理関数でこれらのデータにアクセスする方法ですべてにアクセスします:)


2

メタタグモジュールを使用してください。これはすでにD8対応であり、必要なものをサポートしています。


ページのタイトルブロックでタイトルの上書きをサポートしている場合、100%ではありませんが。この時点では、ページタイトルでのみ機能することを知っています。

Ivan Jarosへの入力に感謝します。サポートされているページタイトルがHTMLヘッドのタイトルであることがわかる限り、メインタイトルを上書きします。
フィリペミゲルフォンセカ2016年

2
その場合、hook_preprocess_page_titleです。ルートからノードをロードし、エンティティタイプを取得して、そこからラベルを取得します。

これは私にとってユーザープロファイルページで機能しました。
ケビン

0

小さなモジュールを作ります。2つのファイルが必要です:

ファイル名:liveeventtitles.info.yml

name: Live Event Titles
description: Programmatically generates titles for event node bundles.
package: Custom
type: module
version: 1.0
core: 8.x
dependencies:
  - node

ファイル:liveeventtitles.module

<?php
/**
 * @file
 * Modify the node create/edit form and automatically generate a node title for event nodes.
 */
define('LIVEEVENTTITLES_PLACEHOLDER', '%LiveEventTitle%');
/**
 * Implements hook_form_alter().
 */
function liveeventtitles_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
  if ($form_id == 'node_event_form' || $form_id == 'node_event_edit_form') {
    $title_widget = &$form['title']['widget'][0];
    $default = (!empty($title_widget['value']['#default_value'])? $title_widget['value']['#default_value'] : LIVEEVENTTITLES_PLACEHOLDER);
    $title_widget['value']['#default_value'] = $default;
    $title_widget['value']['#type'] = 'value';
    $title_widget['value']['#required'] = FALSE;
    $form['title']['#access'] = FALSE;
  }
}
/**
 * Implements hook_node_presave
 */
function liveeventtitles_node_presave(Drupal\node\Entity\Node $node) {
  $type = $node->getType();
  if ($type == 'event') {
    // Load the artist node to get the title
    if ($artist_id = $node->field_artist->getString()) {
      $artist = \Drupal\node\Entity\Node::load($artist_id);
      $artist_name = $artist->title->getString();
    }
    // Load the Venue to get the title
    if ($venue_id = $node->field_venue->getString()) {
      $venue = \Drupal\node\Entity\Node::load($venue_id);
      $venue_name = $venue->title->getString();
    }
    if (!empty($venue_name) && !empty($artist_name)) {
      $node->setTitle($artist_name . ' at ' . $venue_name);
    }
  }
}

おそらく私はデフォルト値とhook_form_alter()内のPLACEHOLDERが必要だとは思わないなど、必要以上のものを持っていますが、誰かにこれに投票する理由を与える必要があります(-;


0

THEMENAME_preprocess_html(&$ variables){}には、最高の手である$ variables ['head_title']があります-ページタイトルのインスタンスです(構造化タイトル:$ variables ['head_title_array'])。$ variables ['page'] ['content']や$ variables ['node_type']のような他の興味深い配列キーもあり、それに基づいてタイトルを処理できます。

最終的な考え:$ variables ['head_title'] = ['title_part1'、 'title_part2']; html.html.twig以来

<title>{{ head_title|safe_join(' | ') }}</title>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.