Формуйте всередині блоку


14

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

Сама форма форми викликається event_signup_form($form, &$form_state)і функція подання викликається, event_signup_form_submit($form, &$form_state)але вона не викликається.

Я використовую гачку_блока_вигляду, щоб показати форму:

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()(без аргументів).


Але зсередини mock_block_view ($ delta = '') api.drupal.org/api/drupal/modules--block--block.api.php/… я повертаю масив, я нічого не друкую.
kristian nissen

4
Я створив інструмент, який створює блок-код, який ви можете розмістити у своєму модулі: перегляньте-tutorials.com
tools/

@Kristian гаразд, це працює з кодом, який ви редагували у своєму запитанні?
Laxman13

Так, мені вдалося змусити його працювати, я додамо оновлення до запитання
kristian nissen

Хоча це може працювати (як) для відредагованого питання, це не правильний спосіб розміщення робочої форми в блоці. Ви хочете масив візуалізації, а не рядок. Ви також хочете мати аргументи (як це визначено 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
Чудовий приклад. Мені не потрібна спеціальна форма подання, але перші дві функції ставлять мою власну форму в блок, і це те, що я шукав, коли знайшов цю сторінку. Спасибі.
мільйонивідпущення

Я думаю, це має бути прийнятою відповіддю.
Безкоштовний радикальний
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.