it-swarm.asia

قم بتغيير $ form_state في AJAX رد الاتصال

أقوم بإنشاء نموذج يستخدم API النموذج '#ajax' السمة ، وأحتاج إلى إجراء تغييرات على $form_state عند الضغط على زر تمكين AJAX. إليك ما حصلت عليه:

داخل منشئ النموذج الخاص بي:

...
$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',
  ),
);

والآن يعمل!

16
MW.

تحتاج لتمرير $form_state كمرجع؛ يجب تعريف الوظيفة AJAX كما هو موضح في المثال التالي:

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

لست متأكدًا من أنها إجابة مباشرة على سؤالك ، ولكنها قد تفيدك في استخدام الحالة: بدلاً من تغيير $ form_state أضف قيمًا إلى نموذج $ الخاص بك. إذا كنت لا تريدهم أن يظهروا فقط استخدم #hidden.

0
Malks