¿Cómo ajaxificar el envío del formulario web en Drupal 7?

8

Intenté alterar la representación del formulario web usando hook_form_alter()y hook_node_view()en un módulo personalizado para poder agregar '#ajax' en alguna parte.

¿Alguien ya ha tenido alguna experiencia trabajando con webform y ajax en D6 o D7? Supongo que la lógica sería la misma para D6 y D7, entonces solo la implementación cambia.

E. de Saint Chamas
fuente
1
D6 y D7 tienen marcos Ajax muy diferentes.
Jeremy French
Sí, pero no es un problema. El verdadero problema que tengo es que no puedo encontrar un gancho para alterar el formulario de formulario web y agregar un evento ajax a través de la API de formulario de Drupal.
E. de Saint Chamas
¿Tiene una pregunta específica sobre Ajax? Esto suena conversacional. Además, solo como referencia: api.drupal.org/api/drupal/includes--ajax.inc/group/ajax/7
Citricguy
Realmente no me gusta publicar respuestas solo con enlaces a "cómo" publicaciones de blog sin ninguna explicación propia, así que solo agregaré esto como un comentario: envisioninteractive.com/drupal/… - si esto termina funcionando, podemos considerar agregarlo como una respuesta tal vez. Parece que esto es lo que podrías necesitar.
Danny Englander

Respuestas:

8

El módulo Ajax funciona para mí en Drupal 6.

Para Drupal 7:

function mymodule_form_alter(&$form, &$form_state, $form_id) {
      // see if webform_client_form_ is in the form_id
      if(strstr($form_id, 'webform_client_form_')) {
        // get the nid so we can use it in the wrapper value
        $nid = $form['#node']->nid;
        // add the ajax properties to the submit button
        $form['actions']['submit']['#ajax'] = array(
          'callback' => 'mymodule_webform_js_submit',
          'wrapper' => 'webform-client-form-' . $nid,
          'method' => 'replace',
          'effect' => 'fade',
        );
      }
    }

function mymodule_webform_js_submit($form, $form_state) {
      // define the $sid variable (submission id from webform)
      $sid = $form_state['values']['details']['sid'];
      // if we have a sid then we know the form was properly submitted, otherwise, we'll just return the existing $form array
      if ($sid) {
        // first we have to load up the webform node object
        $node = node_load($form_state['values']['details']['nid']);
        // create an array up with the confirmation message, retreived from the webform node
        $confirmation = array(
          '#type' => 'markup',
          '#markup' => check_markup($node->webform['confirmation'], $node->webform['confirmation_format'], '', TRUE),
        );
        // return the confirmation message
        return $confirmation;
      }
      else {
        // return the form
        return $form;
      }
    }
Matthew Woodard
fuente
¿Qué se supone que debe hacer exactamente este código? Lo agregué a mi tema (después de cambiar los nombres del gancho para que coincida con mi tema), pero no noto ningún impacto.
John Slegers
Entra en un módulo personalizado dentro de su tema.
neelmeg
0

Una de las formas más sencillas si está buscando ajaxificar solo un formulario en particular será agregar el complemento de formulario jquery . Es bastante sencillo.

Agregue el siguiente código a la función de preproceso de la página en el archivo template.php.

  1. Primero agregue el complemento jquery con el siguiente código.

    drupal_add_js (drupal_get_path ('theme', 'your_theme'). "/js/jquery.form.js");

  2. Luego agregue el código a continuación, reemplácelo #your_form_IDcon el id del formulario

    drupal_add_js ('

                (function($){ 
    $(document).ready(function() { 
    
                $("#your_form_ID").ajaxForm(function() { 
                    alert("Thank you for your comment!"); 
                }); 
    });     }(jQuery));;
    
           ', 'inline');

Eso es todo lo que has hecho. Quizás desee considerar cargar los scripts solo las páginas que necesita.

esafwan
fuente
Lo he estado considerando. Ahora estoy pensando en convertirlo en un módulo con una página de configuración para que todos puedan beneficiarse. ¿Existe algo así?
esafwan
-1

Vea si el módulo Ajax puede ayudarlo con eso. Consulte la documentación , así

pal4life
fuente
1
Él está pidiendo Drupal 7, ese módulo aún no está disponible para D7.
Danny Englander
1
Para ser justos, aunque la pregunta está etiquetada como 7, pregunta explícitamente si alguien tenía experiencia con ajax en D6 o D7.
EmmyS