Forma all'interno di un blocco


14

Sto usando drupal_get_form('event_signup_form')per incorporare il mio modulo personalizzato all'interno di un blocco. Il modulo viene visualizzato come previsto, ma l'invio del modulo non attiva nulla.

Viene chiamata la funzione form stessa e viene chiamata event_signup_form($form, &$form_state)la funzione submit event_signup_form_submit($form, &$form_state)ma non viene chiamata.

Sto usando hook_block_view per mostrare il modulo:

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

Sono riuscito a farlo funzionare - ecco come (stub):

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
}

Risposte:


15

A partire da Drupal 7, drupal_get_form () restituisce un array di rendering anziché una stringa, quindi prova a usare:

drupal_render(drupal_get_form('event_signup_form'));

per incorporare il modulo nel blocco. Per informazioni, consultare la sezione drupal_get_form () restituisce un array di rendering anziché una stringa nell'articolo Conversione dei moduli 6.x in 7.x

Inoltre, credo che la tua funzione event_signup_form($form, &$form_state)dovrebbe essere event_signup_form()(senza argomenti).


Ma dall'interno hook_block_view ($ delta = '') api.drupal.org/api/drupal/modules--block--block.api.php/… Sto restituendo un array, non sto stampando nulla.
Kristian Nissen,

4
Ho creato uno strumento che crea codice a blocchi che puoi inserire nel tuo modulo: browse-tutorials.com/tools/drupal/create-block
ram4nd

@Kristian ok, funziona con il codice che hai modificato nella tua domanda?
Laxman13

Sì, sono riuscito a farlo funzionare, aggiungerò un aggiornamento alla domanda
kristian nissen

Sebbene ciò possa funzionare (in un certo senso ) per la domanda modificata, non è il modo giusto di inserire un modulo funzionante all'interno di un blocco. Volete un array di rendering, non una stringa. Si desidera inoltre disporre degli argomenti (come prescritto dall'API del modulo) per hook_form(). Vedi la risposta di Francisco Luz per la risposta corretta.
Radicale gratuito il

11

La mia scommessa è che $form['#submit'][] = 'event_signup_form_submit';è il colpevole. Lo imposti solo se desideri un gestore di invio aggiuntivo.

Questo è un codice di esempio funzionante.

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

1
Un esempio eccellente!
leymannx,

1
Ottimo esempio Non avevo bisogno di inviare il modulo personalizzato, ma le prime due funzioni hanno messo il mio modulo personalizzato in un blocco, che è quello che stavo cercando quando ho trovato questa pagina. Grazie.
millionleaves,

Penso che questa dovrebbe essere la risposta accettata.
Radicale gratuito il
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.