Come imposto il titolo della pagina?


29

So che potrei cambiare il titolo della pagina con drupal_set_title(t('Amy page title')), ma quando lo provo in Drupal 8 ottengo l' errore Non c'è tale funzione .

Come posso cambiare il titolo della pagina in Drupal 8?

Risposte:


30

Come puoi vedere qui, questa funzione è obsoleta in Drupal 8.

I titoli sui percorsi ora possono essere impostati in vari modi, a seconda del caso d'uso. In precedenza drupal_set_title()veniva chiamato in qualunque posto. Esistono i seguenti casi d'uso:

Titolo statico

Per i titoli statici imposta un '_title' sulla definizione di routing:

block.admin_add:
  path: '/admin/structure/block/add/{plugin_id}/{theme}'
  defaults:
    _controller: '\Drupal\block\Controller\BlockAddController::blockAddConfigureForm'
    _title: 'Configure block'
  requirements:
    _permission: 'administer blocks'

Titolo dinamico

Se si scrive un controller e è necessario un titolo dinamico, ad esempio in base alla configurazione del sito, utilizzare _title_callback nelle impostazioni predefinite del percorso.

mymodule.test:
  path: '/mymodule/test'
  defaults:
    _controller: '\Drupal\mymodule\Controller\Test::getContent'
    _title_callback: '\Drupal\mymodule\Controller\Test::getTitle'

<?php
class Test {

  /**
   * Returns a page title.
   */
  public function getTitle() {
    return  'Foo: ' . \Drupal::config()->get('system.site')->get('name');
  }

  /**
   * Returns a page render array.
   */
  public function getContent() {
    $build = array();
    $build['#markup'] = 'Hello Drupal';
    return $build;
  }
}
?>

Sostituzione del titolo finale

Se si scrive un controller e è necessario sovrascrivere il titolo dalla route, è possibile restituire #title nell'array di rendering. Questo dovrebbe generalmente essere evitato, dal momento che il titolo della pagina quando viene reso completamente potrebbe essere diverso dal titolo in altri contesti (come nel pangrattato).

<?php
class Test {

  /**
   * Renders a page with a title.
   *
   * @return array
   *   A render array as expected by drupal_render()
   */
  public function getContentWithTitle() {
    $build = array();
    $build['#markup'] = 'Hello Drupal';
    $build['#title'] = 'Foo: ' . Drupal::config()->get('system.site')->get('name');

    return $build;
  }

}
?>

Flag di output di drupal_set_title()

La convalida dell'output in Drupal 8 è opposta a Drupal 7. Dobbiamo specificare esplicitamente PASS_THROUGH e CHECK_PLAIN è di default in Drupal 7, mentre in Drupal 8 la situazione è diversa. L'uscita viene salvata automaticamente a meno che non sia contrassegnata come sicura. Entrambi t()e new FormattableMarkuprestituiscono oggetti che non verranno salvati automaticamente.

$form['#title'] = $this->t('Add new shortcut');
$form['#title'] = $this->t("'%name' block", array('%name' => $info[$block->delta]['info']));

Drupal 8.5+

$request = \Drupal::request();
if ($route = $request->attributes->get(\Symfony\Cmf\Component\Routing\RouteObjectInterface::ROUTE_OBJECT)) {
  $route->setDefault('_title', 'New Title');
}

e puoi anche usarlo hook_preprocess_HOOK()per sovrascriverlo

/**
 * Implements hook_preprocess_HOOK().
 */
function MYMODULE_preprocess_page_title(&$variables) {
   // WRITE YOUR LOGIC HERE, 
  if ($YOUR_LOGICS === TRUE) {

    $variables['title'] = 'New Title';
  }
}

Perché devi aggiungere system.site-> name? Viene aggiunto come parte del titolo che viene inserito in HTML se si fornisce una stringa del titolo senza quella.
anoopjohn

5

Modifica il tag del titolo nell'intestazione del documento HTML.

function mymodule_preprocess_html(&$variables) {

  $variables['head_title']['title'] = $something;
}

Cambia il titolo che appare nel contenuto della pagina.

function mymodule_preprocess_block(&$variables) {

  if ('page_title_block' == $variables['plugin_id']) {
    $variables['content']['#title'] = $something;
  }
}

4

drupal_set_title () in Drupal 8

$request = \Drupal::request();
if ($route = $request->attributes->get(\Symfony\Cmf\Component\Routing\RouteObjectInterface::ROUTE_OBJECT)) {
  $route->setDefault('_title', 'New Title');
}

drupal_get_title () in Drupal 8

$request = \Drupal::request();
if ($route = $request->attributes->get(\Symfony\Cmf\Component\Routing\RouteObjectInterface::ROUTE_OBJECT)) {
  $title = \Drupal::service('title_resolver')->getTitle($request, $route);
}

OTTIENI il titolo funziona bene forse ovunque. Mi chiedo dove impostare il titolo, perché nella pagina di preelaborazione non sembra funzionare.
leymannx,


3

