Partager cet article :

Blog
Aug 07, 20238 min read

Drupal sans tête avec Next.js - un exemple simple à suivre

Drupal sans tête avec Next.js - un exemple simple à suivre

Drupal et Next.js

Drupal est un système de gestion de contenu (CMS) populaire et puissant qui facilite la création de flux éditoriaux et d'interfaces répondant à vos besoins spécifiques. Il est basé sur des modules et est hautement personnalisable avec une communauté sisable et une maturité technologique et peut être utilisé pour créer des applications web complètes. La tendance récente, dans le développement web en général, et par conséquent dans le développement de Drupal, est d'utiliser la technologie sans tête - seulement comme une API puissante, et en la détachant de l'interface utilisateur, où d'autres technologies telles que react et Next.js excellent.

Next.js est un framework react populaire pour construire des applications react qui exploitent le rendu côté serveur. Il possède certaines caractéristiques qui le rendent bien adapté aux projets Drupal headless, notamment le découpage automatique du code, l'optimisation des performances et le rendu côté serveur.

Dans ce tutoriel, nous allons d'abord créer une application drupal pour créer et stocker des boissons au café. Nous allons ensuite créer une application Next.js, récupérer les données disponibles dans notre application drupal et enfin afficher une liste de boissons au café. Nous supposons que vous avez déjà une certaine expérience de Drupal et de Next.js.

Application Drupal

Installer Drupal

Nous commençons par créer un nouveau site Drupal. Dans notre exemple, nous allons créer une application web qui montrera différentes options de café. Pour créer le site Drupal, nous allons utiliser docksal, qui est déjà installé sur notre machine. Il nous suffit de lancer :

$ fin project create

On nous demande ensuite le nom de l'application :

