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')),
    ),
),
Citricguy
quelle

Antworten:

39

Folgendes benötigen Sie:

'#states' => array(
    'visible' => array(
        ':input[name="field_star_rating"]' => array(
            array('value' => t('5')),
            array('value' => t('4'))
        ),
    ),
),
richardg
quelle
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 :)

Citricguy
quelle
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".

milkovsky
quelle