【问题标题】:Custom Drupal 7 Field only saves the first character自定义 Drupal 7 字段仅保存第一个字符
【发布时间】:2011-06-21 13:48:47
【问题描述】:

我实际上是在尝试使用新的 Drupal 7 Field API 创建我的第一个字段类型模块。 我设法让它在“编辑”视图中正确显示。
但是,当我尝试保存一些数据时,它只会保存第一个字符。

这是模块:

<?php

function youtubefield_field_info() {
  return array(
    'youtubefield_video' => array(
      'label' => t('Youtube video'),
      'description' => t('This field stores a youtube video ID and displays the video associated with it'),
      'settings' => array(
        'max_length' => 11,
      ),
      'instance_settings' => array(
        'text_processing' => false,
      ),
      'default_widget' => 'youtubefield_video_widget',
      'default_formatter' => 'youtubefield_video_formatter',
    ),
  );
}

function youtubefield_field_widget_info() {
  return array(
    'youtubefield_video_widget' => array(
      'label' => t('Default'),
      'field types' => array('youtubefield_video'),
    ),
  );
}

function youtubefield_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
  $element['#type'] = 'textfield';
  $element['#default_value'] = isset($items[$delta]) ? $items[$delta] : '';
  return $element;
}

function youtubefield_field_is_empty($item, $field) {
  return !$item;
}

function youtubefield_field_formatter_info() {
  return array(
    'youtubefield_video_formatter' => array(
      'label' => t('Youtube video'),
      'field types' => array('youtubefield_video'),
    ),
  );
}

这是安装程序:

<?php

function youtubefield_field_schema($field) {
  return array(
    'columns' => array(
      'value' => array(
        'type' => 'varchar',
        'length' => 11,
        'not null' => true,
      ),
    ),
    'indexes' => array(),
  );
}

编辑:问题似乎与小部件有关,因为它在以编程方式获取数据时工作正常。

【问题讨论】:

  • @Laxman13,在field-api 标签前加上drupal- 不是更好吗?
  • 是的,没想到,谢谢。

标签: php drupal drupal-7 drupal-fields drupal-field-api


【解决方案1】:

这个小部件表单对我有用:

function youtubefield_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta,\
 $element) {
  $main_widget = array();
  switch ($instance['widget']['type']) {
  case 'youtubefield_video_widget':
    $main_widget = $element + array(
      '#type' => 'textfield',
      '#default_value' => isset($items[$delta]['value']) ? $items[$delta]['value'] : NULL,
      );
    break;
  }
  $element['value'] = $main_widget;
  return $element;
}

【讨论】:

  • 谢谢!经过一些调试后,我发现这个答案的解决方案是渲染数组返回 $element 数组,value 作为键值
【解决方案2】:

我遇到了同样的问题,发现 hook_field_widget_form() 需要返回:"$element['value']"

function field_youtube_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {

    $element['value'] = array(
        '#type' => 'textfield', 
        '#default_value' => isset($items[$delta]['value']) ? $items[$delta]['value'] : NULL,
    );

    return $element;
}

【讨论】:

    【解决方案3】:

    将您的小部件表单更改为:

    function youtubefield_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) { 
      switch ($instance['widget']['type']) {  
          case 'youtubefield_video_widget':  
            $element['youtubefield_video'] = array(
                '#type' => 'textfield',  
                '#title' => $element['#title'],  
                '#description' => $element['#description'], 
                '#default_value' => isset($items[$delta]['youtubefield_video']) ? $items[$delta]['youtubefield_video'] : NULL,  
                '#required' => $element['#required'],  
                '#weight' => isset($element['#weight']) ? $element['#weight'] : 0,  
                '#delta' => $delta,  
            ); 
    
          break; 
      } 
      return $element;
    }
    

    【讨论】:

    • 感谢您的回复。请给个解释好吗? :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多