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
}

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).


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


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.