Mam błąd krytyczny EntityMalformedException: Brak właściwości pakietu w jednostce typu node. w instance_extract_ids () (wiersz 7700 z. \ zawiera \ common.inc) podczas próby uzyskania dostępu do użytkownika / xyz .
Próbowałem pobrać informacje o zniekształconym węźle w linii 7700, gdzie budowany jest komunikat o błędzie, myślę:
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)
zwraca nieoczekiwany obiekt użytkownika, a $ info ogromną ilość rzeczy.
Czy ktoś mógłby postawić mnie na właściwej drodze?
Przeczytałem już wszystko, co mogłem znaleźć na temat błędów właściwości brakujących pakietów , ale żadne nie pomogło w rozwiązaniu.
dpm($entity)
zwroty
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);
, ale zamiast obiektu węzła$var
przekazuje obiekt użytkownika. Jeśli masz jakieś niestandardowe lub deweloperskie moduły contrib, spróbuj je wyłączać jeden po drugim, aby zobaczyć, że możesz znaleźć winowajcędpm(debug_print_backtrace());
będą tu bezcenne. Możesz zobaczyć, który moduł zaczął to wszystko, podążając za funkcjami z powrotem do początku żądaniaxdebug.collect_params = 4
, znacznie ułatwi ci to życieOdpowiedzi:
Błąd:
tak się dzieje, ponieważ twoja właściwość pakietu jest zniekształcona podczas ładowania lub zapisywania, więc Drupal nie może znaleźć, jaki to rodzaj pakietu.
Logika tego wyjątku jest następująca:
Więc w zasadzie wartości
$info['entity keys']['bundle']
(dla węzła to:)type
nie można znaleźć w$entity
obiekcie ($node->type
dla węzła), dlatego Drupal nie wie, z jakim bytem ma do czynienia. Więc najprawdopodobniej twój byt jest nieprawidłowy (np. Ładujesz coś innego) lub jest po prostu pusty ($entity
jestNULL
).Jeśli nie zmodyfikowałeś żadnego kodu Drupal, może to być spowodowane różnymi czynnikami (najprawdopodobniej konkretnym błędem modułu Drupal), takimi jak:
zapisywanie nieprawidłowego obiektu, takiego jak:
type
w obiekcie węzła (np. niepoprawnie wygenerowany przez Devel Generate?);osierocone węzły w tabeli węzłów;
węzły posiadające nieprawidłowe / nieistniejące odniesienia; w przypadku danych terminowych można to sprawdzić:
Gdzie
field_data_field_some_ref
jest pole danych,field_some_ref
które jest rodzajem „terminu odniesienia”.Zobacz: Rekordy DB nie są usuwane dla pól referencyjnych terminu po usunięciu terminu
posiadanie osieroconych warunków taksonomii (abyś mógł skorzystać z systemu taksonomii Sierociniec );
nieprawidłowy kod niestandardowy (błąd ludzki), taki jak:
!empty()
przetestuj zmienną encji przed wywołaniemfield_get_items()
,Oto odpowiedzialny kod generowany przez rdzeń Drupala (plik:)
common.inc
:Debugowanie
Jeśli nie rozpoznajesz niczego powyżej, najłatwiejszą metodą debugowania tego rodzaju błędu jest umieszczenie
var_dump(debug_backtrace());
lubdd(debug_backtrace());
(gdy Devel jest włączony) przed rzeczywistymthrow new EntityMalformedException
w linii, której dotyczy problemcommon.inc
.Uwaga: użycie
dd()
funkcji z Devel wygeneruje informacje debugowania do pliku w folderze tymczasowym Drupal (temporary://drupal_debug.txt
) z zrzutem śladu wstecznego, w przeciwnym razie może być zbyt duży i trudny do odczytania podczas zrzutu na ekran. Podczas korzystaniavar_dump()
łatwiej jest zadzwonićdie();
po połączeniu i sprawdzić zrzut w trybie widoku źródła strony.Jeśli dzieje się tak podczas zapisywania węzła, sprawdź ten wpis EntityMalformedException w SO, aby uzyskać bardziej szczegółowe instrukcje.
Zobacz także następujący problem Drupal: # 1778572, aby uzyskać więcej pomysłów.
źródło
dd(debug_backtrace());
do dotkniętej linii przedthrow new EntityMalformedException
, upewniłem się, że Devel jest włączony i uruchomiłem komendę drush w cronie, która generuje ten błąd i nie otrzymuję żadnych danych debugowania. Co zrobiłem źle? Dzięki!drupal_debug.txt
inside,/tmp/drupal_theme/
gdzie „drupal_theme” to nazwa motywu drupal. Dziękujemy za doskonałą pomoc w debugowaniu!Dzięki komentarzom Clive rozwiązałem problem w następujący sposób.
Dodano
ddebug_backtrace()
miejsce wystąpienia błędu ( entity_extract_ids (), wiersz 7700 z. \ Zawiera \ common.inc ), aby wydrukować stos wywołań funkcji.Następnie szukając czegoś nieoczekiwanego w danych wyjściowych, odkryłem, że problemem może być reguła widoczności okienka .
Miałem zastosowano poprawkę na
entity_field_value.inc
kilka dni temu po prostu rozwiązać zawiadomienie reguły widoczność ... i stworzył zasadę widoczności test z warunku field_theme.Teraz cofanie poprawki lub usuwanie reguły widoczności okien rozwiązało bieżący błąd EntityMalformedException ... Potężny
ddebug_backtrace()
!źródło
Ten problem pojawia się, gdy istnieją osierocone węzły, po prostu się ich pozbądź, a cron będzie działał bez żadnego błędu. Indeksowanie wyszukiwania w końcu osiągnie 100%. Przed kontynuowaniem wykonaj kopię zapasową bazy danych.
Zakładając, że masz dostęp do phpMyAdmin, uruchom ten kod SQL, aby zidentyfikować węzły, a następnie je usunąć. Zastąp moje pytanie nazwa typu zawartości maszyny nazwą twojego konkretnego typu zawartości, jeden po drugim, aż nie uzyskasz żadnego wyniku, to znaczy po usunięciu.
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
Możesz usunąć osierocone węzły za pomocą kodu SQL poniżej. Zamień liczby w nawiasie na określone identyfikatory węzłów
DELETE from node where nid IN (12779,12780,12781,12782)
źródło