Vários formulários em uma única página?

8

É possível colocar vários formulários em uma única página?

Estou tentando fazer uma página de oferta de cupom. Eu queria ter dois formulários para duas ofertas diferentes em cada lado de uma página. Cada formulário possui um campo de texto para o código do cupom e seu próprio botão de envio. A primeira forma funciona bem; no entanto, os valores ocultos da segunda forma parecem ser substituídos pelos da primeira forma.

Estou usando hook_alter para alterar o segundo formulário para torná-lo diferente, mas ele ainda tem o mesmo form_id que o primeiro. É isso que está causando meus problemas ou preciso procurar / pensar em outro lugar?

Os dois formulários têm os mesmos valores para "form_id" e "form_token", mas valores diferentes para "form_build_id".

user1359
fonte

Respostas:

8

Se você deseja adicionar o mesmo formulário várias vezes, é necessário implementar hook_forms () . Veja node_forms () para um exemplo.

Isso permite usar diferentes form_id's, que apontam para a mesma função do construtor de formulários. Por exemplo, você pode usar yourmodule_some_form_$ie usar hook_forms () para apontá-las yourmodule_some_form.

Consulte http://www.mohitsharma.net/content/how-show-same-form-multiple-time-page para obter um exemplo

Berdir
fonte
11
O OP está falando em usar dois formulários na mesma página; o uso hook_forms()não resolve isso automaticamente. Se você simplesmente usar o mesmo formulário duas vezes na mesma página, ainda terá o problema de repetir o mesmo campo de formulário duas vezes.
Kiamlaluno
Não tenho certeza se eu te sigo. Não tenho certeza sobre o 6.x agora, mas pelo menos o Drupal 7 garante que não haja IDs duplicados; portanto, não deve haver um problema ao ter os mesmos campos de formulário várias vezes na mesma página?
Berdir
hook_forms()não é usado para ter dois formulários com os mesmos campos de formulário na mesma página; é usado para permitir ter um único construtor de formulários para diferentes IDs de formulários.
Kiamlaluno
Você pode usar hook_forms () exatamente para isso. Ver, por exemplo mohitsharma.net/content/how-show-same-form-multiple-time-page
Berdir
O exemplo dado nesse artigo não é prático; o formulário nem tem um botão de envio e, para esse formulário, eu não usaria hook_forms(). O OP está alterando uma das duas formas.
kiamlaluno
-1

Você pode ter mais de um formulário na mesma página; veja o que foi feito por node_admin_content () , que usa o seguinte código:

function node_admin_content($form_state) {
  if (isset($form_state['values']['operation']) && $form_state['values']['operation'] == 'delete') {
    return node_multiple_delete_confirm($form_state, array_filter($form_state['values']['nodes']));
  }
  $form = node_filter_form();

  $form['#theme'] = 'node_filter_form';
  $form['admin']  = node_admin_nodes();

  return $form;
}

Deixando de fora a primeira instrução IF, a função está adicionando dois formulários diferentes que têm seus próprios manipuladores de envio.

O problema está nos campos de formulário que são repetidos duas vezes. A estrutura de matriz a seguir criaria problemas quando a matriz de formulário é achatada, pois haveria dois campos de "cupom".

$form['first form']['coupon'] = array(
  '#type' => 'textfield', 
  '#title' => t('Coupon'), 
  '#default_value' => variable_get('mymodule_coupon'), 
  '#size' => 60, 
  '#maxlength' => 128, 
  '#required' => TRUE,
);

$form['second form']['coupon'] = array(
  '#type' => 'textfield', 
  '#title' => t('Coupon'), 
  '#default_value' => variable_get('mymodule_coupon'), 
  '#size' => 60, 
  '#maxlength' => 128, 
  '#required' => TRUE,
);

Sem ver o código sendo usado, eu poderia pensar que usar um retorno de chamada de página que chame drupal_get_form () é provavelmente a maneira mais fácil, no seu caso.

$output = drupal_get_form("form identifier") . drupal_get_form("form identifier");

Tentei usar o seguinte código no Drupal 6.

module_load_include('inc', 'path', 'path.admin');
$output = drupal_get_form('path_admin_form') . drupal_get_form('path_admin_form');

O conteúdo de $outputpara o formulário dois era o seguinte (eu removi a saída para os campos de formulário único).

<form action="/dr61/devel/php"  accept-charset="UTF-8" method="post" id="path-admin-form-1">
<div><div class="form-item" id="edit-language-1-wrapper">

<input type="submit" name="op" id="edit-submit" value="Create new alias"  class="form-submit" />
<input type="hidden" name="form_build_id" id="form-4eb9304baac34f292901ca23d925ff03" value="form-4eb9304baac34f292901ca23d925ff03"  />
<input type="hidden" name="form_token" id="edit-path-admin-form-form-token" value="cd429a06b84e381eb82ef04cd5033eeb"  />
<input type="hidden" name="form_id" id="edit-path-admin-form" value="path_admin_form"  />
<form action="/dr61/devel/php"  accept-charset="UTF-8" method="post" id="path-admin-form-1">
<div><div class="form-item" id="edit-language-1-wrapper">

<input type="submit" name="op" id="edit-submit-1" value="Create new alias"  class="form-submit" />
<input type="hidden" name="form_build_id" id="form-fb363c7ca6d88f71d98e86f8a69b0379" value="form-fb363c7ca6d88f71d98e86f8a69b0379"  />
<input type="hidden" name="form_token" id="edit-path-admin-form-form-token-1" value="cd429a06b84e381eb82ef04cd5033eeb"  />
<input type="hidden" name="form_id" id="edit-path-admin-form-1" value="path_admin_form"  />

Não há conflito entre o ID HTML atribuído ao mesmo campo de formulário e o valor para "form_build_id" (ou "form_token") é diferente nos dois formulários.

A implementação de hook_form_alter()usada para alterar o formulário deve ser capaz de entender em que caso alterar o formulário, ou ambos os formulários mostrariam os mesmos campos.

Do ponto de vista da experiência do usuário, não tenho certeza de que mostrar dois formulários diferentes com seus próprios botões de envio seja a melhor maneira de fazer o que você está tentando alcançar.
Eu pensaria que seria melhor usar um formulário que mostre campos diferentes com base nos valores definidos para outros campos. Por exemplo, o formulário poderia ter um seletor para o tipo de cupom e mostraria diferentes campos de formulário com base no tipo de cupom selecionado.

kiamlaluno
fonte
Não é tão simples quando você deseja reutilizar o mesmo formulário.
Berdir