क्या मैं एक इनपुट से कई फॉर्म तत्वों को लक्षित करने के लिए ajax का उपयोग कर सकता हूं?


8

मैं ajax का उपयोग करने की कोशिश कर रहा हूं कि ड्रुपल फॉर्म के दो अलग-अलग हिस्सों को सिर्फ एक फॉर्म इनपुट ब्लर से अपडेट किया जाए।

मेरे इनपुट पर मानक अजाक्स सामग्री है:

$my_form['my_input']['#ajax'] = array(
  'callback' => 'my_callback',
  'wrapper' => 'my_target_div',
  'event' => 'blur',
);

यह अच्छी तरह से काम कर रहा है, इनपुट अपडेट होने पर मेरी div को स्वैप कर रहा है ... हालांकि मैं अपने मूल इनपुट पर धब्बा के परिणामस्वरूप अलग कोड के साथ फॉर्म में कहीं और फॉर्म इनपुट भी अपडेट करना चाहता हूं।

क्या यह संभव है, कोई विचार?

संपादित करें: स्पष्टता के लिए, यहां मेरा वास्तविक विश्व उदाहरण है:

  • सामग्री प्रकार 'मूवी'
  • जोड़ा गया फ़ील्ड 'प्रायमरी_टेटल'
  • जब 'Primary_title' को मेरे ajax कॉलबैक चेक में इसी तरह के तार के लिए अद्यतन किया जाता है और html को लौटाया जाता है।
  • कॉलबैक से html को खाली div में डाला जाता है।

    वह हिस्सा शानदार काम कर रहा है!

मैं मानक नोड 'शीर्षक' इनपुट को भी संशोधित करने की कोशिश कर रहा हूं, इसे स्ट्रिंग को सुव्यवस्थित करने के लिए मैंने कुछ regex करने के बाद 'प्राथमिक_टाइटल' का मूल्य दिया है (प्रारंभ से "" या "ए" को हटाते हुए) परिणाम दो शीर्षक फ़ील्ड होंगे, एक पूर्ण शीर्षक 'Primary_title' और एक छंटनी 'शीर्षक' के साथ, जो रिकॉर्ड को सॉर्ट करने और प्रदर्शित करने के लिए उपयोगी होगा।


जवाबों:


13

ऐसा प्रतीत होता है कि आप ajax कमांड का उपयोग करके फॉर्म के विभिन्न हिस्सों को लक्षित कर सकते हैं, हालाँकि आपको इनमें से किसी एक को ही चुनना होगा :

  • HTML या

  • एक रेंडर योग्य सरणी या

  • AJAX कमांड की एक सरणी

जिस स्थिति के बारे में मैंने मूल रूप से लिखा था, मैं AJAX कमांड की एक सरणी और एक रेंडर करने योग्य सरणी दोनों को वापस करने की कोशिश कर रहा था , जो संभव नहीं लगता।

उदाहरण के कोड में कोड AJAX आदेशों की एक सरणी का उपयोग करके फ़ॉर्म के विभिन्न भागों को लक्षित करता है:

function ajax_example_advanced_commands_html_callback($form, $form_state) {
  $text = $form_state['values']['html_command_example'];

  $commands = array();
  $commands[] = ajax_command_html('#html_div', $text);
  $commands[] = ajax_command_replace("#html_status", "<div id='html_status'>Updated html_command_example with text=$text;  " . date('r') . "</div>");
  return array('#type' => 'ajax', '#commands' => $commands);
}

इस कोड के नमूने में, #html_div को $ टेक्स्ट मिल रहा है, और अलग से #html_status को "अपडेट किया गया html_command_example पाठ = $ पाठ के साथ" मिल रहा है। दिनांक ('आर')। ""

फॉर्म में दो अलग-अलग स्थानों पर एक अजाक्स कॉलबैक से जानकारी के दो अलग-अलग टुकड़े!

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

मैंने नोड फॉर्म पर फ़ील्ड छिपाया है और जब मेरा मूल अजाक्स कॉलबैक ट्रिगर हो जाता है तो यह दूसरी बार मेरा फॉर्म बनाया जाता है।


0

मैं द्रुपाल के लिए काफी नया हूं लेकिन अब तक मुझे अजाक्स ढाँचा नहीं मिला। यह तब तक बढ़िया काम करता है जब तक आप इसका उपयोग करते हैं जैसा कि इसका इरादा था। इसलिए आपके उदाहरण में यदि आप कुछ जेएस को जानते हैं तो सबसे अच्छा निश्चित रूप से यह होगा कि उस स्क्रिप्ट को अपना स्वयं बनाना बहुत हल्का होना चाहिए।

सौभाग्य!


सुझाव के लिए धन्यवाद :) मैंने महसूस किया है कि मुझे नोड टाइटल फ़ील्ड को वापस करने की आवश्यकता नहीं है क्योंकि यह बस सूचियों को व्यवस्थित करने के लिए एक उपयोगिता क्षेत्र के रूप में उपयोग किया जा रहा है। जब मेरा फॉर्म मेरे मौजूदा अजाक्स कॉलबैक के परिणामस्वरूप फिर से बनाया जाता है तो यह आबाद हो जाता है।
रिक

0

एक अन्य विकल्प, drupal.org से :

आप आसानी से पूरे फॉर्म को बदल सकते हैं यदि वह सबसे आसान है। बस पूरे फॉर्म ऐरे में एक #prefix और #suffix जोड़ें, फिर उस #ajax ['आवरण'] के रूप में सेट करें। (यह आपको सिंगल अजाक्स कॉल के माध्यम से कई फॉर्म एलिमेंट को बदलने की अनुमति देगा।) ऐसा न करने का एकमात्र कारण यह है कि यदि कम जानकारी ट्रांसफर की जाती है तो प्रक्रिया तेज होती है।

आपका कॉलबैक फ़नसीटन उतना ही सरल हो सकता है:

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

इसे किसी #ajaxएलीमेंट एलीमेंट में तत्व ( field_whateverनीचे दिए गए उदाहरण के लिए) hook_form_FORM_ID_alter()(या किसी प्रकार के फॉर्म को हुक में परिभाषित) से बुलाया जाना चाहिए, जहाँ आप एरे के लिए भी टेस्ट करते हैं $form_stateऔर एलीमेंट में बदलाव करते हैं $form, जैसे:

 if (isset($form_state['values']['field_whatever'])){
     $form['field_something']['#disabled'] = TRUE;
     $form['field_something_else']['#disabled'] = FALSE;
 } else {
     $form['field_something']['#disabled'] = FALSE;
     $form['field_something_else']['#disabled'] = TRUE;
 }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.