Динамічно приховування / показ полів API API в Drupal 7


14

Я створив сутність із формою "додати нову". Сама сутність має обмежену кількість фактичних змінних. Я додав більшість потрібних мені даних за допомогою спеціальних полів (тобто API поля).

Що мені потрібно зробити на цьому етапі - це можливість динамічно приховати одне поле виходячи зі значення іншого. тобто, якщо у спадному полі встановлено значення Ні, інше поле має бути прихованим, інакше воно повинно бути показане.

Як я бачу, дещо легко додати цю функціональність до полів, створених за допомогою API API (тобто через властивість AJAX), проте чи є спосіб досягти цього за допомогою доданих полів? У мене немає проблем із користувацьким Javascript, якщо саме це потрібно для вирішення цього питання.


Я не впевнений, чи готовий 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);

Так, я використовував drupal_add_js на сторінці форми, і робив це в jQuery. Мені просто було цікаво, чи існує більше "Drupal" спосіб це зробити.
NRaf

Я хотів би зазначити, що я не є великим прихильником підходу Drupal #states до видимості, тому я не пропонував цього вище.
кейт

@keithm Не могли б ви детальніше пояснити, чому ви не шанувальник держав (станом на 2015 рік, D7). Я працюю над проектом, де ми намагаємось прийняти рішення використовувати #states vs drupal_add_js. Чому ви вважаєте, що один - кращий вибір над іншим?
blue928

На мою думку, це питання законних переваг програміста; моє обгрунтування може відрізнятися від вашого. Це означає, що на практиці я більше не люблю вдаватися до іншого синтаксису, який дублює функціональність, що знаходиться в Javascript / jQuery. Коли я спробував #states, я також виявив випадки використання, які, очевидно, розроблені занадто обмежуючими. Коли моя проблема поширювалася за межами цих випадків використання, мені все одно довелося переписати все в прямому Javascript.
кейт

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з прикладів модуля для отримання більш детальної інформації та прикладів.


Якщо говорити про #states, я ніколи не знайшов способу визначення більш складних умов видимості, таких як: приховати контроль A, коли значення B значення знаходиться в масиві (x, y, z). Ви випадково знаєте синтаксис для цього?
Артур

1
Дивіться моє оновлення вище
milkovsky

4

Спробуйте скористатись умовними полями , я думаю, цей модуль є обов'язковим для виконання цього завдання. Ви можете встановити залежності між полями в зручному для користувача інтерфейсі. Наприклад, ви можете встановити Aполе , щоб бути тільки видимим , якщо Bполе має значення « 1234 », або ви можете встановити Cтекстове поле , щоб бути видимим тільки тоді , коли Dполе перевіряється, чи набір Eполе невидимим , якщо Fє увага і т.д.

У формі завантаження ці залежності будуть встановлені на стороні клієнта, на дисплеї вузла ці залежності будуть встановлені на стороні сервера.

Ви можете встановити ці залежності на admin/structure/types/manage/[YOURCONTENTTYPESMACHINENAME]/dependencies.

Умовні поля (Джерело зображення: проекту сторінка )

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.