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


8

Ben sadece bir form giriş bulanıklık bir drupal formun iki farklı bölümlerini güncellemek 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 ben de başka bir form girişi başka bir form formunda farklı kod ile farklı kod ile güncelleştirmek 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 veren standart düğüm 'başlık' girişini değiştirmeye çalışıyorum (başlangıç ​​vb "" "veya" A "kaldırma) Sonuç iki başlık alanı olacak, bunlardan biri tam başlığa 'birincil_yazı' ve bir kesilmiş 'başlık' olacak ve kayıtları sıralamak ve görüntülemek için yararlı olacaktır.


Yanıtlar:


13

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

  • HTML veya

  • Yenilenebilir bir dizi veya

  • Bir dizi AJAX komutu

Başlangıçta hakkında yazdım durumda, bir dizi AJAX komutları ve mümkün görünmeyen, okunabilir bir dizi döndürmeye çalışıyordum .

Örnekler modülündeki kod, bir dizi AJAX komutunu 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ık alanını hiç geri döndürmem gerekmediğini fark ettim. Yalnızca listelerdeki verileri sıralamak için kullanılan bir yardımcı program alanı olacaktır.

Düğüm formunda alanı gizledim ve orijinal ajax geri arama tetiklendiğinde formumun ikinci kez oluşturulduğunda doldurulur.


0

Drupal için oldukça yeniyim ama şimdiye kadar Ajax çerçevesini oldukça esnek bulmadım. Amaçlandığı gibi kullandığınız sürece harika çalışıyor. Yani senin örneğinde bazı JS biliyorsanız en iyi definilty o komut dosyası kendini yapmak için çok hafif olması gerekir.

İyi şanslar!


Öneri için teşekkürler :) Düğüm başlık alanını hiç döndürmeme gerek olmadığını fark ettim, çünkü sadece listeleri düzenlemek için bir yardımcı alan olarak kullanılıyor. Mevcut ajax geri aramamın bir sonucu olarak formum yeniden oluşturulduğunda doldurulur.
Rick

0

Drupal.org'dan başka bir seçenek :

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 #ajaxdizi öğede ( field_whateveraşağıdaki örnek için) bir diziden hook_form_FORM_ID_alter()(veya örneğin bir tür form değiştirme kancasında) tanımlanan $form_stateve $formdiziyi de test ettiğiniz ve dizide değişiklikler yaptığınız gibi çağrılmalıdır :

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