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
}

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


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.