Выберите список в пользовательском элементе формы Drupal 7

Я создал несколько пользовательских элементов в модуле, которые отлично подходят для группировки нескольких элементов управления в одном поле формы.

Однако теперь мне нужно добавить тот, который содержит раскрывающийся список. Идея состоит в том, чтобы иметь раскрывающийся список кодов стран и текстовое поле для номера телефона.

Он отображается правильно и выглядит хорошо, пока форма не будет отправлена, что приводит к ошибке «Обнаружен неправильный выбор. Пожалуйста, свяжитесь с администратором сайта». Казалось бы, это указывает на то, что Drupal не распознает параметры как часть элемента управления select.

Вот мой код:

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

Любая помощь в получении этой работы будет принята с благодарностью.

Спасибо, что посмотрели.

Джеймс


person James Shields    schedule 24.11.2012    source источник
comment
Я копался в ядре Drupal, и элемент управления Date устроен очень похожим образом, поэтому я не думаю, что я слишком далеко от этого. Только не видно откуда ошибка.   -  person James Shields    schedule 25.11.2012


Ответы (2)


вы можете добавить следующий атрибут к элементу, вызывающему эту ошибку.

'#validated' => TRUE,
person Waqas    schedule 02.12.2012
comment
Спасибо за предложение! Это подавляло ошибку, которую я получал. К сожалению, он также отключил всю проверку поля. - person James Shields; 16.02.2013

Эта проблема на какое-то время отошла на второй план, но я вернулся к ней на этой неделе.

Кажется, теперь я понимаю причину ошибки. Если элемент имеет свойство «#options», ожидается, что он будет вести себя как элемент управления выбора, и должен быть отправлен один из параметров. Поскольку само поле является контейнером для других элементов управления, поэтому не имеет прямого ввода, нет опубликованного значения, соответствующего записи в «#options», поэтому Drupal помечает это как недопустимую отправку формы.

После долгих проб и ошибок я наткнулся на нечто очень простое. «#options» используются для заполнения дочернего элемента управления, но после его заполнения они больше не нужны родительскому элементу. Поэтому я добавил к элементу функцию «#after_build» и использовал ее для удаления «#options», и это сработало отлично.

function common_pricing_phone_after_build($element, &$form_state) {
    unset($element['#options']);
    return $element;
}
person James Shields    schedule 18.02.2013