Mehrere Formulare auf einer Seite?

8

Ist es möglich, mehrere Formulare auf einer Seite zu platzieren?

Ich versuche, eine Coupon-Angebotsseite zu erstellen. Ich wollte zwei Formulare für zwei verschiedene Angebote auf jeder Seite einer Seite haben. Jedes Formular verfügt über ein Textfeld für den Gutscheincode und eine eigene Schaltfläche zum Senden. Die erste Form funktioniert in Ordnung; Die verborgenen Werte des zweiten Formulars scheinen jedoch von den Werten des ersten Formulars überschrieben zu werden.

Ich verwende hook_alter, um das zweite Formular zu ändern, um es anders zu machen, aber es hat immer noch die gleiche form_id wie das erste. Verursacht dies meine Probleme oder muss ich woanders suchen / denken?

Die beiden Formulare haben dieselben Werte für "form_id" und "form_token", jedoch unterschiedliche Werte für "form_build_id".

user1359
quelle

Antworten:

8

Wenn Sie dasselbe Formular mehrmals hinzufügen möchten, müssen Sie hook_forms () implementieren . Ein Beispiel finden Sie unter node_forms () .

Dies ermöglicht die Verwendung verschiedener form_id's, die alle auf dieselbe Form Builder-Funktion verweisen. Sie können beispielsweise yourmodule_some_form_$ihook_forms () verwenden und dann verwenden, um auf diese zu verweisen yourmodule_some_form.

Ein Beispiel finden Sie unter http://www.mohitsharma.net/content/how-show-same-form-multiple-time-page

Berdir
quelle
1
Das OP spricht von der Verwendung von zwei Formularen auf derselben Seite. Verwenden hook_forms()löst dies nicht automatisch. Wenn Sie dasselbe Formular einfach zweimal auf derselben Seite verwenden, besteht immer noch das Problem, dass dasselbe Formularfeld zweimal wiederholt wird.
Kiamlaluno
Ich bin mir nicht sicher, ob ich dir folge. Sie sind sich momentan nicht sicher über 6.x, aber mindestens stellt Drupal 7 sicher, dass keine doppelten IDs vorhanden sind. Es sollte also kein Problem geben, wenn dieselben Formularfelder mehrmals auf derselben Seite angezeigt werden.
Berdir
hook_forms()wird nicht verwendet, um zwei Formulare mit denselben Formularfeldern auf derselben Seite zu haben. Es wird verwendet, um einen einzelnen Formularersteller für verschiedene Formular-IDs zu ermöglichen.
Kiamlaluno
Genau dafür können Sie hook_forms () verwenden. Siehe zum Beispiel mohitsharma.net/content/how-show-same-form-multiple-time-page
Berdir
Das in diesem Artikel angegebene Beispiel ist nicht praktikabel. Das Formular hat nicht einmal einen Senden-Button, und für ein solches Formular würde ich nicht verwenden hook_forms(). Das OP ändert dann eine der beiden Formen.
Kiamlaluno
-1

Sie können mehr als ein Formular auf derselben Seite haben. Sehen Sie, was mit node_admin_content () gemacht wird , das den folgenden Code verwendet:

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;
}

Ohne die erste IF-Anweisung fügt die Funktion zwei verschiedene Formulare hinzu, die über eigene Übermittlungshandler verfügen.

Das Problem liegt in den Formularfeldern, die zweimal wiederholt werden. Die folgende Array-Struktur würde Probleme verursachen, wenn das Formular-Array abgeflacht wird, da zwei "Coupon" -Felder vorhanden wären.

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

Ohne den verwendeten Code zu sehen, könnte ich denken, dass die Verwendung eines Seitenrückrufs, der drupal_get_form () aufruft, in Ihrem Fall wahrscheinlich der einfachere Weg ist.

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

Ich habe versucht, den folgenden Code in Drupal 6 zu verwenden.

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

Der Inhalt $outputfür die beiden Formulare war der folgende (ich habe die Ausgabe für die einzelnen Formularfelder entfernt).

<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"  />

Es besteht kein Konflikt zwischen der HTML-ID, die demselben Formularfeld zugewiesen ist, und der Wert für "form_build_id" (oder "form_token") unterscheidet sich in beiden Formularen.

Die Implementierung von hook_form_alter()verwendet, um das Formular zu ändern, sollte verstehen können, in welchem ​​Fall das Formular geändert werden muss, da sonst beide Formulare dieselben Felder anzeigen würden.

Aus Sicht der Benutzererfahrung bin ich mir nicht sicher, ob das Anzeigen von zwei verschiedenen Formularen mit eigenen Übermittlungsschaltflächen der beste Weg ist, um das zu tun, was Sie erreichen möchten.
Ich würde denken, dass es besser wäre, ein Formular zu verwenden, das verschiedene Felder basierend auf den für andere Felder festgelegten Werten anzeigt. Das Formular könnte beispielsweise einen Selektor für den Coupontyp haben und verschiedene Formularfelder anzeigen, die auf dem ausgewählten Coupontyp basieren.

kiamlaluno
quelle
Es ist nicht so einfach, wenn Sie dasselbe Formular wiederverwenden möchten .
Berdir