Formulir dalam satu blok

14

Saya menggunakan drupal_get_form('event_signup_form')untuk menanamkan formulir kustom saya di dalam blok. Formulir diberikan sebagaimana dimaksud, tetapi mengirimkan formulir tidak memicu apa pun.

Fungsi form itu sendiri dipanggil event_signup_form($form, &$form_state)dan fungsi submit dipanggil event_signup_form_submit($form, &$form_state)tetapi tidak dipanggil.

Saya menggunakan hook_block_view untuk menampilkan formulir:

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

Saya berhasil membuatnya berfungsi - berikut ini caranya (rintisan):

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
sumber

Jawaban:

15

Pada Drupal 7, drupal_get_form () mengembalikan array render alih-alih string, jadi coba gunakan:

drupal_render(drupal_get_form('event_signup_form'));

untuk menanamkan formulir di blok. Untuk informasi, lihat bagian drupal_get_form () mengembalikan array render, bukan string dalam artikel Konversi Modul 6.x ke 7.x

Juga, saya percaya fungsi Anda event_signup_form($form, &$form_state)seharusnya event_signup_form()(tanpa argumen).

Laxman13
sumber
Tetapi dari dalam hook_block_view ($ delta = '') api.drupal.org/api/drupal/modules--block--block.api.php/… Saya mengembalikan array, saya tidak mencetak apa-apa.
kristian nissen
4
Saya membuat alat yang membuat kode blok yang dapat Anda tempatkan di modul Anda: browse-tutorials.com/tools/drupal/create-block
ram4nd
@ Kristen ok, apakah itu berfungsi dengan kode yang Anda edit ke pertanyaan Anda?
Laxman13
Ya saya berhasil membuatnya bekerja, saya akan menambahkan pembaruan ke pertanyaan
kristian nissen
Meskipun ini bisa berfungsi (semacam) untuk pertanyaan yang diedit, itu bukan cara yang tepat untuk meletakkan formulir kerja di dalam blok. Anda menginginkan array render, bukan string. Anda juga ingin memiliki argumen (seperti yang ditentukan oleh API Formulir) untuk hook_form(). Lihat jawaban oleh Francisco Luz untuk jawaban yang benar.
Radikal Gratis
11

Taruhan saya $form['#submit'][] = 'event_signup_form_submit';adalah pelakunya. Anda menetapkan itu hanya jika Anda menginginkan penangan pengiriman tambahan.

Ini adalah kode sampel yang berfungsi.

<?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
sumber
1
Contoh yang sangat bagus!
leymannx
1
Contoh yang bagus Saya tidak perlu mengirimkan formulir kustom, tetapi dua fungsi pertama meletakkan formulir kustom saya di blok, yang saya cari ketika saya menemukan halaman ini. Terima kasih.
Jutaan daun
Saya pikir ini harus menjadi jawaban yang diterima.
Radikal Gratis