কীভাবে সত্ত্বা মলফর্মডেক্সশন ডিবাগ করবেন?


16

আমি মারাত্মক ত্রুটি পেয়েছি এন্টিমলফর্মএক্সেপশন: টাইপ নোডের সত্তায় বান্ডিল সম্পত্তি হারিয়েছে। ব্যবহারকারীর / xyz অ্যাক্সেস করার চেষ্টা করার সময় সত্তা_সেক্সট্র্যাক_আইডিগুলিতে () (77 77০০ এর লাইন \। কমন.ইনস অন্তর্ভুক্ত) রয়েছে

আমি ত্রুটি বার্তাটি যেখানে নির্মিত হয়েছে যেখানে 00 77০০ লাইনে ত্রুটিযুক্ত নোড সম্পর্কে তথ্য পুনরুদ্ধার করার চেষ্টা করেছি, এমনটি মনে করে:

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) অপ্রত্যাশিত ব্যবহারকারী অবজেক্ট, এবং a তথ্যকে বিশাল পরিমাণ প্রদান করে।

কেউ আমাকে সঠিক পথে রাখতে পারেন?

বান্ডিল সম্পত্তি মিস করার বিষয়ে আমি যা খুজে পেয়েছি তা ইতিমধ্যে পড়েছি ত্রুটি তবে কোনওটিই সমাধান করতে সহায়তা করেনি।

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
আমি বোঝাতে চেয়েছিলাম যে এটি ব্যান্ডেল তথ্য ব্যতিক্রম ছোঁড়ার আগে উপস্থিত রয়েছে কিনা তা মূলত যাচাই করছে। আপনি যদি ডিএমএম ($ সত্তা) এর আউটপুট পোস্ট করতে পারেন (সংবেদনশীল তথ্য অবশ্যই ঝাপসা করে) তবে এটি অন্যকে কী ভুল তা দেখতে সহায়তা করবে।
আইয়েশক

3
@ কোজো কারণটি আসলেই একটি সহজ সাধারণ ... কিছু কল করছে entity_extract_ids('node', $var);, তবে কোনও নোডের পরিবর্তে $varএটি ব্যবহারকারীর অবজেক্টকে অতিক্রম করছে। আপনার যদি কোনও কাস্টম বা ডেভ ভার্সন অবদান মডিউল থাকে, তবে একে অপরকে এটি অক্ষম করে দেখার চেষ্টা করুন এটি অপরাধীটি খুঁজে পেতে পারেন
ক্লাইভ

2
বাবা। dpm(debug_print_backtrace());এখানে অমূল্য হবে। অনুরোধের শুরুতে ফাংশনগুলি অনুসরণ করে মডিউলটি কীভাবে শুরু হয়েছিল তা আপনি দেখতে পাবেন
ক্লাইভ

1
কোনও উদ্বেগ নেই, আপনি যদি xdebug ইনস্টল ও এর সাথে কনফিগার xdebug.collect_params = 4করতে পারেন তবে আপনার জীবনকে আরও সহজ করে তুলবে
ক্লাইভ

উত্তর:


30

ভূল:

অ্যান্টিমালফর্মএক্সেপশন: টাইপ নোডের সত্তায় বান্ডিল সম্পত্তি হারিয়েছে।

ঘটে, কারণ আপনার বান্ডিল সম্পত্তিটি লোড বা সেভের ক্ষেত্রে হয় ত্রুটিযুক্ত, সুতরাং ড্রুপাল এটি খুঁজে পাচ্ছে না এটি কী ধরণের বান্ডিল।

এই ব্যতিক্রমটির যুক্তিটি হ'ল:

// 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নোডের জন্য), সুতরাং দ্রুপাল জানেন না এটি কী ধরণের সত্তার সাথে কাজ করছে with সুতরাং সম্ভবত আপনার সত্তাটি অবৈধ (যেমন আপনি পরিবর্তে অন্য কোনও কিছু লোড করছেন) বা এটি খালি ( $entityহ'ল NULL)।


আপনি যদি কোনও ড্রুপাল কোড সংশোধন না করে থাকেন তবে এটি সম্ভাব্য বিভিন্ন ধরণের জিনিসগুলির দ্বারা ঘটতে পারে (সম্ভবত নির্দিষ্ট দ্রুপাল মডিউল বাগ দ্বারা), যেমন:

এখানে দায়বদ্ধ কোড যা ড্রুপাল কোর (ফাইল 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());(যখন ডেভেল চালু থাকে) bythrow new EntityMalformedExceptioncommon.inc

