Динамически скрывать / показывать поля Field API в Drupal 7

14

Я создал сущность с формой «Добавить новый». Сам объект имеет ограниченное количество фактических переменных. Я добавил большую часть дополнительных данных, которые мне нужны, используя пользовательские поля (например, API полей).

На этом этапе мне нужно иметь возможность динамически скрывать одно поле в зависимости от значения другого. т. е. если для раскрывающегося поля установлено значение Нет, другое поле должно быть скрыто, в противном случае оно должно отображаться.

Из того, что я вижу, несколько проще добавить эту функциональность в поля, созданные с помощью API-формы (т. Е. Через свойство AJAX), однако есть ли способ добиться этого с помощью прикрепленных полей? У меня нет проблем с использованием пользовательского Javascript, если это то, что требуется для решения этой проблемы.

NRaf
источник
Я не уверен, что drupal.org/project/conditional_fields готов к переходу на d7, но, возможно, стоит посмотреть
Jukebox

Ответы:

5

JQuery хорошо работает для этого:

(function($) {
  $(document).ready(function() {
    $('#select1').change(function() {
      switch ($(this).val()) {
        case '1':
          $('#field2').hide();
          break;
        default:
          $('#field2').show();
          break;
      }
    });
  });
}) (jQuery);
keithm
источник
Да, я использовал drupal_add_js на странице формы и в конечном итоге сделал это в jQuery. Мне просто интересно, есть ли более «Drupal» способ сделать это.
NRaf
Я бы сказал, что я не большой поклонник подхода Drupal #states к видимости, поэтому я не предложил его выше.
Keithm
@keithm Не могли бы вы пояснить, почему вы не являетесь поклонником штатов (по состоянию на 2015 год, D7). Я работаю над проектом, в котором мы пытаемся принять решение использовать #states vs drupal_add_js. Почему вы думаете, что один выбор лучше другого?
blue928,
На мой взгляд, это вопрос законных предпочтений программиста; мое обоснование может отличаться от вашего. Тем не менее, на практике я довольно не люблю прибегать к другому синтаксису, который дублирует функциональность, найденную в Javascript / jQuery. Когда я попробовал #states, я также обнаружил, что варианты использования, для которых он явно предназначен, слишком ограничены. Когда моя проблема вышла за пределы этих сценариев использования, мне все равно пришлось переписать все это прямо на Javascript.
Keithm
19

В Drupal 7 вы можете использовать $ form #statesвместо пользовательского скрипта jQuery. Пример:

  $form['student_type'] = array(
    '#type' => 'radios',
    '#options' => array(
      'high_school'   => t('High School'),
      'undergraduate' => t('Undergraduate'),
      'graduate'      => t('Graduate'),
    ),
    '#title' => t('What type of student are you?')
  );

  // High school information.
  $form['high_school']['tests_taken'] = array(
    '#type' => 'checkboxes',
    '#options' => drupal_map_assoc(array(t('SAT'), t('ACT'))),
    '#title' => t('What standardized tests did you take?'),
    // This #states rule says that this checkboxes array will be visible only
    // when $form['student_type'] is set to t('High School').
    // It uses the jQuery selector :input[name=student_type] to choose the
    // element which triggers the behavior, and then defines the "High School"
    // value as the one that triggers visibility.
    '#states' => array(
      'visible' => array(   // action to take.
        ':input[name="student_type"]' => array('value' => 'high_school'),
      ),
    ),
  );

Вот пример, если вы хотите использовать #statesдля условия нескольких значений:

 $form['student_type'] = array(
    '#type' => 'checkboxes',
    '#options' => array(
      'high_school'   => t('High School'),
      'undergraduate' => t('Undergraduate'),
      'graduate'      => t('Graduate'),
    ),
    '#title' => t('What type of student are you?')
  );

  // High school information.
  $form['high_school']['tests_taken'] = array(
    '#type' => 'textfield',
    '#title' => t('What standardized tests did you take?'),
    '#states' => array(
      'visible' => array(   // action to take.
        ':input[name="student_type[high_school]"]' => array('checked' => TRUE),
        ':input[name="student_type[undergraduate]"]' => array('checked' => TRUE),
        ':input[name="student_type[graduate]"]' => array('checked' => FALSE),
      ),
    ),
  );

Смотрите модульform_example/form_example_states.inc from examples для более подробной информации и примеров.

Мильковский
источник
Говоря о том #states, что я никогда не нашел способ определить более сложные условия видимости, такие как: скрыть элемент управления A, когда значение элемента управления B находится в массиве (x, y, z). Вы знаете синтаксис для этого?
Артур
1
Смотрите мое обновление выше
milkovsky
4

Вы должны попробовать условные поля , я думаю, что этот модуль является обязательным для этой задачи. Вы можете установить зависимости между полями в удобном интерфейсе администратора. Например, вы можете установить Aполе видимым только в том случае, если Bполе имеет значение « 1234 », или вы можете установить Cтекстовое поле таким, чтобы оно было видимым только при установленном Dполе, или установить Eполе в невидимое, если Fоно сфокусировано и т. Д.

В форме загрузки эти зависимости будут установлены на стороне клиента, на дисплее узла эти зависимости будут установлены на стороне сервера.

Вы можете установить эти зависимости в admin/structure/types/manage/[YOURCONTENTTYPESMACHINENAME]/dependencies.

Условные поля (Источник изображения: страница проекта )

Sk8erPeter
источник