Nascondere / mostrare dinamicamente i campi API Field in Drupal 7


14

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 proprietà 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.


Non sono sicuro se drupal.org/project/conditional_fields è già pronto per d7, ma potrebbe valere la pena esaminarlo
Jukebox

Risposte:


5

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

Sì, ho finito per usare drupal_add_js nella pagina del modulo e ho finito per farlo in jQuery. Mi stavo solo chiedendo se ci fosse un modo più "drupal" per farlo.
NRaf

Vorrei menzionare che non sono un grande fan dell'approccio alla visibilità di Drupal #states, motivo per cui non l'ho suggerito sopra.
keithm,

@keithm Potresti approfondire, per favore, perché non sei un fan degli stati (dal 2015, D7). Sto lavorando a un progetto in cui stiamo cercando di prendere la decisione di utilizzare #states vs drupal_add_js. Perché pensi che uno sia una scelta migliore rispetto all'altro?
blue928

Secondo me è una questione di legittima preferenza per il programmatore; la mia logica può differire dalla tua. Detto questo, in pratica non mi piace ricorrere a un'altra sintassi che duplica le funzionalità trovate in Javascript / jQuery. Quando ho provato #states, ho anche trovato i casi d'uso per i quali è apparentemente progettato troppo limitante. Quando il mio problema si è esteso al di fuori di questi casi d'uso, ho dovuto riscrivere comunque tutto in Javascript direttamente.
keithm

19

In Drupal 7 puoi usare $ form #statesinvece 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 #statesper la condizione di più valori:

 $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 moduloform_example/form_example_states.inc da esempi per maggiori dettagli ed esempi.


A proposito #states, non ho mai trovato un modo per definire condizioni di visibilità più complesse, come ad esempio: nascondi il controllo A quando il valore del controllo B è nella matrice (x, y, z). Per caso conosci una sintassi per questo?
Artur,

1
Vedi il mio aggiornamento sopra
milkovsky,

4

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, è possibile impostare il Acampo in modo che sia visibile solo se il Bcampo ha valore " 1234 ", oppure è possibile impostare il campo di Ctesto in modo che sia visibile solo quando il Dcampo è selezionato oppure impostare il Ecampo su invisibile se Fè attivo, ecc.

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

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

Campi condizionali (Fonte dell'immagine: la pagina del progetto )

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.