Kan ik twee callback-functies in één ajax-oproep aanroepen?

Ik wil gewoon weten hoe we twee ajax callbacks kunnen bereiken op één formulier. Is het mogelijk? en hoe?

Antwoord

Nee, het is niet mogelijk. Waarom zou het zijn? Ajax callback kan een stukje HTML retourneren om uw AJAX-wrapper te vervangen. Als je er twee belt, welke zou Drupal dan gebruiken? Hoe moet het beslissen? Daarom wordt #ajax["callback"] gedefinieerd als een naam van een functie, niet als een reeks namen. Met één functie je vermijdt dit soort problemen.

Als je twee functies moet aanroepen als reactie op een AJAX-gebeurtenis, schrijf dan een callback die de logica bevat waar ik naar vroeg in de eerste alinea, en roep functies aan die je nodig hebt vanuit die callback .

Antwoord

Dat kun je niet rechtstreeks doen. Gebruik in plaats daarvan een functie die de twee andere functies aanroept.

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

Dan:

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

Zorg ervoor dat uw callbacks niet interfereren.

Reacties

  • Geef een upvote. Ook handig om in gedachten te houden dat een Ajax callback een array: return array (' #type ' = > ' ajax ', ' #commands ' = > $ commandos); Het kan zijn dat het ' s eenvoudiger is om de eerste callback aan te roepen en vervolgens enkele waarden toe te voegen aan de #commands-array in plaats van aan te roepen de tweede callback. Het kan functionaliteit dupliceren, maar het kan ook zijn dat de hele callback niet ' t vereist is.
  • Ja griz, je hebt gelijk. exmaple is heel eenvoudig, maar zoals je het zegt ' is het beter om de re samen te voegen resultaten van de twee functies. Maar onthoud dat het gebruik van twee functies een hack is.
  • @tunic – > Is het mogelijk om twee wrapper-elementen te hebben?

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *