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 ...


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.


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 :)


2

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


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


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>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.