Ho scoperto in D8 che se si desidera modificare il titolo per una vista entità, è possibile utilizzare hook_ENTITY_TYPE_view_alter (). Ad esempio, ecco come è possibile modificare la vista di un'entità utente con un campo sull'utente "field_display_name", anziché l'ID utente come titolo:

/**
* Implements hook_ENTITY_TYPE_view_alter().
*/
function mymodule_user_view_alter(array &$build, Drupal\Core\Entity\EntityInterface $entity, \Drupal\Core\Entity\Display\EntityViewDisplayInterface $display) {
  $build['#title'] = $entity->get('field_display_name')->getString();
}

Approccio buono e pulito. Funziona bene in D8 /
Vishal Kumar Sahu

2

Ho trovato un altro modo, che potrebbe essere più semplice se non si dispone di un controller e si desidera modificare il titolo in tutto il sito Web. Puoi usarlo per modificare il titolo in base al nodo corrente.

Innanzitutto, rimuovi il tag nel tuo html.html.twig Quindi, hook hook_page_attachments_alter

function mytemplate_page_attachments_alter(array &$page) {
    $page['#attached']['html_head'][] = [
        [
          '#tag' => 'title',
          '#value' => "My title"
        ],
        'title'
    ];
}

È possibile ottenere il nodo corrente del termine tassonomia con

$node = \Drupal::routeMatch()->getParameter('node');
$term = \Drupal::routeMatch()->getParameter('taxonomy_term')

2

Dai un'occhiata a Automatic Entity Label , un modulo contributivo molto ben realizzato per l'impostazione dei titoli dei nodi e simili.

(Si noti che "titolo della pagina" è un modo più colloquiale di dire "etichetta di entità", dove "pagina" è un'entità di contenuto e "etichetta" comprende il titolo e l'equivalente per altre entità, ad esempio soggetti di commento, nomi di termini di tassonomia).

Mentre op sembra chiedere una guida per la scrittura di codice personalizzato, dai dettagli disponibili non è chiaro che il codice personalizzato sia la migliore raccomandazione. Per i lettori senza un motivo molto specifico per la duplicazione di una funzione disponibile dal codice fornito, la community di Drupal consiglia vivamente (e i proprietari dei siti traggono grande vantaggio) dall'adozione di un modulo esistente.


2

drupal_set_title()ed drupal_get_title()entrambi vengono rimossi da drupal 8 ma la parte migliore è che esiste un blocco separato per page_title. L'utente può nascondere o aggiungere questo blocco su qualsiasi pagina / regione.

Ci sono 2 soluzioni per questo.

  1. Disabilita title_blocksu una pagina particolare e aggiungi un nuovo blocco personalizzato con qualche markup per il titolo. Ora posiziona questo blocco subito dopo la title_blocksezione del blocco in drupal.
  2. Usando la hook_preprocess_block()funzione nel tuo custom_theme.themefile.
    Ecco l'esempio di codice:

    function custom_themename_preprocess_block(&$variables) {
      if ('page_title_block' == $variables['plugin_id']) {
        $request = \Drupal::request();
        $path = $request->getRequestUri(); // get current path
        if(strpos($path, 'user')) { //check current path is user profile page
          $variables['content']['#title'] = 'My Profile';
        }
      }
    }

    Nel mio caso ho usato sopra il 2o metodo, che funzionerà solo per la pagina del profilo utente.


1

Ho lottato con questo e ho provato tutte le soluzioni sopra. La soluzione che alla fine ha funzionato è stata:

function mymodule_preprocess_html(&$variables) {
  $variables['head_title']['title'] = $something;
}

ma solo dopo aver aggiornato il peso del mio modulo personalizzato:

drush php:eval "module_set_weight('mymodule', 10);"

1

Ottenere il titolo della pagina funziona bene come scritto nella risposta di @ rpayanm. Ma impostarlo si è rivelato piuttosto complicato. Alla fine ho scoperto che hook_preprocess_HOOK()poteva semplicemente essere usato per preelaborare il titolo della pagina abbastanza facilmente.

/**
 * Implements hook_preprocess_HOOK().
 */
function MYMODULE_preprocess_page_title(&$variables) {

  if ($MYLOGIC === TRUE) {

    $variables['title'] = 'New Title';
  }
}

E come già menzionato in altre risposte qui, è possibile utilizzare anche hook_preprocess_html()per impostare di conseguenza il tag del titolo HTML head.


0

ho modificato il blocco page_title per utente / uid con un nome di campo account personalizzato diverso come questo:

function hook_preprocess_block(&$variables) {  
  $path = \Drupal::request()->getpathInfo();
  $arg = explode('/', $path);
  if (isset($arg[2]) && $arg[2] == 'user' && isset($arg[3])) {
    if (isset($variables['elements']['content']['#type']) && $variables['elements']['content']['#type'] == 'page_title') {
      $account = \Drupal\user\Entity\User::load($arg[3]);
      if(isset($account) && isset($account->field_mycustomfield->value)){
        $variables['content']['#title']['#markup']=$account->field_mycustomfield->value;
      }
    }
  }
}
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.