検索を通じて、EntityMetadataWrapper set()
関数を使用してエンティティフィールドを更新する多くの例を見つけ、モジュールに正常に実装しました。ただし、set()
に渡すことができるさまざまな配列オプションに関するドキュメント/ベストプラクティスの方法で多くを見つけることができませんでした。データの更新方法によって、後で予期しない問題が発生しないことを確認したいと思います。
フォーム送信コールバックのテキストフィールド値を直接更新しています。
_function hook_FORM_ID_submit(&$form, &$form_state) {
// Get the node.
$node = node_load($form_state['nid']);
// Create entity metadata wrapper to get and set values easily.
$node_wrapper = entity_metadata_wrapper('node', $node, array('bundle', $node->type));
// Set fields
$node_wrapper->field_quip->set(array("value" => $form_state['values']['field_quip']['value']));
$node_wrapper->field_short_sentence_summary->set(array("value" => $form_state['values']['field_short_sentence_summary']['value']));
// Save node.
$node_wrapper->save();
}
_
set()
に、1つのキーのみの配列value
を渡しています。これは正常に動作しているようです。ただし、新しい値を設定する前に同じフィールドでvalue()
を呼び出すと、3つのキーを持つ配列が返されることに気付きました。
_$original_value = $node_wrapper->field_quip->value();
// Output of $original_value:
// Array (
// 'value' => '<p>The original value</p>',
// 'format' => 'general',
// 'safe_value' => '<p>The original safe value</p>',
// )
_
現在のフィールド設定方法では、サニタイズされた値が失われています。これは私を噛むために戻ってきますか?値でcheck_markup()
を実行し、format
だけの配列ではなく、value
および_safe_value
_をset()
に渡す必要がありますか?ここで髪の毛を分割しているかもしれませんが、正しいことを確実にしたいと思います。
justを設定した場合、value
を設定すると、Drupalはタグをエンティティに変換しないとHTMLを表示しません。したがって、値_<p>Foo bar</p>
_は、ビュー(およびその他の領域)では文字通り_<p>Foo bar</p>
_として表示されます。
set()
を呼び出す前に無菌化された_safe_value
_を自分で作成しようとするのではなく、format
値を渡した場合、Drupalはそのフォーマット用に定義されたフィルター設定で私のためにサニタイズの世話をします。
したがって、正しい構文は次のとおりです。
_$quip = array(
"value" => $form_state['values']['field_quip']['value'],
// Change to match the text format of your field.
"format" => "general"
);
$node_wrapper->field_quip->set($quip);
_