Tipo de campo numérico en API de formulario

12

Estoy tratando de agregar un tipo de campo "número" a un formulario usando FAPI:

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

Cambio el TIPO a "número" y el campo no se genera en absoluto. El módulo de número está habilitado. He implementado las siguientes funciones de tema:

  • MYTHEME_form_element
  • MYTHEME_textfield
  • MYTHEME_container

¿Qué podría estar detrás de este campo que no aparece cuando uso #type = numbero #type = number_integer, etc.?

Esto podría tener algo que ver con eso:

Creación de campos numéricos (entero y decimal) manualmente en código para formularios personalizados

Sin embargo, en realidad quiero que el tipo se represente como "número" en HTML para que los teléfonos inteligentes muestren un marcador numérico

¿Algunas ideas?

Alex.Barylski
fuente

Respuestas:

13
$form['my_element'] = array(
    '#type' => 'textfield',
    '#attributes' => array(
        ' type' => 'number', // insert space before attribute name :)
    ),
    '#title' => 'My number',
    '#required' => true,
    '#maxlength' => 3
);
Arturo
fuente
¿Qué no está claro? ¿ Se necesita "Tipo de campo numérico en el formulario API" ? Defina el atributo "tipo" ( con espacio ) en la matriz de # atributos con un valor deseado: número, fecha, color ... truco sucio
Arthur
longitud máxima no funciona
logeshvaran 05 de
1
¿Por qué necesita tener un espacio?
fritzmg
Esto conduce a un HTML no válido por cierto .:<input type="number" type="text">
fritzmg
5

Puede instalar y utilizar elementos de módulo para ello.

kala4ek
fuente
Esta es la forma correcta de obtener un campo de número HTML5.
Descifrar
1
#type="numberfield"es la forma correcta de ajustar el campo cuando se usa este módulo.
YPCrumble
1
Este módulo ya está incluido en el núcleo de Drupal 8. La forma correcta de crear un campo numérico es mediante el uso de '#type' => 'number'(no 'numberfield') en la matriz de representación.
fritzmg
2

Llego un poco tarde a la fiesta. El problema es que theme_textfield (D7:, includes/form.inclíneas 3924ff) codifica $element['#attributes']['type'] = 'text';.

Puede finalizar dicha llamada if (!isset($element['#attributes']['type'])) { ... }o esperar a que se aplique el parche https://www.drupal.org/node/2545318 .

Skynet
fuente
1

este es tu código a continuación ...

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

dígame qué es ['phone_number'], es un contenedor o no o existe en su formulario o no, y si desea crear un campo personalizado en su formulario, debe usar hook_form_alter hook_form_alter

me gusta

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

espero que esto te ayude ..

Kamal Oberoi
fuente
0

No veo que funcione con un valor no válido para el campo #type , sin embargo, puede hacer algo así:

El elemento de forma:

$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']) . ' />';
}
Victor Lazov
fuente
Estaba pensando lo mismo para una solución, pero ¿qué quieres decir con que no funcionará con un #valor no válido?
Alex.Barylski
Bueno, si no pones un valor válido para el #tipo, el elemento del formulario no se representará en absoluto, como dijiste antes.
Victor Lazov