1. Nommez votre projet (alphanumérique en minuscules, trait de soulignement et trait d'union):  ; 
drupal-headless-coffee-drinks

On nous demande ensuite le nom de l'application :

Drupal 9 (Version Composer)

Maintenant nous continuons l'installation et finalement votre application sera créée via le CLI et le terminal vous montrera un lien url vers votre application nouvellement créée.

Ouvrez http://drupal-headless-coffee-drinks-app.docksal dans votre navigateur pour vérifier la configuration. 
Recherchez les identifiants de connexion de l'administrateur dans la sortie ci-dessus. 
Fait !  Toutes les étapes d'initialisation sont terminées.

Juste au-dessus du message contenant l'url de votre application, nous voyons les informations d'identification de l'utilisateur administrateur de votre application web Drupal. Conservez ces informations ! Maintenant, nous copions les informations d'identification et nous naviguons vers le login de l'application web

(drupal_app_url)/user/login  ; 
# dans notre cas : http://drupal-headless-coffee-drinks-app.docksal/user/login

Ajouter le module Next.js

Exécutez la commande suivante pour installer le module Next.js et ses dépendances.

$ composer require drupal/next

Activer les modules API

  1. Visitez /admin/modules
  2. Activez les modules suivants : Next.js et Next.js JSON:API.

enable api modules

Créer un type de contenu "boisson au café" et ajouter des données

Créons maintenant nos données sur les boissons au café. Tout d'abord, nous devons créer notre type de contenu pour les boissons au café. Pour ce faire, admin/structure/types et cliquez sur Ajouter un type de contenu, à titre d'exemple, remplissez ce qui suit :

Nom : Boisson au café, puis :

  • Cliquez sur Enregistrer et gérer les champs.
  • Cliquer sur le champ Ajouter
  • Sélectionner le texte brut
  • Dans le champ Étiquette, tapez "description"

add description and image fields

Ajoutons également un champ Image :

  • Cliquer sur ajouter un champ
  • Vous pouvez réutiliser un champ existant (du type de contenu d'article qui est créé par défaut).

Enfin, créons du contenu dans notre base de données. Pour ce faire, naviguez vers /admin/content et cliquez sur Add Content. Nous choisissons maintenant Boisson au café et remplissons les champs suivants

add coffee drink content

J'ai fait la même chose pour Americano, Espresso et Mocha et le résultat final est que j'ai 4 éléments créés en tant que type "Boisson au café" dans notre base de données. Le résultat final est 4 éléments de contenu - Boissons au café - stockés dans notre CMS. Voyons maintenant comment les récupérer dans notre application frontale Next.js.

4 Coffee drinks content items created image

Application Next.js

Créons notre prochaine application avec les paramètres suivants lorsque nous y sommes invités

$ npx create-next-app  ; 
✔ Quel est le nom de votre projet ? ... next-coffee-app  ; 
✔ Souhaitez-vous utiliser TypeScript avec ce projet ? ... Non / Oui  ; 
✔ Souhaitez-vous utiliser ESLint avec ce projet ? ... Non / Oui

Installer Tailwind

Ensuite, en option, installez tailwind dans le projet afin de styliser l'application de manière transparente par la suite. Pour installer tailwind, procédez comme suit

  • npm install -D tailwindcss postcss autoprefixer
  • npx tailwindcss init -p
  • Dans tailwind.config.js, ajoutez ceci :
/** @type {import('tailwindcss').Config} */  ; 
module.exports = {  ; 
contenu : [  ; 
 "./pages/**/*.{js,ts,jsx,tsx}",  ; 
 "./composants/**/*.{js,ts,jsx,tsx}",  ; 
 ],  ; 
 theme : {  ; 
 extend : {},  ; 
 },  ; 
 plugins : [],  ; 
}  ;
  • Allez dans global.css, supprimez tout et ajoutez les directives suivantes à notre CSS :
@tailwind base;  ; 
@tailwind components;  ; 
@tailwind utilities ;

Créer ENV

Créer un fichier .env et ajouter des variables qui pointent vers l'url de notre API :

NEXT_PUBLIC_DRUPAL_BASE_URL=http://drupal-headless-coffee-drinks-app.docksal

Récupérer les données relatives aux boissons au café et les transmettre au composant

// pages/index.tsx  ; 
import Head from "next/head";  ; 
import { GetStaticPropsResult } from "next";  ; 
import { DrupalNode } from "next-drupal";  ; 
import { DrupalClient } from "next-drupal";  ; 
import CoffeeDrinkList from "../components/CoffeeDrinkList" ; 
 
const drupal = new DrupalClient(process.env.NEXT_PUBLIC_DRUPAL_BASE_URL) ; 
 
interface IndexPageProps {  ; 
nodes : DrupalNode[];  ; 
} 

export default function IndexPage({ nodes } : IndexPageProps) {  ; 
 return (  ; 
 <>  ; 
 <Head>  ; 
 <title>Next.js pour Drupal</title>  ; 
 <meta  ; 
 name="description"  ; 
 content="Un site Next.js propulsé par un backend Drupal."  ; 
 />  ; 
 </Head>  ; 
 <CoffeeDrinkList drinks={nodes} />  ; 
 </>  ; 
 );  ; 
} 
export async function getStaticProps() : Promise<  ; 
 GetStaticPropsResult<IndexPageProps>  ; 
> ; {  ; 
 const nodes = await drupal.getResourceCollection<DrupalNode[]> ;(  ; 
"node--coffee_drink",  ; 
 {  ; 
 params : {  ; 
"filter[status]" : 1,  ; 
"fields[node--coffee_drink]":  ; 
"title,field_image,field_description,created",  ; 
 include : "field_image,uid",  ; 
 trier : "-created",  ; 
 },  ; 
 }  ; 
 ) ;

IndexPage renvoie un élément JSX représentant une page web. La page web contient un composant Head du module next/head, qui est chargé de définir le titre et la description de la page. La page web contient également un composant CoffeeDrinkList, auquel est transmis un tableau de boissons. La fonction IndexPage reçoit comme seul argument un objet contenant un tableau d'objets DrupalNode.

Nous avons également une fonction - getStaticProps, qui est utilisée pour générer les accessoires du composant IndexPage. La fonction getStaticProps récupère une collection de nœuds à partir d'un backend Drupal (dans ce cas, les boissons au café) à l'aide de la classe DrupalClient. Les nœuds sont filtrés par statut et triés par date de création, et la fonction renvoie un objet contenant les nœuds en tant que props pour le composant IndexPage.

Afficher les données sous forme de liste

// components/CoffeeDrinksList.tsx  ; 
 import { DrupalNode } from "next-drupal" ; 
 
interface CoffeeDrinkListProps {  ; 
 drinks : DrupalNode[];  ; 
 } 
 
 const CoffeeDrinkList = ({ drinks } : CoffeeDrinkListProps) => ; {  ; 
 return (  ; 
 <div className="h-full bg-white">  ; 
 <h1 className="mb-10 text-6xl font-black text-center">  ;

Liste des boissons au café  ; 
 </h1>  ; 
 <div className="grid grid-cols-3 gap-4 items-center justify-items-center">  ; 
 {drinks ?.length ? (  ; 
boissons.map((boisson) => ; (  ; 
 <div  ; 
key={boisson.id}  ; 
 className="max-w-sm rounded overflow-hidden shadow-lg m-2"  ; 
 >  ; 
 <img  ; 
 className="w-full h-[300px]"  ; 
 src={`${process.env.NEXT_PUBLIC_DRUPAL_BASE_URL}${drink.field_image.uri.url}`}  ; 
 />  ; 
 <div className="px-6 py-4">  ; 
 <div className="font-bold text-xl mb-2">{drink.title}</div>  ; 
 <p className="text-gray-700 text-base">  ; 
 {drink.field_description}  ; 
 </p>  ; 
 </div>  ; 
 <div className="px-6 pt-4 pb-2">  ;

 <span className="inline-block bg-gray-200 rounded-full px-3 py-1 text-sm font-semibold text-gray-700 mr-2 mb-2">  ; 
Créé : {boire.created}  ; 
 </span>  ; 
 </div>  ; 
 </div>  ; 
 ))  ; 
 ) : (  ; 
 <p className="py-4">No nodes found</p>  ; 
 )}  ; 
 </div>  ; 
 </div>  ; 
 );  ; 
 } ; 
 
 export default CoffeeDrinkList ;

CoffeeDrinkList est un composant qui prend un tableau d'objets DrupalNode comme argument et renvoie un élément JSX représentant une liste de boissons au café. Le composant reçoit comme seul argument un objet contenant un tableau d'objets DrupalNode. Le composant se reporte au tableau d'objets DrupalNode, créant un nouvel élément JSX pour chaque nœud. Chaque élément JSX représente une seule boisson au café et affiche le titre, la description et la date de création de la boisson, ainsi qu'une image de la boisson.

Si le tableau des boissons est vide ou nul, le composant affiche un message indiquant qu'aucun nœud n'a été trouvé.

Le composant comprend également des classes CSS qui sont utilisées pour styliser les éléments. Ces classes proviennent de la bibliothèque tailwindcss.

Résultats finaux

Exécutez maintenant l'application suivante et voyez le résultat final

$ npm run dev

Nous avons fini par obtenir une page affichant le titre, la description, l'image et la date et l'heure de création de toutes les boissons au café - des données que nous avons récupérées dans notre application Drupal.

List of Coffee Drinks fetched from drupal api

Résumé

Dans l'exemple de l'article, nous avons vu comment créer une application Drupal, ajouter des types de contenu et des données pour ce type de contenu, exposer notre api Drupal et la consommer avec une application Next.js pour montrer une liste de boissons au café extraites de la base de données à nos utilisateurs. Pour des solutions plus complexes, qui peuvent nécessiter une authentification, l'ajout, la suppression et la mise à jour de données, reportez-vous à la documentation de Next.js pour Drupal : https://next-drupal.org/

S'ABONNER À NOTRE NEWSLETTER

Partager cet article :

S'ABONNER À NOTRE NEWSLETTER

Articles de blog connexes

    Construire une équipe Agile performante : Notre approche éprouvée

    Blog

    Construire une équipe Agile performante : Notre approche éprouvée

    Découvrez comment nous construisons des équipes Agile performantes en définissant des rôles clairs, en favorisant la collaboration et en utilisant des outils flexibles.

    Écrit par Svetoslava Angelova
    Aug 27, 202411 min read
    Drupal 11 : à quoi s'attendre ? Guide complet des nouvelles fonctionnalités et des améliorations

    Blog

    Drupal 11 : à quoi s'attendre ? Guide complet des nouvelles fonctionnalités et des améliorations

    Drupal 11 est sorti ! Dans cet article, découvrez ses fonctionnalités et améliorations passionnantes. Mettez-le à jour dès maintenant pour redéfinir votre stratégie numérique avec l'aide des experts de Bulcode.

    Écrit par Svetoslava Angelova
    Aug 05, 20249 min read
    Composants d'annuaire unique dans Drupal core : Une vue d'ensemble

    Blog

    Composants d'annuaire unique dans Drupal core : Une vue d'ensemble

    Découvrez comment les composants à répertoire unique (SDC) de Drupal Core rationalisent le processus de développement en encapsulant les fichiers liés aux composants dans un répertoire unique. Découvrez les avantages des SDC et suivez un guide étape par étape pour les mettre en œuvre dans vos projets Drupal.

    Écrit par Nikolay Tsekov
    Aug 07, 20244 min read
    Embaucher des développeurs de logiciels spécialisés (équipes)

    Blog

    Embaucher des développeurs de logiciels spécialisés (équipes)

    Vous en avez assez d'augmenter les dépenses de votre équipe de développement interne ? Pourquoi ne pas faire appel à une équipe dédiée pour 40 à 60 % du coût ?

    Écrit par Mihail Shahov
    Aug 07, 20233 min read
    L'importance du bon partenaire de développement dans le cycle de vie de votre logiciel

    Blog

    L'importance du bon partenaire de développement dans le cycle de vie de votre logiciel

    La réussite à portée de main : L'art de choisir le partenaire idéal pour le développement de logiciels. Découvrez le rôle essentiel des partenaires dans le développement de logiciels, les secrets du retour sur investissement et restez à la pointe des tendances du secteur dans cet article incontournable.

    Écrit par Mihail Shahov
    Sep 26, 202310 min read
    Tutoriel sur le module Config split pour Drupal

    Blog

    Tutoriel sur le module Config split pour Drupal

    En tant que développeurs, nous sommes souvent amenés à travailler dans des environnements différents. Cela peut parfois conduire à des problèmes (inattendus). Dans Drupal 8, nous utilisons le système de configuration qui fonctionne plutôt bien, mais il y a des cas où les paramètres pour l'environnement local et tout autre environnement devraient être différents.

    Écrit par Ivaylo Tsandev
    Aug 08, 20238 min read
    Dévoiler le duo de puissance : Next.js comme frontend Headless de Drupal 10

    Blog

    Dévoiler le duo de puissance : Next.js comme frontend Headless de Drupal 10

    Découvrez la synergie dynamique entre Drupal 10 et Next.js, alors que cette puissante combinaison redessine le paysage du développement web. Next.js, un framework open-source basé sur React, est intégré de manière transparente en tant que frontend headless de Drupal 10, offrant une pléthore d'avantages. De l'amélioration des performances grâce à des fonctionnalités telles que le fractionnement automatique du code et le rendu côté serveur à la conception flexible et aux capacités de référencement, cette collaboration permet aux développeurs de créer des applications web très performantes, évolutives et visuellement attrayantes. La gestion efficace du contenu de Drupal 10 associée à l'adaptabilité de Next.js aux tendances garantit une approche de développement de pointe, positionnant ce tandem à l'avant-garde des pratiques modernes de développement web. Embrassez l'avenir avec la combinaison Drupal 10 et Next.js, redéfinissant la façon dont nous abordons et créons des expériences en ligne dynamiques.

    Écrit par Todor Kolev
    Feb 09, 20246 min read
    Tutoriel du module Config ignore pour Drupal

    Blog

    Tutoriel du module Config ignore pour Drupal

    Parfois, nous ne voulons pas que nos configurations soient partagées dans la base de code. Que faire dans ce cas ?

    Écrit par Ivaylo Tsandev
    Aug 08, 20237 min read
    Comment nous avons optimisé la note globale d'un SSL de B à A+.

    Blog

    Comment nous avons optimisé la note globale d'un SSL de B à A+.

    L'optimisation de la mise en œuvre du protocole SSL permet à tous les clients d'ouvrir et de parcourir le site en toute sécurité, sans avertissement.

    Écrit par Mihail Shahov
    Aug 07, 20233 min read
    Comprendre les versions de Drupal et planifier une stratégie de migration

    Blog

    Comprendre les versions de Drupal et planifier une stratégie de migration

    Reconnaître les différentes versions de Drupal et maintenir votre site web à jour.

    Écrit par Svetoslava Angelova
    Aug 08, 20235 min read
    Drupal 9 convertit les images au format WebP

    Blog

    Drupal 9 convertit les images au format WebP

    WebP est capable de porter la compression des données à un niveau supérieur grâce à l'inclusion d'un mode de prédiction dans le processus JPG, ce qui permet de voir clairement comment il peut surpasser son homologue basé sur JPG. Les résultats le prouvent.

    Écrit par Vasil Boychev
    Aug 08, 20238 min read
    Vue d'ensemble de React - Définition, SPA, Composants, Hooks

    Blog

    Vue d'ensemble de React - Définition, SPA, Composants, Hooks

    React est un framework JavaScript front-end gratuit et open-source permettant de créer des interfaces utilisateur basées sur des composants d'interface utilisateur. Il est également connu sous le nom de React.js ou ReactJS.

    Écrit par Mihail Shahov
    Aug 07, 20237 min read

    PRENDRE CONTACT

    Vous avez un projet à lancer ?