块内表格


14

drupal_get_form('event_signup_form')用来将我的自定义窗体嵌入一个块中。表单已按预期方式呈现,但是提交表单不会触发任何操作。

表单函数本身被调用event_signup_form($form, &$form_state),而提交函数被调用,event_signup_form_submit($form, &$form_state)但是没有被调用。

我正在使用hook_block_view来显示表单:

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

我设法使它正常工作-这是(存根)如何:

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
}

Answers:


15

从Drupal 7开始,drupal_get_form()返回一个渲染数组而不是字符串,因此请尝试使用:

drupal_render(drupal_get_form('event_signup_form'));

将该表格嵌入块中。有关信息,请参阅将6.x模块转换为7.x中的文章drupal_get_form()返回渲染数组而不是字符串

另外,我相信您的功能event_signup_form($form, &$form_state)应该只是event_signup_form()(不带参数)。


但是从hook_block_view($ delta ='')内部,api.drupal.org / api / drupal / modules--block--block.api.php /…我正在返回一个数组,我什么都没打印。
kristian nissen 2011年

4
我制作了一个工具,可以创建可放入模块中的块代码:browser-tutorials.com/tools/drupal/create-block
ram4nd

@Kristian好的,它可以与您在问题中编辑的代码一起使用吗?
Laxman13 2011年

是的,我确实设法使其正常运行,我将向问题添加更新
kristian nissen 2011年

尽管这可能对已编辑的问题有效(某种程度上),但这不是将工作表格放入块内的正确方法。您需要一个渲染数组,而不是字符串。您还希望拥有的参数(由Form API规定)hook_form()。有关正确答案,请参见Francisco Luz的答案。
自由基

11

我敢打赌,这$form['#submit'][] = 'event_signup_form_submit';是元凶。仅当您想要额外的提交处理程序时才设置。

这是一个有效的示例代码。

<?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
一个很好的例子!
leymannx 2015年

1
很好的例子。我不需要提交自定义表单,但是前两个功能将我的自定义表单放在一个块中,这是我在找到此页面时所寻找的。谢谢。
百万叶'16

我认为这应该是公认的答案。
自由基
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.