राज्यों के साथ एक फॉर्म कैसे बनाया जाता है?


31

मेरे पास एक ड्रॉप डाउन सूची है जो चुने गए क्षेत्रों के आधार पर विभिन्न क्षेत्रों को प्रदर्शित करती है और मुझे पता है कि मैं राज्यों के साथ दृश्यता को टॉगल कर सकता हूं लेकिन जब मैं आवश्यक उपयोग करने की कोशिश करता हूं तो * स्पैन डिस्प्ले होता है लेकिन वास्तव में इसकी आवश्यकता नहीं होती है। मेरा मतलब है कि भले ही यह "आवश्यक" हो, मैं सबमिट कर सकता हूं और ड्रुपल से त्रुटि संदेश प्राप्त नहीं कर सकता। क्या मैं कुछ गलत कर रहा हूं या क्या यह वर्तमान में Drupal 7.8 में टूट गया है?

        $form['host_info'] = array(
        '#type' => 'select',
        '#title' => t("Host Connection"),
        '#options' => array(
          'SSH2' => t('SSH2'),
          'Web Service' => t('Web Service'),
        ),
        '#default_value' => t(variable_get('host_info', 'SSH2')),
        '#description' => t("Specify the connection information to the host"),
        '#required' => TRUE,
    );

    $form['ssh_host'] = array(
        '#type' => 'textfield',
        '#title' => t("Host Address"),
        '#description' => t("Host address of the SSH2 server"),
        '#default_value' => t(variable_get('ssh_host')),
        '#states' => array(
            'visible' => array(
                ':input[name=host_info]' => array('value' => t('SSH2')),
            ),
            'required' => array(
                ':input[name=host_info]' => array('value' => t('SSH2')),
            ),
        ),
    );

    $form['ssh_port'] = array(
        '#type' => 'textfield',
        '#title' => t("Port"),
        '#description' => t("Port number of the SSH2 server"),
        '#default_value' => t(variable_get('ssh_port')),
        '#states' => array(
            'visible' => array(
                ':input[name=host_info]' => array('value' => t('SSH2')),
            ),
            'required' => array(
                ':input[name=host_info]' => array('value' => t('Web Service')),
            ),
        ),
    );

आप के लिए दोहरे उद्धरण चिह्नों को याद कर रहे हैं name। यह होना ही चाहिए :input[name="host_info"]
लीमैनक्स

जवाबों:


20

आपको इसे अपने आप को एक मान्य सत्यापन फ़ंक्शन में मान्य करना होगा।

#States द्वारा कॉन्फ़िगर किया गया सब कुछ ब्राउज़र में 100% होता है, जो कुछ भी करता है वह Drupal के लिए दिखाई नहीं देता है जब फ़ॉर्म सबमिट किया जाता है (उदाहरण के लिए, सभी अदृश्य फॉर्म फ़ील्ड उसी तरह सबमिट किए जाते हैं और मान्य होते हैं यदि कोई #states नहीं था)।


मुझे लगा कि मामला यही है। जब मैं शोध कर रहा था कि यह कैसे करना है तो मैंने राज्यों के साथ 'आवश्यक' विशेषता की खोज की और सोचा कि यह अतिरिक्त कार्य के बिना मेरी आवश्यकता के तरीके पर काम करेगा।
सतरैल

11

आप इस तरह से उपयोग कर सकते हैं:

'#states'=> [
  'required' => [
    ':input[name="abroad_because[somecheckbox]"]' => ['checked' => TRUE],
  ],
],

4
हां - यह तत्व के लिए आवश्यक संकेतक जोड़ देगा। लेकिन इसमें कोई क्लाइंट या सर्वर साइड सत्यापन शामिल नहीं होगा।
आयुष


#States सरणी में आवश्यक कुंजी रखना मेरे लिए काम कर रहा था, हालांकि यह तथ्य था कि मेरे पास एक ईमेल फ़ील्ड सत्यापन था। तो, मुझे आश्चर्य है कि यदि आप फॉर्म ड्रूमल का उपयोग करते हैं तो यह काम करेंगे
एलेक्स फिननार

8

फेलिक्स ईव के जवाब के समान ही यह इनलाइन तत्व सत्यापन के लिए एक स्निपेट है:

आप किसी तत्व को आवश्यक कार्य को मान्य करने के लिए कहते हैं:

$form['element'] = array(
....
  '#element_validate' => array(
     0 => 'my_module_states_require_validate',
   ),
)

तब सत्यापन फ़ंक्शन आवश्यक फ़ील्ड पाता है और यह देखने के लिए जांच करता है कि क्या इसका सही फ़ॉर्म मूल्य है जो उस फ़ील्ड को प्रकट करेगा जिसे आवश्यक होना चाहिए।

function my_module_states_require_validate($element, $form_state) {
  $required_field_key = key($element['#states']['visible']);
  $required_field = explode('"', $required_field_key);
  if($form_state['values'][$required_field[1]] == $element['#states']['visible'][$required_field_key]['value']) {
    if($form_state['values'][$element['#name']] == '') {
      form_set_error($element['#name'], $element['#title'].' is required.');
    }
  }
}

1
यह सबसे अच्छा समाधान IMHO है!
एलेक्स फिननार

3

प्रपत्र के लिए AFTER_BUILD फ़ंक्शन का उपयोग करने और उस फ़ील्ड को वैकल्पिक बनाने का एक और तरीका है। यहाँ ड्रुपल 6 के लिए एक लिंक दिया गया है

इसे अपने फॉर्म कोड में जोड़ें

$form['#after_build'][] = 'custom_form_after_build';

निर्माण के बाद लागू करें, अपनी कस्टम फ़ील्ड स्थिति का परीक्षण करें

function custom_form_after_build($form, &$form_state) {
  if(isset($form_state['input']['custom_field'])) {
    $form['another_custom_field']['#required'] = FALSE;
    $form['another_custom_field']['#needs_validation'] = FALSE;
  }
 return $form;
}

मेरे मामले में, #states कई जोड़ रहा था * इसलिए मुझे इससे बचना होगा और इस स्पैन को छिपाने और दिखाने के लिए jquery का उपयोग करना होगा * *

$('.another-custom-field').find('span').hide();  

तथा

$('.another-custom-field').find('span').show();

मेरे custom_field मान के आधार पर।


3

यहाँ Drupal 7 फॉर्म #states पर एक विस्तृत गाइड है ।

यह महत्वपूर्ण बिट है:

/**
 * Form implementation.
 */
function module_form($form, $form_state) {
  $form['checkbox_1'] = [
    '#title' => t('Checkbox 1'),
    '#type' => 'checkbox',
  ];

  // If checkbox is checked then text input
  // is required (with a red star in title).
  $form['text_input_1'] = [
    '#title' => t('Text input 1'),
    '#type' => 'textfield',
    '#states' => [
      'required' => [
        'input[name="checkbox_1"]' => [
          'checked' => TRUE,
        ],
      ],
    ],
  ];

  $form['actions'] = [
    'submit' => [
      '#type' => 'submit',
      '#value' => t('Submit'),
    ],
  ];

  return $form;
}

/**
 * Form validate callback.
 */
function module_form_validate($form, $form_state) {
  // if checkbox is checked and text input is empty then show validation
  // fail message.
  if (!empty($form_state['values']['checkbox_1']) &&
    empty($form_state['values']['text_input_1'])
  ) {
    form_error($form['text_input_1'], t('@name field is required.', [
      '@name' => $form['text_input_1']['#title'],
    ]));
  }
}

2

मुझे अभी उसी समस्या का सामना करना पड़ा है, ताकि कस्टम सत्यापन प्रदान करने की आवश्यकता हो, लेकिन मैं चाहता था कि इसे #states सरणी के माध्यम से नियंत्रित किया जाए, इसलिए मुझे दो बार समान नियमों को निर्दिष्ट करने की आवश्यकता नहीं थी।

