EntityMetadataWrapper set()のサニタイズされたテキスト入力


8

検索の結果、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()値にして渡すformatsafe_valueするset()というだけの配列よりも、value?ここで髪の毛を分割しているかもしれませんが、正しいことを確実にしたいと思います。

回答:


6

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

safe_value呼び出す前に自分自身をサニタイズしたものを作成しようとするのではなくset()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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.