
Strapi : Comment explorer les Content-Types de Strapi et obtenir des attributs textuels ou numériques ?

Bon retour parmi nous !
Dans ce nouvel article, nous allons parler de l'exploration des Content-Types de Strapi.
L'objectif est d'effectuer une analyse approfondie d'une instance de service interne de Strapi afin de récupérer tous les content-types et de procéder à une analyse complète. Dans un premier temps, nous devons créer un nouveau service et y implémenter toute la logique nécessaire. Dans un second temps, nous voulons afficher les résultats de l'analyse dans la console JavaScript (de temps en temps, nous devons faire cela...) mais depuis la page d'accueil du plugin principal.
Vous avez remarqué que tous les modules de service utilisent l'instance "strapi".
module.exports = ({ strapi }) => {}
Cette instance est le cœur de Strapi et référence de nombreuses propriétés très utiles, en particulier "contentTypes". Ce dernier est un tableau qui contient tous les types de contenu définis dans votre instance Strapi.

Instance du service core de Strapi

Collection d'attributs à l'intérieur de l'instance du service core de Strapi
Si vous vous souvenez de l'article de la création de la collection de plugins internes, dans "Schema.json", une section "attributes" est définie. C'est celle-ci que vous récupérez ici.
Il devrait être possible de récupérer tous les attributs textuels et numériques, n'est-ce pas ?
Bien sûr !
Alors, créons un nouveau service. Allez dans "api/src/plugins/awesome-help/server/services" et créez un nouveau fichier "parser.js"
Collez le code ci-dessous :
"parse" est la fonction principale de ce service et c'est la seule qui est exposée.
À l'intérieur de la fonction "parse", le premier appel est fait à la fonction "getContentTypes" pour récupérer tous les Content-Types. Elle effectue un mappage de "strapi.contentTypes" et itère dessus. Remarquez le test : nous récupérons uniquement les Content-Types de type collection et single, sans inclure ceux des plugins, car nous souhaitons uniquement obtenir les Content-Types créés par le content-manager ou le développeur.
Maintenant, nous devons explorer les attributs. Un Strapi Content-Type peut être complexe avec, par exemple, des attributs textuels ou numériques simples, mais il peut aussi contenir des composants ou une zone dynamique qui inclut elle-même des attributs numériques ou textuels, voire d'autres composants !
Il est recommandé d'utiliser un modèle de fonction pour explorer les attributs. Nous devons créer une fonction récursive.
Une fonction récursive est une fonction qui s'appelle elle-même au cours de son exécution.
Le but de "getStructure" est de passer d'une structure arborescente des attributs de Strapi à une collection simple et aplatie.
Regardons la fonction "getStructure" : pour chaque élément reçu, la fonction vérifie tous les attributs et détermine si leur type est "component" ou "dynamicZone". Si c'est le cas, la fonction effectue un nouvel appel à "getStructure" avec l'attribut actuel en paramètre. Sinon, la fonction ajoute directement l'attribut à la collection.
Ainsi, la fonction explore toute l'arborescence des attributs et aplatit les résultats sans perdre le chemin de l'arborescence. En effet, lorsqu'elle aplatit le chemin des attributs, de nouvelles propriétés sont ajoutées à l'élément aplati :
- container,
- componentName,
- zoneName
Grâce à ces propriétés, nous pouvons facilement reconstruire le chemin de l'arborescence pour retrouver la position de l'attribut ultérieurement.
La dernière étape consiste à filtrer la nouvelle collection, supprimer tous les Content-Types sans attribut, puis la retourner ! Mais pour appeler cette fonction depuis le site d'administration, nous devons créer un contrôleur et une route.
Créez le contrôleur dans "api/src/plugins/awesome-help/server/controllers/parser.js" et collez-y le code ci-dessous :
Créez le contrôleur dans "api/src/plugins/awesome-help/server/routes/parser.js" et collez-y le code ci-dessous :
N'oubliez pas de référencer ces nouveaux fichiers dans le index.js de chaque dossier.
Retour à l'Admin !
Il est temps de créer un proxy API et de mettre à jour la page d'accueil du plugin pour appeler ce proxy et récupérer les résultats de l'API "Parser".
Créez le proxy dans le dossier "api/src/plugins/awesome-help/admin/src/api/parser-proxy/index.js" et collez-y le code ci-dessous :
Et mettez à jour la page d'accueil avec le code ci-dessous :
Lancez le site d'administration de Strapi.
Il est temps de cliquer sur le bouton "Scan your Strapi internal structure" et d'observer les résultats (pour l'instant dans la console) !

Résultats de l'exploration des Content-Types
Le tableau "result" contient tous les Content-Types de FoodAdvisor Strapi avec la collection d'attributs aplatie.
Mission accomplie !
L'exploration des Content-Types est terminée. Nous devons maintenant enregistrer tous les résultats dans notre collection d'aide.
Et n'oubliez pas notre GIT pour récupérer le code : https://github.com/ExFabrica/strapi-stories/tree/develop/part-4
À bientôt !