Nhập văn bản được khử trùng cho EntityMetadataWrapper set ()


8

Thông qua tìm kiếm, tôi đã tìm thấy rất nhiều ví dụ sử dụng set()hàm EntityMetadataWrapper để cập nhật các trường thực thể và đã triển khai thành công trong mô-đun của mình. Tuy nhiên, tôi không thể tìm thấy nhiều tài liệu / cách thực hành tốt nhất trên các tùy chọn mảng khác nhau mà bạn có thể chuyển qua set(). Tôi muốn đảm bảo rằng cách tôi đang cập nhật dữ liệu sẽ không gây ra sự cố không lường trước sau này.

Tôi đang thực hiện cập nhật đơn giản các giá trị trường văn bản dưới dạng gửi lại cuộc gọi:

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

Tôi đang truyền set()một mảng chỉ với một khóa : value. Điều này dường như đang làm việc tốt. Tuy nhiên, tôi nhận thấy rằng khi tôi gọi value()trên cùng một trường trước khi tôi đặt một giá trị mới, nó sẽ trả về một mảng có ba khóa:

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

Cách tôi đang thiết lập các trường hiện tại, tôi mất giá trị vệ sinh. Điều này sẽ trở lại để cắn tôi? Tôi có nên chạy check_markup()trên giá trị và chuyển formatsafe_valueđến set(), chứ không phải là một mảng chỉ value? Tôi có thể đang chia tóc ở đây, nhưng tôi muốn chắc chắn rằng tôi làm đúng.

Câu trả lời:


6

Hóa ra nếu bạn chỉ đặt value, Drupal sẽ không hiển thị HTML của bạn mà không chuyển đổi các thẻ của bạn thành các thực thể. Vì vậy, giá trị <p>Foo bar</p>sẽ được hiển thị theo nghĩa đen trong Lượt xem (và các khu vực khác) dưới dạng &lt;p&gt;Foo bar&lt;/p&gt;.

Thay vì cố gắng tự tạo vệ sinh safe_valuetrước khi gọi set(), tôi thấy rằng nếu tôi chuyển một formatgiá trị, Drupal sẽ chăm sóc vệ sinh cho tôi với các cài đặt bộ lọc được xác định cho định dạng đó.

Vì vậy, cú pháp đúng là:

$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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.