#statesをトリガーする複数の値


18

複数の値でForm APIの#statesをトリガーするにはどうすればよいですか?

たとえば、値が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
ロビン

#states APIは確かに2011年に大きな意味を持ちます。正しいものとしてマークします。
Citricguy 14

これはすばらしい答えであり、私はここから数十回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)は貴重です

これは、examplesモジュールのAJAXサンプルの1つの修正バージョンです。

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

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.