Articles et BDD Drupal

Il m'est arrivé de perdre l'accès au contenu d'un billet sur un page de mon site suite à une erreur (interne au serveur !!!).
Je me suis donc demandé comment retrouver les données  d'un type de contenu  et je me suis mis à fouiner dans la BDD du site.

Dans la version étudiée (8.8.5), 4 tables sont concernées :

  • node_field_data « The data table for node entities » ( la table des données pour les entités de type node) ;
  • inline_block_usage « Track where a block_content entity is used » ( la table des relations blocs - node) ;
  • block_content_field_data « The data table for block_content entities » ( la table des données pour les entités de type  block) ;
  • block_content_revision__body « Revision archive storage for block_content field body » la table du contenu du champ body des blocs).

l algorithme

Pour récupérer le contenu de la page, j'ai procédé en 3 étapes :

  1. trouver l'id du node en recherchant le titre ou une partie du titre dans le champ "title" de la table "node_field_data" ;
  2. récupérer les id des blocs qui constituent la page en recherchant l'id (trouvé à l'étape 1) dans le champ "layout_entity_id" de la table "inline_block_usage" ;
  3. Tant Que tous les id de blocs (trouvés à l'étape 2) n'ont pas été utilisés faire :
    • récupérer le titre du bloc (champ info du revision_id ( le plus grand pour obtenir  la version la plus récente) en recherchant l'id (trouvé à l'étape 2) dans le champ "id"  de la table : "block_content_field_data"
    • récupérer le code html du bloc (champ body_value du revision_id ( le plus grand pour obtenir  la version la plus récente) en recherchant l'id (trouvé à l'étape 2) dans le champ "entity_id"  de la table block_content_revision__body.

L'image ci-dessus illustre la recherche, dans la table node_filed_data de l'id du node dont le titre contient "a faire".
Remarquer l'utilisation de l'opérateur like %...%

L'image ci-dessus illustre le résultat de la recherche dans la table inline_block_usage de l'id 151 du node (colonne layout_entity_id) trouvé lors de la requête illustrée ci-contre. Les id des blocs sont dans la colonne block_content_id.

/>---