Typ pola numerycznego w formularzu API

12

Usiłuję dodać typ pola „liczba” do formularza za pomocą FAPI:

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

Zmieniam TYPE na „number”, a pole wcale się nie generuje. Moduł liczbowy jest włączony. Wdrożyłem następujące funkcje motywu:

  • MYTHEME_form_element
  • MYTHEME_textfield
  • MYTHEME_container

Co może kryć się za tym polem, które nie wyświetla się, gdy używam #type = numberlub #type = number_integeretc?

To może mieć z tym coś wspólnego:

Ręczne tworzenie pól liczbowych (liczba całkowita i dziesiętna) w kodzie formularzy niestandardowych

Jednak tak naprawdę chcę, aby ten typ był renderowany jako „liczba” w HTML, aby smartfony wyświetlały dialer numeryczny

Jakieś pomysły?

Alex.Barylski
źródło

Odpowiedzi:

13
$form['my_element'] = array(
    '#type' => 'textfield',
    '#attributes' => array(
        ' type' => 'number', // insert space before attribute name :)
    ),
    '#title' => 'My number',
    '#required' => true,
    '#maxlength' => 3
);
Artur
źródło
Co nie jest jasne? „Czy potrzebujesz pola numerycznego w formularzu API” ? Zdefiniuj atrybut „typ” ( ze spacją ) w tablicy #attributes o żądanej wartości: liczba, data, kolor ... brudny hack
Arthur
maksymalna długość nie działa
logeshvaran
1
Dlaczego trzeba mieć spację?
fritzmg
Prowadzi to do nieprawidłowego HTML btw .:<input type="number" type="text">
fritzmg
5

Możesz zainstalować i używać do tego modułu Elements .

kala4ek
źródło
To jest właściwy sposób na uzyskanie pola liczbowego HTML5.
Odszyfruj
1
#type="numberfield"jest poprawnym sposobem dostosowania pola podczas korzystania z tego modułu.
YPCrumble 12.07.17
1
Moduł ten jest już zawarty w rdzeniu Drupala 8. Prawidłowym sposobem utworzenia pola liczbowego jest użycie '#type' => 'number'(nie 'numberfield') w tablicy renderowania.
fritzmg
2

Jestem trochę spóźniony na przyjęcie. Problem polega na tym, że pole tekstowe theme_textfield (D7 includes/form.inc:, linie 3924ff) jest twarde $element['#attributes']['type'] = 'text';.

Możesz owinąć wspomniane połączenie if (!isset($element['#attributes']['type'])) { ... }lub poczekać na zastosowanie poprawki https://www.drupal.org/node/2545318 .

Skynet
źródło
1

to jest twój kod poniżej ..

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

powiedz mi, co to jest ['numer_telefonu], to jest kontener, czy nie, czy istnieje w twoim formularzu, czy nie, a jeśli chcesz utworzyć niestandardowe pole w formularzu, powinieneś użyć hook_form_alter hook_form_alter

lubić

  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
 );
  }
   }

mam nadzieję, że ci to pomoże ...

Kamal Oberoi
źródło
0

Nie widzę, aby działał z niepoprawną wartością dla pola #type , jednak możesz zrobić coś takiego:

Element formularza:

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

I implementacja theme_textfield

if(isset($element['#attributes']['data-type']) && $element['#attributes']['data-type'] === 'number'){
    $output = '<input type="number" />';
}else{
    $output = '<input' . drupal_attributes($element['#attributes']) . ' />';
}
Victor Lazov
źródło
Myślałem o tym samym dla rozwiązania - ale co masz na myśli, że nie będzie działać z nieprawidłową wartością #?
Alex.Barylski
Cóż, jeśli nie podasz poprawnej wartości dla #type, element formularza w ogóle nie będzie renderowany, jak już wcześniej powiedziałeś.
Victor Lazov,