Como enviar um formulário da web ajaxify no Drupal 7?

8

Tentei alterar a renderização do formulário da web usando hook_form_alter()e hook_node_view()em um módulo personalizado para adicionar '#ajax' em algum lugar.

Alguém já teve alguma experiência trabalhando com webform e ajax em D6 ou D7? Eu acho que a lógica seria a mesma para D6 e D7, então apenas a implementação muda.

E. de Saint Chamas
fonte
11
D6 e D7 têm estruturas Ajax muito diferentes.
Jeremy French
Sim, eles fazem, mas não é um problema. O problema real que estou tendo é que não consigo encontrar um gancho para alterar o formulário Webform e adicionar um evento ajax através da API do formulário Drupal.
E. de Saint Chamas
Você tem uma pergunta específica sobre o Ajax? Isso soa conversacional. Além disso, apenas para referência: api.drupal.org/api/drupal/includes--ajax.inc/group/ajax/7
Citricguy
Eu realmente não gosto de postar respostas apenas com links para "como" postagens do blog sem nenhuma explicação própria, então adicionarei isso como um comentário: envisioninteractive.com/drupal/… - se isso acabar funcionando, podemos considerar adicioná-lo como uma resposta, talvez. Parece que é disso que você pode precisar.
Danny Englander

Respostas:

8

O módulo Ajax funciona para mim no Drupal 6.

Para o 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
fonte
O que exatamente esse código deve fazer? Eu o adicionei ao meu tema (depois de alterar os nomes do gancho para corresponder ao meu tema), mas não percebo nenhum impacto.
John Slegers
Ele entra em um módulo personalizado dentro do seu tema.
Neelmeg
0

Uma das maneiras fáceis, se você estiver procurando ajaxificar apenas um formulário específico, será adicionar o plug-in do formulário jquery . É bem direto.

Adicione o código abaixo à função de pré-processamento da sua página no arquivo template.php.

  1. Primeiro adicione o plugin jquery com o código abaixo.

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

  2. Adicione o código abaixo e substitua #your_form_IDpelo seu ID de formulário

    drupal_add_js ('

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

É tudo o que você fez. Talvez você queira considerar carregar os scripts apenas as páginas necessárias.

esafwan
fonte
Eu tenho pensado nisso. Agora, estou pensando em torná-lo um módulo com uma página de configuração para que todos possam se beneficiar. Existe algo assim?
esafwan
-1

Veja se o módulo Ajax pode ajudá-lo com isso. Consulte a documentação também

pal4life
fonte
11
Ele está pedindo pelo Drupal 7, esse módulo ainda não está disponível para o D7.
Danny Englander
11
Para ser justo, embora a pergunta esteja marcada como 7, ela pergunta explicitamente se alguém teve experiência com ajax em D6 ou D7.
Emmys