Mehrere Werte, um #Status auszulösen


18

Wie kann ich festlegen, dass mehrere Werte die #Status der Formular-API auslösen?

Nehmen wir zum Beispiel an, ich wollte, dass dieses Feld nicht nur sichtbar ist, wenn der Wert 5 ist (funktioniert derzeit unten), sondern dass das Feld sichtbar wird, wenn die Werte 3, 4 oder 5 sind.

'#states' => array(
    'visible' => array(
       ':input[name="field_star_rating"]' => array('value' => t('5')),
    ),
),

Als Notiz habe ich folgendes probiert und es funktioniert nicht . Es funktioniert nur, wenn der Wert '4' ist

'#states' => array(
    'visible' => array(
        ':input[name="field_star_rating"]' => array('value' => t('5')),
        ':input[name="field_star_rating"]' => array('value' => t('4')),
    ),
),

Dies funktioniert auch nicht , es funktioniert auch nur, wenn der Wert '4' ist:

'#states' => array(
    'visible' => array(
        ':input[name="field_star_rating"]' => array('value' => t('5'), 'value' => t('4')),
    ),
),

Antworten:


39

Folgendes benötigen Sie:

'#states' => array(
    'visible' => array(
        ':input[name="field_star_rating"]' => array(
            array('value' => t('5')),
            array('value' => t('4'))
        ),
    ),
),

Dies ist in der Tat der richtige Weg, der als richtig markierte ist falsch. Weitere Informationen finden Sie in dieser Ausgabe: drupal.org/node/735528
— Robin

Die #States-API hat sicherlich einen großen Sinn für das Jahr 2011. Als korrekt markieren.
— Citricguy

Das ist eine großartige Antwort, und ich bin wie ein Dutzend Mal von Google hierher gekommen ... ein Kopfgeld ist unterwegs.
— AyeshK

Es funktioniert gut für die normale Ansicht. Nachdem ein 'Ajax' gestartet wurde, wurde es immer wieder hinzugefügt
— Guru

3

Die einzige Möglichkeit, die ich mir vorstellen konnte, ist die Verwendung von #ajax in D7.

Hier sind ein paar hilfreiche Tipps, von denen ich mir wünschte, ich hätte sie vor dem Start gewusst.

  1. #ajax in der Formular-API ist fantastisch und lohnenswert zu lernen
  2. #states unterstützt weder OR noch XOR (Ohne Patch? http://drupal.org/node/735528 )
  3. dpm ($ form); und var_dump ($ form_state) für eine benutzerdefinierte Submit-Funktion sind von unschätzbarem Wert

Hier ist eine modifizierte Version eines der AJAX-Beispiele aus dem Beispielmodul.

function plugin_autotextfields($form, &$form_state) {

    $form['star_rating'] = array(
        '#type' => 'select',
        '#title' => t('Star Rating'),
        '#options' => array('_none' => '- select -', 5 => '5 Star', 4 => '4 Star', 3 => '3 Star', 2 => '2 Star', 1 => '1 Star'),
        '#ajax' => array(
            'callback' => 'plugin_autotextfields_callback',
            'wrapper' => 'textfields',
            'effect' => 'fade',
        ),
    );

    $form['textfields'] = array(
        '#title' => t("Fieldset Name"),
        '#prefix' => '<div id="textfields">',
        '#suffix' => '</div>',
        '#type' => 'fieldset',
        '#description' => t('Where the field will be placed'),
    );

    if (!empty($form_state['values']['star_rating']) && $form_state['values']['star_rating'] == 5) {
        $form['textfields']['review'] = array(
            '#type' => 'textfield',
            '#title' => t('Message if 5 stars'),
        );
    } else if (!empty($form_state['values']['star_rating'])) {
        $form['textfields']['review'] = array(
            '#type' => 'textfield',
            '#title' => t('Message if not 5 stars'),
        );
    }

    $form['submit'] = array(
        '#type' => 'submit',
        '#value' => t('Click Me'),
    );

    return $form;
}

function omfg_autotextfields_callback($form, $form_state) {
    return $form['textfields'];
}

Ich hoffe das hilft jemandem, der auf das gleiche Problem stößt :)


Beeindruckend! Sehr hilfreiche Antwort mein Freund. Ich habe mich um ein Problem mit #states gekümmert und jetzt funktioniert es, aber #ajax wäre offensichtlich einfacher gewesen, jetzt, wo Sie mich mit einem Hinweis-Stock geschlagen haben. Und dieser Debugging-Tipp als Bonus? Tut mir leid, dass ich dich mit armseligem Karma bezahlen muss. ;)
— stefgosselin

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

PS Weitere Funktionen finden Sie im Beispielmodul "form_example / form_example_states.inc".

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.