Numerischer Feldtyp in der Formular-API

12

Ich versuche, einem Formular mit FAPI einen Feldtyp "Zahl" hinzuzufügen:

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

Ich ändere den TYP in "Zahl" und das Feld wird überhaupt nicht generiert. Das Nummernmodul ist aktiviert. Ich habe die folgenden Themenfunktionen implementiert:

  • MYTHEME_form_element
  • MYTHEME_textfield
  • MYTHEME_container

Was könnte sich dahinter befinden, wenn dieses Feld nicht angezeigt wird, wenn ich #type = numberoder #type = number_integerusw. verwende?

Das könnte etwas damit zu tun haben:

Manuelles Erstellen von Zahlenfeldern (Ganzzahl und Dezimalzahl) im Code für benutzerdefinierte Formulare

Ich möchte jedoch, dass der Typ in HTML als "Zahl" dargestellt wird, sodass Smartphones einen numerischen Dialer aufweisen

Irgendwelche Ideen?

Alex.Barylski
quelle

Antworten:

13
$form['my_element'] = array(
    '#type' => 'textfield',
    '#attributes' => array(
        ' type' => 'number', // insert space before attribute name :)
    ),
    '#title' => 'My number',
    '#required' => true,
    '#maxlength' => 3
);
Arthur
quelle
Was ist nicht klar? "Numerischer Feldtyp in Formular-API" wird benötigt? Definieren Sie das Attribut "type" ( mit Leerzeichen ) im Array #attributes mit einem gewünschten Wert: number, date, color ... dirty hack
Arthur
Maximale
1
Warum braucht man ein Leerzeichen?
Freitag
Dies führt zwischendurch zu ungültigem HTML.<input type="number" type="text">
fritzmg
5

Sie können das Modul Elements dafür installieren und verwenden .

kala4ek
quelle
Dies ist der richtige Weg, um ein HTML5-Zahlenfeld zu erhalten.
Entschlüsselung
1
#type="numberfield"ist der richtige Weg, um das Feld anzupassen, wenn Sie dieses Modul verwenden.
YPCrumble
1
Dieses Modul ist bereits im Kern von Drupal 8 enthalten. Die korrekte Art, ein Zahlenfeld zu erstellen, besteht darin, '#type' => 'number'(nicht 'numberfield') im Render-Array zu verwenden.
Freitag
2

Ich bin ein bisschen zu spät zur Party. Das Problem ist, dass theme_textfield (D7 includes/form.inc:, Zeilen 3924ff) Hardcodes enthält $element['#attributes']['type'] = 'text';.

Sie können den besagten Anruf in einen if (!isset($element['#attributes']['type'])) { ... }abwickeln oder warten, bis der Patch https://www.drupal.org/node/2545318 angewendet wird.

Skynet
quelle
1

Dies ist Ihr Code unten ..

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

Bitte sagen Sie mir, was ['phone_number'] ist, ob es sich um einen Container handelt oder nicht oder ob er in Ihrem Formular existiert oder nicht. Wenn Sie ein benutzerdefiniertes Feld in Ihrem Formular erstellen möchten, sollten Sie hook_form_alter hook_form_alter verwenden

mögen

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

hoffe das hilft dir ..

Kamal Oberoi
quelle
0

Ich sehe nicht, dass es mit einem ungültigen Wert für das Feld #type funktioniert. Sie können jedoch Folgendes tun:

Das Formularelement:

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

Und das Implementieren von 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
quelle
Ich habe dasselbe für eine Lösung gedacht - aber was meinst du damit, dass es mit einem ungültigen # -Wert nicht funktioniert?
Alex.Barylski
Wenn Sie keinen gültigen Wert für den #Typ eingeben, wird das Formularelement überhaupt nicht gerendert, wie Sie zuvor angegeben haben.
Victor Lazov