#States'i Tetiklemek için Birden Çok Değer


18

Birden çok değerin Form API'sının #states'ini tetiklemesini nasıl sağlayabilirim?

Örneğin, bu alanın yalnızca değer 5 ise (şu anda aşağıda çalışıyorsa) görünmesini değil, değerler 3, 4 veya 5 ise alanın görünür olmasını istedim.

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

Bir not olarak, aşağıdakileri denedim ve çalışmıyor . Yalnızca değer '4' olduğunda çalışır

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

Bu da işe yaramaz , sadece değer '4' ise de çalışır:

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

Yanıtlar:


39

İhtiyacınız olan şey:

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

Bu gerçekten doğru yoldur, doğru olarak işaretlenmiş olan akım yanlıştır. Daha fazla bilgi için bu konuya bakın: drupal.org/node/735528
Robin

#States API'sı emin olun uzun bir yol duygusu 2011. Doğru olarak işaretleme.
Citricguy

bu harika bir cevap ve ben de Google'dan geldim, bir düzine kez ... bir ödül geliyor.
AyeshK

Normal görünüm için iyi çalışıyor. Herhangi bir 'ajax' çalıştırdıktan sonra tekrar tekrar ekledi
Guru

3

Anlayabilmemin tek yolu D7'de #ajax kullanmaktır.

İşte birkaç yararlı ipucu en keşke başlamadan önce bilseydim.

  1. #ajax form API'sı harika ve öğrenmeye değer
  2. #states VEYA veya XOR'u desteklemez (Düzeltme eki olmadan mı? http://drupal.org/node/735528 )
  3. dpm ($ bir şekilde); ve özel gönderme işlevindeki var_dump ($ form_state) paha biçilemez

Örnek modülünden AJAX örneklerinden birinin değiştirilmiş bir sürümü.

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

Umarım bu aynı problemle karşılaşan birine yardımcı olur :)


Vaov! Çok yararlı cevap arkadaşım. Başımı #states ile ilgili bir soruna sarıyorum ve şimdi çalışmasını sağladım, ancak #ajax açıkçası bana bir ipucu çubuğu ile tokat attığınız için daha kolay olurdu. Ve bu hata ayıklama ipucu bir bonus olarak? Üzgünüm, sana kibarca karma ödemem gerekiyor. ;)
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 Daha fazla özellik için örnek modülüne bakın "form_example / form_example_states.inc"

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.