AJAX geri aramasında $ form_state değerini değiştirme


16

Form API '#ajax'özniteliğini kullanan bir form oluşturuyorum $form_stateve AJAX etkin düğmeye basıldığında değişiklik yapmam gerekiyor . İşte sahip olduğum şeyler:

Form oluşturucu işlevimin içinde:

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

...

Ve işte geri arama işlevi:

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_stateGeri arama bittiğinde yaptığım değişiklik kaybolmuş gibi görünüyor. $form_stateBu işlevde değişiklik yapmanın bir yolu var mı , bunun yerine kullanmam gereken başka bir işlev var mı?

DÜZENLE

Anlaşıldığı gibi, geri arama bu mantığı yapmak için yanlış yerdir. Bunun yerine, form oluşturucu işlevinin en üstüne şunu ekledim:

// 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' => '');
}

Tabii ki, düğmeye isim vermek zorunda kaldım:

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

Ve şimdi işe yarıyor!

Yanıtlar:


3

$form_stateReferans olarak geçmeniz gerekir ; AJAX işlevinin aşağıdaki örnekte olduğu gibi tanımlanması gerekir:

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

Açıklığa kavuşturmak için, değere göre değil referansla geçmeniz gerekir. Bu olmadan sadece $ form_state dosyasının bir kopyasını değiştirirsiniz.
Malks

Evet, bunu yapmazsanız, yalnızca yerel bir değişkeni değiştirirsiniz.
beslenme

1
Elbette bunu düşünmedim. Ne yazık ki, herhangi bir etkisi olmadı - $ form_state üzerinde yapılan herhangi bir değişiklik form oluşturucuda yok sayılır ve bir sonraki AJAX çağrısı yapıldığında $ form_state döndürülür. Form, geri arama yürütüldüğünde form zaten oluşturulmuş olabilir mi? Bunun yerine bu düğme için özel bir gönderici çalıştırmanın bir yolu var mı?
MW.


0

Sorunuza doğrudan bir cevap olduğundan emin değilim, ancak durumunuzu kullanmanız işe yarayabilir: $ form_state yerine $ formunuza değerler ekleyin. Göstermelerini istemiyorsanız sadece kullanın #hidden.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.