AJAX कॉलबैक में $ form_state बदलें


16

मैं एक फॉर्म बना रहा हूं, जो फॉर्म एपीआई '#ajax'विशेषता का उपयोग करता है , और मुझे $form_stateAJAX- सक्षम बटन दबाने पर परिवर्तन करने की आवश्यकता है। यहाँ मुझे क्या मिला है:

मेरे प्रपत्र बिल्डर फ़ंक्शन के अंदर:

...
$form['some_fieldset']['add_more'] = array(
      '#type' => 'button',
      '#value' => t('Add more rows'),
      '#ajax' => array(
        'wrapper' => 'some-fieldset',
        'callback' => 'my_module_settings_ajax',
        'method' => 'replace',
        'effect' => 'fade',
      ),
    );

...

और यहाँ कॉलबैक फ़ंक्शन है:

function my_module_settings_ajax($form, $form_state) { 
  // Make a change to $form_state
  if ($form_state['some_fieldset']['add_more']) {
    $form_state['values']['some_fieldset']['table'][] = array('first_field' => '',
                                                                'second_field' => '');
  }

  return $form['some_fieldset'];
}

$form_stateकॉलबैक समाप्त होने के बाद मैंने जो बदलाव किया है, वह खो जाता है। क्या $form_stateइस फ़ंक्शन में कोई बदलाव करने का कोई तरीका है , या इसके बजाय मुझे किसी अन्य फ़ंक्शन का उपयोग करना चाहिए?

संपादित करें

जैसा कि यह पता चला है, इस तर्क को करने के लिए कॉलबैक गलत जगह है। इसके बजाय, फॉर्म बिल्डर फ़ंक्शन के शीर्ष पर, मैंने इसे जोड़ा:

// Respond to AJAX-triggger:
// Add new row
if ($form_state['triggering_element']['#name'] == 'add_more') {
  $form_state['values']['some_fieldset']['table'][] = array('first_field' => '',
                                                                'second_field' => '');
}

बेशक, मुझे बटन को नाम देना था:

$form['some_fieldset']['add_more'] = array(
  '#type' => 'button',
  '#name' => 'add_more', // <-- Right here
  '#value' => t('Add more rows'),
  '#ajax' => array(
    'wrapper' => 'some-fieldset',
    'callback' => 'my_module_settings_ajax',
    'method' => 'replace',
    'effect' => 'fade',
  ),
);

और अब यह काम करता है!

जवाबों:


3

आपको $form_stateसंदर्भ के रूप में पारित करने की आवश्यकता है ; AJAX फ़ंक्शन को निम्न उदाहरण में परिभाषित करने की आवश्यकता है:

function mymodule_settings_ajax($form, &$form_state) { /* … */ } 

स्पष्ट करने के लिए, आपको मान के बजाय संदर्भ द्वारा पास होने की आवश्यकता है। इसके बिना आप केवल $ form_state की एक प्रति संशोधित कर रहे हैं।
मलस्क

हां, यदि आप ऐसा नहीं करते हैं, तो आप केवल एक स्थानीय चर को संशोधित करते हैं।
पोषण

1
बेशक, ऐसा नहीं सोचा था। दुर्भाग्य से, इसका कोई प्रभाव नहीं पड़ा - $ form_state में किए गए किसी भी परिवर्तन को प्रपत्र बिल्डर में अनदेखा कर दिया जाता है, और अगली बार AJAX कॉल करने पर $ form_state वापस कर दिया जाता है। क्या यह हो सकता है कि कॉलबैक निष्पादित होने के समय तक फॉर्म पहले ही उत्पन्न हो गया हो? क्या इस बटन के बदले कस्टम सबमिट-हैंडलर चलाने का कोई तरीका है?
मेगावाट।

सबमिट करने के लिए बटन से प्रकार बदलने की कोशिश करें
पोषण करें

0

मुझे यकीन नहीं है कि यह आपके प्रश्न का सीधा उत्तर है, लेकिन यह आपके लिए उपयोग किए जाने वाले मामले के लिए काम कर सकता है: $ form_state जोड़ने के बजाय अपने $ फ़ॉर्म में मान जोड़ें। यदि आप उन्हें सिर्फ उपयोग दिखाने के लिए नहीं चाहते हैं #hidden

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