Условная логика Drupal 7 Forms API не работает в IE

У меня есть форма drupal 7 с кучей полей:

$form['account_type'] = array(
  '#title' => t('Utility Account Type'),
  '#type' => 'select',
  '#options' => necp_enrollment_administration_portal_account_type_options(),
  '#required' => TRUE,
  '#default_value' => isset($form_state['values']['account_type']) ? $form_state['values']['account_type'] : '',
);

// Should show if account_type = 1
$form['home_wrapper'] = array(
  '#type' => 'fieldset',
  '#states' => array(
    'visible' => array(
      ':input[name="account_type"]' => array('value' => 1),
    ),
  ),
);
$form['home_wrapper']['first_name_1'] = array(
  '#title' => t('Primary Account First Name'),
  '#type' => 'textfield',
  '#default_value' => isset($form_state['values']['first_name_1']) ? $form_state['values']['first_name_1'] : '',
  '#states' => array(
    'required' => array(
      ':input[name="account_type"]' => array('value' => 1),
    ),
  ),
);
$form['home_wrapper']['last_name_1'] = array(
  '#title' => t('Primary Account Last Name'),
  '#type' => 'textfield',
  '#default_value' => isset($form_state['values']['last_name_1']) ? $form_state['values']['last_name_1'] : '',
  '#states' => array(
    'required' => array(
      ':input[name="account_type"]' => array('value' => 1),
    ),
  ),
);

// Should show if account_type = 2
$form['business_wrapper'] = array(
  '#type' => 'fieldset',
  '#states' => array(
    'visible' => array(
      ':input[name="account_type"]' => array('value' => 2),
    ),
  ),
);
$form['business_wrapper']['company_name'] = array(
  '#title' => t('Company/Organization'),
  '#type' => 'textfield',
  '#default_value' => isset($form_state['values']['company_name']) ? $form_state['values']['company_name'] : '',
  '#states' => array(
    'required' => array(
      ':input[name="account_type"]' => array('value' => 2),
    ),
  ),
);

В Firefox/Chrome/Opera всех версий эта форма ведет себя как надо. Однако во всех версиях IE форма инициализируется display:none; style для всех условных полей независимо от значения в account_type. Изменение выбранного параметра account_type не влияет на скрытый статус.

Любые советы по отладке этой формы были бы потрясающими.

Примечания:

  • Я не большой разработчик Drupal, я унаследовал этот сайт. Просто пытаюсь исправить пару последних ошибок, чтобы мы могли выйти в эфир.
  • есть больше полей, чем указано выше, я просто дал вам некоторые из применимых, чтобы вы могли понять, как были настроены мои формы
  • текущий URL формы в разработке: https://northeastcleanpower.com/enroll_new
  • Я использую http://www.browserstack.com/ для отладки IE 7–10pp4 (думаю, мы нужно только поддерживать 8 и выше)

Я также пробовал:

  • ':select[name="account_type"]' => array('value' => 1),
  • '#edit-account-type' => array('value' => 1),

person Francis Yaconiello    schedule 20.03.2012    source источник


Ответы (2)


Хорошо, я нашел решение. Надеюсь, это поможет кому-то в ситуации, похожей на мою.

':input[name="account_type"]' => array('value' => 1),

нужно быть:

':input[name="account_type"]' => array('value' => "1"),

По-видимому, javascript в IE оценивал литеральный тип/значение, а не просто значение: 1 !== "1" и т. д. Как только я это исправил, он начал работать как чемпион.

также в моем коде был еще один экземпляр, где значение исходило из переменной PHP. Он не принимал переменную как int, но принимал ее как строку...

':input[name="account_type"]' => array('value' => "$id"),
person Francis Yaconiello    schedule 21.03.2012
comment
Ты да человек! У меня было $form['field_movie_credit'][$lang][$key]['field_movie_credit_character']['#states']['visible'] = array( ':input[name="field_movie_credit[' . $lang . '][' . $key . '][field_movie_credit_role][' . $lang . ']"]' => array('value' => $character_role_id),, я изменил его на $form['field_movie_credit'][$lang][$key]['field_movie_credit_character']['#states']['visible'] = array( ':input[name="field_movie_credit[' . $lang . '][' . $key . '][field_movie_credit_role][' . $lang . ']"]' => array('value' => "$character_role_id"), и БУМ! Спасибо! - person Elijah Lynn; 06.12.2013

Я предполагаю, что селектор ввода jQuery по какой-то причине не работает. Можешь попробовать заменить :input[name="account_type"] на #edit-account-type

person Jonathan Rowny    schedule 20.03.2012
comment
это не сработало, я тоже пробовал #edit-account-type option:selected - person Francis Yaconiello; 21.03.2012
comment
в этом случае, возможно, селектор даже не работает. Когда у меня будет минутка, я поищу конкретное поведение, которое делает состояния, чтобы я мог видеть, где поставить разрыв строки. - person Jonathan Rowny; 21.03.2012
comment
Спасибо за вашу помощь, я ценю, что вы нашли секунду, чтобы помочь. - person Francis Yaconiello; 21.03.2012