Czy mogę używać ajax do kierowania wielu elementów formularza z jednego wejścia?

8

Próbuję użyć ajax, aby zaktualizować dwie różne części formularza drupal z jednego rozmycia danych wejściowych formularza.

Mam na wejściu standardowe rzeczy ajax:

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

Działa to dobrze, zamieniając mój div, gdy dane wejściowe są aktualizowane ... jednak chcę również zaktualizować inny formularz wejściowy w innym miejscu formularza z innym kodem w wyniku rozmycia na moim oryginalnym danych wejściowych.

Czy to możliwe, jakieś pomysły?

Edycja: Dla jasności, oto mój przykład z prawdziwego świata:

  • Typ zawartości „film”
  • Dodano pole „primary_title”
  • Kiedy 'primary_title' jest aktualizowany, moje wywołanie zwrotne ajax sprawdza podobne ciągi znaków i zwraca HTML
  • HTML z wywołania zwrotnego jest wstawiany do pustego div.

    Ta część działa świetnie!

Próbuję również zmodyfikować standardowe wejście „tytuł” ​​węzła, nadając mu wartość „primary_title” po wykonaniu wyrażenia regularnego w celu uporządkowania łańcucha (usunięcie „The” lub „A” od początku itp.) Wynik będą dwa pola tytułowe, jedno z pełnym tytułem „tytuł_podstawowy” i jedno przycięte „tytuł”, które będą przydatne do sortowania i wyświetlania rekordów.

Stóg
źródło

Odpowiedzi:

13

Wygląda na to, że możesz kierować reklamy na różne części formularza za pomocą komend ajax, jednak musisz zwrócić tylko jedną z następujących opcji:

  • HTML lub

  • Renderowalna tablica lub

  • Tablica poleceń AJAX

W sytuacji, o której pierwotnie pisałem, próbowałem zwrócić zarówno tablicę poleceń AJAX, jak i tablicę do renderowania, co nie wydaje się możliwe.

Kod w module przykładów demonstruje celowanie w różne części formularza za pomocą tablicy poleceń AJAX:

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

W tym przykładzie kodu #html_div otrzymuje $ text, a osobno #html_status otrzymuje „Zaktualizowano html_command_example o text = $ text;”. data („r”). „”

Dwie różne lokalizacje w formularzu z dwiema różnymi informacjami z jednego wywołania zwrotnego ajax!

Patrząc ponownie na to, nad czym pracowałem, zdałem sobie sprawę, że wcale nie muszę zwracać pola tytułu węzła. Będzie to tylko pole narzędziowe, używane do sortowania danych na listach.

Ukryłem pole w formularzu węzła i jest ono wypełniane po raz drugi, kiedy mój formularz jest budowany po uruchomieniu mojego wywołania zwrotnego ajax.

Stóg
źródło
0

Jestem całkiem nowy w Drupal, ale do tej pory uważałem, że framework Ajax jest raczej mało elastyczny. Działa świetnie, dopóki używasz go zgodnie z przeznaczeniem. Więc w twoim przypadku, jeśli znasz jakieś JS, najlepiej byłoby uczynić ten skrypt swoim własnym, powinien być bardzo lekki.

Powodzenia!

silkAdmin
źródło
Dzięki za sugestię :) Zdałem sobie sprawę, że wcale nie muszę zwracać pola tytułu węzła, ponieważ jest ono po prostu używane jako pole narzędzia do organizowania list. Zostaje wypełniony, gdy mój formularz zostanie odbudowany w wyniku mojego wywołania zwrotnego ajax.
Rick
0

Inna opcja z drupal.org :

Jeśli to najłatwiejsze, możesz łatwo zastąpić cały formularz. Wystarczy dodać #prefix i #suffix do całej tablicy formularzy, a następnie ustawić jako #ajax ['wrapper']. (Umożliwi to zmianę wielu elementów formularza za pomocą pojedynczego wywołania ajax.) Jedynym powodem, dla którego nie należy tego robić, jest szybszy proces, jeśli przesyłanych jest mniej informacji.

Funkcja wywołania zwrotnego może być tak prosta, jak:

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

Powinno to zostać wywołane z #ajaxtablicy na elemencie formularza ( field_whateverna przykład poniżej) zdefiniowanym w hook_form_FORM_ID_alter()(lub pewnego rodzaju haczyku do zmiany formy), w którym również testujesz $form_statei modyfikujesz $formtablicę, na przykład:

 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;
 }
cdmo
źródło