एक ब्लॉक के भीतर प्रपत्र


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 मॉड्यूल को 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/… के भीतर से मैं एक सरणी लौटा रहा हूं, मैं कुछ भी नहीं छाप रहा हूं।
क्रिश्चियन निसेन

4
मैंने एक उपकरण बनाया जो आपके मॉड्यूल में ब्लॉक कोड बना सकता है: Browse-tutorials.com/tools/drupal/create-block
ram4nd

@ क्रिसियन ठीक है, क्या यह आपके प्रश्न में संपादित कोड के साथ काम करता है?
लक्ष्मण १३

हां, मैंने इसे काम करने के लिए प्रबंधित किया था, मैं इस प्रश्न के लिए एक अपडेट
जोड़ूंगा

हालांकि यह संपादित प्रश्न के लिए काम कर सकता है (सॉर्ट करता है), यह एक ब्लॉक के भीतर काम करने का एक सही तरीका नहीं है । आप एक रेंडर नहीं बल्कि एक रेंडर सरणी चाहते हैं। आप तर्क (फॉर्म एपीआई द्वारा निर्धारित) भी करना चाहते हैं 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
एक उत्कृष्ट उदाहरण!
लीमनक्स

1
महान उदाहरण है। मुझे कस्टम फ़ॉर्म सबमिट करने की आवश्यकता नहीं थी, लेकिन पहले दो फ़ंक्शंस ने मेरे कस्टम फ़ॉर्म को एक ब्लॉक में डाल दिया, जो कि मैं इस पृष्ठ को ढूंढने पर देख रहा था। धन्यवाद।
मिलियन जुलाव

मुझे लगता है कि यह स्वीकृत उत्तर होना चाहिए।
फ्री रेडिकल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.