¿Puedo usar ajax para dirigir múltiples elementos de formulario desde una entrada?

8

Estoy tratando de usar ajax para actualizar dos partes diferentes de un formulario drupal desde un solo desenfoque de entrada de formulario.

Tengo el material estándar de ajax en mi entrada:

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

Esto funciona bien, intercambiando mi div cuando se actualiza la entrada ... sin embargo , también quiero actualizar otra entrada de formulario en otra parte del formulario con un código diferente como resultado del desenfoque en mi entrada original.

¿Es esto posible, alguna idea?

Editar: para mayor claridad, aquí está mi ejemplo del mundo real:

  • Tipo de contenido 'película'
  • Se agregó el campo 'título_primero'
  • Cuando se actualiza 'primary_title', mi devolución de llamada ajax busca cadenas similares y devuelve html.
  • El html de la devolución de llamada se inserta en un div vacío.

    Esa parte está funcionando muy bien!

Estoy tratando de modificar también la entrada estándar del 'título' del nodo, dándole el valor de 'primary_title' después de haber realizado algunas expresiones regulares para ordenar la cadena (eliminando "The" o "A" desde el principio, etc.) El resultado habrá dos campos de título, uno con el título completo 'título_primario' y otro 'título' recortado que será útil para ordenar y mostrar registros.

Almiar
fuente

Respuestas:

13

Parece que puede apuntar a diferentes partes de un formulario utilizando comandos ajax, sin embargo, debe elegir devolver solo uno de los siguientes:

  • HTML o

  • Una matriz renderizable o

  • Una matriz de comandos AJAX

En la situación sobre la que escribí originalmente, estaba tratando de devolver una matriz de comandos AJAX y una matriz renderizable, lo que no parece posible.

El código en el módulo de ejemplos muestra la orientación a diferentes partes de un formulario utilizando una 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);
}

En este ejemplo de código, #html_div obtiene $ text y por separado #html_status obtiene "Actualizado html_command_example con text = $ text;". fecha ('r'). ""

¡Dos ubicaciones diferentes en un formulario con dos piezas diferentes de información de una devolución de llamada ajax!

Al mirar nuevamente en lo que estaba trabajando, me di cuenta de que no necesitaba devolver el campo de título del nodo. Solo será un campo de utilidad, utilizado para ordenar datos en listas.

He ocultado el campo en el formulario de nodo y se completa la segunda vez que se crea mi formulario cuando se activa mi devolución de llamada ajax original.

Almiar
fuente
0

Soy bastante nuevo en Drupal pero hasta ahora encontré el marco Ajax bastante flexible. Funciona muy bien siempre que lo use como estaba previsto. Entonces, en su caso, si conoce algunos JS, lo mejor sería hacer ese script usted mismo, debería ser muy ligero.

¡Buena suerte!

sedaadmin
fuente
Gracias por la sugerencia :) Me he dado cuenta de que no necesito devolver el campo de título del nodo porque simplemente se está utilizando como un campo de utilidad para organizar listas. Se rellena cuando mi formulario se reconstruye como resultado de mi devolución de llamada ajax existente.
Rick
0

Otra opción, de drupal.org :

Puede reemplazar fácilmente el formulario completo si es más fácil. Simplemente agregue un #prefix y #suffix a toda la matriz de formularios, luego configúrelo como #ajax ['wrapper']. (Esto le permitirá cambiar múltiples elementos de formulario a través de una sola llamada ajax). La única razón para no hacerlo es que el proceso es más rápido si se transfiere menos información.

Su función de devolución de llamada podría ser tan simple como:

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

Debe llamarse desde una #ajaxmatriz en un elemento de formulario ( field_whateverpara el ejemplo a continuación) definido en un hook_form_FORM_ID_alter()(o algún tipo de enlace alterno de forma) donde también se prueba $form_statey se hacen modificaciones a la $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
fuente