Тип числового поля в 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и т. Д.?

Это может иметь какое-то отношение к этому:

Создание числовых полей (целых и десятичных) вручную в коде для пользовательских форм

Однако я на самом деле хочу, чтобы тип отображался как «число» в HTML, чтобы смартфоны отображали цифровую звонилку

Есть идеи?

Alex.Barylski
источник

Ответы:

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 с требуемым значением: число, дата, цвет ... грязный хак
Артур
максимальная длина не работает
logeshvaran
1
Почему нужно иметь место?
fritzmg
Это приводит к <input type="number" type="text">
неверному
5

Для этого вы можете установить и использовать модуль Elements .

kala4ek
источник
Это правильный способ получить числовое поле HTML5.
Расшифровка
1
#type="numberfield"правильный способ настройки поля при использовании этого модуля.
YPCrumble
1
Этот модуль уже включен в ядро ​​Drupal 8. Правильный способ создания числового поля - использовать '#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 будет применен.

Skynet
источник
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
Хорошо, если вы не укажете правильное значение для #type, элемент формы не будет отображаться вообще, как вы заявили ранее.
Виктор Лазов