Dynamisches Ausblenden / Anzeigen von Feld-API-Feldern in Drupal 7


15

Ich habe eine Entität mit einem neuen Formular erstellt. Die Entität selbst hat eine begrenzte Anzahl von tatsächlichen Variablen. Ich habe die meisten zusätzlichen Daten hinzugefügt, die ich mit benutzerdefinierten Feldern (dh der Feld-API) benötige.

Was ich in dieser Phase tun muss, ist in der Lage zu sein, ein Feld basierend auf dem Wert eines anderen dynamisch auszublenden. Wenn für ein Dropdown-Feld der Wert "Nein" festgelegt ist, sollte ein anderes Feld ausgeblendet werden, andernfalls sollte es angezeigt werden.

Soweit ich sehen kann, ist es einigermaßen einfach, diese Funktionalität zu Feldern hinzuzufügen, die mit der Formular-API (dh über die AJAX-Eigenschaft) erstellt wurden. Gibt es jedoch eine Möglichkeit, dies mit angehängten Feldern zu erreichen? Ich habe keine Probleme mit benutzerdefiniertem Javascript, wenn dies erforderlich ist, um dies zu lösen.


Ich bin mir nicht sicher, ob drupal.org/project/conditional_fields für d7 bereit ist, aber es könnte sich lohnen, einen Blick darauf zu werfen
Jukebox

Antworten:


6

jQuery funktioniert gut dafür:

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

Ja, am Ende habe ich drupal_add_js auf der Formularseite verwendet und dies in jQuery getan. Ich habe mich nur gefragt, ob es einen 'Drupal'-Weg gibt, dies zu tun.
NRaf

Ich würde erwähnen, dass ich kein großer Fan der Sichtbarkeit von Drupal #states bin, weshalb ich es oben nicht vorgeschlagen habe.
Keithm

@keithm Könnten Sie bitte erläutern, warum Sie kein Fan von Staaten sind (Stand 2015, D7). Ich arbeite an einem Projekt, in dem wir versuchen, die Entscheidung zu treffen, #states vs drupal_add_js zu verwenden. Warum denkst du, ist eine bessere Wahl als die andere?
blue928

Meiner Meinung nach ist es eine legitime Frage der Programmiererpräferenz. meine Begründung kann von Ihrer abweichen. In der Praxis greife ich jedoch lieber nicht auf eine andere Syntax zurück, die die Funktionen von Javascript / jQuery dupliziert. Als ich #states ausprobiert habe, fand ich auch die Anwendungsfälle, für die es anscheinend entworfen wurde, zu einschränkend. Als sich mein Problem über diese Anwendungsfälle hinaus erstreckte, musste ich das Ganze sowieso direkt in Javascript umschreiben.
Keithm

20

In Drupal 7 können Sie $ form #statesanstelle eines benutzerdefinierten jQuery-Skripts verwenden. Beispiel:

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

Hier ist ein Beispiel, wenn Sie die #statesBedingung für mehrere Werte verwenden möchten :

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

Siehe das form_example/form_example_states.incvon Beispielen Modul für weitere Informationen und Beispiele.


Apropos #states, ich habe noch nie eine Möglichkeit gefunden, komplexere Sichtbarkeitsbedingungen zu definieren, z. B .: Steuerelement A ausblenden, wenn der Wert von Steuerelement B im Array (x, y, z) liegt. Kennst du zufällig eine Syntax dafür?
Artur

1
Siehe mein Update oben
milkovsky

5

Sie sollten es mit bedingten Feldern versuchen . Ich denke, dieses Modul ist ein Muss für diese Aufgabe. Sie können Abhängigkeiten zwischen Feldern in einer benutzerfreundlichen Administrationsoberfläche festlegen. Zum Beispiel können Sie festlegen , AFeld sein nur sichtbar , wenn BFeld Wert „ 1234 “, oder Sie können festlegen CTextfeld sein , sichtbar nur , wenn DFeld aktiviert ist, oder Set EFeld unsichtbar , wenn Fheißt fokussierte usw.

Auf dem Upload-Formular werden diese Abhängigkeiten clientseitig festgelegt, auf der Knotenanzeige werden diese Abhängigkeiten serverseitig festgelegt.

Sie können diese Abhängigkeiten auf einstellen admin/structure/types/manage/[YOURCONTENTTYPESMACHINENAME]/dependencies.

Bedingte Felder (Quelle des Bildes: die Projektseite )

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.