Tipo di campo numerico in API modulo


12

Sto cercando di aggiungere un tipo di campo "numero" a un modulo utilizzando FAPI:

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

Cambio il TIPO in "numero" e il campo non viene generato affatto. Il modulo numerico è abilitato. Ho implementato le seguenti funzioni tematiche:

  • MYTHEME_form_element
  • MYTHEME_textfield
  • MYTHEME_container

Cosa potrebbe esserci dietro questo campo che non viene visualizzato quando uso #type = numbero #type = number_integer, ecc.?

Questo potrebbe avere qualcosa a che fare con esso:

Creazione manuale di campi numerici (interi e decimali) nel codice per moduli personalizzati

Tuttavia, in realtà voglio che il tipo venga visualizzato come "numero" in HTML, quindi gli smartphone mostrano un dialer numerico

Qualche idea?

Risposte:


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

Cosa non è chiaro? È necessario "Tipo di campo numerico nell'API del modulo" ? Definisci l'attributo "tipo" ( con spazio ) nell'array #attributes con il valore desiderato: numero, data, colore ... hack sporco
Arthur,

la lunghezza massima non funziona
logeshvaran,

1
Perché è necessario avere uno spazio?
fritzmg,

Questo porta a HTML non valido tra:<input type="number" type="text">
fritzmg

5

È possibile installare e utilizzare il modulo Elements per questo.


Questo è il modo corretto per ottenere un campo numerico HTML5.
Decifrare il

1
#type="numberfield"è il modo corretto di regolare il campo quando si utilizza questo modulo.
YPCrumble

1
Questo modulo è già incluso nel core in Drupal 8. Il modo corretto per creare un campo numerico è usare '#type' => 'number'(non 'numberfield') nell'array di rendering.
fritzmg,

2

Sono un po 'in ritardo alla festa. Il problema è che i includes/form.inccodici hard theme_textfield (D7 :, righe 3924ff) $element['#attributes']['type'] = 'text';.

È possibile racchiudere detta chiamata in if (!isset($element['#attributes']['type'])) { ... }o attendere l'applicazione della patch https://www.drupal.org/node/2545318 .


1

questo è il tuo codice qui sotto ..

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

per favore dimmi che cosa è ['phone_number'], è un contenitore o no o esiste nel tuo modulo oppure no e se vuoi creare un campo personalizzato nel tuo modulo, allora dovresti usare hook_form_alter hook_form_alter

piace

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

spero che questo ti aiuti ..


0

Non lo vedo funzionare con un valore non valido per il campo #type , tuttavia puoi fare qualcosa del genere:

L'elemento del modulo:

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

E implementando theme_textfield

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

Stavo pensando la stessa cosa per una soluzione, ma cosa vuoi dire con un valore # non valido ???
Alex.Barylski,

Bene, se non si inserisce un valore valido per #type, l'elemento del modulo non verrà renderizzato affatto, come affermato in precedenza.
Victor Lazov,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.