प्रपत्र में डायनामिक चयन सूची (आश्रित ड्रॉपडाउन)


28

मैं ड्रुपल सात का उपयोग कर रहा हूं। मैं चुनिंदा सूची में विकल्पों को एक फॉर्म में किसी अन्य चयन सूची में चुने गए मूल्य पर निर्भर होना चाहता हूं। मुझे यकीन है कि यह पहले भी कई बार पूछा गया है, लेकिन मुझे यह करने के लिए एक स्पष्ट जवाब खोजने में कठिनाई हो रही है।

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

मैं किसी भी संकेत के लिए सबसे अच्छा तरीका (सबसे सरल) के लिए बहुत आभारी रहूंगा, इस बारे में जाने के लिए, या किसी भी उपयोगी संसाधनों के लिए ऑनलाइन जो मदद करेगा।

जवाबों:


27

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

$form['city'] = array(
  '#type' => 'select',
  '#title' => t('City'),
  '#options' => $options,
  '#ajax' => array(
    'event' => 'change',
    'wrapper' => 'squadron-wrapper',
    'callback' => 'mymodule_ajax_callback',
    'method' => 'replace',
  ),
);
$form['squadron_wrapper'] = array('#prefix' => '<div class="squadron-wrapper">', '#suffix' => '</div>');
$form['squadron_wrapper']['squadron'] = array(
  '#type' => 'select',
  '#title' => t('Squadron'),
  '#options' => $squadron_options,
);

यह तत्वों का सिर्फ मूल सेटअप है। अब आपको यह निर्धारित करने के लिए एक तरीके की आवश्यकता होगी कि स्क्वाड्रन में क्या विकल्प होने चाहिए। सबसे पहले आपको call शहर ’की चयन सूची में अपने अजाक्स कॉलबैक की पहचान करने की आवश्यकता है। ज्यादातर मामलों में आप बस उस तत्व को वापस कर सकते हैं जो अजाक्स तत्व को लपेटता है, इस मामले में $ फॉर्म।

function mymodule_ajax_callback($form, $form_state) {
  return $form;
}

अब, जब 'शहर' चयन सूची में परिवर्तन होता है, तो यह फॉर्म के स्क्वाड्रन-रैपर भाग का पुनर्निर्माण करेगा। आपका 'शहर' मूल्य अब $ form_state ['मान'] में होगा। इसलिए, जब फॉर्म का पुनर्निर्माण किया जाता है, तो हमें यह निर्धारित करने की आवश्यकता होती है कि 'शहर' के मूल्य के आधार पर चयन सूची में क्या विकल्प दिए जाएं।

// Get the value of the 'city' field.
$city = isset($form_state['values']['city']) ? $form_state['values']['city'] : 'default';
switch ($city) {
  case 'default':
    // Set default options.
    break;
  case 'losangeles':
    // Set up $squadron_options for los angeles.
    break;
}

// If you want to hide the squadron select list until a city is
// selected then you can do another conditional.
if ($city !== 'default') {
  $form['squadron_wrapper']['squadron'] = array(
    '#type' => 'select',
    '#title' => t('Squadron'),
    '#options' => $squadron_options,
  );
}

6
उदाहरण उदाहरण मॉड्यूल ("AJAX उदाहरण" → "आश्रित ड्रॉपडाउन") में पाए जा सकते हैं । आप पदानुक्रमित चयन मॉड्यूल पर भी देख सकते हैं ।
कलाब्रो

वैसे, वैकल्पिक रूप से आप इसे बहु-चरणीय रूप में कर सकते हैं, लेकिन मुझे नहीं लगता था कि जैसा आप देख रहे थे, वैसा ही लग रहा था। इसके अलावा ^ अच्छा कॉल! इस तरह की चीज सीखने के लिए उदाहरण मॉड्यूल महान हैं ।
jordojuice

