drupal 7 自定义字段中的所见即所得

Bar*_*och 2 drupal drupal-7 drupal-fapi

我正在尝试在 drupal 7 中构建一个自定义字段。除了所见即所得字段之外,一切都工作得很好。我正在使用下一个代码来构建所见即所得元素:

$element['my_body'] = array(
  '#title' => t('Editor'),
  '#type' => 'text_format',
  '#tree' => true,
  '#rows' => 20,
  '#format' => 'filtered_html',
 );
Run Code Online (Sandbox Code Playgroud)

当它不是所见即所得(常规文本区域)时,所有保存都很好,但是在我将其更改为text_format之后,drupal将字段的值获取为带有2个键(值和格式)的数组,这会在drupal保存值时出错场。据我了解,drupal 期望获得的是两个不同的值(body_filter 和格式),而不是具有 2 个键(值和格式)的 body_filter 数组。

任何人都可以给我提示如何解决这个问题(在 google 和 drupal.org 中找不到任何相关内容)?

谢谢。

小智 5

我遇到了同样的问题,并找到了解决方案,感谢 Berdir 的提示。

正如您提到的“text_format”返回一个包含两个值的数组,例如:

$items[0]['MY_WYSIWYG_FIELD'] = array(
    'value' => 'some text.',
    'format' => 'filtered_html'
);
Run Code Online (Sandbox Code Playgroud)

使用 hook_field_presave() 我能够准备值以将其保存到我的数据库中。

由于我不想保存格式值,因此我只需从 ['MY_WYSIWYG_FIELD'] 数组中提取文本值,并将该数组替换为提取的值:

$items[0]['MY_WYSIWYG_FIELD'] = 'some text.';
Run Code Online (Sandbox Code Playgroud)

我的钩子看起来像这样:

function MY_FIELD_MODULE_field_presave($entity_type, $entity, $field, $instance, $langcode, &$items) {
    if ($field['type'] == 'MY_FIELD_TYPE') {
    foreach ($items as $delta => $item) {
    if (isset($item['MY_WYSIWYG_FIELD'])) {
        $value = $item['MY_WYSIWYG_FIELD']['value'];
        $items[$delta]['MY_WYSIWYG_FIELD'] = $value;
        }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!