web-dev-qa-db-fra.com

Comment définir le titre de la page?

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 l'erreur Il n'y a pas une telle fonction .

Comment puis-je changer le titre de la page dans Drupal 8?

28
Jeff Madison

Comme vous pouvez le voir ici cette fonction est déconseillée 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ée à 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 lorsqu'elle est entièrement rendue 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 explicitement spécifier PASS_THROUGH et CHECK_PLAIN est par défaut dans Drupal 7, tandis que dans Drupal 8 la situation est différente. La sortie est échappée automatiquement sauf si elle est marquée comme sûre. t() et new FormattableMarkup Renvoient 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 également basé sur @leymannx answer, vous pouvez 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';
  }
}
32
Yusef

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;
  }
}
5
arnoldbird

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.

4
AjitS

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);
}
4
rpayanm

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();
}
3
Tyler Fahey

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

Jetez un oeil à Automatic Entity Label , un module de contribution très bien conçu pour définir les titres des nœuds et autres.

(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 duplication d'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.

2
Kay V

drupal_set_title() et drupal_get_title() les deux sont supprimés de drupal 8 mais la meilleure partie est qu'il y a un bloc séparé pour page_title. Utilisateur peut masquer ou ajouter ce bloc sur n'importe quelle page/région.

Il existe 2 solutions pour cela.

  1. Désactivez 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 le title_block Dans la section drupal block.
  2. En utilisant la fonction hook_preprocess_block() dans votre fichier custom_theme.theme.
    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.

2
Manav

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. Enfin découvert que 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.

1
leymannx

J'ai eu du mal 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);"
1
Peter

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;
      }
    }
  }
}
0
Matoeil