EntityMalformedException को डीबग कैसे करें?


16

मुझे घातक त्रुटि EntityMalformedException मिली है : टाइप नोड की इकाई पर बंडल गुण गुम। जब उपयोगकर्ता / xyz तक पहुँचने की कोशिश कर रहा है तब Unit_extract_ids () में (7700 की। \ शामिल \ common.inc)

मैंने लाइन 7700 पर विकृत नोड के बारे में जानकारी प्राप्त करने की कोशिश की, जहां त्रुटि संदेश बनाया गया है, इस तरह से सोचता है:

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) एक अप्रत्याशित उपयोगकर्ता वस्तु, और $ जानकारी चीजों की एक बड़ी मात्रा देता है।

क्या कोई मुझे सही रास्ते पर डाल सकता है?

मैं पहले से ही जो कुछ भी पा सकता था, उसे पढ़ने के लिए मुझे बंडल बंडल की त्रुटियों के बारे में पता था , लेकिन किसी ने भी हल करने में मदद नहीं की।

dpm($entity) रिटर्न

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

यह आमतौर पर एक बहुत ही निम्न स्तर का है जिसे आप केवल डीपीएम () '$ संस्था द्वारा प्राप्त कर सकते हैं। सुनिश्चित करें कि आप स्वयं इकाई को पारित कर रहे हैं - और संस्थाओं का एक सेट नहीं है जो इकाई लोड फ़ंक्शन लौटाते हैं।
आयुष

1
मेरा मतलब था कि यह मूल रूप से जाँच कर रहा है कि अपवाद को फेंकने से पहले बंडल जानकारी मौजूद है या नहीं। यदि आप dpm ($ निकाय) का आउटपुट पोस्ट कर सकते हैं (पाठ्यक्रम की संवेदनशील जानकारी के साथ), तो दूसरों को यह देखने में मदद मिलेगी कि क्या गलत है।
आयुष

3
@Kojo कारण वास्तव में एक बहुत ही सरल है ... कुछ कह रहा है entity_extract_ids('node', $var);, लेकिन इसके लिए एक नोड ऑब्जेक्ट के बजाय $var, यह एक उपयोगकर्ता ऑब्जेक्ट गुजर रहा है। यदि आपके पास कोई कस्टम या देव संस्करण कंट्रिब मॉड्यूल है, तो उन्हें एक-एक करके अक्षम करने का प्रयास करें यह देखने के लिए कि आप अपराधी को ढूंढ सकते हैं
क्लाइव

2
ओह। dpm(debug_print_backtrace());यहाँ अमूल्य होगा। आप देख सकते हैं क्या मॉड्यूल निम्नलिखित कार्य अनुरोध की शुरुआत करने के लिए वापस से यह सब शुरू कर दिया
क्लाइव

1
कोई चिंता नहीं, अगर आप xdebug स्थापित कर सकते हैं और कॉन्फ़िगर के साथ xdebug.collect_params = 4वह भी अपने जीवन में बहुत कुछ आसान हो जाएगा
क्लाइव

जवाबों:


30

त्रुटि:

EntityMalformedException: टाइप नोड की इकाई पर बंडल गुण गुम।

ऐसा इसलिए होता है, क्योंकि आपकी बंडल प्रॉपर्टी लोड या सेव होने पर विकृत हो जाती है, इसलिए Drupal को पता नहीं चल सकता है कि वह किस प्रकार का बंडल है।

उस अपवाद का तर्क है:

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

इसलिए मूल रूप से $info['entity keys']['bundle'](नोड के लिए:) यह ऑब्जेक्ट ( नोड के लिए) typeमें नहीं पाया जा सकता है , इसलिए ड्रुपल को यह पता नहीं है कि यह किस तरह की इकाई के साथ काम कर रहा है। तो सबसे अधिक संभावना है कि आपकी इकाई अमान्य है (जैसे आप इसके बजाय कुछ और लोड कर रहे हैं) या यह सिर्फ खाली है ( है )।$entity$node->type$entityNULL


यदि आपने कोई ड्रुपल कोड संशोधित नहीं किया है, तो यह संभावित रूप से विभिन्न चीजों के कारण हो सकता है (विशिष्ट ड्रुपल मॉड्यूल बग द्वारा सबसे अधिक संभावना है), जैसे:

यहाँ जिम्मेदार कोड है जो ड्रुपल कोर (फ़ाइल:) द्वारा फेंका गया है 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']};
  }

डिबगिंग

यदि आप ऊपर कुछ भी नहीं पहचानते हैं, तो प्रभावित लाइन पर वास्तविक से पहले var_dump(debug_backtrace());या dd(debug_backtrace());(जब डेवेल चालू होता है) उस तरह की त्रुटि को डीबग करना सबसे आसान काम throw new EntityMalformedExceptionहै common.inc

