फॉर्म सबमिट करने के बाद किसी पेज पर रीडायरेक्ट कैसे करें


24

मेरे पास एक कस्टम मॉड्यूल है जो एक फॉर्म प्रदर्शित करता है।

फॉर्म जमा करने पर, मैं उपयोगकर्ता को एक अलग पृष्ठ पर पुनर्निर्देशित करना चाहता हूं।

मैं उसे कैसे कर सकता हूँ?

जवाबों:


31

सबमिट हैंडलर में आप करते हैं

ड्रुपल 7:

$form_state['redirect'] = 'url';

ड्रुपल 8:

$form_state->setRedirect('route', $args, $options);
$form_state->setRedirectUrl(\Drupal\Core\Url);

क्या ऐसा करने का कोई वैकल्पिक तरीका है? जिन रूपों को मुझे पुनर्निर्देशित करने की आवश्यकता है, वे अपने स्वयं के # हैंडबॉलर हैंडलर के साथ बनाए गए हैं (सबमिट हैंडलर को मेरे कस्टम मॉड्यूल में नहीं रखा गया है), इसलिए मेरे पास कोड तक पहुंच नहीं है।
कार्लोस मुनिज़

@Charlie अपने स्वयं के जोड़ने के लिए form_alter का उपयोग करें।
googletorp

@Charlie यदि आपका लिंक मुख्य रूप से लिंक के द्वारा सुलभ है, तो URL में एक गंतव्य पैरामीटर डालें /my-form?destination=node/123:।
tostinni

D7 पर काम नहीं कर रहा है, लेकिन मुझे कुछ ऐसा मिला जो करता है। नीचे मेरे संदेश की जाँच करें।
इग्नासियो सेगुरा पोस्टिगो

मैं केवल D7 के लिए उत्तर देने के लिए धन्यवाद कहना चाहता हूं, फिर D8 के उत्तर को अपडेट करने के लिए 5 साल बाद वापस आ रहा हूं। <3
चींटी

17

यह ध्यान दिया जाना चाहिए कि कई ट्रिगर हैं जो पुनर्निर्देशन को रोक सकते हैं:

  • $form_state['redirect'] === FALSE: यदि सेट किया जाता है, तो फॉर्म बिल्डर फ़ंक्शन या फॉर्म वेलिडेशन / सबमिट हैंडलर नहीं चाहता है कि उपयोगकर्ता को पुनर्निर्देशित किया जाए, जिसका अर्थ है कि drupal_goto()इसे लागू नहीं किया गया है। अधिकांश रूपों के लिए, पुनर्निर्देशन तर्क एक ही होगा चाहे $form_state['redirect']वह अपरिभाषित हो या एफएएलएसई। हालाँकि, यदि इसे परिभाषित नहीं किया गया था और वर्तमान अनुरोध में 'गंतव्य' क्वेरी स्ट्रिंग है, तो drupal_goto()इसके बजाय उस गंतव्य को पुनर्निर्देशित किया जाएगा। केवल स्थापित करने $form_state['redirect']के लिए FALSEकिसी भी पुनर्निर्देशन नहीं कर पाएगा।
  • $form_state['no_redirect'] === TRUE: जब सेट किया जाता है, तो कॉलबैक जो मूल रूप से निर्मित होता है, किसी भी पुनर्निर्देशन को स्पष्ट रूप से अस्वीकार कर देता है, भले ही पुनर्निर्देशन मूल्य में परवाह किए बिना $form_state['redirect']। उदाहरण के लिए, किसी भी पुनर्निर्देशन को रोकने के लिए AJAX कॉलबैक में फॉर्म बनाते समय ajax_get_form()परिभाषित करता है $form_state['no_redirect']$form_state['no_redirect']फार्म बिल्डर के कार्यों में बदलाव नहीं किया जाना चाहिए और न ही सत्यापन / सबमिट हैंडलर तैयार करना चाहिए।
  • $form_state['programmed'] === TRUE: इसका मतलब है कि फॉर्म सबमिशन के माध्यम से आम तौर पर लागू किया गया था drupal_form_submit(), इसलिए किसी भी पुनर्निर्देशन से उस स्क्रिप्ट को तोड़ दिया जाएगा drupal_form_submit()
  • $form_state['rebuild'] === TRUE: इसका मतलब है कि फॉर्म को पुनर्निर्देशन के बिना पुनर्निर्माण करने की आवश्यकता है।

7

ड्रुपल 7 के लिए, मैंने एक कस्टम मॉड्यूल पर यह कोशिश की और यह काम करता है। यह भी एक विषय में इस्तेमाल किया जा सकता है:

function my_theme_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'contact_site_form') {
$form['#submit'][] = 'contact_form_submit_handler';
}
}

function contact_form_submit_handler(&$form, &$form_state) {
$form_state['redirect'] = 'thank-you-page-alias';
}

BTW, मुझे यह स्निपेट यहाँ मिला: https://gist.github.com/postrational/5768796


4

Drupal 8 में बाहरी URL पर पुनर्निर्देशित करने के लिए, TrustedRedirectResponseनिम्न कोड की तरह, कक्षा का उपयोग करें ।

$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);

यदि यह मदद कर सकता है, तो हमें इस वर्ग को useकीवर्ड और उसके नामस्थान के साथ शामिल करना होगा :use Drupal\Core\Routing\TrustedRedirectResponse;
Sébastien Gicquel

2

D8 पर मुझे यह पसंद आया (लेकिन यह काम नहीं करेगा ... नीचे देखें):

/**
* Implements hook_form_FORM_ID_alter().
*/
function MYMODULE_form_FORM_ID_form_alter( array &$form, FormStateInterface $form_state, $form_id ) {

   // Force redirect to "/thankyou" page
   $url = "/thankyou";
   $path = \Drupal::service('path.alias_manager')->getPathByAlias($url);
   if(preg_match('/node\/(\d+)/', $path, $matches)) {
     $form_state->setRedirect('entity.node.canonical',
       array('node' => $matches[1])
     );    
   }

}

/ संपादित करें

मुझे याद आ रहा था कि setRedirect / setRedirectUrl मॉड्यूल के जमा होने के बाद काम करता है, इसलिए यह मेरे काम के समाधान के लिए है:

/**
 * Implements hook_form_FORM_ID_alter().
 */
function MYMODULE_form_FORM_ID_form_alter( array &$form, FormStateInterface $form_state, $form_id ) {
  $form['actions']['submit']['#submit'][] = 'MYFORM_redirect_handler';
}

function MYFORM_redirect_handler($form, FormStateInterface $form_state) {
  // Force redirect to "/sent"
  $dest_url = "/sent";
  $url = Url::fromUri('internal:' . $dest_url);
  $form_state->setRedirectUrl( $url );
}

आशा है कि यह मदद कर सकता है


1

के लिए Drupal 7 आप की तरह पैरामीटर वाला URL पर रीडायरेक्ट करना चाहते हैंsomeurl?param1=1&param2=2

$query = array(
  'param1' => '1',
   'param2' => '2',
 );
$form_state['redirect'] = array(
    'someurl',
    array(
      'query'    => $query,
      'fragment' => 'hash_fragment',
    ),
  );
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.