web-dev-qa-db-fra.com

Comment affichez-vous le champ «Titre» sur l'affichage / la page pour le type de contenu personnalisé?

J'ai créé un type de contenu appelé "News" et lors de la création d'une entité "News", je peux entrer une valeur pour le champ "Title".

Cependant, lorsque je vais dans "Gérer l'affichage" pour le type de contenu, le champ "Titre" n'est pas répertorié comme l'un des champs pouvant être gérés.

En regardant la page/le nœud pour une entité "Actualités", le champ "Titre" apparaît uniquement dans le fil d'Ariane. Cependant, je voudrais afficher le champ "Titre" ailleurs sur la page (pas seulement dans le fil d'Ariane).

Existe-t-il un moyen d'y parvenir?

6
kvjava1

En D8, le titre n'est pas traité comme un champ normal. À titre d'exemple pour les nœuds, le titre s'affiche de deux manières:

  1. Bloc: Il y a un bloc "Titre de page". Vous pouvez placer ce bloc dans n'importe quelle région, il est possible de le placer plusieurs fois et la visibilité peut être configurée afin qu'il n'apparaisse pas sur chaque page.

  2. Modèle: si le nœud n'est pas affiché en tant que page, le titre s'affiche dans le modèle de nœud.

Vous pouvez utiliser les mêmes méthodes pour votre entité personnalisée.

La première méthode devrait fonctionner avec n'importe quelle entité personnalisée. Si vous avez un itinéraire vers l'entité et que vous placez le bloc "Titre de la page" sur votre site, alors le bloc devrait être en mesure de résoudre le titre de l'entité.

Pour la deuxième méthode, vous devez mettre le titre dans une variable en prétraitement et le placer dans le fichier twig.

Modifier: vous n'avez pas d'entité personnalisée, c'est un type de contenu personnalisé. Le titre est donc déjà là comme variable "label" et peut être utilisé tout de suite:

nœud - custom-content-type.html.twig

  <h2{{ title_attributes }}>
      <a href="{{ url }}" rel="bookmark">{{ label }}</a>
    </h2>

Cet exemple est le titre lié, mais vous pouvez simplement utiliser {{ label }} si vous n'en avez pas besoin.

7
4k4

Je n'aime pas l'idée de retomber dans un autre bloc (car je voulais un champ de titre ) ou d'avoir besoin de définir le titre dans des modèles (aussi beaucoup de logique dans les modèles peut devenir difficile à maintenir à long terme). Au moins, il semble y avoir une discussion en cours sur DO comment [META] exposer le titre et d'autres champs de base dans Manage Display après l'aimé le module de titre semble être abandonné .

Je ne recommanderais pas non plus d'installer la suite d'affichage assez massive pour une si petite chose. Le nouveau module de base expérimental Layouts Builder ( vidéo ) pourrait couvrir cela, mais semble toujours assez difficile à configurer.

Donc pour l'instant je vis avec le petit bijou suivant ( source 1 , source 2 ) qui ajoute un nouveau pseudo-champ aux paramètres d'affichage de chaque type de contenu pour rendre le titre de la page sous forme de balisage simple à la position correspondante à l'intérieur du $content.

use Drupal\node\Entity\NodeType;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\Display\EntityViewDisplayInterface;

/**
 * Implements hook_entity_extra_field_info().
 */
function MYMODULE_entity_extra_field_info() {

  $extra = [];

  foreach (NodeType::loadMultiple() as $bundle) {

    $extra['node'][$bundle->id()]['display']['title_field'] = [
      'label'       => t('Title'),
      'description' => t('Title field'),
      'weight'      => 100,
      'visible'     => TRUE,
    ];
  }

  return $extra;
}

/**
 * Implements hook_ENTITY_TYPE_view().
 */
function MYMODULE_node_view(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display, $view_mode) {

  // You could get the node ID or anything else
  // you want from the node object here.
  $title = $entity->getTitle();

  if ($display->getComponent('title_field')) {

    $build['title_field'] = [
      '#type'     => 'inline_template',
      '#template' => '<h1>{{ title }}</h1>',
      '#context'  => [
        'title' => $title,
      ],
    ];
  }
}

Je viens de découvrir qu'il existe déjà un petit module qui fait exactement cela: Pseudo Title .

Le pseudo-titre crée un pseudo-champ qui peut être utilisé pour monter et descendre le contenu du titre dans la même page d'administration où l'affichage des autres champs est géré.

Et il y a aussi le module Gérer l'affichage .

Ce projet rend les champs de base tels que "titre" disponibles dans "Gérer l'affichage".

Ce module très simple utilise le framework qui est déjà dans Core plutôt que d'inventer quelque chose de nouveau. L'objectif est que la plupart ou la totalité de ce module soit absorbée dans le noyau # 2353867: [META] Exposez le titre et d'autres champs de base dans Manage Display .

3
leymannx

Si vous inspectez l'entité à partir de la portée de vos modèles TWIG le titre devrait y être disponible. Aussi Node :: getTitle ()

2
Ryan Hartman

Il existe une troisième façon: si vous avez installé les modules Token et Token filter, vous pouvez utiliser le jeton [current-page: title] à chaque endroit de votre nœud et vous obtenez le titre rendu. Vous pouvez également le placer dans le type de contenu comme valeur par défaut dans certains champs et masquer le champ à l'utilisateur qui fournit le contenu. Il s'affiche ensuite automatiquement dans ce champ.

2
Julius99