ध्यान दें: dd()डेवेल से फ़ंक्शन का उपयोग आपके ड्रुपल टेंप फ़ोल्डर ( temporary://drupal_debug.txt) में बैकट्रेस डंप के साथ फ़ाइल में डिबगिंग जानकारी उत्पन्न करेगा , अन्यथा स्क्रीन पर डंपिंग होने पर पढ़ने के लिए बहुत बड़ा और मुश्किल हो सकता है। उपयोग करते समय var_dump(), कॉल के die();बाद कॉल करना आसान है और पृष्ठ के दृश्य-स्रोत मोड में डंप की जांच करें।

यदि यह नोड सेव पर हो रहा है, तो अधिक विस्तृत निर्देशों के लिए इस EntityMalformedException पोस्ट को SO पर जांचें ।


निम्नलिखित Drupal समस्या को भी देखें: # 1778572 अधिक विचारों के लिए।


2
इस तरह के एक विस्तृत जवाब के लिए यश! मैंने अपना मुद्दा बहुत समय पहले हल कर लिया था, लेकिन इसमें संदेह नहीं कि यह बहुत सारे लोगों के लिए मददगार होगा।
कोजो

3
यह एक शानदार जवाब है! अधिक अपवाह का वर्णन करता है।
क्रिश्चियन

मैंने dd(debug_backtrace());प्रभावित लाइन के सामने जोड़ा throw new EntityMalformedException, यह सुनिश्चित किया कि देवल सक्षम है और ड्रोन में ड्रोन कमांड को चलाता है जो इस त्रुटि को फेंक रहा है और कोई डीबगिंग आउटपुट नहीं मिल रहा है। मैंने गलत क्या किया? धन्यवाद!
Christia

1
इसे मिला: कमांड ने एक फाइल बनाई, जिसे drupal_debug.txtअंदर /tmp/drupal_theme/"drupal_theme" नाम दिया गया है, जो ड्रुपल थीम का नाम है। अपने उत्कृष्ट डिबगिंग मदद के लिए धन्यवाद!
क्रिस्टिया

8

क्लाइव की टिप्पणियों के लिए धन्यवाद, मैंने निम्नलिखित मुद्दे को हल किया।

जोड़ा गया ddebug_backtrace()जहां फ़ंक्शन कॉल स्टैक को प्रिंट करने के लिए त्रुटि हुई ( एंटिटी_एक्सट्रेक्ट_एड्स), 7700 की। (शामिल \ आम \ _ )।

फिर आउटपुट में कुछ भी अप्रत्याशित नहीं है, मैंने पाया कि एक फलक दृश्यता नियम समस्या हो सकती है।

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

मैंने entity_field_value.incकुछ दिन पहले एक दृश्यता नियम नोटिस को हल करने के लिए एक पैच लागू किया था ... और फ़ील्ड_टेम की स्थिति के साथ एक परीक्षण दृश्यता नियम बनाया।

अब पैच reverting या किसी भी फलक दृश्यता नियम को हटाने से मौजूदा EntityMalformedException बग हल हो गई ... शक्तिशाली ddebug_backtrace()!


मैंने इस तरीके को आजमाया और मुझे फ्रंट एंड पर कोड की 1000 की लाइन मिल गई। आप कैसे देखते हैं कि त्रुटि कहाँ है?
सैम

@Sam Kenorb जवाब पर एक नज़र है, यह आपकी मदद कर सकता है
Kojo

0

अनाथ नोड्स होने पर यह मुद्दा सामने आता है, बस उनसे छुटकारा पाएं और क्रोन बिना किसी त्रुटि के चलेगा। खोज अनुक्रमण अंत में 100% हो जाएगा। आगे बढ़ने से पहले अपने डेटाबेस का बैकअप लें।

मान लें कि आपके पास phpMyAdmin तक पहुंच है, नोड्स की पहचान करने के लिए इस SQL ​​कोड को चलाएं और फिर उन्हें हटा दें। मेरे प्रश्न सामग्री प्रकार मशीन का नाम अपने विशिष्ट सामग्री प्रकार मशीन के नाम के साथ एक के बाद एक तब तक बदलें जब तक आपको कोई परिणाम नहीं मिल जाता है, जो कि हटाने के बाद है।

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

आप नीचे दिए गए SQL कोड का उपयोग करके अनाथ नोड्स को हटा सकते हैं। अपने विशिष्ट नोड आईडी के साथ कोष्ठक में संख्याओं को बदलें

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.