Come eseguire il debug di EntityMalformedException?


16

Ho un errore irreversibile EntityMalformedException: proprietà bundle mancante sull'entità di tipo nodo. in entity_extract_ids () (riga 7700 di. \ Includes \ common.inc) quando si tenta di accedere a user / xyz .

Ho provato a recuperare informazioni sul nodo non valido alla riga 7700, in cui viene creato il messaggio di errore, come:

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) restituisce un oggetto utente imprevisto e $ info una quantità enorme di cose.

Qualcuno potrebbe mettermi sulla strada giusta?

Ho già letto tutto quello che ho potuto trovare sugli errori di proprietà del bundle mancante , ma nessuno mi ha aiutato a risolverlo.

dpm($entity) ritorna

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

Questo è di solito un livello piuttosto basso che puoi scoprire solo da dpm () in $ entity. Assicurati di passare l'entità stessa e non un insieme di entità restituite dalle funzioni di caricamento dell'entità.
AyeshK,

1
Intendevo dire che sta fondamentalmente controllando l'esistenza delle informazioni sul pacchetto prima di lanciare l'eccezione. Se potessi pubblicare l'output di dpm ($ entity) (con le informazioni sensibili sfocate ovviamente), ciò aiuterebbe gli altri a vedere cosa c'è che non va.
AyeshK,

3
@Kojo La causa è in realtà molto semplice ... qualcosa sta chiamando entity_extract_ids('node', $var);, ma invece di un oggetto nodo per $var, sta passando un oggetto utente. Se hai moduli contrib personalizzati o dev versione, prova a disabilitarli uno per uno per vederlo, puoi trovare il colpevole
Clive

2
Yikes. dpm(debug_print_backtrace());sarà prezioso qui. Puoi vedere quale modulo ha iniziato tutto seguendo le funzioni all'inizio della richiesta
Clive

1
Nessun problema, se riesci a installare e configurare xdebug con xdebug.collect_params = 4questo ti renderà anche la vita molto più semplice
Clive

Risposte:


30

L'errore:

EntityMalformedException: proprietà bundle mancante sull'entità del tipo nodo.

accade perché la proprietà del bundle non è corretta al momento del caricamento o del salvataggio, quindi Drupal non riesce a trovare il tipo di bundle.

La logica di tale eccezione è:

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

Quindi sostanzialmente il valore di $info['entity keys']['bundle'](per il nodo è:) non typepuò essere trovato $entitynell'oggetto ( $node->typeper il nodo), quindi Drupal non sa con quale tipo di entità abbia a che fare. Quindi molto probabilmente la tua entità non è valida (ad esempio stai caricando qualcos'altro invece) o è semplicemente vuota (lo $entityè NULL).


Se non hai modificato alcun codice Drupal, questo potrebbe essere causato da una varietà di cose (molto probabilmente da specifici bug del modulo Drupal), come:

Ecco il codice responsabile che viene generato dal core Drupal (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']};
  }

Debug

Se non riconosci nulla sopra, la cosa più semplice per eseguire il debug di quel tipo di errore è posizionando var_dump(debug_backtrace());o dd(debug_backtrace());(quando Develop è attivo) prima dell'effettivo throw new EntityMalformedExceptionsulla linea interessata common.inc.

Nota: l'uso della dd()funzione da Devel genererà le informazioni di debug sul file nella cartella Temp di Drupal ( temporary://drupal_debug.txt) con dump di backtrace, altrimenti potrebbe essere troppo grande e difficile da leggere quando si scarica sullo schermo. Durante l'utilizzo var_dump(), è più facile chiamare die();dopo la chiamata e controllare il dump nella modalità di visualizzazione sorgente della pagina.

Se ciò accade durante il salvataggio del nodo, controllare questo post EntityMalformedException su SO per istruzioni più dettagliate.


Vedi anche il seguente numero di Drupal: # 1778572 per ulteriori idee.


2
complimenti per una risposta così dettagliata! Ho risolto il mio problema molto tempo fa, ma senza dubbio questo sarà utile per molte persone, me compreso.
Kojo

3
Questa è una risposta fantastica! Merita più voti.
Christian,

Ho aggiunto dd(debug_backtrace());alla linea interessata di fronte throw new EntityMalformedException, assicurato che Develop sia abilitato ed eseguito il comando drush in cron che sta lanciando questo errore e non sto ottenendo alcun output di debug. Che cosa ho fatto di sbagliato? Grazie!
Christia,

1
Trovato: il comando ha creato un file chiamato drupal_debug.txtall'interno in /tmp/drupal_theme/cui "drupal_theme" è il nome del tema drupal. Grazie per l'eccellente aiuto nel debug!
Christia,

8

Grazie ai commenti di Clive, ho risolto il problema come segue.

Aggiunto ddebug_backtrace()dove si è verificato un errore ( entity_extract_ids (), riga 7700 di. \ Includes \ common.inc ) per stampare lo stack di chiamate di funzione.

Quindi, cercando qualcosa di inaspettato nell'output, ho scoperto che una regola di visibilità del riquadro potrebbe essere il 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)
      //...

Avevo applicato una patch entity_field_value.incAlcuni giorni fa solo per risolvere un avviso sulla regola di visibilità ... e creato una regola di visibilità di prova con una condizione field_theme.

Ora il ripristino della patch o la rimozione di qualsiasi regola di visibilità del riquadro ha risolto il bug EntityMalformedException corrente ... Potente ddebug_backtrace()!


Ho provato questo metodo e ho ottenuto migliaia di righe di codice sul front-end. Come vedi dove si trova l'errore?
Sam

@ Sam dai un'occhiata alla risposta di Kenorb, potrebbe aiutarti
Kojo

0

Questo problema si presenta quando ci sono nodi orfani, basta eliminarli e cron verrà eseguito senza errori. L'indicizzazione della ricerca arriverà finalmente al 100%. Eseguire il backup del database prima di procedere.

Supponendo di avere accesso a phpMyAdmin, eseguire questo codice SQL per identificare i nodi, quindi eliminarli. Sostituisci il mio nome di macchina con il tipo di contenuto della domanda con il tuo nome di macchina con il tipo di contenuto specifico uno dopo l'altro fino a quando non ottieni alcun risultato, ovvero dopo l'eliminazione.

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

È possibile eliminare i nodi orfani utilizzando il codice SQL riportato di seguito. Sostituisci i numeri tra parentesi con i tuoi ID nodo specifici

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.