Cara mengganti judul halaman berdasarkan jenis konten

12

Saya menggunakan pagetitlemodul inti untuk membuat judul halaman. Namun, untuk jenis konten tertentu saya inginhalamanjudul utama menjadi label tipe konten (mis. "Berita") dan bukan label simpul (mis. "Drupal 8 dirilis!").

Apakah ada cara sederhana untuk mencapainya? Dugaan pertama saya adalah menggunakan template_preprocess_page_titletetapi $variablestidak memiliki konteks apa pun tentang simpul, jenis simpul, dll ...

Filipe Miguel Fonseca
sumber
apa maksud Anda ketika Anda mengunjungi sebuah node, judul halaman akan menampilkan label tipe konten dari node ini?
MrD
Ketika Anda mengunjungi sebuah simpul, judul halaman adalah judul dari simpul tersebut (mis. "Drupal 8 dirilis!". Saya ingin itu menjadi judul jenis konten (mis. "Berita").
Filipe Miguel Fonseca

Jawaban:

25

Seperti yang disebutkan oleh Ivan Jaros, Anda bisa menggunakan hook_preprocess_page_title.

Anda hanya perlu memuat node dari rute terlebih dahulu, untuk mendapatkan beberapa konteks.

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;
  }
}

Jika Anda hanya ingin menggunakan ini dengan jenis konten tertentu, Anda dapat menggunakan $node->bundle()untuk mendapatkan nama yang dapat dibaca mesin dan memeriksanya.

Linus
sumber
1
Ini mengubah judul untuk block_title. Namun itu tidak menggantikan judul Halaman. Tahu cara mendapatkan judul halaman disetel ke nilai yang sama dengan blok judul
Malabya ​​Tewari
4

Linus sudah benar untuk fungsi preprocess, tapi saya pribadi menggunakan ini untuk mendapatkan node saat ini (karena lebih pendek dan tampak lebih mudah ...)

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

Kemudian untuk mengakses judul node, gunakan:

$title = $node->getTitle()

atau untuk mengakses bidang khusus lain (dengan nilai):

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

Sebenarnya, akses semua cara Anda akan mengakses data ini dalam fungsi preprocess simpul biasa :)

ZyDucksLover
sumber
2

Gunakan modul Metatag yang sudah siap D8 dan mendukung apa yang Anda butuhkan.

DRUPWAY
sumber
Meskipun saya tidak 100% jika mendukung judul utama di blok judul halaman. Pada titik ini saya hanya tahu ini berfungsi untuk judul halaman.
Terima kasih atas masukan Ivan Jaros, sejauh yang saya tahu judul halaman yang didukung adalah yang ada di kepala HTML, saya ingin mengganti judul utama.
Filipe Miguel Fonseca
2
Dalam hal ini hook_preprocess_page_title. Muat simpul dari rute, dapatkan entitastype dan dapatkan label dari sana.
Ini berfungsi untuk saya untuk halaman profil pengguna.
Kevin
0

Buat modul kecil. Diperlukan dua file:

Nama file: 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

File: 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);
    }
  }
}

Saya mungkin memiliki lebih dari yang saya butuhkan, seperti saya tidak berpikir saya perlu nilai default dan PLACEHOLDER di hook_form_alter () tapi saya perlu memberi seseorang alasan untuk memilih ini (-;

Joe Hyde
sumber
0

Dalam THEMENAME_preprocess_html (& $ variabel) {} ada $ variabel ['head_title'] yang merupakan contoh tangan tertinggi untuk judul halaman (Judul terstruktur: $ variabel ['head_title_array']). Ada juga kunci array lain yang menarik seperti $ variabel ['halaman'] ['konten'] dan $ variabel ['node_type'] berdasarkan di mana judul dapat diproses.

Pikiran terakhir: $ variabel ['head_title'] = ['title_part1', 'title_part2']; sejak di html.html.twig

<title>{{ head_title|safe_join(' | ') }}</title>
Francis
sumber