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?
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:
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()
enew FormattableMarkup
restituiscono 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';
}
}
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;
}
}
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);
}
Quella funzione è stata rimossa da Drupal 8.
Modifica record:
drupal_set_title () e drupal_get_title () sono stati rimossi .
Ora puoi impostare il titolo quando definisci i percorsi in modulename.routing.yml
. Esempio di come potrebbe essere fatto, è mostrato il link al record di modifica sopra.
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();
}
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')
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.
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.
title_block
su una pagina particolare e aggiungi un nuovo blocco personalizzato con qualche markup per il titolo. Ora posiziona questo blocco subito dopo la title_block
sezione del blocco in drupal.Usando la hook_preprocess_block()
funzione nel tuo custom_theme.theme
file.
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.
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);"
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.
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;
}
}
}
}