콘텐츠 유형별로 페이지 제목을 재정의하는 방법


12

내가 사용하고 pagetitle페이지 제목을 렌더링하는 핵심 모듈을. 그러나 특정 콘텐츠 유형의 경우페이지기본 제목은 컨텐츠 레이블 (예 : "뉴스")이며 노드 레이블이 아닙니다 (예 : "Drupal 8 릴리스!").

그것을 달성하는 간단한 방법이 있습니까? 내 첫 번째 추측은 노드 를 사용하는 template_preprocess_page_title것이었지만 $variables노드, 노드 유형 등에 대한 컨텍스트는 없습니다.


노드를 방문 할 때 페이지 제목에이 노드의 컨텐츠 유형 레이블이 표시된다는 것은 무엇을 의미합니까?
MrD

노드를 방문 할 때 페이지의 제목은 노드의 제목입니다 (예 : "Drupal 8 release!") 컨텐츠 유형 제목 (예 : "뉴스")이되고 싶습니다
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 %는 아니지만. 이 시점에서 나는 그것이 페이지 제목에서만 작동한다는 것을 알고 있습니다.

지원되는 페이지 제목이 HTML 헤드에있는 것임을 알 수있는 한 Ivan Jaros 입력에 감사드립니다. 기본 제목을 재정의하고 싶습니다.
Filipe Miguel Fonseca

2
이 경우 hook_preprocess_page_title입니다. 경로에서 노드를로드하고 엔티티 유형을 가져오고 거기에서 레이블을 가져옵니다.

이것은 사용자 프로필 페이지에서 나를 위해 일했습니다.
Kevin

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

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.