Formularz w bloku

14

Używam, drupal_get_form('event_signup_form')aby osadzić swój niestandardowy formularz w bloku. Formularz jest renderowany zgodnie z przeznaczeniem, ale przesłanie go nie uruchamia niczego.

Wywoływana jest sama funkcja formularza event_signup_form($form, &$form_state)i wywoływana jest funkcja wysyłania, event_signup_form_submit($form, &$form_state)ale nie jest ona wywoływana.

Korzystam z hook_block_view, aby wyświetlić formularz:

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

Udało mi się to uruchomić - oto jak (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
źródło

Odpowiedzi:

15

Począwszy od Drupal 7, drupal_get_form () zwraca tablicę renderującą zamiast łańcucha, więc spróbuj użyć:

drupal_render(drupal_get_form('event_signup_form'));

aby osadzić formularz w bloku. Aby uzyskać informacje, zobacz sekcję drupal_get_form () zwraca tablicę renderowania zamiast łańcucha w artykule Konwertowanie modułów 6.x na 7.x

Ponadto uważam, że twoja funkcja event_signup_form($form, &$form_state)powinna być po prostu event_signup_form()(bez argumentów).

Laxman13
źródło
Ale z poziomu hook_block_view ($ delta = '') api.drupal.org/api/drupal/modules--block--block.api.php/… Zwracam tablicę, nic nie drukuję .
kristian nissen
4
Zrobiłem narzędzie, które tworzy blok kodu, który można umieścić w module: browse-tutorials.com/tools/drupal/create-block
ram4nd
@Kristian ok, czy to działa z kodem, który edytowałeś w swoim pytaniu?
Laxman13,
Tak, udało mi się go uruchomić, dodam aktualizację do pytania
Kristian Nissen 11.11.11
Chociaż może to działać (w pewnym sensie) w przypadku edytowanego pytania, nie jest to właściwy sposób na umieszczenie działającego formularza w bloku. Chcesz tablicę renderującą, a nie ciąg znaków. Chcesz także mieć argumenty (zgodnie z interfejsem API formularza) hook_form(). Prawidłowa odpowiedź znajduje się w odpowiedzi Francisco Luz.
Wolny radykalny
11

Założę się, że $form['#submit'][] = 'event_signup_form_submit';to jest sprawca. Ustawiasz to tylko, jeśli chcesz mieć dodatkową procedurę obsługi przesyłania.

To jest działający przykładowy kod.

<?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
źródło
1
Doskonały przykład!
leymannx,
1
Świetny przykład. Nie potrzebowałem przesyłać niestandardowego formularza, ale dwie pierwsze funkcje umieściły mój niestandardowy formularz w bloku, czego szukałem, kiedy znalazłem tę stronę. Dzięki.
millionleaves
Myślę, że to powinna być zaakceptowana odpowiedź.
Wolny radykalny