Bereinigte Texteingabe für EntityMetadataWrapper set ()

8

Durch die Suche habe ich viele Beispiele gefunden, die die EntityMetadataWrapper- set()Funktion zum Aktualisieren von Entitätsfeldern verwenden, und sie erfolgreich in meinem Modul implementiert. Ich konnte jedoch nicht viel Dokumentation / Best Practices für die verschiedenen Array-Optionen finden, an die Sie übergeben können set(). Ich möchte sicherstellen, dass die Art und Weise, wie ich Daten aktualisiere, später keine unvorhergesehenen Probleme verursacht.

Ich mache eine einfache Aktualisierung der Textfeldwerte in einem Formular-Rückruf:

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();
}

Ich übergebe set()ein Array mit nur einem Schlüssel : value. Dies scheint gut zu funktionieren. Ich stelle jedoch fest, dass beim Aufrufen value()desselben Felds vor dem Festlegen eines neuen Werts ein Array mit drei Schlüsseln zurückgegeben wird:

$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>',
// )

So wie ich aktuelle Einstellungsfelder bin, verliere ich den bereinigten Wert. Wird das zurückkommen, um mich zu beißen? Sollte ich check_markup()auf dem Wert laufen und übergeben formatund safe_valuean set(), anstatt ein Array mit nur value? Ich spalte hier vielleicht Haare, aber ich möchte sicherstellen, dass ich die Dinge richtig mache.

Spencer Brooks
quelle

Antworten:

6

Es stellt sich heraus, dass Drupal Ihren HTML-Code nicht anzeigt , wenn Sie nur die valueTags festlegen , ohne Ihre Tags in Entitäten zu konvertieren. Der Wert <p>Foo bar</p>wird also buchstäblich in Ansichten (und anderen Bereichen) als angezeigt &lt;p&gt;Foo bar&lt;/p&gt;.

Anstatt safe_valuevor dem Aufruf zu versuchen, selbst eine Bereinigung zu erstellen , set()stellte ich fest, dass formatDrupal die Übergabe für mich mit den für dieses Format definierten Filtereinstellungen übernimmt , wenn ich einen Wert übergeben habe.

Die richtige Syntax lautet also:

$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);
Spencer Brooks
quelle