Tipo de campo numérico na API do formulário


12

Estou tentando adicionar um tipo de campo "número" a um formulário usando a FAPI:

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

Eu mudo o TYPE para "number" e o campo não é gerado. O módulo numérico está ativado. Eu implementei as seguintes funções de tema:

  • MYTHEME_form_element
  • MYTHEME_textfield
  • MYTHEME_container

O que poderia estar por trás desse campo não aparecer quando eu uso #type = numberou #type = number_integeretc?

Isso pode ter algo a ver com isso:

Criando campos de números (inteiro e decimal) manualmente no código para formulários personalizados

No entanto, na verdade, eu quero que o tipo seja renderizado como "número" em HTML para que os smartphones mostrem um discador numérico

Alguma ideia?

Respostas:


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

O que não está claro? "Tipo de campo numérico na API do formulário" é necessário? Definir atributo "tipo" ( com espaço ) em conjunto #attributes com um valor desejado: número, data, cor ... truque sujo
Arthur

comprimento máximo não está funcionando
logeshvaran 5/17/17

1
Por que é necessário ter um espaço?
Fritzmg 28/03

Isso leva a HTML inválido btw .<input type="number" type="text">
.ritzmg 28/03

5

Você pode instalar e usar o módulo Elements para isso.


Essa é a maneira correta de obter um campo numérico HTML5.
decifrar

1
#type="numberfield"é a maneira correta de ajustar o campo ao usar este módulo.
YPCrumble

1
Este módulo já está incluído no núcleo do Drupal 8. A maneira correta de criar um campo numérico é usando '#type' => 'number'(não 'numberfield') na matriz de renderização.
Fritzmg 28/03

2

Estou um pouco atrasado para a festa. O problema é que theme_textfield (D7 includes/form.inc:, linhas 3924ff) codifica $element['#attributes']['type'] = 'text';.

Você pode encerrar a chamada em if (!isset($element['#attributes']['type'])) { ... }ou aguardar a aplicação do patch https://www.drupal.org/node/2545318 .


1

este é o seu código abaixo ..

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

diga-me o que é ['phone_number'], é um contêiner ou não, ou existe em seu formulário ou não, e se você deseja criar um campo personalizado em seu formulário, use hook_form_alter hook_form_alter

gostar

  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 isso ajude você ..


0

Não o vejo funcionando com valor inválido para o campo #type , mas você pode fazer algo assim:

O elemento do formulário:

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

Eu estava pensando a mesma coisa para uma solução - mas como assim não funcionará com um #value inválido ???
Alex.Barylski

Bem, se você não colocar um valor válido para o #type, o elemento do formulário não será renderizado, como você afirmou anteriormente.
Victor Lazov
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.