Form API中的数字字段类型


12

我正在尝试使用FAPI向表单添加“数字”字段类型:

$form['phone_number']['areacode'] = array(
  '#type' => 'textfield',
  '#title' => '---',
  '#width' => '30%',
  '#align' => 'center',
  '#required' => true,
  '#maxlength' => 3
);

我将“类型”更改为“数字”,并且根本不会生成该字段。号码模块已启用。我已经实现了以下主题功能:

  • MYTHEME_form_element
  • MYTHEME_textfield
  • MYTHEME_container

当我使用#type = number或时#type = number_integer,该字段后面没有显示什么?

这可能与它有关:

在自定义表单的代码中手动创建Number字段(整数和十进制)

但是我实际上希望该类型在HTML中呈现为“数字”,以便智能手机显示数字拨号器

有任何想法吗?

Answers:


13
$form['my_element'] = array(
    '#type' => 'textfield',
    '#attributes' => array(
        ' type' => 'number', // insert space before attribute name :)
    ),
    '#title' => 'My number',
    '#required' => true,
    '#maxlength' => 3
);

不清楚吗?是否需要“ Form API中的数字字段类型”?在#attributes数组中使用所需值定义属性“类型”(以空格表示):数字,日期,颜色...肮脏的hack
Arthur

最大长度不起作用
logeshvaran

1
为什么需要有空间?
fritzmg

这会导致无效的HTML btw 。:<input type="number" type="text">
fritzmg

5

您可以为其安装和使用模块Elements


这是获取HTML5数字字段的正确方法。
解密

1
#type="numberfield"是使用此模块时调整字段的正确方法。
YPCrumble

1
这个模块已经包含在Drupal 8的核心中。创建数字字段的正确方法是在render数组中使用'#type' => 'number'(不是'numberfield')。
fritzmg

2

我参加聚会有点晚了。问题是theme_textfield(D7 : includes/form.inc,第3924ff行)是硬代码$element['#attributes']['type'] = 'text';

您可以将所说的呼叫包装在中,if (!isset($element['#attributes']['type'])) { ... }或等待补丁https://www.drupal.org/node/2545318应用。


1

这是下面的代码。

$form['phone_number']['areacode'] = array(
'#type' => 'textfield',
'#title' => '---',
'#width' => '30%',
'#align' => 'center',
'#required' => true,
'#maxlength' => 3
);

请告诉我什么是['phone_number'],它是否为容器或它是否存在于表单中,如果要在表单中创建自定义字段,则应使用hook_form_alter hook_form_alter

喜欢

  function mymodule_form_alter($form_id, &$form) {
 if ($form_id == 'form_id') {

$form['field_name'] = array(
 '#type' => 'textfield',     
 '#title' => t('title'),
 '#description' => t('Description.'),
 '#width' => '30%',
 '#align' => 'center',
 '#required' => true,
 '#maxlength' => 3
 );
  }
   }

希望对您有帮助。


0

我看不到它对#type字段使用无效值,但是您可以执行以下操作:

表单元素:

$form['my_element'] = array(
    '#type' => 'textfield',
    '#attributes' => array(
        'data-type' => 'number',
    ),
    '#title' => '---',
    '#width' => '30%',
    '#align' => 'center',
    '#required' => true,
    '#maxlength' => 3
);

并实现theme_textfield

if(isset($element['#attributes']['data-type']) && $element['#attributes']['data-type'] === 'number'){
    $output = '<input type="number" />';
}else{
    $output = '<input' . drupal_attributes($element['#attributes']) . ' />';
}

我在为解决方案考虑同一件事-但是您的意思是,它不适用于无效的#value?
Alex.Barylski 2014年

好吧,如果您没有为#type设置有效值,那么表单元素将根本不会呈现,就像您之前所说的那样。
维克托·拉佐夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.