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?

Antworten:


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

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


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 .


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.


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 ..


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']) . ' />';
}

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.