দ্রষ্টব্য: dd()দেভেল থেকে ফাংশনটি ব্যবহার করা আপনার ড্রপাল টেম্প ফোল্ডারে ( temporary://drupal_debug.txt) ব্যাকট্র্যাস ডাম্পের সাহায্যে ফাইলটিতে ডিবাগিং তথ্য উত্পন্ন করবে , অন্যথায় স্ক্রিনে ডাম্পিং করার সময় পড়তে খুব বড় এবং অসুবিধা হতে পারে। ব্যবহার করার সময় var_dump(), কল করা আরও সহজdie(); পরে কল করা এবং পৃষ্ঠার ভিউ-উত্স মোডে ডাম্প পরীক্ষা করা easier

যদি নোড সেভের ক্ষেত্রে এটি ঘটে থাকে তবে আরও বিস্তারিত নির্দেশাবলীর জন্য এসও-তে এই এনটিটিমলফর্মএক্সেপশন পোস্টটি দেখুন।


নিম্নলিখিত দ্রুপাল সমস্যাটিও দেখুন: # 1778572 আরও ধারণার জন্য।


2
এরকম বিস্তারিত উত্তরের জন্য কুডোস! আমি দীর্ঘদিন আগে আমার সমস্যা সমাধান করেছি, তবে সন্দেহ নেই যে এটি অনেক লোকের পক্ষে সহায়ক হবে, আমি অন্তর্ভুক্ত করেছি।
কোজো

3
এটি একটি দুর্দান্ত উত্তর! আরও upvotes প্রাপ্য।
খ্রিস্টান

আমি dd(debug_backtrace());সামনের দিকে প্রভাবিত লাইনে যুক্ত হয়েছি throw new EntityMalformedException, ডেলিভ সক্ষম হয়েছে কিনা তা নিশ্চিত করে ক্রোনটিতে ড্রাশ কমান্ড চালিয়েছে যা এই ত্রুটিটি ছুঁড়েছে এবং কোনও ডিবাগিং আউটপুট পাচ্ছে না। আমি কি ভুল করছি? ধন্যবাদ!
খ্রিস্টিয়া

1
এটি খুঁজে পেয়েছে : কমান্ডটি drupal_debug.txtভিতরে একটি ফাইল তৈরি করেছে /tmp/drupal_theme/যেখানে "ড্রুপাল_থেম" ড্রুপাল থিমের নাম। আপনার চমৎকার ডিবাগিং সাহায্যের জন্য ধন্যবাদ!
খ্রিস্টিয়া

8

ক্লাইভ মন্তব্যে ধন্যবাদ, আমি নিম্নলিখিত হিসাবে সমস্যাটি সমাধান করেছি।

যোগ করা হয়েছে ddebug_backtrace()যেখানে ত্রুটি ঘটেছে ( entity_extract_ids (), লাইনের 7700। \ \ Common.inc অন্তর্ভুক্ত ফাংশন কল স্ট্যাকের প্রিন্ট করতে)।

তারপরে আউটপুটটিতে অপ্রত্যাশিত যে কোনও কিছুর সন্ধান করে আমি খুঁজে পেলাম যে একটি ফলকটির দৃশ্যমানতার বিধি সমস্যা হতে পারে।

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কিছুদিন আগে কেবল একটি দৃশ্যমানতার বিধি বিজ্ঞপ্তি সমাধান করার জন্য একটি প্যাচ প্রয়োগ করেছি had ... এবং ফিল্ড-থিম শর্ত দিয়ে একটি পরীক্ষা দৃশ্যমানতার নিয়ম তৈরি করেছি।

এখন প্যাচটি ফিরিয়ে দেওয়া বা কোনও ফলক দৃশ্যমানতার বিধি সরিয়ে ফেললে বর্তমান অ্যান্টিমেলফোর্ডএক্সেপশন বাগ সমাধান করা যায় ... শক্তিশালী ddebug_backtrace()!


আমি এই পদ্ধতিটি চেষ্টা করেছি এবং আমি সামনের প্রান্তে 1000 এর কোড লাইন পেয়েছি। ত্রুটি কোথায় রয়েছে তা আপনি কীভাবে দেখবেন?
স্যাম

@ স্যামের কেনোরব উত্তরটি দেখুন, এটি আপনাকে সহায়তা করতে পারে
কোজো

0

যখন অনাথ নোড থাকে তখন এই সমস্যাটি উপস্থিত হয়, কেবল এগুলি থেকে মুক্তি পান এবং ক্রোন কোনও ত্রুটি ছাড়াই চলবে। অনুসন্ধান সূচক শেষ পর্যন্ত 100% এ পাবেন। এগিয়ে যাওয়ার আগে আপনার ডাটাবেসটিকে ব্যাকআপ দিন।

ধরে নিই যে আপনার পিএইচপিএমআইএডমিনে অ্যাক্সেস রয়েছে, নোডগুলি সনাক্ত করতে এই এসকিউএল কোডটি চালান তারপরে সেগুলি মুছুন। আমার প্রশ্নের সামগ্রী সামগ্রী টাইপ মেশিনের নামটিকে আপনার নির্দিষ্ট সামগ্রী ধরণের মেশিনের নাম একের পরে একের পরে প্রতিস্থাপন করুন যতক্ষণ না আপনি কোনও ফল পান না, সেটি মুছে ফেলার পরে।

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

আপনি নীচে এসকিউএল কোড ব্যবহার করে অনাথ নোডগুলি মুছতে পারেন। আপনার নির্দিষ্ট নোড আইডি দিয়ে বন্ধনীতে নম্বরগুলি প্রতিস্থাপন করুন

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.