【问题标题】:Select list in Drupal 7 custom form element在 Drupal 7 自定义表单元素中选择列表
【发布时间】:2012-11-24 23:03:45
【问题描述】:

我在一个模块中创建了几个自定义元素,它们非常适合将多个控件分组到一个表单字段中。

但是,我现在需要添加一个包含下拉列表的列表。这个想法是有一个国家代码的下拉列表和一个电话号码的文本字段。

在提交表单之前,它会正确显示并且看起来不错,这会导致错误“检测到非法选择。请联系站点管理员。”这似乎表明 Drupal 没有将选项识别为选择控件的一部分。

这是我的代码:

function my_module_element_info() {
  $types = array(
    'phone' => array(
      '#input' => TRUE,
      '#process' => array('my_module_phone_process'),
      '#element_validate' => array('my_module_phone_validate'),
      '#autocomplete_path' => FALSE,
      '#theme_wrappers' => array('my_module_inline_form_element'),
    ),
  );
  return $types;
}

function my_module_phone_process($element, &$form_state, $complete_form) {
  $element['#tree'] = TRUE;

  $element['prefix'] = array(
    '#type' => 'select',
    '#value' => $element['#value']['prefix'] ,
    '#options' => $element['#options'],
    '#required' => $element['#required'],
  );
  $element['number'] = array(
    '#type' => 'textfield',
    '#size' => 20,
    '#maxlength' => 40,
    '#value' => $element['#value']['number'],
    '#required' => $element['#required'],
  );
  if (isset($element['#attributes'])) {
    $element['prefix']['#attributes'] = $element['#attributes'];
    $element['number']['#attributes'] = $element['#attributes'];
  }
  $element['prefix']['#attributes']['class'][] = 'form-phone-prefix';
  $element['number']['#attributes']['class'][] = 'form-phone-number';
  if (isset($element['#ajax'])) {
    $element['prefix']['#ajax'] = $element['#ajax'];
    $element['number']['#ajax'] = $element['#ajax'];
  }

  return $element;
}

function my_module_phone_validate($element) {
  if (!preg_match('/^[0-9 ]+$/', $element['#value']['number'])) {
    form_error($element['number'], t('Phone number may contain only digits and spaces.'));
  }
  return $element;
}

我们将不胜感激任何帮助完成这项工作。

感谢收看。

詹姆斯

【问题讨论】:

  • 我一直在研究 Drupal 核心,并且 Date 控件的构造方式非常相似,所以我认为我离得太远了。只是看不到错误来自哪里。

标签: drupal drupal-7 drupal-fapi drupal-forms


【解决方案1】:

您可以将以下属性添加到导致此错误的元素。

'#validated' => TRUE,

【讨论】:

  • 感谢您的建议!这确实抑制了我得到的错误。不幸的是,它还禁用了该字段的所有验证。
【解决方案2】:

这个问题被搁置了一段时间,但我这周又回到了它。

我想我现在明白了错误的原因。如果一个元素有一个“#options”属性,那么它应该表现得像一个选择控件,并且应该提交其中一个选项。由于该字段本身是其他控件的容器,因此没有直接输入,因此没有与“#options”中的条目匹配的发布值,因此 Drupal 将其标记为无效的表单提交。

经过大量的反复试验,我找到了一些非常简单的东西。 “#options”用于填充子控件,但一旦填充,父控件就不再需要它们。所以我给元素添加了一个“#after_build”函数,并用它来删除“#options”,效果很好。

function common_pricing_phone_after_build($element, &$form_state) {
    unset($element['#options']);
    return $element;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多