Puncte:0

Schimbați fila utilizator implicită

drapel it
MMT

După autentificare, utilizatorii vor fi redirecționați către pagina de profil de utilizator. Am adăugat o filă nouă, Panoul meu de control folosind hook_meniu(). Totul functioneaza bine.

După ce utilizatorii se conectează, aș dori să fie redirecționați către Panoul meu de control, dar nu o pot face să funcționeze.

Am încercat în două moduri, care ambele au aceeași problemă.

Mai întâi am încercat cu acest cod.

funcția mymodule_menu() {
  $items['user/%user/dashboard'] = matrice(
    'title' => t('Tabloul meu de bord'),
    'page callback' => 'mymodule_dashboard',
    'argumente de pagină' => matrice (1),
    „acces apel invers” => TRUE,
    'type' => MENU_DEFAULT_LOCAL_TASK,
    „greutate” => -20, 
  );
  
  returnează $articole;
}

function mymenu_menu_alter(&$articole) {
  $items['user/%user/view'] = matrice(
    'type' => MENU_LOCAL_TASK,
  );
  
  returnează $articole;
}

Apoi, am încercat cu următorul cod.

funcția mymodule_menu_alter(&$articole) {
  $items['user/%user/dashboard'] = matrice(
    'title' => t('Tabloul meu de bord'),
    'page callback' => 'mymodule_dashboard',
    'argumente de pagină' => matrice (1),
    „acces apel invers” => TRUE,
    'type' => MENU_DEFAULT_LOCAL_TASK,
    „greutate” => -20, 
  );

  $items['user/%user/view'] = matrice(
    'type' => MENU_LOCAL_TASK,
  );
  
  returnează $articole;
}

Am șters și cache-ul.

Problema este că, după autentificare, Vedere fila dispare ca filă, „Tabloul meu de bord” este fila activă, dar are conținutul precedentului Vedere fila.

captură de ecran

URL-ul după conectare este https://example.com/users/myusername1, care nu este adresa URL a tabloului de bord. Când dau clic între file, Panoul meu de control păstrează această adresă URL greșită și afișează conținutul filei *Vizualizare.

Am încercat câteva variante între hook_meniu() și hook_menu_alter(), dar nu o pot face să funcționeze.

Cum pot avea Panoul meu de control și propriul conținut afișat ca filă implicită după conectare?

apaderno avatar
drapel us
`hook_menu_alter()` nu trebuie să returneze nicio valoare.Nu acesta este motivul pentru care codul nu funcționează, totuși.
drapel it
MMT
Mulțumesc apaderno, Fără să mă prefac că sunt un expert, ceea ce citesc aici este că hook_menu_alter are de fapt un parametru https://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/ hook_menu_alter/7.x Oricum, acesta este un detaliu lateral, deoarece chiar și cu sau fără problema este încă acolo. Orice alte idei ar fi binevenite
Puncte:0
drapel us

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,
  );
Puncte:0
drapel de

Ai nevoie de o combinație de hook_user_login() (numit după ce utilizatorul se autentifică) și drupal_goto() (redirecționează utilizatorul). Nu am mai lucrat cu D7 de câțiva ani, dar eliminând memoria ar trebui să puteți face ceva de genul acesta:

funcția hook_user_login(&$editare, $cont) {
  drupal_goto('user/' . $account['id'] . '/dashboard');
  drupal_exit();
}
drapel it
MMT
Mulțumesc Jaypan. Am incercat dar nu rezolva problema. Problema este că, după ce mă autent, adresa URL nu este .../dashboard, ci este site.com/users/username8169 . Odată ce introduc manual adresa URL corectă site.com/user/8169, atunci funcționează bine. Dar cum să faci utilizatorul după autentificare să ajungă la pagina .../tabloul de bord? De asemenea, este ciudat că fila Vizualizare a dispărut.
Jaypan avatar
drapel de
Ok, scuze că am înțeles greșit problema ta. Am schimbat cu totul răspunsul.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.