Aller au contenu principal


Le bloc "Billet créé le :"

Pour réaliser les blocs "Billet créé le :" dans mes billets (par exemple ceux de type de contenu "billet_systeme" dont cette page fait partie), je procède en 2 phases. 
La 1ère suit les 3 étapes illustrées dans l'image ci-dessous :

je clique sur le lien "ajouter un bloc" à l'intérieur d'une de ses sections layout-builder (par exemple : la section "Introduction") ;

dans la liste des blocs, je développe l'onglet "champs de contenu" ;

je clic sur le bloc "écrit le" puis je choisis l'affichage personnalisé "d M Y".

La seconde peut s'écrire selon 2 versions décrites les paragraphes ci-dessous.

 

Billet créé le :
20 jan 2023

Cliquer pour agrandir l'image

Comme indiqué au point 2 de l'image ci-dessus, ce bloc est produit par l’exécution du template "field--node--created.html.twig" disponible, par exemple, dans "core\themes\stable9\templates\field" d'une installation standard de Drupal.  Je l'ai copié dans le dossier templates/field de mon  thème.

 

Version "sans preprocess"

Pour cette version, moins "propre" que celle présentée dans le paragraphe suivant, j'ai modifié le code d'origine (du fichier field--node--created.html.twig) comme indiqué ci-dessous pour scinder la date en 2 parties  et styliser le bloc.

 
La variable  items[0]["content"][#text"] du code ci-dessous me fournit la date de création. 
La balise "section role = "dateCreationNode" me permet d'ajouter un style CSS.

 

<section role="dateCreationNode">     
   <div>     
   Billet créé le :     
    </div>     
    <div>     
        <span{{ attributes }}>             
                {{ items[0]["content"]["#text"]|slice(0, 2) }}     
        </span>     
        <span{{ attributes }}>             
                {{ items[0]["content"]["#text"]|slice(3, length) }}     
        </span>     
    </div>     
</section>

 

 La fonction twig "slice" placée à la suite du pipe me permet de découper la chaîne de caractères qui précédé le pipe, à savoir : la date de création.

slice(0,2) qui rend les 3 premières lettres ;

slice(3, length) pour le reste de la date.

 

Version avec preprocess

Cette version nécessite la définition de la fonction "preprocess" dh_preprocess_field__node__created() qui doit figurer dans le fichier .theme de mon thème donc dans dh.theme.  Dans Drupal, une fonction "preprocess" permet de manipuler (et/ou d' ajouter) des variables qui seront ensuite utilisées dans vos fichiers de template ou gabarit.

Une telle fonction est exécutée avant l'affichage du template. La fonction dh_preprocess_field__node__created()  sera donc exécutée avant field--node--created.html.twig. Remarquez que la syntaxe (imposée par Drupal) de son nom est très proche de celle du gabarit, elle colle le nom du thème (ici dh) à "_preprocess_" et au nom du gabarit dans lequel les "-" sont remplacés par des "_".

Dans mon exemple, le rôle de cette fonction est de sécuriser l'affichage en testant l'existence (usage de "isset" ) des données et de fournir les variables jourCreated et moisAnCreated au gabarit "field--node--created.html.twig".

function dh _preprocess_field__node__created(&$variables) {         
 /*dump($variables);*/         
 if (isset ($variables['items'][0]["content"]["#text"])){         
     $temp= $variables['items'][0]["content"]["#text"];         
     $variables['jourCreated'] = substr($temp,0,2);         
     $variables['moisAnCreated'] = substr($temp,3);         
 }         
 else {         
     $variables['jourCreated'] = "00";         
     $variables['moisAnCreated'] = "MmM YYYY";         
 }         
}

Les fonctions "preprocess" sont écrite en php d'où l'emploi de substr() à la place de la fonction twig slice(). Sinon, on manipule bien les mêmes éléments que dans le paragraphe précédent.

Le fichier du gabarit devient :

<section role="dateCreationNode">         
   <div>         
   Billet créé le :          
    </div>         
    <div>         
        <span{{ attributes }}>                 
                {{ jourCreated }}         
        </span>         
        <span{{ attributes }}>                 
                {{ moisAnCreated }}         
        </span>         
    </div>     
</section>

Ci dessous figure le code CSS pour styliser ce bloc.

Cliquez sur le bouton pour copier le code 
dans le presse papier  

section[role="dateCreationNode"]{
   display:flex;
flex-direction: column;
float:right;
width: 8em;
   height: 80px;
   overflow: hidden;
   padding: 0em 0em 0em 1em;
margin: 0px 5px 7px 5px;
background-color: rgb(235, 249, 198);
}
section[role="dateCreationNode"] div {
   text-decoration: underline;
}
section[role="dateCreationNode"] div + div {
   display:flex;
flex-direction: row;
text-decoration: aliceblue;
}
section[role="dateCreationNode"] span {
font-size: 4em;
   font-family: 'oswaldregular';
text-align: center;
line-height: 1.2;   
}
section[role="dateCreationNode"] span + span {
   text-transform: uppercase;
   font-size: 1.2em;
   padding: 12px 5px 1px 1px;
}

 

J'ai procédé à l'identique pour le bloc "dernière MAJ" créé à partir de "modifié" disponible dans les champs de contenu et du template "field--node--changed.html.twig
 
Nb : l'item #text a remplacé l'item #markup lors de la mise à jour vers drupal v10.1