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'));
}
}
$form_state->setRedirect('mymodule.dashboard);
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 menghentikanhook_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.
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.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.
sumber
Anda dapat menggunakan hook_user_login dan mencoba mengalihkan ke
yourpath
Anda juga dapat menggunakan modul Aturan , tetapi belum ada versi stabil untuk Drupal 8.
sumber
ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION
kesalahan dalam keadaan tertentu dengan di atas - saya sarankan menggantireturn;
denganexit;
, 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
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 () .
sumber
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
sumber
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 .
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.
sumber
Di D8, Anda dapat menggunakan modul halaman default pengguna untuk tujuan ini.
sumber
Ada modul sederhana untuk melakukan ini yang kompatibel dengan Drupal 8. Ini disebut User Default Page .
sumber
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.sumber
Saya menampilkan formulir login di controller saya sendiri. Dengan cara itu dimungkinkan untuk memanipulasi formulir (dan mengarahkan pengguna setelah masuk) tanpa kait non-OO:
Ubah rute 'proreos.home' ke tujuan apa pun yang Anda butuhkan.
Salam
Rainer
sumber
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
sumber
Saya menggunakan cuplikan berikut cukup banyak sehingga saya pikir saya akan membagikannya. Anda dapat menambahkan arahan yang berbeda tergantung pada peran yang dimiliki pengguna.
sumber
Gunakan salah satu dari modul ini:
https://www.drupal.org/project/login_redirect
ATAU
https://www.drupal.org/project/login_destination
Bersulang
sumber
Anda dapat menggunakan modul logintoboggan untuk pengalihan. Ini memiliki konfigurasi lain yang mungkin berguna jika Anda ingin functionlaities lain seperti login menggunakan nama pengguna.
sumber
https://www.drupal.org/project/redirect
Jadi, konfigurasikan modul di atas untuk mengalihkan dari
/ user / login ke / user / login? destination = 'CUSTOM_NODE_PATH'
sumber
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.
sumber
sumber