06 avr 2015

Il suffit de taper "EntityMalformedException" sur Google pour se rendre compte que cette erreur est à la fois fréquente sur les sites Drupal et difficile à résoudre. Pour ma part, j'ai rencontré cette erreur en effectuant la migration d'un site Drupal de la version 6 vers la version 7. Ce site était construit autour de "Organic groups", ce qui rendait sa migration un peu complexe. Lors de l'activation de la version 7 du module "Organic Groups", un message est apparu, me demandant de "Reconstruire les permissions d'accès au contenu".Normal. Mais après avoir essayé de reconstruire ces permissions, cette erreur fatale s'affichait : "EntityMalformedException: Missing bundle property on entity of type node. in entity_extract_ids() ....dans /includes/common.inc ligne 7789". Que signifie cette erreur ? Dans l'un des bundles de l'entité de type "node", il manque une propriété ($bundle->propriété). Nous savons où l'affichage de cette erreur est déclenché ("/includes/common.inc ligne 7789"), il nous reste à savoir ce qui la déclenche. Pour cela faisons appel à la fonction PHP debug_print_backtrace() Cette fonction affiche la pile d'exécution PHP et nous permet de reconstruire ainsi la suite des événements avant l'affichage de l'erreur. Ligne 7789 de /includes/common.inc se trouve ce code :

// Explicitly fail for malformed entities missing the bundle property.
    if (!isset($entity->{$info['entity keys']['bundle']}) || $entity->{$info['entity keys']['bundle']} === '') {      
      throw new EntityMalformedException(t('Missing bundle property on entity of type @entity_type.', array('@entity_type' => $entity_type)));
    }

Nous allons donc insérer

dpm(debug_print_backtrace());

juste avant l'appel de l'exception :(Pour utiliser la fonction dpm(), il faut avoir installé le module Devel).

// Explicitly fail for malformed entities missing the bundle property.
    if (!isset($entity->{$info['entity keys']['bundle']}) || $entity->{$info['entity keys']['bundle']} === '') {    
      dpm(debug_print_backtrace());  
      throw new EntityMalformedException(t('Missing bundle property on entity of type @entity_type.', array('@entity_type' => $entity_type)));
    }

Dans l'affichage résultant, cherchez les "node" et leur "nid", puisque l'erreur nous parle de "nodes". Pour ma part, il y avait trois nodes, node/5561, node/5562 et node/5563. Je pouvais voir que leur type était vide (type => ,). Il m'a suffit d'aller dans PhpMyadmin dans la table "node" et de filtrer par "type" : Ces trois "nodes" avaient un type vide. Après leur suppression, tout est rentré dans l'ordre, j'ai pu reconstruire les permissions et continuer le processus normal de la migration !