Forma dentro de un bloque

14

Estoy usando drupal_get_form('event_signup_form')para incrustar mi formulario personalizado dentro de un bloque. El formulario se procesa según lo previsto, pero el envío del formulario no genera nada.

La función de formulario en sí se llama event_signup_form($form, &$form_state)y la función de envío se llama event_signup_form_submit($form, &$form_state)pero no se llama.

Estoy usando hook_block_view para mostrar el formulario:

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

Me las arreglé para que esto funcionara, así es como (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
}
Kristian Nissen
fuente

Respuestas:

15

A partir de Drupal 7, drupal_get_form () devuelve una matriz de representación en lugar de una cadena, así que intente usar:

drupal_render(drupal_get_form('event_signup_form'));

para incrustar el formulario en el bloque. Para obtener información, consulte la sección drupal_get_form () devuelve una matriz de representación en lugar de una cadena en el artículo Conversión de módulos 6.x a 7.x

Además, creo que su función event_signup_form($form, &$form_state)debería ser event_signup_form()(sin argumentos).

Laxman13
fuente
Pero desde hook_block_view ($ delta = '') api.drupal.org/api/drupal/modules--block--block.api.php/… Estoy devolviendo una matriz, no estoy imprimiendo nada.
Kristian Nissen
44
Creé
ram4nd
@ Kristian ok, ¿funciona con el código que editaste en tu pregunta?
Laxman13
Sí, logré hacerlo funcionar,
agregaré
Si bien esto puede funcionar (más o menos) para la pregunta editada, no es la forma correcta de poner un formulario de trabajo dentro de un bloque. Desea una matriz de renderizado, no una cadena. También desea tener los argumentos (según lo prescrito por la API del formulario) para hook_form(). Vea la respuesta de Francisco Luz para la respuesta correcta.
Radical libre
11

Mi apuesta es que $form['#submit'][] = 'event_signup_form_submit';es el culpable. Lo configura solo si desea un controlador de envío adicional.

Este es un código de muestra que funciona.

<?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
fuente
1
Un excelente ejemplo!
leymannx
1
Gran ejemplo No necesitaba el envío del formulario personalizado, pero las dos primeras funciones pusieron mi formulario personalizado en un bloque, que es lo que estaba buscando cuando encontré esta página. Gracias.
millionleaves
Creo que esta debería ser la respuesta aceptada.
Radical libre el