Я получил фатальную ошибку EntityMalformedException: отсутствует свойство пакета на объекте типа узла. в entity_extract_ids () (строка 7700 из. \ includes \ common.inc) при попытке доступа к user / 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 - огромное количество вещей.
Может ли кто-нибудь поставить меня на правильный путь?
Я уже прочитал все, что мог найти об ошибках в свойствах Missing bundle , но ни одна из них не помогла решить.
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
entity_extract_ids('node', $var);
, но вместо объекта узла$var
он передает объект пользователя. Если у вас есть пользовательские модули или модули для разработки версий, попробуйте отключить их один за другим, чтобы увидеть, что вы можете найти виновникаdpm(debug_print_backtrace());
будет неоценимым здесь. Вы можете увидеть , что модуль начал все это прочь, следуя функции вернуться к началу запросаxdebug.collect_params = 4
, это также сделает вашу жизнь намного прощеОтветы:
Ошибка:
случается, потому что ваше свойство bundle искажено либо при загрузке, либо при сохранении, поэтому Drupal не может найти тип этого пакета.
Логика этого исключения:
Так что в принципе значение
$info['entity keys']['bundle']
(для узла it:)type
невозможно найти в$entity
объекте ($node->type
для узла), поэтому Drupal не знает, с каким типом сущности он имеет дело. Поэтому, скорее всего, ваша сущность недействительна (например, вы загружаете что-то другое) или она просто пуста ($entity
естьNULL
).Если вы не модифицировали какой-либо код Drupal, это может быть вызвано различными причинами (скорее всего, конкретной ошибкой модуля Drupal), такими как:
сохранение недействительной сущности, такой как:
type
в объекте узла (например, неправильно сгенерирован Devel Generate?);осиротевшие узлы в таблице узлов;
узлы, имеющие недействительные / несуществующие ссылки; для срочных данных это может быть проверено:
Где
field_data_field_some_ref
поле данных,field_some_ref
тип которого является ссылкой на термин.Смотрите: Записи БД не удаляются для Поля ссылки на термин после удаления термина
наличие сиротских таксономических терминов (так что вы можете использовать таксономический приют );
неверный пользовательский код (человеческая ошибка), такой как:
!empty()
проверить переменную сущности перед вызовомfield_get_items()
,Вот ответственный код, который генерируется ядром Drupal (файл:
common.inc
:Отладка
Если вы ничего не узнали выше, проще всего отладить такого рода ошибку, поместив
var_dump(debug_backtrace());
илиdd(debug_backtrace());
(когда Devel включен) перед фактическимthrow new EntityMalformedException
в строке, на которую влияютcommon.inc
.Примечание: использование
dd()
функции из Devel создаст отладочную информацию для файла в вашей временной папке Drupal (temporary://drupal_debug.txt
) с дампом обратной трассировки, в противном случае он может быть слишком большим и трудным для чтения при выводе на экран. При использованииvar_dump()
проще позвонитьdie();
после звонка и проверить дамп в режиме просмотра источника на странице.Если это происходит при сохранении узла, проверьте эту запись EntityMalformedException в SO для получения более подробных инструкций.
Смотрите также следующую проблему Drupal: # 1778572 для большего количества идей.
источник
dd(debug_backtrace());
к соответствующей строке перед собойthrow new EntityMalformedException
, убедился, что Devel включен, и выполнил команду drush в cron, которая выдает эту ошибку и не получает никаких результатов отладки. Что я сделал не так? Благодарность!drupal_debug.txt
внутри,/tmp/drupal_theme/
где "drupal_theme" - это название темы drupal. Спасибо за вашу отличную помощь в отладке!Благодаря комментариям Клайва я решил проблему следующим образом.
Добавлено,
ddebug_backtrace()
когда произошла ошибка ( entity_extract_ids (), строка 7700 из. \ Includes \ common.inc ), чтобы напечатать стек вызовов функций.Затем, ища что-то неожиданное в выводе, я обнаружил, что проблема может быть в правиле видимости панели .
Я применил патч
entity_field_value.inc
несколько дней назад, чтобы решить проблему с правилом видимости. ... и создал тестовое правило видимости с условием field_theme.Теперь исправление патча или удаление любого правила видимости панели решило текущую ошибку EntityMalformedException ... Мощно
ddebug_backtrace()
!источник
Эта проблема возникает, когда есть потерянные узлы, просто избавьтесь от них, и cron будет работать без ошибок. Поисковая индексация, наконец, достигнет 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)
источник