Formulário dentro de um bloco

15

Estou usando drupal_get_form('event_signup_form')para incorporar meu formulário personalizado dentro de um bloco. O formulário está sendo renderizado conforme pretendido, mas o envio do formulário não dispara nada.

A própria função de formulário é chamada event_signup_form($form, &$form_state)e a função de envio é chamada, event_signup_form_submit($form, &$form_state)mas não está sendo chamada.

Estou usando hook_block_view para mostrar o formulário:

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

Eu consegui fazer isso funcionar - aqui está 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
fonte

Respostas:

15

A partir do Drupal 7, drupal_get_form () retorna uma matriz de renderização em vez de uma string, portanto, tente usar:

drupal_render(drupal_get_form('event_signup_form'));

para incorporar o formulário no bloco. Para obter informações, consulte a seção drupal_get_form () retorna uma matriz de renderização em vez de uma string no artigo Convertendo os módulos 6.x para 7.x

Além disso, acredito que sua função event_signup_form($form, &$form_state)deveria ser apenas event_signup_form()(sem argumentos).

Laxman13
fonte
Mas de dentro de hook_block_view ($ delta = '') api.drupal.org/api/drupal/modules--block--block.api.php/… Estou retornando uma matriz, não estou imprimindo nada.
Nissen kristian
4
Fiz uma ferramenta que cria código de bloco que você pode colocar no seu módulo: browse-tutorials.com/tools/drupal/create-block
ram4nd
@ Kristian ok, ele funciona com o código que você editou na sua pergunta?
Laxman13
Sim eu consegui fazê-lo funcionar, vou acrescentar uma atualização para a questão
Kristian Nissen
Embora isso possa funcionar (mais ou menos) para a pergunta editada, não é o caminho certo para colocar um formulário de trabalho dentro de um bloco. Você deseja uma matriz de renderização, não uma string. Você também deseja ter os argumentos (conforme prescrito pela API do formulário) para hook_form(). Veja a resposta de Francisco Luz para obter a resposta correta.
Free Radical
11

Minha aposta é que $form['#submit'][] = 'event_signup_form_submit';é o culpado. Você define isso apenas se desejar um manipulador de envio extra.

Este é um código de exemplo funcional.

<?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
fonte
11
Um excelente exemplo!
Leymannx
11
Ótimo exemplo. Eu não precisava do envio do formulário personalizado, mas as duas primeiras funções colocaram meu formulário personalizado em um bloco, o que eu estava procurando quando encontrei esta página. Obrigado.
millionleaves
Eu acho que essa deve ser a resposta aceita.
Free Radical