แบบฟอร์มภายในบล็อก


14

ฉันใช้drupal_get_form('event_signup_form')เพื่อฝังฟอร์มที่กำหนดเองของฉันไว้ในบล็อก ฟอร์มกำลังถูกเรนเดอร์ตามที่ตั้งใจ แต่การส่งแบบฟอร์มไม่ได้ก่อให้เกิดอะไร

ฟังก์ชั่นรูปแบบของตัวเองเรียกว่าevent_signup_form($form, &$form_state)และฟังก์ชั่นส่งเรียกว่า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 Modules เป็น 7.x

นอกจากนี้ฉันเชื่อว่าฟังก์ชันของคุณevent_signup_form($form, &$form_state)ควรเป็นevent_signup_form()(โดยไม่มีข้อโต้แย้ง)


แต่จากภายใน hook_block_view ($ delta = '') api.drupal.org/api/drupal/modules--block--block.api.php/…ฉันกลับอาร์เรย์ฉันไม่ได้พิมพ์อะไรเลย
kristian nissen

4
ฉันทำเครื่องมือที่จะสร้างการป้องกันรหัสที่คุณสามารถวางในโมดูลของคุณ: browse-tutorials.com/tools/drupal/create-block
ram4nd

@ คริสเตียนตกลงมันใช้งานได้กับรหัสที่คุณแก้ไขให้กับคำถามของคุณหรือไม่?
Laxman13

ใช่ฉันจัดการเพื่อให้มันใช้งานได้ฉันจะเพิ่มการอัปเดตให้กับคำถาม
kristian nissen

ขณะนี้อาจใช้งานได้ (เรียงลำดับ) สำหรับคำถามที่แก้ไข แต่ไม่ใช่วิธีที่เหมาะสมในการวางแบบฟอร์มการทำงานภายในบล็อก คุณต้องการอาร์เรย์เรนเดอร์ไม่ใช่สตริง นอกจากนี้คุณยังต้องการที่จะมีการขัดแย้ง (ตามที่กำหนดไว้ในแบบฟอร์มของ API) hook_form()สำหรับ ดูคำตอบโดย Francisco Luz สำหรับคำตอบที่ถูกต้อง
ฟรี Radical

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
ตัวอย่างที่ดี ฉันไม่ต้องการส่งฟอร์มที่กำหนดเอง แต่สองฟังก์ชันแรกใส่ฟอร์มที่กำหนดเองของฉันในบล็อกซึ่งเป็นสิ่งที่ฉันค้นหาเมื่อฉันพบหน้านี้ ขอบคุณ
millionleaves

ฉันคิดว่านี่ควรเป็นคำตอบที่ยอมรับได้
ฟรี
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.