Як налагодити EntityMalformedException?


16

У мене сталася фатальна помилка EntityMalformedException: Відсутнє властивість пакету для сутності вузла типу. у entity_extract_ids () (рядок 7700 від. \ включає \ common.inc) при спробі доступу до користувача / xyz .

Я намагався отримати інформацію про неправильно сформований вузол у рядку 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) повертає несподіваний об’єкт користувача та $ info величезна кількість речей.

Чи може хтось поставити мене на правильний шлях?

Я вже читав все, що міг знайти про помилки у відсутності властивостей пакета , але жодна не допомогла вирішити.

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

Зазвичай це досить низький рівень, про який можна дізнатися лише dpm () '$ суттю $. Переконайтеся, що ви передаєте сутність, а не набір сутностей, до яких повертаються функції завантаження.
АйешК

1
Я мав на увазі, що це в основному перевірка, чи існує інформація про пакет, перш ніж викидати виняток. Якщо ви можете опублікувати висновок dpm ($ сутність) (зрозуміла інформація розмита), це допоможе іншим зрозуміти, що не так.
АйешК

3
@Kojo Причина насправді дуже проста ... щось дзвонить entity_extract_ids('node', $var);, але замість об'єкта вузла для $varвін передає об’єкт користувача. Якщо у вас є якісь спеціальні модулі або модулі для розробників версій для розробників, спробуйте відключити їх один за одним, щоб побачити його, ви можете знайти винуватця
Клайв

2
Yikes. dpm(debug_print_backtrace());буде тут неоціненним. Ви можете побачити, який модуль запустив все це, дотримуючись функцій на початку запиту
Clive

1
Не хвилюйтесь, якщо ви зможете встановити та налаштувати xdebug xdebug.collect_params = 4, це також полегшить ваше життя
Clive

Відповіді:


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для вузла), тому Drupal не знає, з якою суттю він має справу. Тому, швидше за все, ваша організація недійсна (наприклад, ви завантажуєте щось інше), або вона просто порожня ( $entityє NULL).


Якщо ви не змінили жодного коду Drupal, це може бути спричинене різними речами (швидше за все, певною помилкою модуля Drupal), наприклад:

Ось відповідальний код, який викидає ядро ​​Drupal (файл:) 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());(коли Devel увімкнено) перед фактичним throw new EntityMalformedExceptionу рядку, на який впливає common.inc.

Примітка: Використання dd()функції від Devel генерує інформацію про налагодження до файлу у вашій папці tempal temp ( temporary://drupal_debug.txt) із зворотним дамп, інакше може бути занадто великим і важким для читання при скиданні на екран. Під час використання var_dump()простіше зателефонувати die();після дзвінка та перевірити дамп у режимі перегляду джерел сторінки.

Якщо це відбувається при збереженні вузла, перевірте цей пост EntityMalformedException в SO для отримання більш детальних інструкцій.


Дивіться також наступний випуск Drupal: # 1778572 для отримання додаткових ідей.


2
кудо за таку детальну відповідь! Я вирішив своє питання давно, але не сумніваюся, що це буде корисно для багатьох людей, включаючи мене.
Коджо

3
Це фантастична відповідь! Заслуговує більшої кількості нагород.
Крістіан

Я додав dd(debug_backtrace());до порушеного рядка перед throw new EntityMalformedException, переконався, що Devel увімкнено і запустив команду drush у cron, яка кидає цю помилку, і я не отримую жодного результату налагодження. Що я зробив не так? Спасибі!
Крістен

1
Виявив це: команда створила файл, названий drupal_debug.txtвсередині, /tmp/drupal_theme/де "drupal_theme" - назва теми drupal. Дякуємо за відмінну допомогу з налагодження!
Крістен

8

Завдяки коментарям Клайва, я вирішив питання наступним чином.

Додано, ddebug_backtrace()де сталася помилка ( entit_extract_ids (), рядок 7700. \ Включає \ звичайний.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кілька разів тому застосував виправлення, щоб вирішити повідомлення про правило видимості ... і створив тестове правило видимості з умовою field_theme.

Тепер повернення виправлення або видалення будь-якого правила видимості панелі вирішено поточну помилку 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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.