Type de champ numérique dans l'API Form


12

J'essaie d'ajouter un type de champ "numéro" à un formulaire à l'aide de FAPI:

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

Je change le TYPE en "nombre" et le champ n'est pas généré du tout. Le module numérique est activé. J'ai implémenté les fonctions thématiques suivantes:

  • MYTHEME_form_element
  • MYTHEME_textfield
  • MYTHEME_container

Qu'est-ce qui pourrait être derrière ce champ qui n'apparaît pas lorsque j'utilise #type = numberou #type = number_integer, etc.?

Cela pourrait avoir quelque chose à voir avec cela:

Création manuelle de champs numériques (entier et décimal) dans le code pour les formulaires personnalisés

Cependant, je veux que le type soit rendu sous forme de "nombre" en HTML pour que les téléphones intelligents affichent un numéroteur numérique

Des idées?

Réponses:


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

Qu'est-ce qui n'est pas clair? "Type de champ numérique dans l'API Form" est nécessaire? Définissez l'attribut "type" ( avec espace ) dans le tableau #attributes avec une valeur souhaitée: nombre, date, couleur ... bidouille
Arthur

la longueur maximale ne fonctionne pas
logeshvaran

1
Pourquoi faut-il avoir un espace?
fritzmg

Cela conduit à un HTML incorrect:<input type="number" type="text">
fritzmg

5

Vous pouvez installer et utiliser le module Elements pour cela.


C'est la bonne façon d'obtenir un champ numérique HTML5.
Déchiffrer le

1
#type="numberfield"est la bonne façon d'ajuster le champ lors de l'utilisation de ce module.
YPCrumble

1
Ce module est déjà inclus dans le noyau de Drupal 8. La bonne façon de créer un champ numérique est d'utiliser '#type' => 'number'(pas 'numberfield') dans le tableau de rendu.
fritzmg

2

Je suis un peu en retard à la fête. Le problème est que les includes/form.inchard-codes theme_textfield (D7 :, lignes 3924ff) $element['#attributes']['type'] = 'text';.

Vous pouvez encapsuler cet appel dans un if (!isset($element['#attributes']['type'])) { ... }ou attendre que le patch https://www.drupal.org/node/2545318 soit appliqué.


1

voici votre code ci-dessous ..

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

s'il vous plaît dites-moi ce qui est ['phone_number'], c'est un conteneur ou non ou son existe dans votre formulaire ou non et si vous voulez créer un champ personnalisé dans votre formulaire, vous devez utiliser hook_form_alter hook_form_alter

comme

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

j'espère que cela vous aide ..


0

Je ne le vois pas fonctionner avec une valeur non valide pour le champ #type , mais vous pouvez faire quelque chose comme ça:

L'élément de formulaire:

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

Et implémenter theme_textfield

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

Je pensais la même chose pour une solution - mais que voulez-vous dire que cela ne fonctionnera pas avec une valeur # invalide ???
Alex.Barylski

Eh bien, si vous ne mettez pas de valeur valide pour le #type, l'élément de formulaire ne sera pas rendu du tout, comme vous l'avez dit précédemment.
Victor Lazov
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.