it-swarm-ja.com

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

カスタムフォームのDrupal 7にある数値フィールドを手動でレンダリングする必要があります。次のフィールド定義を作成しました:

$form['num_seats'] = array(
  '#type' => 'textfield',
      '#title' => t('Number of Seats'),
      '#required' => TRUE,
      '#number_type' => 'decimal',
      '#field_name' => 'num_seats',
      '#element_validate' => array ('number_field_widget_validate'),
      '#field_parents' => array(),
      '#language' => $language->language,
      '#field_prefix' => '$',
      '#size' => 14,
      '#maxlength' => 12,
      '#default_value' => $location ? $location['num_seats'] : $node->field_workshop_num_seats[$node->language][0]['value'],
);

ただし、フォームを送信すると、「preg_replace()[function.preg-replace]:コンパイルに失敗しました:number_field_widget_validate()のオフセット14の文字クラスの範囲が正しくありません(391行目)

「number_type」に「decimal」ではなく「integer」を使用すると、正常に機能します。 Numberモジュールのコードを確認したところ、フィールド定義から正規表現が正しく作成されていないことが原因であることがわかりました。

だから私の質問は、提出がカスタムテーブルに保存されるカスタムフォームで、通常のDrupal entity_typeコンテキスト(つまり、ノード/ユーザーなどのフォームの外側)の外でフィールドを手動でレンダリングする方法です。

6
r_honey

いくつかグーグルして、私が過去にどのように使用したかについて少し考えました。 FAPI要素をフィールドウィジェットと混同しています。それらは同じものではありません これはDrupal.StackExchangeで前に説明されました 。そして、なぜそれらが異なるのかという点でそこで完全に答えられています。

あなたの最も簡単な解決策は、独自の#element_validate関数を作成し、number_field_widget_validateが直接提供する検証関数に依存しないことです。 FAPI要素がウィジェットではなく、$field['settings']がないため、preg_replaceは失敗します。それが私の考えていることです。

3
tenken

3年後に何かが変わったと思います。次のように、エラーなしで10進数フィールドを追加できました。

'location_crossing_mileage' => array(
    '#type' => 'textfield',
    '#title' => t('Mileage'),
    '#size' => 5,
    '#maxlength' => 12,
    '#number_type' => 'decimal',
    '#field_name' => 'location_crossing_mileage',
    '#element_validate' => array ('number_field_widget_validate'),
  ),
0
Blanca Esqueda