Formular innerhalb eines Blocks

15

Ich benutze drupal_get_form('event_signup_form'), um mein benutzerdefiniertes Formular in einen Block einzubetten. Das Formular wird wie beabsichtigt gerendert, aber das Absenden des Formulars löst nichts aus.

Die Formularfunktion selbst wird aufgerufen event_signup_form($form, &$form_state)und die Submit-Funktion wird aufgerufen, event_signup_form_submit($form, &$form_state)aber nicht aufgerufen.

Ich benutze hook_block_view , um das Formular anzuzeigen :

function event_block_view($delta = '') {
$blocks = array();
if ($delta ...) {
$blocks['content'] = drupal_render(drupal_get_form('event_signup_form'));
}
}

Ich habe es geschafft, das zum Laufen zu bringen - hier ist, wie (Stummel):

function hook_block_view($delta = '') {
$blocks['content'] = drupal_render(drupal_get_form('event_signup_form'));
}

function event_signup_form() {
// Register form submit handler, same goes for validation handler
$form['#submit'][] = 'event_signup_form_submit';

return $form;
}

function event_signup_form_submit($form, &$form_state) {
// This is now triggered
}
Christian Nissen
quelle

Antworten:

15

Ab Drupal 7 gibt drupal_get_form () ein Render-Array anstelle eines Strings zurück. Versuchen Sie also , Folgendes zu verwenden:

drupal_render(drupal_get_form('event_signup_form'));

um das Formular in den Block einzubetten. Weitere Informationen finden Sie im Abschnitt drupal_get_form (), in dem ein Render-Array anstelle einer Zeichenfolge im Artikel Konvertieren von 6.x-Modulen nach 7.x zurückgegeben wird

Ich glaube auch, dass Ihre Funktion event_signup_form($form, &$form_state)einfach sein sollte event_signup_form()(ohne Argumente).

Laxman13
quelle
Aber in hook_block_view ($ delta = '') api.drupal.org/api/drupal/modules--block--block.api.php/… Ich gebe ein Array zurück, ich drucke nichts.
Kristian Nissen
4
Ich habe ein Tool erstellt, das Blockcode erstellt, den Sie in Ihr Modul einfügen
ram4nd
@Kristian ok, funktioniert es mit dem Code, den Sie in Ihre Frage bearbeitet haben?
Laxman13,
Ja, ich habe es geschafft, es zum
Laufen
Während dies für die bearbeitete Frage möglicherweise funktioniert, ist es nicht der richtige Weg, ein Arbeitsformular innerhalb eines Blocks zu platzieren. Sie möchten ein Render-Array, keine Zeichenfolge. Sie möchten auch die Argumente (wie von der Formular-API vorgeschrieben) für haben hook_form(). Siehe Antwort von Francisco Luz für die richtige Antwort.
Free Radical
11

Ich wette, das $form['#submit'][] = 'event_signup_form_submit';ist der Täter. Sie legen dies nur fest, wenn Sie einen zusätzlichen Submission-Handler wünschen.

Dies ist ein funktionierender Beispielcode.

<?php
/**
 * Implements hook_block_info().
 */
function MYMODULE_block_info() {
  $blocks = array();

  $blocks['MYBLOCK'] = array(
    'info' => t('My block'), 
    'cache' => DRUPAL_NO_CACHE,
  );
  return $blocks;
}

/**
 * Implements hook_block_view().
 */
function MYMODULE_block_view($delta = '') {
  $block = array();

  switch ($delta) {
    case 'MYBLOCK':
      $block['subject'] = t('My block title');
      $block['content'] = drupal_get_form('MYFORM_form');
    break;
  }
  return $block;
}

/**
 * Custom form.
 */
function MYFORM_form($form, &$form_state) {
  $form['MYFIELD'] = array(
    '#type' => 'textfield',
    '#title' => t('Some Field'),
  );

  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Submit Button'),
  );

  return $form;
}

/**
 * Custom form submit function.
 */
function MYFORM_form_submit($form, &$form_state) {
  // You need the have Devel module enabled for dpm() to work.
  dpm($form_state);
}
Francisco Luz
quelle
1
Ein hervorragendes Beispiel!
Leymannx
1
Tolles Beispiel. Ich musste das benutzerdefinierte Formular nicht senden, aber die ersten beiden Funktionen platzieren mein benutzerdefiniertes Formular in einem Block. Dies war genau das, wonach ich gesucht habe, als ich diese Seite gefunden habe. Vielen Dank.
Millionleaves
Ich denke, das sollte die akzeptierte Antwort sein.
Free Radical