Vous êtes ici

Créer un type de contenu personnalisé par programmation

Vous avez 30 secondes ?
S'abonner au flux d'actualités
Rubrique: 
Technique
Difficultée: 
Facile
Vous le savez certainement, Drupal permet de créer de nouveaux types de contenu personnalisés. Cela peut-être fait par n'importe quel administrateur via les fonctions d'administration de Drupal. Toutefois, sachez qu'il est également possible de faire cela directement dans votre module, via le code. Le but ? Que votre module, à l'installation, puisse créer pour l'utilisateur le nouveau type de contenu dont il a besoin pour fonctionner. Le module Webform définit par exemple un contenu de contenu Webform, le module Forum définit le type de contenu billet de blog, et ainsi de suite.
 
Un nouveau type de contenu est une nouvelle spéciation de l'entité Node. En aucun cas, nous n'allons créer dans ce tutoriel un nouveau type d'entité. Ce ne sera ici qu'un type de contenu parmi d'autres, tout comme vous pourriez la créer via l'administration de votre site.
 
Pour créer un tel type de contenu, il vous faudra :
  • choisir un nom machine pour ce type de contenu
  • créer un fichier node.type.nom_machine_du_type_de_contenu.yml
  • créer la configuration pour votre nouveau type de contenu
  • placer le fichier au bon endroit dans votre module
  • activer votre module
Le saviez-vous ?
Contrairement aux versions précédentes, il n'est plus nécessaire d'utiliser de code PHP pour créer de nouveaux type de contenus. De plus, ceux-ci ne sont plus stockés en base de données. Exit la table node_type, tout est désormais configuré dans des fichiers de configurations YAML stockés dans sites/default/files/config_XXX/active.

Choisir un nom machine pour le type de contenu

Comme tous les noms-machine dans Drupal, le nom de votre type de contenu devra être écrit en minuscule, ne contenir ni espaces, ni accents, ni caractères spéciaux. Il peut toutefois utiliser le symbole underscore. L'une des difficultés va être de trouver un nom unique pour éviter tout conflit avec la définition d'un type de contenu de Drupal core ou celui d'un autre module. Préfixer le nom du type de contenu par celui de votre module (qui est unique) semble une bonne idée. En reprenant notre module hello_world crée dans l'article "mon premier module Drupal 8". Nous allons créer un module de gestion de recettes de cuisine nommé MyRecette et définissant le type de contenu "Recette de Cuisine" nommé myrecette_recette.

Définir le nouveau type de contenu

Maintenant que nous avons un nom pour notre nouveau type de contenu, il faut créer son fichier de configuration. Celui-ci doit se nommer : node.type.nom_machine_du_type_de_contenu.yml. Dans notre cas, cela donne donc : node.type.myrecette_recette.yml. Ce fichier se place dans un sous-dossier install luis même dans un dossier config à la racine de votre module. Dans le cas de cet exemple, nous retrouverons le fichier :

/modules/myrecette/config/install/node.type.myrecette_recette.yml

Cette syntaxe rappelle que le module myrecette contient des configurations. Parmi elles, se trouve la configuration d'un nouveau type de noeud nommé myrecette_recette.
Pour créer la structure des dossiers ainsi que le fichier directement via Eclipse, reportez-vous à l'article : Mon premier module : Créer une page.
 
  • Dans ce fichier, copiez-collez ce code de configuration :
type: myrecette_recette
name: Recette de Cuisine
description: 'Utilisez le type de contenu <i>Recette de Cuisine</i> pour gérez vos petits plats.'
help: ''
has_title: true
title_label: Intitulé du plat
settings:
  node:
    preview: 1
    options:
      status: true
      promote: true
      sticky: false
      revision: false
    submitted: true
status: true
langcode: en
La syntaxe de ce code est très simple : c'est du YAML simple à lire. Nous retrouvons les différentes configurations suivantes :
  • type: le nom machine de votre type de contenu.
  • name: le nom humain de votre type de contenu.
  • description: Un court texte de description. Ce texte peut contenir des balises HTML et doit être entouré de guillemets simples : 'blablabla'.
  • help: Un texte d'aide ou un guide d'utilisation de ce type de contenu. Ce texte peut contenir des balises HTML et doit être entouré de guillemets simples : 'blablabla'.
  • has_title: true ou false, suivant que le type de contenu doit avoir un titre ou non.
  • title_label: Le label du titre du contenu. Title est l'option la plus logique, mais vous pourriez définir autre chose ! Pour une recette, "Intitulé du plat" est un choix justifié !
  • settings: Un tableau de configurations contenant les champs suivants :
    • node: des configurations propres aux noeuds :
      • preview: 0, 1 ou 2, indiquant si la configuration par défaut du noeud est d'activer, de désactiver ou de rendre optionnel la prévisualisation à la sauvegarde (0 : désactivé, 1: facultatif, 2: requis).
      • options: les options du noeuds :
        • status: true ou false, indiquant si le noeud est publié ou non par défaut.
        • promote: true ou false, indiquant si le noeud est promu ou non en page d'accueil par défaut.
        • sticky: true ou false, indiquant si le noeud est "collant en haut de liste" par défaut ou non.
        • revision: true ou false, indiquant si le noeud doit supporté par défaut le versionning des révisions.
      • submitted: true ou false, indiquant si les informations sur l'auteur et la date de publication du noeud doivent être affichés par défaut.
  • status: true ou false, ce champ
  • langcode: le code de la langue par défaut du noeud.
