मेरे पास एक कस्टम मॉड्यूल है जो एक फॉर्म प्रदर्शित करता है।
फॉर्म जमा करने पर, मैं उपयोगकर्ता को एक अलग पृष्ठ पर पुनर्निर्देशित करना चाहता हूं।
मैं उसे कैसे कर सकता हूँ?
मेरे पास एक कस्टम मॉड्यूल है जो एक फॉर्म प्रदर्शित करता है।
फॉर्म जमा करने पर, मैं उपयोगकर्ता को एक अलग पृष्ठ पर पुनर्निर्देशित करना चाहता हूं।
मैं उसे कैसे कर सकता हूँ?
जवाबों:
सबमिट हैंडलर में आप करते हैं
ड्रुपल 7:
$form_state['redirect'] = 'url';
ड्रुपल 8:
$form_state->setRedirect('route', $args, $options);
$form_state->setRedirectUrl(\Drupal\Core\Url);
/my-form?destination=node/123
:।
यह ध्यान दिया जाना चाहिए कि कई ट्रिगर हैं जो पुनर्निर्देशन को रोक सकते हैं:
$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 के लिए, मैंने एक कस्टम मॉड्यूल पर यह कोशिश की और यह काम करता है। यह भी एक विषय में इस्तेमाल किया जा सकता है:
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
Drupal 8 में बाहरी URL पर पुनर्निर्देशित करने के लिए, TrustedRedirectResponse
निम्न कोड की तरह, कक्षा का उपयोग करें ।
$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);
use
कीवर्ड और उसके नामस्थान के साथ शामिल करना होगा :use Drupal\Core\Routing\TrustedRedirectResponse;
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 );
}
आशा है कि यह मदद कर सकता है