致命的なエラーが発生しましたEntityMalformedException:ノードタイプのエンティティにバンドルプロパティがありません。 entity_extract_ids()(。\ includes\common.incの7700行目)ser/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 propertyエラーについて見つけたものはすべて読みましたが、解決に役立ちませんでした。
dpm($entity)
は
_uid (String, 2 characters ) 70
name (String, 9 characters ) John
pass (String, 55 characters ) $S$DUwPuOuDPiDL4nRTYXqc7a5uOfMKey7pyhOFUEKka1XM...
mail (String, 30 characters ) [email protected]
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 ) [email protected]
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
_
クライブのコメントのおかげで、私は次のように問題を解決しました。
エラーが発生したddebug_backtrace()
を追加(entity_extract_ids()、。\ includes\common.incの7700行目)、関数呼び出しスタックを出力します。
次に、出力で予期しないものを探したところ、ペインの可視性ルールが問題である可能性があることがわかりました。
_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()
!
エラー:
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
_ is NULL
)。
Drupalコードを変更していない場合、これはさまざまな原因で発生する可能性があります(おそらく特定のDrupalモジュールのバグ))。
無効なエンティティを保存 など:
type
がありません(たとえば、Devel Generateによって誤って生成された場合);孤立したノード ノードテーブル内。
無効または存在しない参照を持つノード。用語データの場合、これは次の方法で確認できます。
_drush sqlq "SELECT nid, title from node WHERE nid IN (select entity_id from field_data_field_some_ref WHERE field_some_ref_tid not IN (select tid from taxonomy_term_data));"
_
ここで、_field_data_field_some_ref
_は、「用語参照」のタイプである_field_some_ref
_のデータフィールドです。
孤立した分類法の用語がある(つまり、 Taxonomy Orphanage を使用できます);
次のような無効なカスタムコード(ヒューマンエラー)
!empty()
を呼び出す前にエンティティ変数をテストしますfield_get_items()
、Drupal core(file:_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']};
}
_
上記のいずれも認識できない場合、その種類のエラーをデバッグする最も簡単な方法は、実際の_throw new EntityMalformedException
_の前にvar_dump(debug_backtrace());
またはdd(debug_backtrace());
(Develがオンの場合)を配置することです。 _common.inc
_の影響を受ける行。
注:Develのdd()
関数を使用すると、バックトレースダンプで Drupal temp folder (_temporary://drupal_debug.txt
_)のファイルにデバッグ情報が生成されます。そうしないと、大きすぎて、画面にダンプすると読みにくい。 var_dump()
を使用すると、呼び出し後にdie();
を呼び出して、ページのソース表示モードでダンプを確認する方が簡単です。
これがノードの保存時に発生している場合は、これを確認してください SOのEntityMalformedExceptionポスト より詳細な手順。
次のDrupal問題: #1778572 も参照してください。).
この問題は、孤立したノードがある場合に発生します。孤立したノードを取り除くだけで、cronはエラーなしで実行されます。検索のインデックス作成は最終的に100%になります。続行する前にデータベースをバックアップしてください。
PhpMyAdminへのアクセス権があると想定して、このSQLコードを実行してノードを識別し、ノードを削除します。私のquestionコンテンツタイプマシン名を特定のコンテンツタイプマシン名に次々と置き換えて、結果が得られなくなるまで、つまり削除した後です。
_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コードを使用して、孤立したノードを削除できます。括弧内の数字を特定のノードIDに置き換えます
DELETE from node where nid IN (12779,12780,12781,12782)