Cómo anular el título de la página por tipo de contenido


12

Estoy usando el pagetitlemódulo principal para representar el título de una página. Sin embargo, para ciertos tipos de contenido quiero elpáginaEl título principal es la etiqueta de tipo de contenido (por ejemplo, "Noticias") y no la etiqueta de nodo (por ejemplo, "¡Drupal 8 lanzado!").

¿Hay una manera simple de lograrlo? Mi primera suposición fue usar el template_preprocess_page_titlepero $variablesno tiene ningún contexto sobre nodo, tipo de nodo, etc.


¿Qué quiere decir que cuando visita un nodo, el título de la página mostrará la etiqueta de tipo de contenido de este nodo?
MrD

Cuando visita un nodo, el título de la página es el título del nodo (por ejemplo, "¡Drupal 8 lanzado!". Quiero que sea el título del tipo de contenido (por ejemplo, "Noticias").
Filipe Miguel Fonseca

Respuestas:


25

Como lo menciona Ivan Jaros, puedes usarlo hook_preprocess_page_title.

Solo tiene que cargar el nodo de la ruta primero, para obtener algo de 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;
  }
}

Si solo desea usar esto con ciertos tipos de contenido, puede usarlo $node->bundle()para obtener el nombre legible por máquina y verificarlo.


1
Esto cambia el título de la block_title. Sin embargo, no anula el título de la página. Alguna idea de cómo configurar el título de la página con el mismo valor que el bloque de título
Malabya ​​Tewari

4

Linus lo hizo bien para la función de preproceso, pero personalmente lo usaría para obtener el nodo actual (ya que es más corto y parece más fácil ...)

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

Luego, para acceder al título del nodo, use:

$title = $node->getTitle()

o para acceder a otro campo personalizado (con un valor):

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

En realidad, acceda a todo de la forma en que accedería a estos datos en una función de preproceso de nodo regular :)


2

Utilice el módulo Metatag , ya está listo para D8 y admite lo que necesita.


Aunque no estoy al 100% si admite la anulación del título en el bloque de título de la página. En este punto, solo sé que funciona para el título de la página.

Gracias por el aporte Ivan Jaros, por lo que puedo decir, el título de la página admitida es el del encabezado HTML, quiero anular el título principal.
Filipe Miguel Fonseca

2
En ese caso, hook_preprocess_page_title. Cargue el nodo de la ruta, obtenga el tipo de entidad y obtenga la etiqueta desde allí.

Esto funcionó para mí para la página de perfil de usuario.
Kevin

0

Haz un pequeño módulo. Se requieren dos archivos:

Nombre de archivo: 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

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

Probablemente tenga más de lo que necesito, ya que no creo que necesite un valor predeterminado y PLACEHOLDER en hook_form_alter () pero necesito darle a alguien una razón para votar esto (-;


0

En THEMENAME_preprocess_html (& $ variables) {} están las $ variables ['head_title'], que es la instancia de mano más alta para el título de la página (Título estructurado: $ variables ['head_title_array']). También hay otras claves de matriz interesantes como $ variables ['página'] ['contenido'] y $ variables ['node_type'] en función de las cuales se puede procesar el título.

Pensamiento final: $ variables ['head_title'] = ['title_part1', 'title_part2']; ya que en la html.html.twig

<title>{{ head_title|safe_join(' | ') }}</title>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.