Più moduli su una sola pagina?


8

È possibile mettere più moduli su una singola pagina?

Sto cercando di creare una pagina di offerta coupon. Volevo avere due moduli per due diverse offerte su ciascun lato di una pagina. Ogni modulo ha un campo di testo per il codice coupon e un proprio pulsante di invio. La prima forma funziona bene; tuttavia i valori nascosti della seconda forma sembrano essere sovrascritti da quelli della prima forma.

Sto usando hook_alter per modificare il secondo modulo per renderlo diverso, ma ha ancora lo stesso form_id del primo. È questo ciò che causa i miei problemi o devo cercare / pensare altrove?

Le due forme hanno gli stessi valori per "form_id" e "form_token", ma valori diversi per "form_build_id".

Risposte:


8

Se si desidera aggiungere più volte lo stesso modulo, è necessario implementare hook_forms () . Vedi node_forms () per un esempio.

Ciò consente di utilizzare diversi form_id, che puntano tutti alla stessa funzione del form builder. Ad esempio, è possibile utilizzare yourmodule_some_form_$ie quindi utilizzare hook_forms () per puntare a questi yourmodule_some_form.

Vedi http://www.mohitsharma.net/content/how-show-same-form-multiple-time-page per un esempio


1
L'OP sta parlando dell'uso di due moduli nella stessa pagina; l'utilizzo hook_forms()non risolve automaticamente questo. Se usi semplicemente lo stesso modulo due volte sulla stessa pagina, hai ancora il problema di ripetere lo stesso campo del modulo due volte.
kiamlaluno

Non sono sicuro se ti seguo. Non sei sicuro di 6.x in questo momento, ma Drupal 7 si assicura che non ci siano ID duplicati, quindi non ci dovrebbero essere problemi quando si hanno gli stessi campi modulo più volte nella stessa pagina?
Berdir,

hook_forms()non è utilizzato per avere due moduli con gli stessi campi modulo nella stessa pagina; viene utilizzato per consentire di avere un unico form builder per diversi ID modulo.
kiamlaluno

Puoi usare hook_forms () esattamente per questo. Vedi ad esempio mohitsharma.net/content/how-show-same-form-multiple-time-page
Berdir

L'esempio fornito in quell'articolo non è pratico; il modulo non ha nemmeno un pulsante di invio e per tale modulo non userei hook_forms(). L'OP sta quindi modificando una delle due forme.
kiamlaluno

-1

Puoi avere più di un modulo nella stessa pagina; guarda cosa è stato fatto da node_admin_content () , che utilizza il seguente codice:

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

Tralasciando la prima istruzione IF, la funzione sta aggiungendo due diversi moduli che hanno i loro gestori di invio.

Il problema è con i campi del modulo che si ripetono due volte. La seguente struttura di array creerebbe problemi quando l'array di moduli viene appiattito, poiché ci sarebbero due campi "coupon".

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

Senza vedere il codice in uso, potrei pensare che usare un callback di pagina che chiama drupal_get_form () sia probabilmente il modo più semplice, nel tuo caso.

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

Ho provato a utilizzare il seguente codice in Drupal 6.

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

Il contenuto di $outputper i due moduli era il seguente (ho rimosso l'output per i campi del modulo singolo).

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

Non esiste un conflitto tra l'ID HTML assegnato allo stesso campo del modulo e il valore per "form_build_id" (o "form_token") è diverso nei due moduli.

L'implementazione di hook_form_alter()usato per modificare il modulo dovrebbe essere in grado di capire in quale caso modificare il modulo, oppure entrambi i moduli mostrerebbero gli stessi campi.

Dal punto di vista dell'esperienza dell'utente, non sono sicuro che mostrare due diversi moduli con i propri pulsanti di invio sia il modo migliore per fare ciò che si sta tentando di ottenere.
Penserei che sarebbe meglio usare un modulo che mostri campi diversi in base ai valori impostati per altri campi. Ad esempio, il modulo potrebbe avere un selettore per il tipo di coupon e mostrerebbe diversi campi modulo in base al tipo di coupon selezionato.


Non è così semplice quando si desidera riutilizzare lo stesso modulo.
Berdir,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.