【问题标题】:Drupal 7 Custom Field Widget not saving user inputDrupal 7 自定义字段小部件不保存用户输入
【发布时间】:2013-02-28 08:16:32
【问题描述】:

我正在构建一个自定义字段模块来与我们的流媒体视频提供商合作。作为其中的一部分,我需要从提供商的 API 中获取基于所选类别的视频。该字段将需要存储许多部分 - 选定的类别、选定的视频和一些尚未添加的附加详细信息(例如标题)。

我可以让这个表单出现在节点编辑页面上(在将字段附加到内容类型之后),但它似乎没有保存用户的输入。这是编辑节点屏幕上的表格:Field on node editing screen。用户的工作流程是他们选择一个类别,该类别填充要选择的视频列表。当他们选择视频时,他们会在 $element['teacherstv']['teacherstv_video_details'] 中看到预览。这一直工作到用户保存表单的地步。此时,所选值将丢失。

我查看了 D7 的 Field API 和 Forms API 文档,但没有看到任何关于如何设置这种字段小部件并让它保存用户输入的明确说明。

这里是 hook_field_widget_form() 的代码

function teacherstv_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
//  $value = $isset($items[$delta['teacherstv']) ? $items[$delta]['teacherstv'] : '';
  $widget['#delta'] = $delta;

  //lets get an array of our categories from core
  $coreapi = new coreapi();
  $APIsettings = variable_get('teacherstv_API_settings');
  $coreapi->apiuser = $APIsettings['username'];
  $coreapi->apipwd = $APIsettings['password'];
  $coreapi->apiurl = $APIsettings['api_url'];
  $coreapi->sortcriteria = "alpha";

  //$categoriesavailable = $coreapi->get_categories();
  $categories = coreapi_get_categories();
  $defaults = $field['settings'];
  $settings = $instance['settings'];

  $category = !is_null($form_state['values'][$field['field_name']]['und'][$delta]['teacherstv']['teacherstv_category']) ? $form_state['values'][$field['field_name']]['und'][$delta]['teacherstv']['teacherstv_category'] : $defaults['teacherstv']['defaultcategory'];

  switch ($instance['widget']['type']) {

    case 'teacherstv':

      $element['teacherstv'] = array(
        '#tree' => TRUE,
        '#type' => 'fieldset',
        '#title' => t('TeachersTV Video'),
        '#description' => '<p>' . t('Select a video from the TeachersTV service to embed.') . '</p>',
        '#delta' => $delta,
      );

      $element['teacherstv']['teacherstv_category'] = array(
        '#type' => 'select',
        '#field_parents' => 'teacherstv',
        '#title' => t('Video Categories'),
        '#options' => $categories,
        '#description' => t('Select a video category for a list of videos'),
        '#default_value' => !is_null($settings['teacherstv_category']) ? array($settings['teacherstv_category']) : array($category),
        '#ajax' => array(
          'callback' => 'teacherstv_ajax_videolist',
          'wrapper' => 'teacherstv-videolist-' . $delta . '-div',
          'method' => 'replace',
        ),
        '#delta' => $delta,
      );

  $videos = coreapi_list_videos($category);
  $videos[0] = "--Please select a video--";
  asort($videos);

      $element['teacherstv']['teacherstv_video'] = array(
        '#type' => 'select',
        '#title' => t('Select a video'),
        '#field_parents' => 'teacherstv',
        '#prefix' => '<div id="teacherstv-videolist-' . $delta . '-div">',
        '#suffix' => '</div>',
        '#options' => array(0 => 'Video 1'),
        '#default_value' => 
        isset($form_state['values'][$field['field_name']]['und'][$delta]['teacherstv']['teacherstv_video']) ? $form_state['values'][$field['field_name']]['und'][$delta]['teacherstv']['teacherstv_video'] : NULL,
        '#description' => t('Select a video.'),
        '#options' => $videos,
        '#ajax' => array(
          'callback' => 'teacherstv_ajax_videoselect',
          'wrapper' => 'teacherstv-videodetails-' . $delta . '-div',
        ),
        '#delta' => $delta,
      );

      $video_keys = array_keys($videos);
      $selected_video = isset($form_state['values'][$field['field_name']]['und'][$delta]['teacherstv_category']) ? $form_state['values'][$field['field_name']]['und'][$delta]['teacherstv_category'] : NULL;
      $element['teacherstv']['teacherstv_video_details'] = array(
        '#type' => 'markup',
        '#field_parents' => 'teacherstv',
        '#title' => t('Video details'),
        '#prefix' => '<div id="teacherstv-videodetails-' . $delta . '-div">',
        '#suffix' => '</div>',
        '#description' => t('Details about the video.'),
        '#markup' => teacherstv_ajax_render_video($selected_video),
        '#delta' => $delta,
      );

      break;

  }
  return $element;
}

【问题讨论】:

  • 只是在黑暗中的狂野射击 - 尝试从字段集中删除 #tree 属性
  • 恐怕没有变化。

标签: drupal drupal-7 drupal-modules drupal-forms drupal-field-api


【解决方案1】:

它可能是 AJAX 回调,在你的 AJAX 回调中,使用

$form_state['rebuild'] = TRUE;

或将 ajax 值分配给新元素以将其放入 $form_state 数组中。 使用 devel 和 dpm($form_state)。我敢打赌你的价值是“”

【讨论】:

  • 恐怕也没有运气。我将更深入地研究代码以确保正确定义字段等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多