0

モジュールにいくつかのカスタム要素を作成しました。これは、単一のフォーム フィールドに複数のコントロールをグループ化するのに最適です。

ただし、ドロップダウン リストを含むものを追加する必要があります。アイデアは、国コードのドロップダウン リストと、電話番号のテキスト フィールドを用意することです。

フォームが送信されるまでは正しく表示され、問題なく表示されますが、「不正な選択が検出されました。サイト管理者に連絡してください」というエラーが発生します。これは、Drupal がオプションを選択コントロールの一部として認識していないことを示しているようです。

これが私のコードです:

function my_module_element_info() {
  $types = array(
    'phone' => array(
      '#input' => TRUE,
      '#process' => array('my_module_phone_process'),
      '#element_validate' => array('my_module_phone_validate'),
      '#autocomplete_path' => FALSE,
      '#theme_wrappers' => array('my_module_inline_form_element'),
    ),
  );
  return $types;
}

function my_module_phone_process($element, &$form_state, $complete_form) {
  $element['#tree'] = TRUE;

  $element['prefix'] = array(
    '#type' => 'select',
    '#value' => $element['#value']['prefix'] ,
    '#options' => $element['#options'],
    '#required' => $element['#required'],
  );
  $element['number'] = array(
    '#type' => 'textfield',
    '#size' => 20,
    '#maxlength' => 40,
    '#value' => $element['#value']['number'],
    '#required' => $element['#required'],
  );
  if (isset($element['#attributes'])) {
    $element['prefix']['#attributes'] = $element['#attributes'];
    $element['number']['#attributes'] = $element['#attributes'];
  }
  $element['prefix']['#attributes']['class'][] = 'form-phone-prefix';
  $element['number']['#attributes']['class'][] = 'form-phone-number';
  if (isset($element['#ajax'])) {
    $element['prefix']['#ajax'] = $element['#ajax'];
    $element['number']['#ajax'] = $element['#ajax'];
  }

  return $element;
}

function my_module_phone_validate($element) {
  if (!preg_match('/^[0-9 ]+$/', $element['#value']['number'])) {
    form_error($element['number'], t('Phone number may contain only digits and spaces.'));
  }
  return $element;
}

これを機能させるための助けをいただければ幸いです。

ご覧いただきありがとうございます。

ジェームズ

4

2 に答える 2

0

このエラーの原因となっている要素に次の属性を追加できます。

'#validated' => TRUE,
于 2012-12-02T07:20:20.440 に答える
0

この問題はしばらく後回しにされていましたが、今週また問題が発生しました。

エラーの理由が理解できたと思います。要素に「#options」プロパティがある場合、選択コントロールのように動作することが期待され、オプションの 1 つを送信する必要があります。フィールド自体は他のコントロールのコンテナーであるため、直接入力がないため、「#options」のエントリに一致する投稿された値がないため、Drupal は無効なフォーム送信としてフラグを立てます。

試行錯誤を繰り返した結果、とてもシンプルなものにたどり着きました。"#options" は子コントロールを設定するために使用されますが、設定が完了すると、親では必要なくなります。そこで、要素に「#after_build」関数を追加し、それを使用して「#options」を削除したところ、完全に機能しました。

function common_pricing_phone_after_build($element, &$form_state) {
    unset($element['#options']);
    return $element;
}
于 2013-02-18T00:00:59.817 に答える