Posso usar o ajax para direcionar vários elementos de formulário de uma entrada?

8

Estou tentando usar o ajax para atualizar duas partes diferentes de um formulário drupal a partir de apenas um desfoque de entrada de formulário.

Eu tenho o material padrão do ajax na minha entrada:

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

Isso está funcionando bem, trocando minha div quando a entrada é atualizada ... no entanto , também quero atualizar outra entrada de formulário em outro lugar do formulário com código diferente como resultado do desfoque na minha entrada original.

Isso é possível, alguma idéia?

Edit: Para maior clareza, aqui está o meu exemplo do mundo real:

  • Tipo de conteúdo 'filme'
  • Adicionado campo 'primary_title'
  • Quando o 'primary_title' é atualizado, meu retorno de chamada ajax verifica se há strings semelhantes e retorna html.
  • O html do retorno de chamada é inserido em uma div vazia.

    Essa parte está funcionando muito bem!

Também estou tentando modificar a entrada 'title' do nó padrão, fornecendo o valor de 'primary_title' depois de fazer um regex para arrumar a string (removendo "The" ou "A" desde o início, etc.) haverá dois campos de título, um com o título completo 'primary_title' e um 'title' aparado que serão úteis para classificar e exibir registros.

Rick
fonte

Respostas:

13

Parece que você pode direcionar diferentes partes de um formulário usando comandos ajax, no entanto, você deve optar por retornar apenas um dos seguintes:

  • HTML ou

  • Uma matriz renderizável ou

  • Uma matriz de comandos AJAX

Na situação sobre a qual escrevi originalmente, estava tentando retornar uma matriz de comandos AJAX e uma matriz renderizável, o que não parece possível.

O código no módulo de exemplos demonstra como direcionar diferentes partes de um formulário usando uma matriz de comandos 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);
}

Neste exemplo de código, #html_div está recebendo $ text e separadamente #html_status está recebendo "Atualizado html_command_example com text = $ text;". data ('r'). ""

Dois locais diferentes em um formulário com duas informações diferentes, desde o retorno de chamada ajax!

Olhando novamente para o que estava trabalhando, percebi que não precisava retornar o campo de título do nó. Será apenas um campo utilitário, usado para classificar dados em listas.

Ocultei o campo no formulário do nó e ele é preenchido na segunda vez em que meu formulário é criado quando meu retorno de chamada ajax original é acionado.

Rick
fonte
0

Eu sou bastante novo no Drupal, mas até agora achei a estrutura do Ajax bastante flexível. Funciona muito bem desde que você o use como pretendido. Portanto, no seu exemplo, se você conhece algum JS, o melhor seria definir esse script como se fosse muito leve.

Boa sorte!

silkAdmin
fonte
Obrigado pela sugestão :) Percebi que não preciso retornar o campo de título do nó, porque ele está sendo usado como um campo utilitário para organizar listas. Ele é preenchido quando meu formulário é reconstruído como resultado do meu retorno de chamada ajax existente.
Rick
0

Outra opção, de drupal.org :

Você pode substituir facilmente o formulário inteiro, se isso for mais fácil. Apenas adicione um #prefix e #suffix a toda a matriz de formulários e defina-o como o #ajax ['wrapper']. (Isso permitirá que você altere vários elementos do formulário por meio de uma única chamada ajax.) O único motivo para não fazer isso é que o processo é mais rápido se menos informações forem transferidas.

Sua função de retorno de chamada pode ser tão simples quanto:

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

Isso deve ser chamado a partir de uma #ajaxmatriz em um elemento do formulário ( field_whateverpor exemplo, abaixo) definido em um hook_form_FORM_ID_alter()(ou algum tipo de alter hook de formulário) onde você também testa $form_statee faz alterações na $formmatriz, como:

 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
fonte