@jordojuice आपके उत्तर के लिए बहुत बहुत धन्यवाद। मैं अब इस पर काम कर रहा हूं। आपके द्वारा दिए गए कोड के तीसरे उदाहरण में (शुरुआत // मान प्राप्त करें ...) मैं कोड के इस हिस्से को किस फ़ंक्शन में डालूं? क्या यह _ajax_callback फ़ंक्शन में जाता है? धन्यवाद
बेन

मैंने इसके लिए उदाहरण मॉड्यूल का पालन किया, लेकिन मुझे हर बार एक त्रुटि मिली कि मैं पहली ड्रॉप डाउन में एक आइटम का चयन करता हूं: चेतावनी: array_values ​​() पैरामीटर 1 से सरणी होने की उम्मीद करता है, स्ट्रिंग स्ट्रिंग में _field_filter_items () (I की रेखा 525: \ My दस्तावेज़ \ वेब \ XAMPP \ htdocs \ mysite \ मॉड्यूल \ क्षेत्र \ field.module)। मैं इस ajax पर निर्भर ड्रॉप डाउन के साथ संयोजन में एक मल्टी स्टेप फॉर्म का उपयोग कर रहा हूं जो मैंने एक कस्टम ओवरराइड मॉड्यूल में लिखा था .... हालांकि पहले के आधार पर दूसरे dd के लिए मान बदल जाते हैं। यह सिर्फ एक चेतावनी है जो दिखा रहा है, लेकिन परेशान ... क्या कोई मुझे उस चेतावनी को हटाने में मदद कर सकता है? धन्यवाद!
जनवरी

इस कोड के बीच 2 महत्वपूर्ण अंतर और @Ben के लिए काम करना समाप्त हो गया। ध्यान दें कि #suffix एक आईडी का उपयोग करता है, और ajax कॉलबैक पूरे तत्व को लौटाता है, न कि पूरे फॉर्म को। इसके अलावा यह सुपर सहायक था!
वोल्फर-पूर्व

11

ऊपर दिए गए jordojuice के लिए बहुत धन्यवाद। उनकी मदद से मैं एक समाधान खोजने में कामयाब रहा। मैंने उदाहरण के लिए http://public-action.org/content/drupal-7-form-ap-d dependent-lists-and-ajax-form-submission पर भी जिक्र किया । मैंने अंततः नीचे दिए गए कोड का उपयोग किया जो एक कस्टम मॉड्यूल में काम करता था। किसी कारण से मैं $ form_state मूल्यों में अपना कोई भी मान नहीं पा सका, लेकिन उन्हें $ रूप में खोजने में सक्षम था। अंत में, जब मैंने परीक्षण किया, तो मुझे एक त्रुटि संदेश मिल रहा था कि ड्रुपल ने ड्रॉप-डाउन में एक अवैध विकल्प का पता लगाया था। मैंने फॉर्म 12 में लाइन 1290 पर टिप्पणी करके इसे प्राप्त किया:

form_error($elements, $t('An illegal choice has been detected. Please contact the site administrator.'));

अंतिम कोड जिसका मैंने उपयोग किया था:

<?php

function sappers_squadron_form_work_history_node_form_alter(&$form, &$form_state) {     
        //echo '<pre>';
        //print_r ($form);
        //echo '</pre>';

        $squadron_options = array();

        if(isset($form['field_wkhist_city']['und']['#default_value'][0])) {
            $city = $form['field_wkhist_city']['und']['#default_value'][0];
        }
        else {
            $city = 0;
        }

        $squadron_options = sappers_squadron_squadrons($city);

        $form['field_wkhist_city']['und']['#ajax'] = array(
            'event' => 'change',
            'wrapper' => 'squadron-wrapper',
            'callback' => 'sappers_squadron_ajax_callback',
            'method' => 'replace',
        );

        $form['field_squadron']['und']['#prefix'] = '<div id="squadron-wrapper">';
        $form['field_squadron']['und']['#suffix'] = '</div>';
        $form['field_squadron']['und']['#options'] = $squadron_options;
}


function sappers_squadron_ajax_callback($form, $form_state) {   
    $city = $form['field_wkhist_city']['und']['#value'];

    $form['field_squadron']['und']['#options'] = sappers_squadron_squadrons($city);

    return $form['field_squadron'];
}


function sappers_squadron_squadrons($city) {
    $nodes = array();

    $select = db_query("SELECT node.title AS node_title, node.nid AS nid FROM  {node} node INNER JOIN {taxonomy_index} taxonomy_index ON node.nid = taxonomy_index.nid WHERE (( (node.status = '1') AND (node.type IN  ('squadron')) AND (taxonomy_index.tid = $city) )) ORDER BY node_title ASC");

    $nodes[]="";

    foreach ($select as $node) {
            $nodes[$node->nid] = $node->node_title;
    }

    return $nodes;
}

?>

मुझे एक अवैध विकल्प मिल गया है। कृपया साइट व्यवस्थापक से संपर्क करें। त्रुटि जब मैंने ऊपर लागू करने की कोशिश की। क्या आप मदद कर सकते हैं?
हरसल

@ हर्षल - मेरे पास एक ही समस्या थी और मैंने अपने उत्तर में दिए गए समाधान को लागू करके इसे गोल कर दिया, कृपया ऊपर देखें (form.inc को बदलकर)। यह थोड़ा हैक है लेकिन इसने मेरे लिए काम किया।
बेन

@ हर्षल - संभवत: बेहतर समाधान यह है कि नीचे दिए गए हैकर द्वारा दिया गया।
बेन

1

कोड की लाइन अर्थात के
$nodes[''] = '- None -'; बाद रखो

 $nodes = array();

उर में sappers_squadron_squadrons function और वह आपकी त्रुटि को हल करेगा

form_error($elements, $t('An illegal choice has been detected. Please contact the site administrator.'));


1

"एक गैरकानूनी विकल्प" का मूल कारण पता चला है। कृपया साइट व्यवस्थापक से संपर्क करें। यह है कि द्वारा जोड़ा गया 0 के मान के साथ खाली स्ट्रिंग $nodes[]="";फ़ील्ड_स्क्वाड्रन फ़ील्ड के लिए अमान्य है।

अग्रिम PHP प्रोग्रामिंग और विकास देखें , लेकिन ध्यान रखें कि DANGEROUS_SKIP_CHECK और मान्य ध्वज D7 में पदावनत हैं

जब मैंने उस लाइन को हटाया, उसके बाद त्रुटि हो गई थी।


1

संदर्भ क्षेत्र विकल्प सीमा मॉड्यूल का उपयोग करें

यह मॉड्यूल कई प्रकार के संदर्भ क्षेत्रों को अपने विजेट के उपलब्ध विकल्पों को वर्तमान इकाई में अन्य क्षेत्रों के मूल्यों द्वारा सीमित करने की अनुमति देता है।


क्या यह सशर्त क्षेत्रों के मॉड्यूल का विकल्प है?
उमर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.