Jawaban:
Anda perlu mengubah formulir login dan menambahkan handler kirim yang akan menangani pengalihan. Anda tidak dapat menggunakan $form_state->setRedirectUrl()
secara langsung dalam formulir alter, karena itu akan ditimpa oleh 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
sini? Mempertahankan pengalihan yang ada?
Mengarahkan pengguna setelah mereka masuk di situs Drupal 8 tidak berbeda dari yang dilakukan di Drupal 7, kecuali kode perlu disesuaikan untuk Drupal 8.
Khususnya:
hook_user_login()
tidak digunakan untuk mengarahkan pengguna setelah mereka masuk, hanya karena fakta bahwa mengarahkan pengguna di kail itu akan menghentikan hook_user_login()
implementasi lain dari dipanggil.Cara yang benar untuk mengarahkan ulang pengguna adalah menambahkan penangan pengiriman formulir ke formulir login yang menggunakan kode yang mirip dengan yang berikut ini.
$form_state->setRedirect('user.page');
Perhatikan bahwa user.page adalah nama perutean untuk jalur Drupal tempat Anda ingin pengguna diarahkan.
Jika Anda memiliki instance Drupal\Core\Url
kelas, Anda juga bisa menggunakan kode berikut.
$form_state->setRedirectUrl($url);
Perlu diingat bahwa metode pertama lebih disukai ketika Anda mengarahkan pengguna ke halaman di situs yang sama dengan yang mereka masuki; metode kedua biasanya digunakan untuk mengarahkan ulang pengguna menggunakan URL eksternal.
Anda dapat menggunakan hook_user_login dan mencoba mengalihkan keyourpath
function yourmodule_user_login($account) {
// We want to redirect user on login.
$response = new RedirectResponse("yourpath");
$response->send();
return;
}
Anda juga dapat menggunakan modul Aturan , tetapi belum ada versi stabil untuk Drupal 8.
ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION
kesalahan dalam keadaan tertentu dengan di atas - saya sarankan mengganti return;
dengan exit;
, untuk memastikan redirect - yang set header - adalah hal terakhir yang akan dieksekusi.
Agak terlambat ke pesta tetapi sesuai https://www.drupal.org/node/2068293#comment-11712455 Anda dapat mengatur tujuan di hook_user_login () untuk mengarahkan ulang di akhir pemrosesan login.
yaitu
/**
* 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()
);
}
}
}
Menggunakan FormState :: setRedirect () sesuai dengan jawaban lain mungkin akan mencakup sebagian besar kasus penggunaan orang dan berpotensi jawaban 'benar', namun menggunakan param kueri tujuan dengan hook_user_login berarti bahwa setiap bentuk pengiriman * yang dicatat oleh pengguna akan diarahkan tetapi tanpa gangguan atau pengetahuan sebelumnya tentang bagian lain dari formulir / permintaan.
yaitu masih akan bekerja dengan formulir login khusus dan menggunakan tujuan tidak menghentikan kait lain (ini diterapkan \Drupal\Core\EventSubscriber\RedirectResponseSubscriber
pada akhir pemrosesan respons).
* Setiap formulir kirim yang memanggil hook_user_login (user_login_finalize ()) dan tidak secara manual memanggil FormState :: setResponse () .
mymodule.dashboard
adalah nama rute dan dapat diganti dengan nama rute apa pun (yaitu \Drupal\Core\Url::fromRoute('<front>')->toString()
atau \Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 123])->toString()
). Untuk informasi lebih lanjut, lihat drupal.org/docs/8/api/routing-system/routing-system-overview dan api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/…
Anda cukup melakukannya dengan menggunakan Aturan
Bereaksi pada: Setelah pengguna masuk
Anda juga dapat mengubah formulir login pengguna dan menambahkan handler ajukan kustom Anda sendiri untuk menetapkan $ form_state redirect, alih-alih secara langsung mengarahkan pengguna ke URL khusus Anda menggunakan hook_user_login .
<?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');
}
Menambahkannya di $ form_state redirect akan memastikan bahwa pengirim lain / kait login dipanggil.
Seperti Drupal7, kami tidak dapat menetapkan $ form_state ['redirect'] secara langsung, karena $ form_state sekarang adalah objek kelas. Checkout FormState :: setRedirect () untuk detail lebih lanjut.
Di D8, Anda dapat menggunakan modul halaman default pengguna untuk tujuan ini.
Modul ini memungkinkan Anda untuk menyesuaikan tujuan yang diarahkan pengguna setelah masuk atau keluar. Anda dapat menyesuaikan berdasarkan peran atau pengguna individu.
Ada modul sederhana untuk melakukan ini yang kompatibel dengan Drupal 8. Ini disebut User Default Page .
Modul ini memungkinkan Anda untuk menyesuaikan tujuan yang diarahkan pengguna setelah masuk atau keluar. Anda dapat menyesuaikan berdasarkan peran atau pengguna individu. Dan sesuaikan pesan drupal yang dapat dikonfigurasi untuk tindakan ini.
hook_user_login()
tidak berfungsi untuk pengalihan, ini digunakan jika Anda ingin melakukan sesuatu dengan pengguna saat dia masuk. Fx core menyarankan pengguna untuk mengatur zona waktu lokal jika tidak diatur.
Alih-alih, Anda perlu menggunakan hook_form_alter
semua formulir masuk dan menambahkan penangan kirim kustom yang menetapkan pengalihan pada objek status formulir.
Saya menampilkan formulir login di controller saya sendiri. Dengan cara itu dimungkinkan untuk memanipulasi formulir (dan mengarahkan pengguna setelah masuk) tanpa kait non-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;
Ubah rute 'proreos.home' ke tujuan apa pun yang Anda butuhkan.
Salam
Rainer
Cukup tambahkan destination
parameter ke url login.
Contoh:http://example.com/user/login?destination=/my-page
Jika Anda melakukannya untuk 403 (Akses Ditolak) halaman menggunakan modul berikut:
https://www.drupal.org/project/redirect_403_to_login_page
Saya menggunakan cuplikan berikut cukup banyak sehingga saya pikir saya akan membagikannya. Anda dapat menambahkan arahan yang berbeda tergantung pada peran yang dimiliki pengguna.
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();
}
}
Gunakan salah satu dari modul ini:
https://www.drupal.org/project/login_redirect
ATAU
https://www.drupal.org/project/login_destination
Bersulang
Anda dapat menggunakan modul logintoboggan untuk pengalihan. Ini memiliki konfigurasi lain yang mungkin berguna jika Anda ingin functionlaities lain seperti login menggunakan nama pengguna.
https://www.drupal.org/project/redirect
Jadi, konfigurasikan modul di atas untuk mengalihkan dari
/ user / login ke / user / login? destination = 'CUSTOM_NODE_PATH'
Opsi lain yang khusus untuk masalah ini adalah modul sederhana kontribusi Drupal 8: Pengalihan Setelah Masuk . Modul ini dapat ditemukan di sini:
https://www.drupal.org/project/redirect_after_login
Seperti yang diperlihatkan oleh deskripsi, ini adalah modul sederhana, terfokus yang dicakup oleh kebijakan penasihat keamanan Drupal.
/**
* 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;
}
$form_state->setRedirect('mymodule.dashboard);