Come sovrascrivere il titolo della pagina per tipo di contenuto


12

Sto usando il pagetitlemodulo principale per rendere il titolo di una pagina. Tuttavia, per alcuni tipi di contenuto voglio ilpaginail titolo principale deve essere l' etichetta del tipo di contenuto (ad es. "Notizie") e non l' etichetta del nodo (ad es. "Drupal 8 rilasciato!").

C'è un modo semplice per raggiungerlo? La mia prima ipotesi è stata quella di utilizzare il template_preprocess_page_titlema $variablesnon ha alcun contesto sul nodo, sul tipo di nodo, ecc ...


cosa vuoi dire che quando visiti un nodo, il titolo della pagina mostrerà l'etichetta del tipo di contenuto di questo nodo?
MrD,

Quando visiti un nodo, il titolo della pagina è il titolo del nodo (ad es. "Drupal 8 rilasciato!". Voglio che sia il titolo del tipo di contenuto (ad es. "Notizie").
Filipe Miguel Fonseca,

Risposte:


25

Come menzionato da Ivan Jaros È possibile utilizzare hook_preprocess_page_title.

Devi solo caricare il nodo dalla route prima, per ottenere un contesto.

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 si desidera utilizzarlo solo con determinati tipi di contenuto, è possibile utilizzare $node->bundle()per ottenere il nome leggibile dalla macchina e verificarlo.


1
Questo cambia il titolo per il block_title. Tuttavia, non sostituisce il titolo della pagina. Qualche idea su come impostare il titolo della pagina sullo stesso valore del
cartiglio

4

Linus ha capito bene per la funzione di preelaborazione, ma personalmente lo userei per ottenere il nodo corrente (poiché è più corto e sembra più facile ...)

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

Quindi per accedere al titolo del nodo, utilizzare:

$title = $node->getTitle()

o per accedere a un altro campo personalizzato (con un valore):

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

In realtà, accedi a tutto nel modo in cui accedi a questi dati in una normale funzione di preelaborazione del nodo :)


2

Usa il modulo Metatag che è già pronto per D8 e supporta ciò di cui hai bisogno.


Anche se non sono al 100% se supporta il titolo prioritario nel cartiglio della pagina. A questo punto so solo che funziona per il titolo della pagina.

Grazie per l'input Ivan Jaros, per quanto ne so il titolo della pagina supportata è quello sulla testa HTML, voglio sovrascrivere il titolo principale.
Filipe Miguel Fonseca,

2
In tal caso hook_preprocess_page_title. Carica il nodo dalla rotta, ottieni il tipo di entità e ottieni l'etichetta da lì.

Questo ha funzionato per me per la pagina del profilo utente.
Kevin,

0

Crea un piccolo modulo. Sono richiesti due file:

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

Probabilmente ho più di quello di cui ho bisogno, ad esempio non credo di aver bisogno di un valore predefinito e PLACEHOLDER in hook_form_alter (), ma devo dare a qualcuno un motivo per votare questo verso il basso (-;


0

In THEMENAME_preprocess_html (& $ variabili) {} c'è la variabile $ [[head_title '] che è la mano più alta - istanza per il titolo della pagina (titolo strutturato: $ variabili [' head_title_array ']). Esistono anche altre chiavi di array interessanti come $ variabili ['pagina'] ['contenuto'] e $ variabili ['tipo_nodo'] in base alle quali è possibile elaborare il titolo.

Pensiero finale: $ variabili ['head_title'] = ['title_part1', 'title_part2']; poiché in html.html.twig

<title>{{ head_title|safe_join(' | ') }}</title>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.