Form APIの数値フィールドタイプ


12

FAPIを使用してフォームに「数値」フィールドタイプを追加しようとしています。

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

TYPEを「number」に変更すると、フィールドがまったく生成されません。番号モジュールが有効になっています。次のテーマ関数を実装しました。

  • MYTHEME_form_element
  • MYTHEME_textfield
  • MYTHEME_container

#type = number#type = number_integerなどを使用すると、このフィールドの後ろに何が表示されないのでしょうか?

これには何か関係があるかもしれません:

カスタムフォームのコードで数値フィールド(整数と小数)を手動で作成する

ただし、実際には、タイプをHTMLで「数値」としてレンダリングして、スマートフォンに数値ダイヤラーが表示されるようにします。

何か案は?

回答:


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

明確ではないものは何ですか?「Form APIの数値フィールドタイプ」が必要ですか?#attributes配列の属性「type」(スペース付き)を目的の値で定義します:数値、日付、色...汚いハック
アーサー

最大長が機能していません
-logeshvaran

1
なぜスペースがあるのですか?
fritzmg

これは無効なHTMLにつながります<input type="number" type="text">
。– fritzmg

5

モジュールElementsをインストールして使用できます。


これは、HTML5数値フィールドを取得する正しい方法です。
解読

1
#type="numberfield"このモジュールを使用する場合、フィールドを調整する正しい方法です。
YPCrumble

1
このモジュールはすでにDrupal 8のコアに含まれています。数値フィールドを作成する正しい方法は、レンダー配列で'#type' => 'number'(ではなく'numberfield')を使用することです。
fritzmg

2

私はパーティーに少し遅れています。問題は、theme_textfield(D7 : includes/form.inc、行3924ff)がハードコードすること$element['#attributes']['type'] = 'text';です。

上記の呼び出しをラップするif (!isset($element['#attributes']['type'])) { ... }か、パッチhttps://www.drupal.org/node/2545318が適用されるのを待つことができます。


1

これは以下のコードです。

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

['phone_number']が何であるかを教えてください、それはコンテナであるか、フォームに存在するかどうかです。フォームにカスタムフィールドを作成する場合は、hook_form_alter hook_form_alterを使用する必要があります

お気に入り

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

これがお役に立てば幸いです。


0

#typeフィールドの無効な値で動作するようには見えませんが、次のようなことができます:

フォーム要素:

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

theme_textfieldの実装

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

私は解決策について同じことを考えていましたが、無効な#値では動作しないということですか?
Alex.Barylski 14年

前に述べたように、#typeに有効な値を入力しないと、フォーム要素はまったくレンダリングされません。
ビクターラゾフ14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.