web-dev-qa-db-fra.com

Comment déboguer EntityMalformedException?

J'ai une erreur fatale EntityMalformedException: propriété de bundle manquante sur l'entité de type node. dans entity_extract_ids () (ligne 7700 de.\includes\common.inc) lors de la tentative d'accès à l'utilisateur/xyz.

J'ai essayé de récupérer des informations sur le nœud mal formé à la ligne 7700, où le message d'erreur est généré, pense comme:

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

dpm($entity) renvoie un objet utilisateur inattendu, et $ info une énorme quantité de choses.

Quelqu'un pourrait-il me mettre sur la bonne voie?

J'ai déjà lu tout ce que je pouvais trouver sur les erreurs de propriété de bundle manquantes, mais aucune n'a aidé à les résoudre.

dpm($entity) renvoie

uid (String, 2 characters ) 70
name (String, 9 characters ) John
pass (String, 55 characters ) $S$DUwPuOuDPiDL4nRTYXqc7a5uOfMKey7pyhOFUEKka1XM...
mail (String, 30 characters ) [email protected]
theme (String, 0 characters )
signature (String, 0 characters )
signature_format (String, 13 characters ) filtered_html
created (String, 10 characters ) 1396286331
access (String, 10 characters ) 1397146661
login (String, 10 characters ) 1396513460
status (String, 1 characters ) 1
timezone (NULL)
language (String, 2 characters ) fr
picture (NULL)
init (String, 30 characters ) [email protected]
data (Array, 5 elements)
roles (Array, 1 element)
og_user_node (Array, 0 elements)
message_subscribe_email (Array, 1 element)
field_bio (Array, 0 elements)
field_name_first (Array, 1 element)
field_name_last (Array, 1 element)
field_facebook_url (Array, 0 elements)
field_linkedin_url (Array, 0 elements)
field_Twitter_url (Array, 0 elements)
user_trusted_contacts (Array, 1 element)
group_group (Array, 1 element)
group_access (Array, 1 element)
metatags (Array, 0 elements)
rdf_mapping (Array, 3 elements)
realname (String, 13 characters ) John Doe
content (Array, 13 elements)
entity_view_prepared (Boolean) TRUE
privatemsg_disabled (Boolean) FALSE
16
Kojo

Grâce aux commentaires de Clive, j'ai résolu le problème comme suit.

ddebug_backtrace() où l'erreur s'est produite ( entity_extract_ids (), ligne 7700 de.\Includes\common.inc) pour imprimer la pile d'appels de fonctions.

Puis, à la recherche de quelque chose d'inattendu dans la sortie, j'ai trouvé qu'une règle de visibilité du volet pouvait être le problème.

19: ctools_entity_field_value_ctools_access_check() (Array, 2 elements)
  file (String, 81 characters ) profiles\commons\modules\contrib\ctools\plugins...
  $...['19: ctools_entity_field_value_ctools_access_check()']['file']
    profiles\commons\modules\contrib\ctools\plugins\access\entity_field_value.inc:213
  args (Array, 3 elements)
    0 (Array, 2 elements)
      field_theme (Array, 1 element)
      //...

J'avais appliqué un correctif sur entity_field_value.inc Il y a quelques jours seulement pour résoudre un avis de règle de visibilité ... et créé une règle de visibilité de test avec une condition field_theme.

Désormais, la restauration du correctif ou la suppression de toute règle de visibilité de volet a résolu le bogue EntityMalformedException actuel ... Powerful ddebug_backtrace()!

8
Kojo

L'erreur:

EntityMalformedException: propriété de bundle manquante sur l'entité de type noeud.

se produit, car votre propriété de bundle est mal formée lors du chargement ou de la sauvegarde, donc Drupal ne peut pas trouver de quel type de bundle il s'agit.

La logique de cette exception est la suivante:

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

Donc, fondamentalement, la valeur de $info['entity keys']['bundle'] (Pour le nœud c'est: type) ne peut pas être trouvée dans l'objet $entity ($node->type Pour le nœud), donc Drupal ne sait pas avec quel type d'entité il s'agit. Par conséquent, votre entité n'est probablement pas valide (par exemple, vous chargez quelque chose d'autre à la place) ou elle est simplement vide ($entity Est NULL).


Si vous n'avez modifié aucun code Drupal, cela peut potentiellement être causé par diverses choses (très probablement par un bogue spécifique du module Drupal), comme:

Voici le code responsable qui est jeté par Drupal core (fichier: common.inc):

 if (!empty($info['entity keys']['bundle'])) {
    // 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)));
    }
    $bundle = $entity->{$info['entity keys']['bundle']};
  }

Débogage

Si vous ne reconnaissez rien ci-dessus, la chose la plus simple pour déboguer ce type d'erreur est de placer var_dump(debug_backtrace()); ou dd(debug_backtrace()); (lorsque Devel est activé) avant le throw new EntityMalformedException sur la ligne affectée dans common.inc.

Remarque: L'utilisation de la fonction dd() de Devel générera les informations de débogage dans le fichier de votre dossier temporaire Drupal (temporary://drupal_debug.txt) Avec un backtrace, sinon il pourrait être trop gros et difficile à lire lors du dumping sur l'écran. Lorsque vous utilisez var_dump(), il est plus facile d'appeler die(); après l'appel et de vérifier le vidage en mode source d'affichage de la page.

Si cela se produit lors de l'enregistrement du nœud, vérifiez ceci EntityMalformedException post at SO pour des instructions plus détaillées.


Voir aussi le problème Drupal suivant: # 1778572 pour plus d'idées.

31
kenorb

Ce problème survient lorsqu'il existe des nœuds orphelins, il suffit de s'en débarrasser et cron s'exécutera sans aucune erreur. L'indexation de la recherche atteindra enfin 100%. Sauvegardez votre base de données avant de continuer.

En supposant que vous ayez accès à phpMyAdmin, exécutez ce code SQL pour identifier les nœuds puis supprimez-les. Remplacez mon question nom de machine de type de contenu par votre nom de machine de type de contenu spécifique l'un après l'autre jusqu'à ce que vous n'obteniez aucun résultat, c'est-à-dire après la suppression.

SELECT n.nid, n.title, n.vid, nr.vid FROM drcm_node n LEFT JOIN drcm_node_revision nr ON nr.nid = n.nid WHERE n.type = 'question' AND nr.vid IS NULL ORDER BY n.nid ASC

Vous pouvez supprimer les nœuds orphelins en utilisant le code SQL ci-dessous. Remplacez les numéros dans le support par vos ID de nœud spécifiques

DELETE from node where nid IN (12779,12780,12781,12782)

0
Koech