Como depurar EntityMalformedException?

16

Eu tenho um erro fatal EntityMalformedException: propriedade do pacote ausente na entidade do tipo node. em entity_extract_ids () (linha 7700 de. \ inclui \ common.inc) ao tentar acessar o usuário / xyz .

Eu tentei recuperar informações sobre o nó mal formado na linha 7700, onde a mensagem de erro é criada, pensa assim:

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) retorna um objeto de usuário inesperado e $ info uma quantidade enorme de coisas.

Alguém poderia me colocar no caminho certo?

Já li o que pude encontrar sobre os erros de propriedade do pacote ausente , mas nenhum ajudou a solucionar.

dpm($entity) retorna

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
Kojo
fonte
Geralmente é um nível bastante baixo que você pode descobrir apenas dpm () na entidade $. Verifique se você está passando a própria entidade - e não um conjunto de entidades que as funções de carregamento de entidade retornam.
precisa saber é o seguinte
1
Eu quis dizer o que é basicamente verificar se as informações do pacote existem antes de lançar a exceção. Se você pudesse postar a saída do dpm ($ entity) (com as informações confidenciais borradas, é claro), isso ajudará outras pessoas a ver o que está errado.
precisa saber é o seguinte
3
@Kojo A causa é realmente muito simples ... algo está chamando entity_extract_ids('node', $var);, mas em vez de um objeto de nó $var, está passando um objeto de usuário. Se você tiver alguma personalizados ou versão dev módulos contrib, tente desabilitá-los um por um para ver que você pode encontrar o culpado
Clive
2
Caramba. dpm(debug_print_backtrace());será inestimável aqui. Você pode ver qual módulo iniciou tudo seguindo as funções do início da solicitação
Clive
1
Não se preocupe, se você pode instalar e configurar o xdebug, xdebug.collect_params = 4isso também tornará sua vida muito mais fácil
Clive

Respostas:

29

O erro:

EntityMalformedException: propriedade do pacote ausente na entidade do tipo node.

acontece, porque sua propriedade de pacote configurável está incorreta ao carregar ou salvar, portanto, o Drupal não consegue encontrar que tipo de pacote é esse.

A lógica dessa exceção é:

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

Então, basicamente, o valor de $info['entity keys']['bundle'](para o nó é:) não typepode ser encontrado no $entityobjeto ( $node->typepara o nó), portanto, o Drupal não sabe com que tipo de entidade está lidando. Portanto, provavelmente sua entidade é inválida (por exemplo, você está carregando outra coisa) ou está vazia ( $entityestá NULL).


Se você não modificou nenhum código Drupal, isso pode ser causado por várias coisas (provavelmente por um erro específico do módulo Drupal), como:

Aqui está o código responsável que é lançado pelo núcleo do Drupal (arquivo:) 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']};
  }

Depuração

Se você não reconhecer nada acima, a coisa mais fácil para depurar esse tipo de erro é colocando var_dump(debug_backtrace());ou dd(debug_backtrace());(quando Devel estiver ativado) antes do real throw new EntityMalformedExceptionna linha afetada common.inc.

Nota: O uso da dd()função de Devel gerará as informações de depuração para o arquivo na pasta temporária Drupal ( temporary://drupal_debug.txt) com despejo de backtrace, caso contrário, pode ser muito grande e difícil de ler ao despejar na tela. Ao usar var_dump(), é mais fácil ligar die();após a ligação e verificar o despejo no modo de fonte de exibição da página.

Se isso estiver acontecendo no salvamento do nó, verifique esta postagem EntityMalformedException no SO para obter instruções mais detalhadas.


Veja também a seguinte edição do Drupal: # 1778572 para mais idéias.

kenorb
fonte
2
parabéns por uma resposta tão detalhada! Resolvi meu problema há muito tempo, mas não há dúvida de que isso será útil para muitas pessoas, inclusive eu.
Kojo
3
Esta é uma resposta fantástica! Merece mais votos positivos.
Christian
Eu adicionei dd(debug_backtrace());à linha afetada na frente throw new EntityMalformedException, verifiquei se o Devel está habilitado e executei o comando drush no cron que está lançando esse erro e não estou obtendo nenhuma saída de depuração. O que eu fiz errado? Obrigado!
Christia
1
Encontrou: o comando criou um arquivo chamado drupal_debug.txtdentro de /tmp/drupal_theme/onde "drupal_theme" é o nome do tema drupal. Obrigado por sua excelente ajuda na depuração!
Christia
8

Graças aos comentários do Clive, resolvi o problema da seguinte maneira.

Adicionado ddebug_backtrace()onde ocorreu o erro ( entity_extract_ids (), linha 7700 de. \ Includes \ common.inc ) para imprimir a pilha de chamadas de função.

Depois, procurando por algo inesperado na saída, descobri que uma regra de visibilidade do painel pode ser o problema.

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)
      //...

Apliquei um patch entity_field_value.inchá alguns dias apenas para resolver um aviso de regra de visibilidade ... e criei uma regra de visibilidade de teste com uma condição field_theme.

Agora, reverter o patch ou remover qualquer regra de visibilidade do painel resolveu o erro atual de EntityMalformedException ... Poderoso ddebug_backtrace()!

Kojo
fonte
Eu tentei esse método e tenho milhares de linhas de código no front-end. Como você vê onde está o erro?
Sam
@Sam dar uma olhada em resposta Kenorb, pode ajudá-lo
Kojo
0

Esse problema surge quando há nós órfãos, basta se livrar deles e o cron será executado sem nenhum erro. A indexação de pesquisa finalmente chegará a 100%. Faça backup do seu banco de dados antes de continuar.

Supondo que você tenha acesso ao phpMyAdmin, execute este código SQL para identificar os nós e exclua-os. Substitua minha pergunta nome da máquina do tipo de conteúdo pelo nome específico da máquina do tipo de conteúdo, um após o outro, até que você não obtenha resultado, após a exclusão.

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

Você pode excluir os nós órfãos usando o código SQL abaixo. Substitua os números no suporte pelos IDs de nós específicos

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

Koech
fonte