Форма внутри блока

14

Я использую, drupal_get_form('event_signup_form')чтобы встроить мою пользовательскую форму в блок. Форма отображается в соответствии с назначением, но отправка формы ничего не вызывает.

Вызывается сама функция формы и вызывается event_signup_form($form, &$form_state)функция submit, 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'));

встроить форму в блок. Информацию смотрите в разделе drupal_get_form () возвращает строку рендера вместо строки в статье Преобразование модулей 6.x в 7.x

Кроме того, я считаю, что ваша функция event_signup_form($form, &$form_state)должна быть просто event_signup_form()(без аргументов).

Laxman13
источник
Но изнутри hook_block_view ($ delta = '') api.drupal.org/api/drupal/modules--block--block.api.php/… Я возвращаю массив, я ничего не печатаю .
Кристиан Ниссен
4
Я создал инструмент, который создает блочный код, который вы можете разместить в своем модуле: browse-tutorials.com/tools/drupal/create-block
ram4nd
@ Кристиан, хорошо, это работает с кодом, который вы отредактировали в своем вопросе?
Laxman13
Да, мне удалось заставить его работать, я добавлю обновление к вопросу
Кристиан Ниссен
Хотя это может работать (вроде) для отредактированного вопроса, это не правильный способ поместить рабочую форму в блок. Вы хотите массив рендеринга, а не строку. Вы также хотите иметь аргументы (как предписано API формы) для hook_form(). Смотрите ответ Франциско Луз для правильного ответа.
Свободный Радикал
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
1
Отличный пример. Мне не нужно было отправлять пользовательскую форму, но первые две функции поместили мою пользовательскую форму в блок, что я и искал, когда нашел эту страницу. Благодарю.
миллион листьев
Я думаю, что это должен быть принятый ответ.
Свободный Радикал