Czy mogę wywołać dwie funkcje zwrotne w jednym wywołaniu AJAX?

Chcę tylko wiedzieć, w jaki sposób możemy uzyskać dwa wywołania zwrotne Ajax w jednym przesłaniu formularza. Czy to możliwe? i jak?

Odpowiedź

Nie, nie jest to możliwe. Dlaczego miałoby to być? Wywołanie zwrotne AJAX może zwrócić fragment kodu HTML, aby zastąpić opakowanie AJAX. Jeśli zadzwonisz do dwóch, z którego skorzystałby Drupal? Jak to powinno zadecydować? Dlatego właśnie #ajax["callback"] jest zdefiniowane jako nazwa funkcji, a nie tablica nazw. Z jedną funkcją unikniesz takich problemów.

Jeśli potrzebujesz wywołać dwie funkcje w odpowiedzi na zdarzenie AJAX, napisz callback, który będzie zawierał logikę, o którą pytałem w pierwszym akapicie, i wywołaj funkcje, których potrzebujesz z tego wywołania zwrotnego .

Odpowiedź

Nie możesz tego zrobić bezpośrednio. Zamiast tego użyj funkcji, która wywołuje dwie inne funkcje.

"#ajax" => array( "callback" => "my_callbacks_wrapper", ) ... 

Następnie:

my_callbacks_wrapper($form, $form_state) { $first_callback_processed_form = first_callback($form, $form_state); $second_callback_processed_form = second_callback($first_callback_processed_form, $form_state); return $second_callback_processed_form; } 

Upewnij się, że wywołania zwrotne nie przeszkadzają.

Komentarze

  • Głos za. Warto też pamiętać, że wywołanie zwrotne Ajax zwraca array: return array (' #type ' = > ' ajax ', ' #commands ' = > $ commands); Może być tak, że ' prościej jest wywołać pierwsze wywołanie zwrotne, a następnie dodać pewne wartości do tablicy #commands zamiast wywoływać drugie wywołanie zwrotne. Może to być funkcja powielania, ale może się też zdarzyć, że całe wywołanie zwrotne nie jest ' t wymagane.
  • Tak, griz, masz rację. przykład jest bardzo prosty, ale jak mówisz ' d lepiej byłoby scalić wyniki dwóch funkcji. Pamiętaj jednak, że używanie dwóch funkcji to hack.
  • @tunic – > Czy można mieć dwa elementy opakowania?

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *