# 상태를 트리거하는 여러 값


18

여러 값을 사용하여 양식 API의 # 상태를 트리거하려면 어떻게해야합니까?

예를 들어, 값이 5 (현재는 아래에서 작동) 인 경우에만이 필드를 표시하고 싶지만 값이 3, 4 또는 5 인 경우 필드를 표시하려고했습니다.

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

참고로 다음을 시도했지만 작동하지 않습니다 . 값이 '4'인 경우에만 작동합니다

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

이것은 또한 작동하지 않으며 값이 '4'인 경우에만 작동합니다.

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

답변:


39

필요한 것은 다음과 같습니다.

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

이것은 실제로 올바른 방법이며, 올바른 것으로 표시된 현재 방법이 잘못되었습니다. 자세한 내용은이 문제를 참조하십시오. drupal.org/node/735528
Robin

#states API는 확실히 2011 년 말이되었습니다.
Citricguy

이것은 훌륭한 답변입니다. 저는 수십 번과 같이 Google에서 왔으며 현상금이 진행 중입니다.
AyeshK

정상적인 시야에서는 잘 작동합니다. 'ajax'를 실행 한 후, 계속 추가되었습니다
Guru

3

내가 알 수있는 유일한 방법은 D7에서 #ajax를 사용하는 것입니다.

다음은 시작하기 전에 알고 싶었던 유용한 팁입니다.

  1. 양식 API의 #ajax는 훌륭하고 배울 가치가 있습니다.
  2. #states는 OR 또는 XOR을 지원하지 않습니다 (패치가 없습니까? http://drupal.org/node/735528 )
  3. dpm ($ form); 사용자 정의 제출 함수의 var_dump ($ form_state)는 값이 없습니다.

다음은 예제 모듈에서 AJAX 예제 중 하나의 수정 된 버전입니다.

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

나는 이것이 동일한 문제에 부딪 치는 누군가를 돕기를 바랍니다 :)


와! 친구에게 매우 도움이됩니다. 나는 #states와 관련된 문제를 머리에 감아 서 지금 작동하고 있지만 #ajax는 단서로 나를 때렸 기 때문에 분명히 더 쉬울 것입니다. 그리고 그 디버깅 팁은 보너스입니까? 미련한 업장으로 돈을 지불해야해서 미안 해요 ;)
stefgosselin 8

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 더 많은 기능 "form_example / form_example_states.inc" 는 예제 모듈 을 참조하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.