field_attach_form()を使用して、コンテンツタイプの特定のフィールドをカスタムフォームに追加しています。フォームが送信されると、#validateおよび#submitコールバックからfield_attach_form_validate()およびfield_attach_submit()を呼び出してこれらのフィールドを処理しています。
その時点で、投稿後の準備されたノードオブジェクトを元のノードと比較し、フィールドのいずれかが変更された場合にのみnode_save()を使用します。したがって、最初にを使用して元のノードをロードしますentity_load_unchanged()
。
残念ながら、元のノードオブジェクトのフィールド配列は、フィールドに変更が加えられていない場合でも、保存を待機している準備済みノードオブジェクトのフィールド配列と一致しないため、単純な "$ old_field == $ new_field 「比較は不可能です。たとえば、元のテキストフィールドは次のように表示されます。
$old_node->field_text['und'][0] = array(
'value' => 'Test',
'format' => NULL,
'safe_value' => 'Test',
);
一方、準備されたノードでは次のように表示されます。
$node->field_text['und'][0] = array(
'value' => 'Test',
);
「値」キーを比較するだけでよいと思うかもしれませんが、「値」キーを持たない他の要素で構成されたフィールドに遭遇します。例えば、NO「値」キーが存在しないアドレス・フィールドでの見てみましょうと対応していない古い、準備ノードの両方のキーがあります。
古いノード
$old_node->field_address['und'][0] = array(
'country' => 'GB',
'administrative_area' => 'Test',
'sub_administrative_area' => NULL,
'locality' => 'Test',
'dependent_locality' => NULL,
'postal_code' => 'Test',
'thoroughfare' => 'Test',
'premise' => 'Test',
'sub_premise' => NULL,
'organisation_name' => 'Test',
'name_line' => 'Test',
'first_name' => NULL,
'last_name' => NULL,
'data' => NULL,
);
準備されたノード
$node->field_address['und'][0] = array(
'element_key' => 'node|page|field_address|und|0',
'thoroughfare' => 'Test',
'premise' => 'Test',
'locality' => 'Test',
'administrative_area' => 'Test',
'postal_code' => 'Test',
'country' => 'GB',
'organisation_name' => 'Test',
'name_line' => 'Test',
);
空のフィールドについては、さらに別の矛盾があります。
古いノード
$old_node->field_text = array();
準備されたノード
$node->field_text = array(
'und' => array(),
);
一般に、フィールドの古い値と新しい値を比較して、変更されたかどうかを検出できますか?
これは単なる不可能ですか?
_field_invoke()
「準備された」ノードから完全なフィールド構造を準備し、両方のフィールドをレンダリングして、これらのHTML文字列を単純に比較するために、あなたは遊んだり何か関連することができると思います。ただのアイデア。