web-gelistirme-sc.com

Bir girişten birden çok form öğesini hedeflemek için ajax kullanabilir miyim?

Sadece bir form giriş bulanıklık bir drupal formun iki farklı bölümlerini güncelleştirmek için ajax kullanmaya çalışıyorum.

Benim giriş standart ajax şeyler var:

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

Bu iyi çalışıyor, giriş güncellendiğinde benim div takas ... ancak Ayrıca başka bir form girişi başka bir form formunda farklı kod ile farklı kod ile güncellemek istiyorum orijinal girdimde bulanıklık .

Bu mümkün mü, herhangi bir fikir?

Düzenleme: Açıklık için, benim gerçek dünya örneğim:

  • İçerik türü 'film'
  • 'Birincil_title' alanı eklendi
  • 'Birincil_yazı' güncellendiğinde, ajax geri çağrım benzer dizeleri kontrol eder ve html döndürür.
  • Geri aramadaki html boş bir div'e eklenir.

    Bu kısım harika çalışıyor!

Ben de dize derlemek için bazı regex yaptıktan sonra 'birincil_title' değerini vererek, standart düğüm 'başlık' girdisini değiştirmeye çalışıyorum (başlangıç ​​vb "" "veya" A "kaldırma) Sonuç iki başlık alanı olacak, bunlardan biri tam başlık 'birincil_yazı' ve bir kesilmiş 'başlık' olacak ve kayıtları sıralamak ve görüntülemek için yararlı olacaktır.

8
Rick

Ajax komutlarını kullanarak bir formun farklı bölümlerini hedefleyebileceğiniz anlaşılıyor, ancak şunlardan birini yalnızca bir döndürmeyi seçmelisiniz:

  • HTML veya

  • Yenilenebilir bir dizi veya

  • AJAX komut dizisi

Başlangıçta yazdığım durumda, hem AJAX commands ve bir dizi mümkün görünmeyen bir dizi döndürmeye çalışıyordum.

örnekler modülü içindeki kod, bir AJAX komut dizisi kullanarak bir formun farklı bölümlerini hedeflemeyi gösterir:

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);
}

Bu kod örneğinde, #html_div $ metin alıyor ve ayrıca #html_status "html_command_example ile text = $ text;" dosyasını alıyor. tarih ('r'). ""

Bir formdaki iki farklı konum, bir ajax geri aramasından iki farklı bilgi parçasıyla!

Üzerinde çalıştığım şeye tekrar baktığımda, düğüm başlığı alanına geri dönmem gerekmediğini fark ettim. Yalnızca listelerdeki verileri sıralamak için kullanılan bir yardımcı program alanı olacaktır.

Düğüm formundaki alanı gizledim ve orijinal ajax geri çağırma tetiklendiğinde formumun ikinci kez oluşturulduğu zaman doldurulur.

13
Rick

Başka bir seçenek, drupal.org :

En kolaysa, formun tamamını kolayca değiştirebilirsiniz. Form dizisinin tamamına bir #prefix ve #suffix ekleyin, sonra bunu #ajax ['wrapper'] olarak ayarlayın. (Bu, tek bir ajax çağrısı yoluyla birden çok form öğesini değiştirmenize izin verecektir.) Bunu yapmamanın tek nedeni, daha az bilgi aktarıldığında işlemin daha hızlı olmasıdır.

Geri arama işleviniz şu kadar basit olabilir:

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

Bu, bir hook_form_FORM_ID_alter() (veya bir çeşit form değiştirme kancası) içinde tanımlanan bir form öğesindeki (aşağıdaki örnek için #ajax) Bir field_whatever Dizisinden çağrılmalıdır. ayrıca $form_state için test edin ve $form dizisinde aşağıdaki gibi değişiklikler yapın:

 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;
 }
0
cdmo

Drupal için oldukça yeniyim ama şimdiye kadar Ajax çerçevesini oldukça esnek bulmadım. İstediğiniz kadar kullandığınız sürece harika çalışıyor. en iyisi bu senaryoyu kendiniz yapmak için çok açık olacaktır.

İyi şanslar!

0
silkAdmin