Drupal 7自定义字段小部件不保存用户输入

问题描述:

我正在构建自定义字段模块以与我们的流式视频提供程序一起工作。作为其中的一部分,我需要从提供商的API中选择一个基于所选类别的视频。该字段需要存储多个片段 - 所选类别,所选视频和一些额外的细节(如标题),但尚未添加。Drupal 7自定义字段小部件不保存用户输入

我可以让这个表单出现在节点编辑页面(将字段附加到内容类型之后),但它似乎并没有保存用户的输入。这是编辑节点屏幕上的表单: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; 
} 
+0

只是在黑暗中拍摄 - 尝试从字段集中删除'#tree'属性 – Clive 2013-03-12 21:37:54

+0

没有变化,恐怕。 – 2013-03-12 21:56:38

它大概的AJAX回调,在您的AJAX回调,使用

$form_state['rebuild'] = TRUE; 

,或者给阿贾克斯值到一个新的元素有它在$ form_state数组.. 使用devel和dpm($ form_state)。我敢打赌,你的价值是“”

+0

这个也不好运,恐怕。我将更深入地了解代码以确保字段被正确定义等。 – 2013-03-19 20:51:07