AJAX কলব্যাক $ form_state পরিবর্তন করুন


16

আমি এমন একটি ফর্ম তৈরি করছি যা ফর্ম API '#ajax'বৈশিষ্ট্যটি ব্যবহার করে এবং $form_stateএজ্যাক্স-সক্ষম হওয়া বোতামটি চাপলে আমার পরিবর্তন করা দরকার । আমি যা পেয়েছি তা এখানে:

আমার ফর্ম বিল্ডার ফাংশনের ভিতরে:

...
$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
অবশ্যই, এটি ভেবে দেখেনি। দুর্ভাগ্যক্রমে, এর কোনও প্রভাব নেই - ফর্ম বিল্ডারে $ ফর্ম_স্টেটে করা কোনও পরিবর্তন উপেক্ষা করা হবে এবং পরের বার এজেএক্স কল করার পরে, $ ফর্ম_স্টেটটি আবার উল্টানো হবে। এটি কি এমন হতে পারে যে কলব্যাক কার্যকর হওয়ার সময় থেকেই ফর্মটি ইতিমধ্যে উত্পন্ন হয়েছে? পরিবর্তে এই বোতামটির জন্য কাস্টম জমা-হ্যান্ডলার চালানোর কোনও উপায় আছে?
মেগাওয়াট

জমা দেওয়ার জন্য বোতাম থেকে প্রকারটি পরিবর্তন করার চেষ্টা করুন
পুষ্টি

0

আমি নিশ্চিত নই যে এটি আপনার প্রশ্নের সরাসরি উত্তর, তবে এটি আপনার ক্ষেত্রে ব্যবহার করতে পারে:: ফর্ম_স্টেট পরিবর্তন করার পরিবর্তে আপনার $ ফর্মটিতে মানগুলি যুক্ত করুন। আপনি যদি না চান তবে সেগুলি কেবল ব্যবহারের জন্য প্রদর্শিত হবে #hidden

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.