it-swarm.it

Nascondere / mostrare dinamicamente i campi API Field in Drupal 7

Ho creato un'entità con un modulo "aggiungi nuovo". L'entità stessa ha un numero limitato di variabili effettive. Ho aggiunto la maggior parte dei dati extra di cui ho bisogno usando Fields personalizzati (ovvero l'API Field).

Quello che devo fare in questa fase è riuscire a nascondere dinamicamente un campo in base al valore di un altro. cioè se un campo a discesa ha il valore impostato su No, un altro campo dovrebbe essere nascosto, altrimenti dovrebbe essere mostrato.

Da quello che posso vedere, è in qualche modo facile aggiungere questa funzionalità ai campi creati utilizzando l'API Form (ovvero tramite la AJAX), tuttavia c'è un modo per raggiungerlo utilizzando i campi allegati? Non ho problemi a utilizzare Javascript personalizzato se questo è ciò che è necessario per risolvere questo problema.

14
NRaf

jQuery funziona bene per questo:

(function($) {
  $(document).ready(function() {
    $('#select1').change(function() {
      switch ($(this).val()) {
        case '1':
          $('#field2').hide();
          break;
        default:
          $('#field2').show();
          break;
      }
    });
  });
}) (jQuery);
5
keithm

In Drupal 7 puoi usare $ form #states invece dello script jQuery personalizzato. Esempio:

  $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'),
      ),
    ),
  );

Ecco un esempio se si desidera utilizzare #states per condizione di valori multipli:

 $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),
      ),
    ),
  );

Vedi il form_example/form_example_states.inc da modulo esempi per maggiori dettagli ed esempi.

19
milkovsky

Dovresti provare Conditional Fields , penso che questo modulo sia un must per questo compito. È possibile impostare dipendenze tra i campi su un'interfaccia di amministrazione intuitiva. Ad esempio, puoi impostare il campo A in modo che sia solo visibile se il campo B ha valore " 1234 ", oppure puoi impostare C campo di testo in modo che sia visibile quando il campo D è selezionato oppure imposta il campo E su invisibile se F è focalizzato ecc.

Nel modulo di caricamento, queste dipendenze verranno impostate sul lato client, sul display del nodo, queste dipendenze verranno impostate sul lato server.

Puoi impostare queste dipendenze su admin/structure/types/manage/[YOURCONTENTTYPESMACHINENAME]/dependencies.

Conditional Fields(Fonte dell'immagine: il progetto pagina )

4
Sk8erPeter