¿Múltiples formularios en una sola página?

8

¿Es posible poner múltiples formularios en una sola página?

Estoy tratando de hacer una página de oferta de cupones. Quería tener dos formularios para dos ofertas diferentes en cada lado de una página. Cada formulario tiene un campo de texto para el código de cupón y su propio botón de envío. La primera forma funciona bien; sin embargo, los valores ocultos de la segunda forma parecen ser anulados por los de la primera forma.

Estoy usando hook_alter para alterar la segunda forma para que sea diferente, pero todavía tiene el mismo form_id que la primera. ¿Es esto lo que está causando mis problemas, o necesito buscar / pensar en otro lugar?

Las dos formas tienen los mismos valores para "form_id" y "form_token", pero valores diferentes para "form_build_id".

usuario1359
fuente

Respuestas:

8

Si desea agregar el mismo formulario varias veces, debe implementar hook_forms () . Ver node_forms () para un ejemplo.

Esto permite utilizar diferentes form_id, que apuntan a la misma función de generador de formularios. Por ejemplo, puede usar yourmodule_some_form_$iy luego usar hook_forms () para señalarlos yourmodule_some_form.

Ver http://www.mohitsharma.net/content/how-show-same-form-multiple-time-page para ver un ejemplo

Berdir
fuente
1
El OP está hablando de usar dos formularios en la misma página; el uso hook_forms()no resuelve esto automáticamente. Si simplemente usa el mismo formulario dos veces en la misma página, todavía tiene el problema de repetir el mismo campo de formulario dos veces.
kiamlaluno
No estoy seguro si te sigo. No estoy seguro sobre 6.x en este momento, pero al menos Drupal 7 se asegura de que no haya ID duplicados, por lo que no debería haber un problema al tener los mismos campos de formulario varias veces en la misma página.
Berdir
hook_forms()no se usa para tener dos formularios con los mismos campos de formulario en la misma página; se usa para permitir tener un único generador de formularios para diferentes ID de formulario.
kiamlaluno
Puede usar hook_forms () para exactamente esto. Ver por ejemplo mohitsharma.net/content/how-show-same-form-multiple-time-page
Berdir el
El ejemplo dado en ese artículo no es práctico; el formulario ni siquiera tiene un botón de envío, y para tal formulario no lo usaría hook_forms(). El OP está alterando una de las dos formas.
kiamlaluno
-1

Puede tener más de un formulario en la misma página; vea lo que hace node_admin_content () , que usa el siguiente 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;
}

Dejando de lado la primera instrucción IF, la función agrega dos formas diferentes que tienen sus propios controladores de envío.

El problema está en los campos de formulario que se repiten dos veces. La siguiente estructura de matriz crearía problemas cuando la matriz de formulario se aplana, ya que habría dos campos de "cupón".

$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,
);

Sin ver el código que se está utilizando, podría pensar que usar una devolución de llamada de página que llame a drupal_get_form () es probablemente la forma más fácil, en su caso.

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

Intenté usar el siguiente código en Drupal 6.

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

El contenido de $outputlos dos formularios fue el siguiente (eliminé el resultado de los campos de formulario ú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"  />

No existe un conflicto entre la ID de HTML asignada al mismo campo de formulario, y el valor de "form_build_id" (o "form_token") es diferente en los dos formularios.

La implementación de hook_form_alter()used to alter the form debería poder entender en qué caso alterar el formulario, o ambos formularios mostrarían los mismos campos.

Desde el punto de vista de la experiencia del usuario, no estoy seguro de que mostrar dos formularios diferentes con sus propios botones de envío sea la mejor manera de hacer lo que está tratando de lograr.
Creo que sería mejor usar un formulario que muestre diferentes campos basándose en los valores establecidos para otros campos. Por ejemplo, el formulario podría tener un selector para el tipo de cupón y mostraría diferentes campos de formulario basados ​​en el tipo de cupón seleccionado.

kiamlaluno
fuente
No es tan simple cuando quieres reutilizar el mismo formulario.
Berdir