यह jQuery चयनकर्ता से फ़ील्ड का नाम निकालकर काम करता है (चयनकर्ता प्रारूप में होना चाहिए :input[name="field_name"]या यह काम नहीं करेगा)।

नीचे दिए गए कोड को केवल उस विशिष्ट परिदृश्य में जांचा जाता है जिसका मैं इसमें उपयोग कर रहा था, हालाँकि मैं हालांकि किसी और के लिए उपयोगी साबित हो सकता हूँ।

function hook_form_validate($form, &$form_state) {

    // check for required field specified in the states array

    foreach($form as $key => $field) {

        if(is_array($field) && isset($field['#states']['required'])) {

            $required = false;
            $lang = $field['#language'];

            foreach($field['#states']['required'] as $cond_field_sel => $cond_vals) {

                // look for name= in the jquery selector - if that isn't there then give up (for now)
                preg_match('/name="(.*)"/', $cond_field_sel, $matches);

                if(isset($matches[1])) {

                    // remove language from field name
                    $cond_field_name = str_replace('[und]', '', $matches[1]);

                    // get value identifier (e.g. value, tid, target_id)
                    $value_ident = key($cond_vals);

                    // loop over the values of the conditional field
                    foreach($form_state['values'][$cond_field_name][$lang] as $cond_field_val) {

                        // check for a match
                        if($cond_vals[$value_ident] == $cond_field_val[$value_ident]) {
                            // now we know this field is required
                            $required = true;
                            break 2;
                        }

                    }

                }

            }

            if($required) {
                $field_name = $field[$lang]['#field_name'];
                $filled_in = false;
                foreach($form_state['values'][$field_name][$lang] as $item) {
                    if(array_pop($item)) {
                        $filled_in = true;
                    }
                }
                if(!$filled_in) {
                    form_set_error($field_name, t(':field is a required field', array(':field' => $field[$lang]['#title'])));
                }
            }

        }
    }

}

2

मैं इसे ड्रुपल 8 में इस तरह से करने में सक्षम था:

          '#states' => array(
            'required' => array(
              array(':input[name="host_info"]' => array('value' => 'SSH2')),
             ),
           ),

टी मत डालो ('SSH2')। यह उस विकल्प के मूल्य के स्थान पर इसका अनुवाद करेगा जो कि एक असत्य एसएसएच 2 है।

मुझे संदेह है कि यह ड्रुपल 7 के लिए भी काम करेगा।


1
ड्रुपल 7 में, जैसा कि समान समाधान देने वाले उत्तरों के लिए कहा गया है, यह आवश्यक फ़ील्ड अंकन प्रदान करता है, लेकिन वास्तव में कोई सत्यापन नहीं करता है। क्या Drupal 8 वास्तव में आवश्यक us #states के रूप में चिह्नित फ़ील्ड को मान्य करता है?
अल्ट्राबॉच

0

मेरे पास प्रपत्र फ़ील्ड, और एक चेकबॉक्स है, इसलिए मुझे डोमिनिक वुडमैन के उत्तर पर थोड़ा काम करने की आवश्यकता है। यदि कोई अन्य शरीर उसी समस्या में भाग ले तो:

function my_module_states_require_validate($element, $form_state) {
  $required_field_key = key($element['#states']['visible']);
  $required_field = explode('"', $required_field_key);
  $keys = explode('[', $required_field[1]);
  $keys = str_replace(']', '', $keys);
  $tmp = $form_state['values'];
  foreach ($keys as $key => $value) {
    $tmp = $tmp[$value];
  }
  if($tmp == $element['#states']['visible'][$required_field_key]['checked']) {
    $keys2 = explode('[', $element['#name']);
    $keys2 = str_replace(']', '', $keys2);
    $tmp2 = $form_state['values'];
    foreach ($keys2 as $key => $value) {
      $tmp2 = $tmp2[$value];
    }
    if($tmp2 == '') {
      form_set_error($element['#name'], $element['#title']. t(' is required.'));
    }
  }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.