EntityMalformedException hata ayıklama nasıl?


16

Ben önemli hata var EntityMalformedException: tip düğümün varlık üzerinde demeti özelliği eksik. kullanici / xyz öğesine erişmeye çalışırken , varlık_extract_ids () 'de (. \ içerir. \ include \ common.inc satırı) .

Hata iletisinin oluşturulduğu 7700 satırındaki hatalı biçimlendirilmiş düğüm hakkında bilgi almaya çalıştım:

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) beklenmeyen bir kullanıcı nesnesi döndürür ve $ info çok sayıda şey döndürür.

Birisi beni doğru yola koyabilir mi?

Zaten eksik paket özelliği hataları hakkında bulabildiğim her şeyi okudum , ancak hiçbiri çözülmesine yardımcı olmadı.

dpm($entity) İadeler

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

Bu genellikle $ varlık tarafından sadece dpm () ile öğrenebileceğiniz oldukça düşük seviyeli bir düzeydir. Varlık yükleme işlevlerinin döndürdüğü varlık kümesini değil, varlığı kendinizden geçirdiğinizden emin olun.
AyeshK

1
Temelde istisna atmadan önce paket bilgilerinin var olup olmadığını kontrol etmek demekti. Dpm ($ entity) çıktısını gönderebiliyorsanız (hassas bilgiler elbette bulanıktır), bu başkalarının neyin yanlış olduğunu görmesine yardımcı olacaktır.
AyeshK

3
@Kojo Nedeni aslında çok basit ... bir şey çağırıyor entity_extract_ids('node', $var);, ama bir düğüm nesnesi yerine $varbir kullanıcı nesnesini geçiyor. Herhangi bir özel veya dev sürümü katkıda bulunan modülleriniz varsa, suçluyu bulabilmek için tek tek devre dışı bırakmayı deneyin
Clive

2
Amanın. dpm(debug_print_backtrace());burada çok değerli olacak. İsteğin başlangıcına kadar olan işlevleri izleyerek hangi modülün her şeyi başlattığını görebilirsiniz
Clive

1
Endişelenmeyin, xdebug'u kurup yapılandırırsanız xdebug.collect_params = 4, hayatınızı çok daha kolaylaştıracak
Clive

Yanıtlar:


30

Hata:

EntityMalformedException: Tip düğümü varlığında eksik paket özelliği.

bundle özelliğiniz yükte veya tasarrufta hatalı biçimlendirildiğinden, Drupal ne tür bir paket olduğunu bulamaz.

Bu İstisna mantığı:

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

Yani temelde değeri $info['entity keys']['bundle'](düğüm için öyle: type) içinde bulunamaz $entity(nesnenin $node->type, bu nedenle Drupal tür varlığın o uğraşan yarayanlarla bilmiyor düğüm için). Büyük olasılıkla varlığınız geçersizdir (örneğin, bunun yerine başka bir şey yüklüyorsunuz) veya boştur ( $entityis NULL).


Herhangi bir Drupal kodunu değiştirmediyseniz, bu muhtemelen aşağıdakiler gibi çeşitli şeylerden (büyük olasılıkla belirli Drupal modül hatası nedeniyle) kaynaklanabilir:

İşte Drupal çekirdeği tarafından atılan sorumlu kod (dosya:) 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']};
  }

Hata ayıklama

Yukarıdaki hiçbir şeyi tanımıyorsanız, bu tür bir hata ayıklamak için en kolay şey , etkilenen çizgiye gerçek olanın önüne yerleştirmek var_dump(debug_backtrace());veya dd(debug_backtrace());(Devel açıkken) yapmaktır .throw new EntityMalformedExceptioncommon.inc

Not: dd()Devel işlevini kullanmak , geri izleme dökümü ile Drupal temp klasörünüzdeki ( temporary://drupal_debug.txt) dosyaya hata ayıklama bilgilerini oluşturur , aksi takdirde ekrana dökülürken okunması çok büyük ve zor olabilir. Kullanırken var_dump(), aramadan die();sonra aramak ve sayfanın görünüm kaynağı modunda dökümü kontrol etmek daha kolaydır .

Düğüm kaydında bu oluyorsa, daha ayrıntılı talimatlar için SO'daki bu EntityMalformedException yayınını kontrol edin .


Ayrıca, aşağıdaki Drupal sorununa bakın: # 1778572 Daha fazla fikir için.


2
böyle ayrıntılı bir cevap için kudos! Sorunumu uzun zaman önce çözdüm, ancak bunun pek çok insan için yararlı olacağından şüphe yok.
Kojo

3
Bu harika bir cevap! Daha fazla oyu hak ediyor.
Hristiyan

Eklediğim dd(debug_backtrace());önünde etkilenen hattına throw new EntityMalformedException, emin Devel etkindir yaptı ve bu hatayı atıyor ve herhangi ayıklama çıktı almıyorum cron drush komutunu koştu. Neyi yanlış yaptım? Teşekkürler!
Christia

1
Bulundu: komut drupal_debug.txtiçinde /tmp/drupal_theme/"drupal_theme" drupal temasının adı olarak adlandırılan bir dosya yarattı . Mükemmel hata ayıklama yardımınız için teşekkürler!
Christia

8

Clive yorumları sayesinde sorunu şu şekilde çözdüm.

Eklenen ddebug_backtrace()hatası (oluştu burada entity_extract_ids (), hat 7700. \ \ Common.inc içeren işlev çağrısı yığını baskı).

Sonra çıktı beklenmedik bir şey arıyorum, bir bölme görünürlük kuralı sorun olabilir bulundu .

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.incBirkaç gün önce bir görünürlük kuralı bildirimini çözmek için bir yama uyguladım ... ve bir field_theme koşulu ile bir test görünürlük kuralı oluşturdum.

Şimdi yama geri döndürme veya herhangi bir bölme görünürlük kuralını kaldırmak mevcut EntityMalformedException hata çözüldü ... Güçlü ddebug_backtrace()!


Bu yöntemi denedim ve ön ucunda 1000 kod satırı var. Hatanın nerede olduğunu nasıl görüyorsunuz?
Sam

@ Kenam'ın cevabına bir göz atın, size yardımcı olabilir
Kojo

0

Bu sorun artık yetim düğümler olduğunda ortaya çıkar, onlardan kurtulun ve cron hatasız çalışacaktır. Arama dizine ekleme sonunda% 100 elde edilir. Devam etmeden önce veritabanınızı yedekleyin.

PhpMyAdmin'e erişiminiz olduğunu varsayarsak, düğümleri tanımlamak için bu SQL kodunu çalıştırın ve ardından silin. Benim değiştirin soru hiçbir sonuç almak kadar, birbiri ardına özel içerik türü makine adı biriyle içerik türü makine adını o silme sonra en.

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

Artık düğümleri aşağıdaki SQL kodunu kullanarak silebilirsiniz. Köşeli parantez içindeki sayıları özel düğüm kimliklerinizle değiştirin

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.