Je sais que je pourrais changer le titre de la page avec drupal_set_title(t('Amy page title'))
, mais quand je l'essaye dans Drupal 8 j'obtiens Il n'y a pas une telle erreur de fonction .
Comment puis-je changer le titre de la page dans Drupal 8?
Je sais que je pourrais changer le titre de la page avec drupal_set_title(t('Amy page title'))
, mais quand je l'essaye dans Drupal 8 j'obtiens Il n'y a pas une telle erreur de fonction .
Comment puis-je changer le titre de la page dans Drupal 8?
Réponses:
Comme vous pouvez le voir ici, cette fonction est obsolète dans Drupal 8.
Les titres sur les itinéraires peuvent désormais être définis de différentes manières, selon votre cas d'utilisation. Auparavant, juste
drupal_set_title()
était appelé dans n'importe quel endroit. Les cas d'utilisation suivants existent:Titre statique
Pour les titres statiques, vous définissez un '_title' sur la définition de routage:
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'
Titre dynamique
Si vous écrivez un contrôleur et que vous avez besoin d'un titre dynamique, par exemple en fonction de la configuration du site, utilisez _title_callback dans les valeurs par défaut de l'itinéraire.
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; } } ?>
Remplacement du titre final
Si vous écrivez un contrôleur et que vous devez remplacer le titre de la route, vous pouvez renvoyer #title dans le tableau de rendu. Cela doit généralement être évité, car le titre de la page, une fois rendu, peut être différent du titre dans d'autres contextes (comme dans le fil d'Ariane).
<?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; } } ?>
Drapeau de sortie de
drupal_set_title()
La validation de sortie dans Drupal 8 est opposée à Drupal 7. Nous devons spécifier explicitement PASS_THROUGH et CHECK_PLAIN est par défaut dans Drupal 7, alors que dans Drupal 8 la situation est différente. La sortie est échappée automatiquement sauf si elle est marquée comme sûre. Les deux
t()
etnew FormattableMarkup
retournent des objets qui ne seront pas échappés automatiquement.$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');
}
et vous pouvez également l'utiliser hook_preprocess_HOOK()
pour le remplacer
/**
* Implements hook_preprocess_HOOK().
*/
function MYMODULE_preprocess_page_title(&$variables) {
// WRITE YOUR LOGIC HERE,
if ($YOUR_LOGICS === TRUE) {
$variables['title'] = 'New Title';
}
}
Modifiez la balise de titre dans la tête de votre document HTML.
function mymodule_preprocess_html(&$variables) {
$variables['head_title']['title'] = $something;
}
Modifiez le titre qui apparaît dans le contenu de la page.
function mymodule_preprocess_block(&$variables) {
if ('page_title_block' == $variables['plugin_id']) {
$variables['content']['#title'] = $something;
}
}
drupal_set_title () dans 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 () dans 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);
}
Cette fonction a été supprimée de Drupal 8.
Modification de l'enregistrement:
drupal_set_title () et drupal_get_title () ont été supprimés .
Vous pouvez maintenant définir le titre lors de la définition des itinéraires dans modulename.routing.yml
. Exemple de la façon dont cela pourrait être fait, est montré le lien d'enregistrement de changement ci-dessus.
J'ai trouvé dans D8 que si vous souhaitez modifier le titre d'une vue d'entité, vous pouvez utiliser hook_ENTITY_TYPE_view_alter (). Par exemple, voici comment vous pouvez modifier la vue d'une entité utilisateur avec un champ sur l'utilisateur "field_display_name", plutôt que l'ID utilisateur comme titre:
/**
* 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();
}
J'ai trouvé un autre moyen, qui peut être plus simple si vous n'avez pas de contrôleur et que vous souhaitez modifier le titre sur votre site Web. Vous pouvez l'utiliser pour modifier le titre en fonction du nœud actuel.
Tout d'abord, supprimez la balise dans votre html.html.twig Ensuite, accrochez hook_page_attachments_alter
function mytemplate_page_attachments_alter(array &$page) {
$page['#attached']['html_head'][] = [
[
'#tag' => 'title',
'#value' => "My title"
],
'title'
];
}
Vous pouvez obtenir le nœud actuel du terme de taxonomie avec
$node = \Drupal::routeMatch()->getParameter('node');
$term = \Drupal::routeMatch()->getParameter('taxonomy_term')
Jetez un œil à Automatic Entity Label , un module de contribution très bien conçu pour définir les titres des nœuds, etc.
(Notez que `` titre de page '' est une manière plus familière de dire `` étiquette d'entité '', où `` page '' est une entité de contenu et `` étiquette '' englobe le titre et l'équivalent pour d'autres entités, par exemple les sujets de commentaire, les noms de termes de taxonomie.)
Bien que op semble demander des conseils sur l'écriture de code personnalisé, il n'est pas clair d'après les détails disponibles que le code personnalisé est la meilleure recommandation. Pour les lecteurs sans raison très spécifique de dupliquer une fonctionnalité disponible à partir du code contribué, la communauté Drupal conseille fortement (et les propriétaires de sites en tirent un grand avantage) d'adopter un module existant.
drupal_set_title()
et les drupal_get_title()
deux sont supprimés de drupal 8 mais la meilleure partie est qu'il y a un bloc séparé pour page_title
. L'utilisateur peut masquer ou ajouter ce bloc sur n'importe quelle page / région.
Il y a 2 solutions pour cela.
title_block
sur une page particulière et ajoutez un nouveau bloc personnalisé avec un balisage pour le titre. Placez maintenant ce bloc juste après la title_block
section du bloc in drupal.En utilisant la hook_preprocess_block()
fonction dans votre custom_theme.theme
fichier.
Voici l'exemple de code:
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';
}
}
}
Dans mon cas, j'ai utilisé la deuxième méthode ci-dessus, qui ne fonctionnera que pour la page de profil utilisateur.
J'ai lutté avec cela et j'ai essayé toutes les solutions ci-dessus. La solution qui a finalement fonctionné était:
function mymodule_preprocess_html(&$variables) {
$variables['head_title']['title'] = $something;
}
mais seulement après avoir mis à jour le poids de mon module personnalisé:
drush php:eval "module_set_weight('mymodule', 10);"
Obtenir le titre de la page fonctionne très bien comme écrit dans la réponse de @ rpayanm. Mais la configuration s'est avérée assez compliquée. Nous avons finalement découvert que cela hook_preprocess_HOOK()
pourrait simplement être utilisé pour prétraiter le titre de la page assez facilement.
/**
* Implements hook_preprocess_HOOK().
*/
function MYMODULE_preprocess_page_title(&$variables) {
if ($MYLOGIC === TRUE) {
$variables['title'] = 'New Title';
}
}
Et comme déjà mentionné dans d'autres réponses ici, vous pouvez également utiliser hook_preprocess_html()
pour définir la balise de titre de tête HTML en conséquence.
j'ai changé le bloc page_title pour user / uid en un nom de champ de compte personnalisé différent comme ceci:
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;
}
}
}
}