Comment définir le titre de la page?

29

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?

Jeff Madison
la source

Réponses:

30

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()et new FormattableMarkupretournent 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';
  }
}
Yusef
la source
Pourquoi devez-vous ajouter le nom system.site->? Cela est ajouté dans le titre qui va dans la tête html si vous fournissez une chaîne de titre sans cela.
anoopjohn
5

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;
  }
}
arnoldbird
la source
4

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);
}
rpayanm
la source
Le titre GET fonctionne bien peut-être partout. Je me demande où régler le titre, car dans la page de prétraitement, cela ne semble pas fonctionner.
leymannx
3

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.

AjitS
la source
3

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();
}
Tyler Fahey
la source
Bonne approche et propre. Fonctionne bien en D8 /
Vishal Kumar Sahu
2

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')
Kodiak
la source
2

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.

Kay V
la source
2

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.

  1. Désactivez title_blocksur 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_blocksection du bloc in drupal.
  2. En utilisant la hook_preprocess_block()fonction dans votre custom_theme.themefichier.
    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.

Manav
la source
1

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);"
Peter
la source
1

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.

leymannx
la source
0

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;
      }
    }
  }
}
Matoeil
la source