¿Cómo depurar EntityMalformedException?

16

Tengo un error fatal EntityMalformedException: falta la propiedad del paquete en la entidad del tipo de nodo. en entity_extract_ids () (línea 7700 de. \ incluye \ common.inc) al intentar acceder al usuario / xyz .

Traté de recuperar información sobre el nodo con formato incorrecto en la línea 7700, donde se genera el mensaje de error, piensa así:

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) devuelve un objeto de usuario inesperado, y $ info una gran cantidad de cosas.

¿Podría alguien ponerme en el camino correcto?

Ya leí todo lo que pude encontrar sobre los errores de propiedad del paquete faltante , pero ninguno ayudó a resolverlo.

dpm($entity) devoluciones

uid (String, 2 characters ) 70
name (String, 9 characters ) John
pass (String, 55 characters ) $S$DUwPuOuDPiDL4nRTYXqc7a5uOfMKey7pyhOFUEKka1XM...
mail (String, 30 characters ) john@example.com
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 ) john@example.com
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
Kojo
fuente
Por lo general, este es un nivel bastante bajo que puede descubrir simplemente dpm () 'en la entidad $. Asegúrese de pasar la entidad en sí misma, y ​​no un conjunto de entidades que devuelven las funciones de carga de la entidad.
AyeshK
1
Quise decir que básicamente está verificando si existe la información del paquete antes de lanzar la excepción. Si pudiera publicar la salida de dpm ($ entity) (con la información confidencial borrosa, por supuesto), eso ayudará a otros a ver qué está mal.
AyeshK
3
@Kojo La causa es realmente muy simple ... algo está llamando entity_extract_ids('node', $var);, pero en lugar de un objeto de nodo $var, está pasando un objeto de usuario. Si tiene módulos de contribución de versiones de desarrollo o personalizados, intente deshabilitarlos uno por uno para ver si puede encontrar al culpable
Clive
2
Yikes dpm(debug_print_backtrace());Será invaluable aquí. Puede ver qué módulo comenzó todo siguiendo las funciones hasta el comienzo de la solicitud
Clive
1
No se preocupe, si puede instalar y configurar xdebug con xdebug.collect_params = 4eso, también le hará la vida mucho más fácil
Clive

Respuestas:

30

El error:

EntityMalformedException: falta la propiedad del paquete en la entidad del tipo de nodo.

sucede, porque su propiedad de paquete está mal formada al cargar o guardar, por lo que Drupal no puede encontrar qué tipo de paquete es.

La lógica de esa excepción es:

// 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)));
}

Entonces, básicamente, el valor de $info['entity keys']['bundle'](para el nodo es:) typeno se puede encontrar en el $entityobjeto ( $node->typepara el nodo), por lo tanto, Drupal no sabe con qué tipo de entidad se trata. Por lo tanto, lo más probable es que su entidad no sea válida (por ejemplo, está cargando algo más) o simplemente está vacía ( $entityestá NULL).


Si no ha modificado ningún código de Drupal, esto puede ser causado por una variedad de cosas (muy probablemente por un error específico del módulo de Drupal), como:

Aquí está el código responsable que arroja Drupal core (file:) 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']};
  }

Depuración

Si no reconoce nada de lo anterior, lo más fácil de depurar ese tipo de error es colocando var_dump(debug_backtrace());o dd(debug_backtrace());(cuando Devel está activado) antes del real throw new EntityMalformedExceptionen la línea afectada common.inc.

Nota: El uso de la dd()función de Devel generará la información de depuración en el archivo en su carpeta temporal Drupal ( temporary://drupal_debug.txt) con volcado de seguimiento, de lo contrario podría ser demasiado grande y difícil de leer al volcar en la pantalla. Cuando se usa var_dump(), es más fácil llamar die();después de la llamada y verificar el volcado en el modo de fuente de vista de la página.

Si esto sucede en el guardado del nodo, consulte esta publicación de EntityMalformedException en SO para obtener instrucciones más detalladas.


Consulte también el siguiente número de Drupal: # 1778572 para obtener más ideas.

kenorb
fuente
2
¡Felicitaciones por una respuesta tan detallada! Resolví mi problema hace mucho tiempo, pero sin duda esto será útil para mucha gente, incluido yo.
Kojo
3
¡Esta es una respuesta fantástica! Merece más votos a favor.
Christian
He añadido dd(debug_backtrace());a la línea afectada frente throw new EntityMalformedException, se aseguró devel está activado y ejecutó el comando drush en cron que está lanzando este error y no estoy recibiendo ninguna salida de depuración. ¿Qué hice mal? ¡Gracias!
Christia
1
Lo encontré: el comando creó un archivo llamado drupal_debug.txtdentro /tmp/drupal_theme/donde "drupal_theme" es el nombre del tema drupal. ¡Gracias por su excelente ayuda de depuración!
Christia
8

Gracias a los comentarios de Clive, resolví el problema de la siguiente manera.

Se agregó ddebug_backtrace()donde ocurrió el error ( entity_extract_ids (), línea 7700 de. \ Incluye \ common.inc ) para imprimir la pila de llamadas de función.

Luego, buscando algo inesperado en el resultado, descubrí que una regla de visibilidad del panel podría ser el problema.

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)
      //...

Me había aplicado un parche entity_field_value.inchace unos días solo para resolver un aviso de regla de visibilidad ... y creé una regla de visibilidad de prueba con una condición field_theme.

Ahora, revertir el parche o eliminar cualquier regla de visibilidad del panel solucionó el error actual de EntityMalformedException ... ddebug_backtrace()¡ Potente !

Kojo
fuente
Probé este método y obtuve miles de líneas de código en el front-end. ¿Cómo ves dónde está el error?
Sam
@Sam echa un vistazo a la respuesta de Kenorb, podría ayudarte
Kojo
0

Este problema surge cuando hay nodos huérfanos, simplemente deshazte de ellos y cron se ejecutará sin ningún error. La indexación de búsqueda finalmente llegará al 100%. Haga una copia de seguridad de su base de datos antes de continuar.

Suponiendo que tiene acceso a phpMyAdmin, ejecute este código SQL para identificar los nodos y luego bórrelos. Reemplace mi nombre de máquina de tipo de contenido de pregunta con su nombre de máquina de tipo de contenido específico uno tras otro hasta que no obtenga ningún resultado, después de eliminarlo.

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

Puede eliminar los nodos huérfanos utilizando el código SQL a continuación. Reemplace los números en el soporte con sus ID de nodo específicos

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

Koech
fuente