Ce simple petit bout de configuration suffit désormais à créer un type de contenu ! Plus besoin avec Drupal 8 de code PHP ni quoi que ce soit d'autres !

La technique du fainéant

Ceux qui ont essayé de retenir tout cela vont me haïr : sachez qu'il est possible de faire tout cela via l'interface Drupal ! Tout comme le ferait un administrateur, il vous est possible de créer votre type de contenu via la GUI d'administration de Drupal.
  • Rendez-vous sur la page d'administration des nouveaux type de contenus :
    admin/structure/types/add.
  • Créez et sauvegardez votre nouveau type de contenu.
  • Rendez-vous sur votre serveur dans le dossier sites\default\files\config_XXXX\active.
  • Récupérez le fichier node.type.votre_type_de_contenu.yml.
  • Placez-le dans le dossier config de votre module.

Considérations avancées (en bref)

Comment activer les commentaires sur ce type de contenu ?
Dans Drupal 8, les commentaires sont désormais un champ. Cela permet de gérer de manière unifiée les commentaires sur toutes les entités 'fieldables' (sur lesquelles l'extensibilité par champs est activée). Activer les commentaires sur notre nouveau type de contenu revient donc à lui ajouter de nouveaux champs.
 
Comment ajouter de nouveaux champs par défaut à un type de contenu ?
Si le créateur du module "My Recette" considère qu'une recette de cuisine possède nécessairement une liste d'ingrédients et un temps de préparation, il lui est possible d'ajouter automatiquement ces champs à ce type de contenu via le module. Pour cela, un nouveau fichier de configuration par champ sera nécessaire. Pour un champ commentaire existant, il faudra (en considérant qu'un champ field_commentaires existe) créer le fichier :

field.instance.node.myrecette_recette.field_commentaires.yml

De manière générale le nom du fichier est :

field.instance.nom_de_l_entite.nom_du_type_de_contenu.nom_du_champ.yml

Nous verrons plus en détail comment ajouter ainsi un champ existant à un type de contenu créé via un module dans un tutoriel prochain. Nous verrons également comment ajouter un nouveau champ,  et comment créer un nouveau type de champ.
 
Comment configurer le menu par défaut de notre type de contenu ?
Pareil que pour les champs : via un fichier de configuration. Par convention, ce fichier aura un nom de la forme :

menu.entity.nom_de_l_entite.nom_du_type_de_contenu.yml

Là encore, nous verrons cela plus en détails dans un prochain tutoriel.
 
Comment savoir quoi mettre comme clef / valeur dans la configuration ?
C'est une bonne question. Sachez que du moment qu'un module offre une nouvelle entité configurable (un noeud pour le module Node, un menu pour le module Menu, les champs pour le module Field, etc...), ce module se doit de lui définir un shéma. Celui-ci se retrouve dans le dossier /config/shcema dans un fichier nom_du_module.schema.yml. Dans le module core Menu par exemple, on retrouve le fichier : /config/schema/menu.schema.yml qui nous indique comment nous pouvons autoriser notre type de contenu à apparaîre dans un menu (le menu main appelé "Main Navigation" par exemple) et en quelle position par défaut (par exemple à la racine de ce menu). Dans notre cas, cela se fera via les lignes suivantes d'un fichier de configuration nommé menu.entity.node.myrecette_recette.yml :
available_menus:
  - main
parent: 'main:0'
Notation: 
Average: 2.9 (9 votes)
Vous avez aimé: 

Commentaires

Bonjour,
Je vous remercie de cet avis très positif. D'autres articles suivent et suivront régulièrement. N'hésitez pas à vous créer un compte pour rester informer. Je mettrais prochainement en place un système d'abonnement par mail et newletter pour suivre plus facilement la sortie d'articles.
Les tutos sortent au fur et à mesure de l'avancement de Drupal 8, de mon inspiration (pour l'ordre de sortie) et de mes dipos (pour l'écriture). Mais les retours positifs aident à garder le rythme !!
This post is useful!
This post is useless!
Portrait de Vanessa

Tout d'abord merci Dominique pour votre tuto qui permet de découvrir Drupal 8 ! :)

Je suis arrivée à l'étape de création des types de contenu et là je bloque... Si je créé un type de contenu via le code, mais il n'apparait pas dans les types de contenus. Je décide alors de tester la méthode "fainéant" ^^ et je passe direct par l'admin. Le type de contenu est bien ajouté par contre impossible de trouver le fichier node.type.votre_type_de_contenu.yml correspondant ni même le dossier config_XXX. Dans default je n'ai qu'un dossier config_XXX qui date de plusieurs jours. 

J'ai noté que dans "admin/config/development/configuration", j'ai ce message "Your current configuration has changed. Changes to these configuration items will be lost on the next synchronization:" mais j'ai effectué quelques recherches sans succès, je n'ai pas trouvé ce qu'il y avait à modifié.

Suis-je passée à côté d'une étape de configuration ? Auriez-vous une idée ? Merci par avance.

 
This post is useful!
This post is useless!