pagetitle
コアモジュールを使用してページタイトルをレンダリングしています。ただし、特定のコンテンツタイプについては、 ページ コンテンツタイプラベル(たとえば、「ニュース」)であり、ノードラベル(たとえば、「Drupal 8がリリースされました!」)ではないメインタイトル。
それを達成する簡単な方法はありますか?私の最初の推測は、template_preprocess_page_title
だが $variables
には、ノード、ノードタイプなどに関するコンテキストはありません。
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()
を使用して、機械で読み取り可能な名前を取得し、それをチェックできます。
Linusは、前処理機能に対してそれを正しく理解しましたが、私はこれを現在のノードを取得するために個人的に使用します(より短くて簡単に見えるので...)
$node = \Drupal::request()->attributes->get('node')
次に、ノードのタイトルにアクセスするには、次を使用します。
$title = $node->getTitle()
または別のカスタムフィールドにアクセスするには(値を使用):
$node->get('field_MYFIELD')->value
実際には、通常のノード前処理関数でこれらのデータにアクセスする方法ですべてにアクセスします:)
Metatag モジュールを使用してください。これはすでにD8対応であり、必要なものをサポートしています。
小さなモジュールを作ります。 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が必要だとは思わないなど、必要以上のものを持っていますが、誰かにこれに投票する理由を与える必要があります(-;
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>