উত্তর:
আপনাকে লগইন ফর্মটি পরিবর্তন করতে হবে এবং একটি জমা হ্যান্ডলার যুক্ত করতে হবে যা পুনঃনির্দেশের যত্ন নেবে। আপনি $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
এখানে কি হচ্ছে ? একটি বিদ্যমান পুনঃনির্দেশ বজায় রাখা?
ব্যবহারকারীরা একটি ড্রুপাল 8 সাইটে লগইন করার পরে পুনর্নির্দেশ করা ড্রুপাল 7-তে কীভাবে করা হয়েছিল তার থেকে আলাদা নয়, কোডটি ড্রুপাল 8 এর জন্য অভিযোজিত করা দরকার বাদে।
নির্দিষ্টভাবে:
hook_user_login()
ব্যবহারকারীরা লগইন করার পরে পুনর্নির্দেশের জন্য ব্যবহৃত হয় না, কেবল এই জন্য যে এই হুকের ব্যবহারকারীদের পুনর্নির্দেশ করা অন্য hook_user_login()
বাস্তবায়নগুলি আহ্বান করা থেকে বিরত রাখবে ।ব্যবহারকারীদের পুনর্নির্দেশের সঠিক উপায়টি লগইন ফর্মটিতে একটি ফর্ম জমা হ্যান্ডলার যুক্ত করছে যা নিম্নলিখিতটির মতো কোড ব্যবহার করে।
$form_state->setRedirect('user.page');
লক্ষ্য করুন যে ব্যবহারকারীর পাতাই সেই ড্রুপাল পাথের রাউটিং নাম যেখানে আপনি ব্যবহারকারীকে পুনঃনির্দেশিত করতে চান।
আপনার যদি 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;
}
এছাড়াও আপনি বিধি মডিউলটি ব্যবহার করতে পারেন তবে ড্রুপাল 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()
);
}
}
}
অন্যান্য উত্তর অনুসারে ফর্মস্টেট :: সেটরেডাইরেক্ট () ব্যবহার করা সম্ভবত বেশিরভাগ লোকের ব্যবহারের ক্ষেত্রে আবশ্যক এবং সম্ভবত 'ডান' উত্তর, তবে হুক_উজার_লগিন সহ গন্তব্য ক্যোয়ারী প্যারাম ব্যবহার করার অর্থ যে কোনও ফর্ম জমা দেওয়া * যা ব্যবহারকারীর লগগুলিতে পুনঃনির্দেশিত হবে তবে ফর্ম / অনুরোধের অন্য কোনও অংশের হস্তক্ষেপ বা পূর্ব জ্ঞান ছাড়াই
যেমন এটি এখনও একটি কাস্টম লগইন ফর্মের সাথে কাজ করবে এবং গন্তব্য ব্যবহার করা অন্য কোনও হুক থামায় না (এটি \Drupal\Core\EventSubscriber\RedirectResponseSubscriber
প্রতিক্রিয়া প্রক্রিয়া শেষে শেষ করা হয়)।
* যে কোনও ফর্ম জমা দেয় যা হুক_উজার_লগিন (ইউজার_লগিন_ফাইনালাইজ ()) কে আহ্বান করে এবং ম্যানুয়ালি ফর্মস্টেট :: সেটরেস্পোনস () কল করে না ।
mymodule.dashboard
হ'ল রুটের নাম এবং যেকোন রুটের নাম (যেমন \Drupal\Core\Url::fromRoute('<front>')->toString()
বা \Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 123])->toString()
) দিয়ে প্রতিস্থাপন করা যেতে পারে । আরো তথ্য দেখুন জন্য drupal.org/docs/8/api/routing-system/routing-system-overview এবং api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/...
আপনি এটি নিয়মাবলী ব্যবহার করে সহজেই করতে পারেন
প্রতিক্রিয়া এতে: ব্যবহারকারী লগ ইন করার পরে
আপনি ব্যবহারকারীর লগইন ফর্মটিও পরিবর্তন করতে পারেন এবং hook_user_login ব্যবহার করে সরাসরি আপনার কাস্টম URL এ ব্যবহারকারীকে সরাসরি পুনর্নির্দেশের পরিবর্তে own form_state পুনঃনির্দেশ সেট করতে আপনার নিজস্ব কাস্টম জমা হ্যান্ডলার যুক্ত করতে পারেন ।
<?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');
}
এটিকে $ ফর্ম_স্টেটের পুনঃনির্দেশে যুক্ত করা নিশ্চিত করবে যে অন্য জমা দেওয়া হ্যান্ডলার / লগইন হুকগুলি কল পেয়েছে।
ড্রুপাল Like এর মতো আমরা সরাসরি $ form_state ['redirect'] সেট করতে পারি না, কারণ $ form_state এখন শ্রেণি অবজেক্ট। ফর্মস্টেট চেকআউট :: আরও তথ্যের জন্য setRedirect () ।
ডি 8-তে, আপনি এই উদ্দেশ্যে ব্যবহারকারীর ডিফল্ট পৃষ্ঠা মডিউলটি ব্যবহার করতে পারেন ।
এই মডিউলটি আপনাকে গন্তব্যটি কাস্টমাইজ করতে দেয় যেখানে একজন ব্যবহারকারী লগ ইন বা লগ আউট করার পরে পুনঃনির্দেশিত হয়। আপনি ভূমিকা বা স্বতন্ত্র ব্যবহারকারীদের দ্বারা কাস্টমাইজ করতে পারেন।
এটি করার জন্য একটি সাধারণ মডিউল রয়েছে যা ড্রুপাল ৮ এর সাথে সামঞ্জস্যপূর্ণ It এটি ইউজার ডিফল্ট পৃষ্ঠা বলে ।
মডিউল আপনাকে গন্তব্যটি কাস্টমাইজ করতে দেয় যেখানে একজন ব্যবহারকারী লগ ইন বা লগ আউট করার পরে পুনরায় নির্দেশিত হয়। আপনি ভূমিকা বা স্বতন্ত্র ব্যবহারকারীদের দ্বারা কাস্টমাইজ করতে পারেন। এবং এই ক্রিয়াগুলির জন্য কনফিগারযোগ্য ড্রুপাল বার্তাগুলি কাস্টমাইজ করুন।
hook_user_login()
পুনঃনির্দেশের জন্য কাজ করে না, ব্যবহারকারী লগ ইন করার সময় আপনি কিছু করতে চাইলে এটি ব্যবহার করা হয় F
পরিবর্তে আপনাকে hook_form_alter
সমস্ত লগইন ফর্মগুলিতে ব্যবহার করতে হবে এবং একটি কাস্টম জমা হ্যান্ডলার যুক্ত করতে হবে যা ফর্মের স্টেট অবজেক্টে পুনঃনির্দেশ সেট করে।
আমি আমার নিজস্ব নিয়ামকটিতে লগইন ফর্মটি প্রদর্শন করছি। এইভাবে ফর্মটি পরিচালনা করা সম্ভব (এবং লগইন করার পরে ব্যবহারকারীকে পুনর্নির্দেশ করা) অ-ওও হুক ব্যতীত:
$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
ইউআরএল লগইন করার জন্য কেবল পরামিতি যুক্ত করুন ।
উদাহরণ: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
চিয়ার্স
পুনঃনির্দেশের জন্য আপনি লগইনটোবোগান মডিউল ব্যবহার করতে পারেন । এটির অন্যান্য কনফিগারেশন রয়েছে যা আপনি ব্যবহারকারীর নাম ব্যবহার করে লগইনের মতো অন্যান্য কার্যাদি চাইলে দরকারী হতে পারে।
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 এর নতুন সংস্করণে অন্যান্য অনেকগুলি বিকল্প ভেঙে যাচ্ছে কিছু অন্যান্য পুনঃ-প্রত্যক্ষ মডিউলগুলি অনেক বেশি লেগ-কাজ করে যা এখন আর প্রাসঙ্গিক নয় এবং / বা ঠিক ডান হগিংয়ের সংস্থানগুলি। আমি লগইন প্রক্রিয়াগুলি পরিচালনা করার জন্য কাস্টম মডিউলে এই সাধারণ যুক্তিকে একসাথে রেখেছি:
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;
}
আমি এটি সফলভাবে ড্রুপাল ৮.৮.৩ এর সাথে ব্যবহার করছি এবং এটি আমার নির্মিত অন্য একটি মডিউল থেকে আমার আরএসটি লগইন অনুরোধগুলি ভঙ্গ করে না, নতুন অ্যাকাউন্ট তৈরির জন্য সঠিকভাবে পুনঃনির্দেশ দেয় এবং তারপরে একটি নিয়মিত সাইট লগইনে অন্য পৃষ্ঠায় পুনঃনির্দেশ দেয়।
$form_state->setRedirect('mymodule.dashboard);