Hình thành trong một khối


15

Tôi đang sử dụng drupal_get_form('event_signup_form')để nhúng biểu mẫu tùy chỉnh của mình vào trong một khối. Biểu mẫu đang được hiển thị như dự định, nhưng việc gửi biểu mẫu không kích hoạt gì.

Hàm biểu mẫu được gọi event_signup_form($form, &$form_state)và hàm gửi được gọi event_signup_form_submit($form, &$form_state)nhưng nó không được gọi.

Tôi đang sử dụng hook_block_view để hiển thị biểu mẫu:

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

Tôi đã quản lý để làm việc này - đây là cách (sơ khai):

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
}

Câu trả lời:


15

Kể từ Drupal 7, drupal_get_form () trả về một mảng kết xuất thay vì một chuỗi, vì vậy hãy thử sử dụng:

drupal_render(drupal_get_form('event_signup_form'));

để nhúng các hình thức trong khối. Để biết thông tin, hãy xem phần drupal_get_form () trả về một mảng kết xuất thay vì một chuỗi trong bài viết Chuyển đổi mô-đun 6.x thành 7.x

Ngoài ra, tôi tin rằng chức năng của bạn event_signup_form($form, &$form_state)chỉ nên event_signup_form()(không có đối số).


Nhưng từ trong hook_block_view ($ delta = '') api.drupal.org/api/drupal/modules--block--block.api.php/ tôi đang trả lại một mảng, tôi không in bất cứ thứ gì.
kristian nissen

4
Tôi đã tạo một công cụ tạo mã khối mà bạn có thể đặt trong mô-đun của mình: Browse-tutorials.com/tools/drupal/create-block
ram4nd

@Kristian ok, nó có hoạt động với mã bạn đã chỉnh sửa thành câu hỏi của bạn không?
Laxman13

Có, tôi đã quản lý để làm cho nó hoạt động, tôi sẽ thêm một bản cập nhật cho câu hỏi
kristian nissen

Mặc dù điều này có thể hoạt động (loại) cho câu hỏi đã chỉnh sửa, nhưng đây không phải là cách phù hợp để đặt một biểu mẫu làm việc trong một khối. Bạn muốn một mảng render, không phải là một chuỗi. Bạn cũng muốn có các đối số (theo quy định của API biểu mẫu) cho hook_form(). Xem câu trả lời của Francisco Luz để có câu trả lời chính xác.
Cấp tiến miễn phí

11

Đặt cược của tôi là đó $form['#submit'][] = 'event_signup_form_submit';là thủ phạm. Bạn đặt nó chỉ khi bạn muốn một trình xử lý đệ trình thêm.

Đây là một mã mẫu làm việc.

<?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
Một ví dụ tuyệt vời!
leymannx

1
Ví dụ tuyệt vời. Tôi không cần gửi biểu mẫu tùy chỉnh, nhưng hai chức năng đầu tiên đặt biểu mẫu tùy chỉnh của tôi trong một khối, đó là những gì tôi đang tìm kiếm khi tôi tìm thấy trang này. Cảm ơn.
triệu phú

Tôi nghĩ rằng đây nên là câu trả lời được chấp nhận.
Cấp tiến miễn phí
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.