วิธีแทนที่ชื่อหน้าตามประเภทเนื้อหา


12

ฉันใช้pagetitleโมดูลหลักเพื่อแสดงชื่อหน้า อย่างไรก็ตามสำหรับเนื้อหาบางประเภทที่ฉันต้องการหน้าหัวเรื่องหลักที่จะเป็นเลเบลชนิดเนื้อหา (เช่น "News") และไม่ใช่เลเบลโหนด (เช่น "Drupal 8 release!")

มีวิธีง่ายๆในการบรรลุหรือไม่ การเดาครั้งแรกของฉันคือการใช้template_preprocess_page_titleแต่$variablesไม่มีบริบทใด ๆ เกี่ยวกับโหนดประเภทโหนด ฯลฯ ...


คุณหมายความว่าอย่างไรเมื่อคุณเข้าชมโหนดชื่อหน้าจะแสดงป้ายกำกับประเภทเนื้อหาของโหนดนี้
MrD

เมื่อคุณเยี่ยมชมโหนดชื่อของหน้าเป็นชื่อของโหนด (เช่น "Drupal 8 เปิดตัว!" ฉันต้องการให้มันเป็นชื่อประเภทเนื้อหา (เช่น "ข่าว")
Filipe Miguel Fonseca

คำตอบ:


25

ดังกล่าวโดยอีวาน 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

ไลนัสทำให้ถูกต้องสำหรับฟังก์ชั่น preprocess แต่ส่วนตัวแล้วฉันจะใช้มันเพื่อรับโหนดปัจจุบัน (เพราะมันสั้นกว่าและดูง่ายกว่า ... )

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

จากนั้นเพื่อเข้าถึงชื่อโหนดให้ใช้:

$title = $node->getTitle()

หรือเพื่อเข้าถึงฟิลด์ที่กำหนดเองอื่น (มีค่า):

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

ที่จริงแล้วเข้าถึงทุกอย่างในแบบที่คุณต้องการเข้าถึงข้อมูลเหล่านี้ในฟังก์ชั่น preprocess โหนดปกติ :)


2

ใช้เมตาแท็กโมดูลมันเป็น D8 พร้อมอยู่แล้วและสนับสนุนสิ่งที่คุณต้องการ


แม้ว่าฉันจะไม่ใช่ 100% ก็ตามหากรองรับการแทนที่หัวเรื่องในบล็อคชื่อหน้า ณ จุดนี้ฉันรู้ว่ามันใช้งานได้สำหรับชื่อหน้า

ขอบคุณสำหรับอินพุต Ivan Jaros เท่าที่ฉันสามารถบอกได้ว่าชื่อเพจที่รองรับนั้นเป็นชื่อที่อยู่บนส่วนหัวของ HTML ฉันต้องการแทนที่ชื่อหลัก
Filipe Miguel Fonseca

2
ในกรณีนั้น hook_preprocess_page_title โหลดโหนดจากเส้นทางรับเอนทิตี้ประเภทและรับเลเบลจากที่นั่น

สิ่งนี้ใช้ได้สำหรับฉันสำหรับหน้าโปรไฟล์ผู้ใช้
เควิน

0

ทำโมดูลขนาดเล็ก ต้องการสองไฟล์:

ชื่อไฟล์: 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);
    }
  }
}

ฉันอาจมีมากกว่าที่ฉันต้องการเช่นฉันไม่คิดว่าฉันต้องการค่าเริ่มต้นและ PLACEHOLDER ใน hook_form_alter () แต่ฉันต้องให้เหตุผลแก่คนอื่นในการลงคะแนน (-;


0

ใน THEMENAME_preprocess_html (& $ ตัวแปร) {} มี $ ตัวแปร ['head_title'] ซึ่งเป็นมือที่สูงที่สุด - อินสแตนซ์สำหรับชื่อหน้า (ชื่อโครงสร้าง: $ ตัวแปร ['head_title_array']) นอกจากนี้ยังมีปุ่มอาเรย์อื่น ๆ ที่น่าสนใจเช่น $ 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.