Múltiples valores para desencadenar # estados

18

¿Cómo puedo hacer que múltiples valores activen los # estados de la API de formulario?

Digamos, por ejemplo, que quería que este campo fuera visible no solo si el valor es 5 (actualmente funciona a continuación), sino que quería que el campo sea visible si los valores son 3, 4 o 5.

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

Como nota, probé lo siguiente y no funciona . Solo funciona si el valor es '4'

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

Esto tampoco funciona , solo funciona si el valor es '4':

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

Respuestas:

39

Esto es lo que necesitas:

'#states' => array(
    'visible' => array(
        ':input[name="field_star_rating"]' => array(
            array('value' => t('5')),
            array('value' => t('4'))
        ),
    ),
),
richardg
fuente
Esta es de hecho la forma correcta, la actual marcada como correcta es incorrecta. Consulte este número para obtener más información: drupal.org/node/735528
Robin
La API #states seguramente ha tenido mucho sentido en 2011. Marcado como correcto.
Citricguy
esta es una gran respuesta, y vine aquí de Google, como una docena de veces ... una recompensa está en camino.
AyeshK
Está funcionando bien para la vista normal. Después de ejecutar cualquier 'Ajax', se añadió una y otra vez
Guru
3

La única forma en que podría imaginar es usar #ajax en D7.

Aquí hay algunos consejos útiles que desearía haber sabido antes de comenzar.

  1. #ajax en la forma API es increíble y vale la pena aprender
  2. #states no admite OR o XOR (¿Sin un parche? http://drupal.org/node/735528 )
  3. dpm ($ formulario); y var_dump ($ form_state) en una función de envío personalizada no tienen precio

Aquí hay una versión modificada de uno de los ejemplos de AJAX del módulo de ejemplos.

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'];
}

Espero que esto ayude a alguien que se encuentre con el mismo problema :)

Citricguy
fuente
¡Guauu! Muy útil respuesta mi amigo. He estado resolviendo un problema con #states y ahora lo tengo funcionando, pero #ajax obviamente hubiera sido más fácil ahora que me abofeteaste con un palo de pista. ¿Y ese consejo de depuración como un bono? Lo siento, tengo que pagarte con miserable karma. ;)
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),
      ),
    ),
  );

PD Consulte el módulo de ejemplos para obtener más funciones "form_example / form_example_states.inc"

milkovsky
fuente