Yanıtlar:
Oturum açma formunu değiştirmeniz ve yeniden yönlendirmeyle ilgilenecek bir gönderme işleyicisi eklemeniz gerekir. $form_state->setRedirectUrl()
Üzerine yazılacağı için doğrudan form değiştirmede kullanamazsınız 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
Burada neler olduğunu anlamıyorum ? Mevcut bir yönlendirmeyi korumak mı istiyorsunuz?
Drupal 8 sitesinde oturum açtıktan sonra kullanıcıları yeniden yönlendirmek, kodun Drupal 8 için uyarlanması gerekmediği sürece Drupal 7'de yapıldığından farklı değildir.
Özellikle:
hook_user_login()
kullanıcıları giriş yaptıktan sonra yeniden yönlendirmek için kullanılmaz; yalnızca o kancadaki kullanıcıları yeniden yönlendirmek diğer hook_user_login()
uygulamaların çağrılmasını engelleyecektir .Kullanıcıları yeniden yönlendirmenin doğru yolu, giriş formuna aşağıdakine benzer kod kullanan bir form gönderme işleyicisi eklemektir.
$form_state->setRedirect('user.page');
User.page'in , kullanıcının yeniden yönlendirilmesini istediğiniz Drupal yolunun yönlendirme adı olduğuna dikkat edin . Sınıfın
bir örneğine Drupal\Core\Url
sahipseniz, aşağıdaki kodu da kullanabilirsiniz.
$form_state->setRedirectUrl($url);
Kullanıcıları giriş yaptıkları sitedeki bir sayfaya yönlendirirken ilk yöntemin tercih edildiğini unutmayın; ikinci yöntem normalde harici bir URL kullanarak kullanıcıları yönlendirmek için kullanılır.
hook_user_login adresini kullanabilir ve adresine yönlendirmeyi deneyebilirsinizyourpath
function yourmodule_user_login($account) {
// We want to redirect user on login.
$response = new RedirectResponse("yourpath");
$response->send();
return;
}
Ayrıca Rules modülünü kullanabilirsiniz , ancak Drupal 8 için henüz kararlı bir sürüm yoktur.
ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION
yukarıdaki ile bazı durumlarda hatalar - Ben değiştirmenizi öneririz return;
ile exit;
setleri başlıkları - - yönlendirme sağlamak için, yürütülecek en son şeydir.
Partiye biraz geç ama https://www.drupal.org/node/2068293#comment-11712455 uyarınca, giriş işleminin sonunda yönlendirmek için hook_user_login () içindeki hedefi ayarlayabilirsiniz.
yani
/**
* 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 () yöntemini diğer yanıtlara göre kullanmak, büyük olasılıkla çoğu kullanıcının kullanım örneklerini kapsayacaktır ve potansiyel olarak 'doğru' yanıttır, ancak hook_user_login ile hedef sorgu parametresini kullanmak , kullanıcı günlüklerinde herhangi bir form gönderme * 'nin yeniden yönlendireceği anlamına gelir. formun / talebin başka herhangi bir kısmının müdahalesi veya önceden bilgisi olmadan.
yani yine de özel bir giriş formu ile çalışacak ve hedefin kullanılması diğer kancaları durdurmaz\Drupal\Core\EventSubscriber\RedirectResponseSubscriber
(yanıt işlemenin sonunda tarafından uygulanır ).
* Hook_user_login'i (user_login_finalize ()) çağıran ve FormState :: setResponse () öğesini elle çağırmayan herhangi bir form gönderimi .
mymodule.dashboard
, rota adıdır ve herhangi bir rota adıyla (yani \Drupal\Core\Url::fromRoute('<front>')->toString()
veya \Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 123])->toString()
) değiştirilebilir. Daha fazla bilgi için bkz drupal.org/docs/8/api/routing-system/routing-system-overview ve api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/...
Bunu Kurallar'ı kullanarak kolayca yapabilirsiniz
Tepki açık: Kullanıcı giriş yaptıktan sonra
Ayrıca, hook_user_login kullanarak kullanıcıyı doğrudan özel URL'nize yönlendirmek yerine, kullanıcı giriş formunu değiştirebilir ve $ form_state yönlendirmesini ayarlamak için kendi özel gönderme işleyicinizi ekleyebilirsiniz .
<?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 redirect içine eklediğinizde, diğer gönderme işleyicileri / giriş kancaları çağrılır.
Drupal7 gibi, $ form_state ['redirect'] 'i doğrudan ayarlayamayız, çünkü $ form_state artık sınıf nesnesidir. Ödeme FormState :: setRedirect () Daha fazla detay için.
D8'de, bu amaç için kullanıcı varsayılan sayfa modülünü kullanabilirsiniz .
Bu modül, oturum açtıktan veya oturumu kapattıktan sonra kullanıcının yönlendirildiği hedefi özelleştirmenizi sağlar. Rollere veya tek tek kullanıcılara göre özelleştirebilirsiniz.
Bunu yapmak için Drupal 8 ile uyumlu basit bir modül vardır. Buna Varsayılan Kullanıcı Sayfası denir .
Modül, oturum açtıktan veya oturumu kapattıktan sonra kullanıcının yönlendirildiği hedefi özelleştirmenizi sağlar. Rollere veya tek tek kullanıcılara göre özelleştirebilirsiniz. Ve bu eylemler için yapılandırılabilir drupal mesajlarını özelleştirin.
hook_user_login()
yeniden yönlendirme için çalışmazsa, oturum açtığında kullanıcıyla bir şeyler yapmak istiyorsanız kullanılır. Fx core, kullanıcılara ayarlanmamışsa yerel saat dilimini ayarlamalarını önerir.
Bunun yerine hook_form_alter
, tüm giriş formlarında kullanmanız ve form durumu nesnesine yönlendirmeyi ayarlayan özel bir gönderme işleyicisi eklemeniz gerekir.
Giriş formunu kendi denetleyicimde görüntülüyorum. Bu şekilde, OO olmayan kancalar olmadan formu değiştirmek (ve kullanıcıyı oturum açtıktan sonra yönlendirmek) mümkündür:
$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' yolunu ihtiyacınız olan hedefe değiştirin.
Saygılarımızla
Rainer
destination
Giriş URL'sine parametre ekleyin .
Misal:http://example.com/user/login?destination=/my-page
403 (Erişim Reddedildi) sayfaları için yapıyorsanız şu modülü kullanın:
https://www.drupal.org/project/redirect_403_to_login_page
Aşağıdaki snippet'i çok kullanıyorum, bu yüzden paylaşacağımı düşündüm. Kullanıcının rolüne bağlı olarak farklı yönlendirmeler ekleyebilirsiniz.
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();
}
}
Bu modüllerden herhangi birini kullanın:
https://www.drupal.org/project/login_redirect
VEYA
https://www.drupal.org/project/login_destination
Şerefe
Yeniden yönlendirme için logintoboggan modülünü kullanabilirsiniz . Kullanıcı adlarını kullanarak oturum açma gibi diğer işlevler için yararlı olabilecek başka yapılandırmalara sahiptir.
https://www.drupal.org/project/redirect
Bu nedenle, yukarıdaki modülü
/ user / login / user / login? destination = 'CUSTOM_NODE_PATH'
Bu sorun için özellikle başka bir seçenek de basit bir Drupal 8 katkıda bulunan modül: Girişten Sonra Yeniden Yönlendir . Modül burada bulunabilir:
https://www.drupal.org/project/redirect_after_login
Açıklamanın gösterdiği gibi, Drupal güvenlik danışma politikası kapsamında basit, odaklanmış bir modüldür.
/**
* 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;
}
Diğer birçok seçenek 8 yeni sürümlerinde kırılıyor çünkü hook_user_login bağımlı diğer şeyler etrafında almak için bir yol üzerinde çalışıyordu. / ya da sadece dışarıda asılı durma kaynakları. Bu basit mantığı, oturum açma işlemlerini işlemek için özel bir modüle koydum:
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;
}
Bunu Drupal 8.8.3 ile başarıyla kullanıyorum ve REST giriş taleplerimi oluşturduğum başka bir modülden kırmıyor, yeni hesap kreasyonları için doğru bir şekilde yönlendiriyor ve daha sonra normal bir site girişinde farklı bir sayfaya yönlendiriyor.
$form_state->setRedirect('mymodule.dashboard);