Como substituir o título da página por tipo de conteúdo

12

Estou usando o pagetitlemódulo principal para renderizar um título de página. No entanto, para certos tipos de conteúdo, quero opáginao título principal deve ser o rótulo do tipo de conteúdo (por exemplo, "Notícias") e não o rótulo do (por exemplo, "Drupal 8 liberado!").

Existe uma maneira simples de conseguir isso? Meu primeiro palpite foi usar o template_preprocess_page_titlemas $variablesnão tem contexto algum sobre nó, tipo de nó, etc.

Filipe Miguel Fonseca
fonte
o que você quer dizer com quando visita um nó, o título da página mostra o rótulo do tipo de conteúdo desse nó?
MrD 25/01
Quando você visita um nó o título da página é o título do nó (por exemplo, "Drupal 8 lançado!" Eu quero que seja o título tipo de conteúdo (por exemplo, "News")..
Filipe Miguel Fonseca

Respostas:

25

Como mencionado por Ivan Jaros, você pode usar hook_preprocess_page_title.

Você só precisa carregar o nó da rota primeiro, para obter algum contexto.

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

Se você quiser apenas usá-lo com certos tipos de conteúdo, poderá $node->bundle()obter o nome legível por máquina e verificar com ele.

Linus
fonte
1
Isso altera o título para o block_title. No entanto, ele não substitui o título da página. Alguma idéia de como obter o conjunto título da página para mesmo valor que o bloco de título
Malabya Tewari
4

Linus acertou na função de pré-processo, mas eu pessoalmente usaria isso para obter o nó atual (já que é mais curto e parece mais fácil ...)

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

Em seguida, para acessar o título do nó, use:

$title = $node->getTitle()

ou para acessar outro campo personalizado (com um valor):

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

Na verdade, acesse tudo como você acessaria esses dados em uma função de pré-processamento de nó regular :)

ZyDucksLover
fonte
2

Use o módulo Metatag , ele já está pronto para o D8 e suporta o que você precisa.

DRUPWAY
fonte
Embora eu não seja 100% se ele suporta o título substituto no bloco de título da página. Neste ponto, só sei que funciona para o título da página.
Obrigado pela contribuição Ivan Jaros, tanto quanto posso dizer que o título da página suportado é o cabeçalho HTML, quero substituir o título principal.
Filipe Miguel Fonseca
2
Nesse caso, hook_preprocess_page_title. Carregue o nó da rota, obtenha o tipo de entidade e obtenha o rótulo a partir daí.
Isso funcionou para mim na página de perfil do usuário.
21418 Kevin
0

Faça um pequeno módulo. São necessários dois arquivos:

Nome do arquivo: 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

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

Provavelmente tenho mais do que preciso, como não acho que precise de um valor padrão e PLACEHOLDER no hook_form_alter (), mas preciso dar a alguém uma razão para votar nisso (-;

Joe Hyde
fonte
0

Em THEMENAME_preprocess_html (& $ variable) {}, existem as $ variables ['head_title'], que é a instância manual mais alta para o título da página (título estruturado: $ variable ['head_title_array']). Também existem outras chaves de matriz interessantes, como $ variable ['page'] ['content'] e $ variable ['node_type'] com base nas quais o título pode ser processado.

Pensamento final: $ variable ['head_title'] = ['title_part1', 'title_part2']; desde que no html.html.twig

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