Modificarea filei implicite afișate pentru o pagină nu este modalitatea de redirecționare a utilizatorilor după ce se conectează.De asemenea, funcționează numai atunci când utilizatorii sunt redirecționați către pagina lor de profil de utilizator după ce se conectează. Dacă sunt redirecționați către o altă pagină, modificarea filei implicite pentru pagina /user/%user nu va realiza ceea ce încercați să realizați.
Pentru a redirecționa utilizatorii după ce și-au introdus datele de conectare în formularul de conectare (ori de câte ori este afișat pe pagina de conectare sau în blocul de conectare) este:
- Adăugați un handler de trimitere a formularului la formularul de conectare
- În acel handler de trimitere, redirecționați utilizatorii către adresa URL dorită
funcția mymodule_form_user_login_alter(&$form, &$form_state) {
$form['#submit'][] = 'mymodule_user_login_submit';
}
funcția mymodule_user_login_submit($form, &$form_state) {
dacă (!empty($form_state['uid'])) {
// Utilizatorul a fost conectat cu succes.
// $form_state['uid'] este setat de user_login_authenticate_validate() când datele de conectare sunt corecte.
$form_state['redirect'] = "utilizator/{$form_state['uid']}/tablou de bord";
}
}
De cand hook_user_login()
implementările sunt invocate de la user_login_finalize()
, acestea nu sunt invocate numai după ce utilizatorii se conectează din interfața cu utilizatorul; de exemplu, acestea sunt invocate după ce un utilizator a urmat linkul pentru a-și reseta parola, ceea ce face ca Drupal să ruleze user_pass_reset()
, funcția care conține următorul cod.
if ($action == 'login') {
$utilizator = $cont;
user_login_finalize();
flood_clear_event('pass_reset_user', $account->uid);
watchdog('utilizator', 'Utilizatorul %name a folosit un link de conectare unic la ora %timestamp.', array(
'%name' => $cont->nume,
'%timestamp' => $timestamp,
));
drupal_set_message(t('Tocmai ați folosit linkul de conectare unică. Nu mai este necesar să utilizați acest link pentru a vă autentifica. Vă rugăm să vă schimbați parola.'));
$token = drupal_random_key();
$_SESSION['pass_reset_' . $user->uid] = $token;
drupal_goto('user/' . $user->uid . '/edit', array(
'query' => matrice(
'pass-reset-token' => $token,
),
));
Apel drupal_goto()
interior hook_user_login()
interferează cu acestea și cu alte cazuri și nu permite Drupal să invoce toate hook_user_login()
implementari.
A hook_user_login()
implementarea ar putea stabili $edit['redirect']
pentru a redirecționa utilizatorii.
funcția mymodule_user_login(&$editare, $cont) {
dacă (este_matrice($editare)) {
$edit['redirect'] = „utilizator/{$account->uid}/tablou de bord”;
}
}
drupal_goto()
, sunat de la drupal_process_form()
(prin intermediul drupal_redirect_form()
) când un formular este trimis fără erori, folosește valoarea lui $_GET['destinație']
când valoarea sa nu este o adresă URL externă. Pentru a fi siguri că utilizatorii sunt redirecționați către calea dorită, implementarea ar putea fi similară cu următoarea.
funcția mymodule_user_login(&$editare, $cont) {
if (strpos(cure_cale(), 'utilizator/resetare/') !== 0) {
// Evitați redirecționarea utilizatorilor care își resetează parola.
$_GET['destination'] = "utilizator/{$account->uid}/tablou de bord";
}
}
Codul ar trebui să verifice, de asemenea, că nu redirecționează utilizatorii în cazurile în care nu ar trebui și să verifice că nu cauzează probleme cu alte module instalate, de exemplu Autentificare cu doi factori (TFA) modul. Din acest motiv, aș evita setarea $_GET['destinație']
și folosiți una dintre celelalte soluții pe care le-am descris în acest răspuns.
Cât despre https://example.com/users/myusername1 care apare ca URL, adică folosește un alias de cale. Module care implementează hook_meniu()
nu trebuie să vă faceți griji cu privire la alias-urile căii, deoarece Drupal folosește alias-ul căii pentru a găsi pagina de afișat și apelează înapoi pagina asociată paginii respective.
Dacă atunci trebuie să schimbați fila implicită afișată pe user/%user, din diferite motive, aș folosi un cod similar cu următorul.
funcția mymodule_menu_alter(&$articole) {
if (isset($items['utilizator/%utilizator'])) {
$items['user/%user/view'] = matrice(
'title' => 'Vizualizare',
'type' => MENU_LOCAL_TASK,
„greutate” => -10,
'page callback' => 'user_view_page',
'argumente de pagină' => matrice (1),
'access callback' => 'user_view_access',
'access arguments' => matrice (1),
);
$items['utilizator/%utilizator'] = matrice(
'title' => 'Contul meu',
'title callback' => 'user_page_title',
'title arguments' => matrice (1),
'page callback' => 'mymodule_dashboard',
'argumente de pagină' => matrice (1),
'access callback' => 'user_view_access',
'access arguments' => matrice (1),
'menu_name' => 'navigație',
);
$items['user/%user/dashboard'] = matrice(
'title' => 'Tabloul meu de bord',
'type' => MENU_DEFAULT_LOCAL_TASK,
„greutate” => -20,
);
}
}
Motivul pentru care $items['user/%user/dashboard']
conține puține articole este că a MENU_DEFAULT_LOCAL_TASK
elementul de meniu moștenește apel invers de pagină, argumente de pagină, apel invers de acces și argumente de acces din elementul său de meniu părinte, în acest caz $items['utilizator/%utilizator']
.
Acest lucru este descris în hook_meniu()
documentația și este, de asemenea, motivul pentru care următoarele elemente de meniu, preluate din codul de bază Drupal, sunt definite în acest fel.
$items['nod/%node'] = matrice(
'title callback' => 'node_page_title',
'title arguments' => matrice (1),
'page callback' => 'node_page_view',
'argumente de pagină' => matrice (1),
'access callback' => 'node_access',
'access arguments' => array('view', 1),
);
$items['node/%node/view'] = matrice(
'title' => 'Vizualizare',
'type' => MENU_DEFAULT_LOCAL_TASK,
„greutate” => -10,
);
$items['admin/config/search/path'] = matrice(
'title' => 'alias-uri URL',
'description' => "Schimbați căile URL ale site-ului dvs. prin alias.",
'page callback' => 'path_admin_overview',
'access arguments' => array('administrare aliasuri URL'),
„greutate” => -5,
'file' => 'path.admin.inc',
);
$items['admin/config/search/path/list'] = matrice(
'title' => 'Lista',
'type' => MENU_DEFAULT_LOCAL_TASK,
„greutate” => -10,
);
$items['admin'] = matrice(
'title' => 'Administrare',
'access arguments' => array('accesează paginile de administrare'),
'page callback' => 'system_admin_menu_block_page',
„greutate” => 9,
'menu_name' => 'management',
„fișier” => „system.admin.inc”,
);
$items['admin/tasks'] = matrice(
'title' => 'Sarcini',
'type' => MENU_DEFAULT_LOCAL_TASK,
„greutate” => -20,
);