web-dev-qa-db-ja.com

EntityMetadataWrapper set()の無害化されたテキスト入力

検索を通じて、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()に渡す必要がありますか?ここで髪の毛を分割しているかもしれませんが、正しいことを確実にしたいと思います。

8
Spencer Brooks

justを設定した場合、valueを設定すると、Drupalはタグをエンティティに変換しないとHTMLを表示しません。したがって、値_<p>Foo bar</p>_は、ビュー(およびその他の領域)では文字通り_&lt;p&gt;Foo bar&lt;/p&gt;_として表示されます。

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);
_
6
Spencer Brooks