Posso chamar duas funções de retorno de chamada em uma chamada ajax?

Só quero saber como podemos obter dois retornos de chamada ajax em um envio de formulário. É possível? e como?

Resposta

Não, não é possível. Por que seria? O retorno de chamada Ajax pode retornar um pedaço de HTML para substituir seu wrapper AJAX. Se você chamar dois, qual deles o Drupal usaria? Como deve decidir? É por isso que #ajax["callback"] é definido como um nome de uma função, não uma matriz de nomes. Com uma função você evita problemas como esse.

Se você precisar chamar duas funções em resposta a um evento AJAX, escreva um retorno de chamada que incluirá a lógica que perguntei no primeiro parágrafo e as funções de chamada que você precisa desse retorno de chamada .

Resposta

Você não pode fazer isso diretamente. Em vez disso, use uma função que chama as duas outras funções.

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

Em seguida:

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

Certifique-se de que seus retornos de chamada não interfiram.

Comentários

  • Tenha um voto positivo. Também é útil ter em mente que um retorno de chamada Ajax retorna um array: return array (' #type ' = > ' ajax ', ' #commands ' = > $ comandos); Pode ser que ' seja mais simples chamar o primeiro retorno de chamada, em seguida, adicione alguns valores ao array #commands em vez de chamar o segundo retorno de chamada. Pode estar duplicando a funcionalidade, mas também pode ser que todo o retorno de chamada não seja ' necessário.
  • Sim griz, você está certo. exemplo é muito simples, mas como você diz ' d seria melhor mesclar o re resultados das duas funções. Mas tenha em mente que usar duas funções é um hack.
  • @tunic – > É possível ter dois elementos de wrapper?

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *