जवाबों:
आपको लॉगिन फ़ॉर्म को बदलने और सबमिट हैंडलर जोड़ने की आवश्यकता है जो पुनर्निर्देशन का ध्यान रखेगा। आप $form_state->setRedirectUrl()
सीधे रूप में परिवर्तन का उपयोग नहीं कर सकते , क्योंकि यह ओवरराइट हो जाएगा UserForm::submitForm()
।
/**
* Implements hook_form_FORM_ID_alter().
*/
function mymodule_form_user_login_form_alter(&$form, FormStateInterface $form_state) {
$form['#submit'][] = 'mymodule_user_login_submit';
}
/**
* Form submission handler for user_login_form().
*
* Redirects the user to the dashboard after logging in.
*/
function mymodule_user_login_submit(&$form, FormStateInterface $form_state) {
$url = Url::fromRoute('mymodule.dashboard');
// Check if a destination was set, probably on an exception controller.
// @see \Drupal\user\Form\UserLoginForm::submitForm()
$request = \Drupal::service('request_stack')->getCurrentRequest();
if (!$request->request->has('destination')) {
$form_state->setRedirectUrl($url);
}
else {
$request->query->set('destination', $request->request->get('destination'));
}
}
else
यहाँ क्या हो रहा है? मौजूदा पुनर्निर्देशित बनाए रखना?
एक Drupal 8 साइट पर लॉगिन करने के बाद उपयोगकर्ताओं को पुनर्निर्देशित करना Drupal 7 पर कैसे किया गया, इससे अलग नहीं है, सिवाय इसके कि Drupal 8 के लिए कोड को अनुकूलित करने की आवश्यकता है।
विशेष रूप से:
hook_user_login()
लॉगिन करने के बाद उपयोगकर्ताओं को पुनर्निर्देशित करने के लिए उपयोग नहीं किया जाता है, बस इस तथ्य के लिए कि उस हुक में उपयोगकर्ताओं को पुनर्निर्देशित hook_user_login()
करने से अन्य कार्यान्वयन बंद हो जाएंगे ।उपयोगकर्ताओं को पुनर्निर्देशित करने का सही तरीका लॉगिन फ़ॉर्म में एक फॉर्म सबमिशन हैंडलर जोड़ना है जो निम्नलिखित के समान कोड का उपयोग करता है।
$form_state->setRedirect('user.page');
ध्यान दें कि user.page Drupal पथ के लिए रूटिंग नाम है जहां आप चाहते हैं कि उपयोगकर्ता रीडायरेक्ट हो।
यदि आपके पास Drupal\Core\Url
कक्षा का एक उदाहरण है , तो आप निम्न कोड का भी उपयोग कर सकते हैं।
$form_state->setRedirectUrl($url);
ध्यान रखें कि पहली विधि तब बेहतर होती है जब आप उपयोगकर्ताओं को उसी साइट के पृष्ठ पर पुनः निर्देशित कर रहे हों जिस साइट में उन्होंने लॉग इन किया था; दूसरी विधि आम तौर पर बाहरी URL का उपयोग करने वाले उपयोगकर्ताओं को पुनर्निर्देशित करने के लिए उपयोग की जाती है।
आप hook_user_login का उपयोग कर सकते हैं और इसे पुनर्निर्देशित करने का प्रयास कर सकते हैंyourpath
function yourmodule_user_login($account) {
// We want to redirect user on login.
$response = new RedirectResponse("yourpath");
$response->send();
return;
}
इसके अलावा, आप नियम मॉड्यूल का उपयोग कर सकते हैं , लेकिन Drupal 8 के लिए अभी तक स्थिर संस्करण नहीं है।
ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION
ऊपर से कुछ निश्चित परिस्थितियों में त्रुटियों - मैं जगह का सुझाव देते हैं return;
साथ exit;
, रीडायरेक्ट सुनिश्चित करने के लिए - जो सेट हेडर - आखिरी बात क्रियान्वित किया जा रहा है।
पार्टी में थोड़ी देर हो गई लेकिन https://www.drupal.org/node/2068293#comment-11712455 के अनुसार आप लॉग इन प्रोसेसिंग के अंत में अनुप्रेषित करने के लिए गंतव्य को hook_user_login () में सेट कर सकते हैं।
अर्थात
/**
* Implements hook_user_login().
*/
function mymodule_user_login(\Drupal\user\UserInterface $account) {
// Ignore password reset.
$route_name = \Drupal::routeMatch()->getRouteName();
if ($route_name !== 'user.reset.login') {
// Do not interfere if a destination was already set.
$current_request = \Drupal::service('request_stack')->getCurrentRequest();
if (!$current_request->query->get('destination')) {
// Default login destination to the dashboard.
$current_request->query->set(
'destination',
\Drupal\Core\Url::fromRoute('mymodule.dashboard')->toString()
);
}
}
}
FormState :: setRedirect () का उपयोग अन्य उत्तरों के अनुसार, संभवतः अधिकांश लोगों के उपयोग के मामलों को कवर करेगा और संभावित रूप से 'सही' उत्तर होगा, हालांकि हुक_सुअर_लगिन के साथ गंतव्य क्वेरी परम का उपयोग करने का मतलब है कि कोई भी फ़ॉर्म सबमिट करें * जो उपयोगकर्ता में लॉग इन रीडायरेक्ट करेगा लेकिन प्रपत्र / अनुरोध के किसी अन्य भाग के हस्तक्षेप या पूर्व ज्ञान के बिना।
यानी यह अभी भी एक कस्टम लॉगिन फॉर्म के साथ काम करेगा और गंतव्य का उपयोग करके किसी भी अन्य हुक को नहीं रोकता है (यह \Drupal\Core\EventSubscriber\RedirectResponseSubscriber
प्रतिक्रिया प्रसंस्करण के अंत में लागू किया जाता है)।
* कोई भी फॉर्म सबमिट करें जो हुक_सुर्ज़_लगइन (user_login_finalize ()) को इनवॉइस करता है और मैन्युअल रूप से FormState :: setResponse () को कॉल नहीं करता है ।
mymodule.dashboard
मार्ग का नाम है और किसी भी मार्ग का नाम (यानी साथ बदला जा सकता \Drupal\Core\Url::fromRoute('<front>')->toString()
या \Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 123])->toString()
)। अधिक जानकारी के लिए drupal.org/docs/8/api/rout-system/rout-system-overview और api.drupal.org/api/drupal/core%21lib%21Drupal/21Core%21Url.php/…
आप बस नियमों का उपयोग करके इसे कर सकते हैं
पर प्रतिक्रिया: उपयोगकर्ता के लॉग इन करने के बाद
आप उपयोगकर्ता लॉगिन फ़ॉर्म को भी बदल सकते हैं और अपने कस्टम सबमिट हैंडलर को जोड़ने के लिए $ form_state को पुनर्निर्देशित कर सकते हैं, बजाय हुक_user_login का उपयोग करते हुए अपने कस्टम URL पर सीधे उपयोगकर्ता को पुनर्निर्देशित करने के लिए ।
<?php
/**
* Implements hook_form_alter().
*/
function [MODULENAME]_form_alter(&$form, \Drupal\Core\Form\FormStateInterface\FormStateInterface $form_state, $form_id) {
switch ($form_id) {
// Alter login form and add own custom submit handler.
case 'user_login_form':
$form['#submit'][] = '_[MODULENAME]_user_login_form_submit';
break;
}
}
/**
* Custom submit handler for login form.
*/
function _[MODULENAME]_user_login_form_submit($form, FormStateInterface $form_state) {
// Set redirect to login form.
$form_state->setRedirect('YOUR.MENU-ROUTER.NAME');
}
इसे $ form_state रिडायरेक्ट में जोड़ने से यह सुनिश्चित हो जाएगा कि अन्य सबमिट हैंडलर / लॉगिन हुक कहलाते हैं।
Drupal7 की तरह हम $ form_state ['redirect'] को सीधे सेट नहीं कर सकते, क्योंकि $ form_state अब क्लास ऑब्जेक्ट है। आगे के विवरण के लिए चेकआउट फ़ॉर्म :: सेटRedirect () ।
D8 में, आप इस उद्देश्य के लिए उपयोगकर्ता डिफ़ॉल्ट पेज मॉड्यूल का उपयोग कर सकते हैं ।
यह मॉड्यूल आपको उस गंतव्य को कस्टमाइज़ करने की अनुमति देता है जिसे लॉग इन करने या लॉग आउट करने के बाद उपयोगकर्ता पुनर्निर्देशित होता है। आप भूमिकाओं या व्यक्तिगत उपयोगकर्ताओं द्वारा अनुकूलित कर सकते हैं।
ऐसा करने के लिए एक सरल मॉड्यूल है जो Drupal 8 के साथ संगत है। इसे उपयोगकर्ता डिफ़ॉल्ट पृष्ठ कहा जाता है ।
मॉड्यूल आपको उस गंतव्य को अनुकूलित करने की अनुमति देता है जो लॉग इन करने या लॉग आउट करने के बाद किसी उपयोगकर्ता को पुनर्निर्देशित किया जाता है। आप भूमिकाओं या व्यक्तिगत उपयोगकर्ताओं द्वारा अनुकूलित कर सकते हैं। और इस कार्रवाई के लिए कॉन्फ़िगर करने योग्य ड्रुपल संदेशों को अनुकूलित करें।
hook_user_login()
पुनर्निर्देशन के लिए काम नहीं करता है, इसका उपयोग तब किया जाता है जब आप उपयोगकर्ता के साथ कुछ करना चाहते हैं जब वह लॉग इन करता है। एफएक्स कोर उपयोगकर्ताओं को स्थानीय टाइमज़ोन सेट करने का सुझाव देता है यदि यह सेट नहीं है।
इसके बजाय आपको hook_form_alter
सभी लॉगिन फ़ॉर्म का उपयोग करना होगा और एक कस्टम सबमिट हैंडलर जोड़ना होगा जो फॉर्म स्टेट ऑब्जेक्ट पर रीडायरेक्ट सेट करता है।
मैं अपने स्वयं के नियंत्रक में लॉगिन फ़ॉर्म प्रदर्शित कर रहा हूं। इस तरह से गैर-OO हुक के बिना फ़ॉर्म में हेरफेर करना संभव है (और लॉगिन के बाद उपयोगकर्ता को पुनर्निर्देशित करें):
$fb = $this->formBuilder();
$rc['top'] = ['#markup' => '<p>Willkommen im Kundenbereich von proreos.
Bitte melden Sie sich hier mit Ihrem
Benutzernamen oder Ihrer Email Addresse an.</p>'];
$form = $fb->getForm("Drupal\user\Form\UserLoginForm");
$ug = $this->getUrlGenerator();
$redir = $ug->generateFromRoute('proreos.home', [],
['query' => $this->getDestinationArray(), 'external' => FALSE]);
$form['#action'] = $redir;
$rc['login'] = $form;
return $rc;
आपको जो भी गंतव्य की आवश्यकता है, उसके लिए 'proreos.home' मार्ग बदलें।
सादर
रेनर
बस destination
url लॉगिन करने के लिए पैरामीटर जोड़ें ।
उदाहरण:http://example.com/user/login?destination=/my-page
यदि आप इसे 403 (एक्सेस अस्वीकृत) पृष्ठों के लिए कर रहे हैं, तो निम्न मॉड्यूल का उपयोग करें :
https://www.drupal.org/project/redirect_403_to_login_page
मैं निम्नलिखित स्निपेट का काफी उपयोग करता हूं इसलिए मुझे लगा कि मैं इसे साझा करूंगा। आप उपयोगकर्ता द्वारा किस भूमिका के आधार पर अलग-अलग रीडायरेक्ट जोड़ सकते हैं।
use Symfony\Component\HttpFoundation\RedirectResponse;
/**
* Redirect on login.
*/
function MYMODULE_user_login($account) {
$roles = $account->getRoles();
if(in_array('webmaster', $roles)) {
$response = new RedirectResponse('/admin/content');
$response->send();
}
}
इनमें से किसी भी मॉड्यूल का उपयोग करें:
https://www.drupal.org/project/login_redirect
या
https://www.drupal.org/project/login_destination
चियर्स
आप पुनर्निर्देशन के लिए logintoboggan मॉड्यूल का उपयोग कर सकते हैं । यदि आपके पास उपयोगकर्ता नाम का उपयोग करते हुए लॉगिन की तरह अन्य कार्य करना चाहते हैं तो इसके अन्य कॉन्फ़िगरेशन हैं जो उपयोगी हो सकते हैं।
https://www.drupal.org/project/redirect
तो, उपरोक्त मॉड्यूल को पुनर्निर्देशित से कॉन्फ़िगर करें
/ उपयोगकर्ता / लॉगिन / उपयोगकर्ता / लॉगिन? गंतव्य = 'CUSTOM_NODE_PATH'
इस मुद्दे के लिए विशेष रूप से एक अन्य विकल्प एक सरल ड्रुपल 8 योगदान मॉड्यूल है: लॉगिन के बाद रीडायरेक्ट । मॉड्यूल यहां पाया जा सकता है:
https://www.drupal.org/project/redirect_after_login
जैसा कि विवरण दिखाता है, यह एक सरल, केंद्रित मॉड्यूल है जो ड्रुपल सुरक्षा सलाहकार नीति द्वारा कवर किया गया है।
/**
* hook_user_login Redirect to English language whenever admin login
**/
function modulename_user_login($account) {
// We want to redirect user on login.
$response = new Symfony\Component\HttpFoundation\RedirectResponse("/en/admin/config");
$response->send();
return;
}
मैं अन्य चीजों के आसपास जाने के लिए एक तरह से काम कर रहा था जो हुक_सुअर_लगिन पर निर्भर करते हैं क्योंकि कई अन्य विकल्प 8 के नए संस्करणों में टूट रहे हैं। कुछ अन्य री-डायरेक्ट मॉड्यूल बहुत सारे लेग-काम करते हैं जो या तो प्रासंगिक नहीं हैं और / या सिर्फ सही-सही hogging संसाधन। मैंने लॉगिन प्रक्रियाओं को संभालने के लिए इस सरल तर्क को एक कस्टम मॉड्यूल में एक साथ रखा:
function hook_user_login( UserInterface $account ) {
// Doing checks to see if the login is from an HTML origin or not.
// Could be from RESTful request to logins
$request = \Drupal::request();
if ($request->getRequestFormat() !== 'html') {
// default
return;
}
// Get the destination to see where the login request is going.
// This is useful to check for interactions from user creations.
$destination = $request->query->get('destination');
// Check the destination. If the destination will result in a re-direct
// to your homepage (here statically defined, but could be programmatic)
// then you can force re-direct to a different page. This is the URL defined
// in config > system > basic site settings.
if ($destination && $destination === '/whatever-homepage-uri-is') {
// Regular login, send to alternate welcome page
$response = new RedirectResponse('/welcome');
$response->send();
exit;
}
// default
return;
}
मैं Drupal 8.8.3 के साथ सफलतापूर्वक इसका उपयोग कर रहा हूं और यह मेरे द्वारा बनाए गए किसी अन्य मॉड्यूल से मेरे REST लॉगिन अनुरोधों को नहीं तोड़ता है, नए खाते की रचनाओं के लिए सही-सही निर्देश देता है, और फिर नियमित साइट लॉगिन पर एक अलग पृष्ठ पर फिर से निर्देश देता है।
$form_state->setRedirect('mymodule.dashboard);