ブロック内のフォーム


15

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
}

回答:


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/内から… 配列を返していますが、何も出力していません。
クリスチャンニッセン

4
モジュールに配置できるブロックコードを作成するツールを作成しました:browse-tutorials.com/tools/drupal/create-block
ram4nd

@Kristian OK、質問に編集したコードで動作しますか?
ラックスマン

はい、私はそれを機能させることができました。質問に更新を追加します
クリスチャンニッセン

これは、編集された質問では(ある種の)動作する可能性がありますが、ブロック内に作業フォームを配置する正しい方法ではありません。文字列ではなくレンダー配列が必要です。また、の引数(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
素晴らしい例です!
レイマン

1
素晴らしい例です。カスタムフォームを送信する必要はありませんでしたが、最初の2つの関数はカスタムフォームをブロックに入れました。これがこのページを見つけたときに探していたものです。ありがとう。
ミリオンリーブズ

これは受け入れられる答えだと思います。
フリーラジカル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.