Puncte:-2

Editarea linkului „Trimite mesaj privat” pentru a include numele de utilizator

drapel in
j0e

Eu folosesc Mesaj privat versiunea modulului 8.x-2.0-beta16 și vreau să schimb mesajul de la „Trimite mesaj privat” la „Trimite mesaj privat către @nume utilizator” care ar trebui să afișeze numele de utilizator din pagina utilizatorului pe care o vizităm și o contactăm.

Modulul folosește următorul cod.

'#title' => t('Trimite mesaj privat'),

Există modalități de a înlocui direct această linie și de a introduce numele de utilizator? Am incercat fara succes.

Codul relevant se află în: mesaj_privat\src\Service\PrivateMessageService.php#L336-382.

funcția publică createRenderablePrivateMessageThreadLink(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display, $view_mode) {
  if ($display->getComponent('private_message_link')) {
    if ($entity instanceof UserInterface) {
      $autor = $entitate;
    }
    else {
      $autor = $entitate->getOwner();
    }
    $utilizator_actual = \Drupal::Utilizator curent();
    dacă ($utilizator_actual->isAuthenticated()) {
      if ($current_user->hasPermission('folosește sistemul de mesagerie privată') && $current_user->id() != $author->id()) {
        $membri = [$utilizator_actual, $autor];
        $thread_id = $this->mapper->getThreadIdForMembers($membri);
        dacă ($thread_id) {
          $url = Url::fromRoute('entity.private_message_thread.canonical', ['private_message_thread' => $thread_id], ['attributes' => ['class' => ['private_message_link']]]);
          $build['private_message_link'] = [
            '#type' => 'link',
            '#url' => $url,
            '#title' => t('Trimite mesaj privat'),
            '#prefix' => '<div class="private_message_link_wrapper">',
            '#sufix' => '</div>',
          ];
        }
        else {
          $url = Url::fromRoute('private_message.private_message_create', [], ['query' => ['recipient' => $author->id()]]);
          $build['private_message_link'] = [
            '#type' => 'link',
            '#url' => $url,
            '#title' => t('Trimite mesaj privat'),
            '#prefix' => '<div class="private_message_link_wrapper">',
            '#sufix' => '</div>',
          ];
        }
      }
    }
    else {
      $url = Url::fromRoute('user.login');
      $build['private_message_link'] = [
        '#type' => 'link',
        '#url' => $url,
        '#title' => t('Trimite mesaj privat'),
        '#prefix' => '<div class="private_message_link_wrapper">',
        '#sufix' => '</div>',
      ];
    }
  }   
}
sonfd avatar
drapel in
Nu piratați un modul. Creați un patch cu modificarea dvs. și aplicați-l cu compozitor.
j0e avatar
drapel in
j0e
Nu mă deranjează să pun petice în loc să sparg. Dar intrebarea ramane...
leymannx avatar
drapel ne
Nu puteți preprocesa linkul și apoi verificați pentru `$variables['element']['#prefix'] === '
sonfd avatar
drapel in
Da, sau ați putea chiar să anulați serviciul și să extindeți această metodă. Consultați [Cum să suprascrieți un serviciu](https://drupal.stackexchange.com/questions/292562/how-to-override-a-service).
Puncte:2
drapel in

Cred că vă întrebați: „Cum pot crea un șir tradus „Trimite un mesaj privat către @nume utilizator” unde @nume utilizator este înlocuit cu numele utilizatorului care este vizualizat în prezent?”

Dacă vizualizați pagina utilizatorului, puteți face acest lucru ca:

// Obține obiectul utilizator care este vizualizat în prezent din parametrii rutei.
$user = \Drupal::routeMatch()->getParameter('utilizator');
// Dacă avem un obiect utilizator valid.
if ($user instance of Drupal\user\Entity\User) {
  $message = t('Trimite un mesaj privat către @nume utilizator', [
    '@username' => $user->getDisplayName(),
  ]);
}

Cu toate acestea, privind codul specific pe care l-ați postat, nu vi se garantează că vă aflați pe pagina utilizatorului. În plus, utilizatorul care urmează să primească mesajul este deja determinat și stocat $autor:

// adică pagina utilizatorului.
if ($entity instanceof UserInterface) {
  $autor = $entitate;
}
// adică un nod sau o altă entitate creată de un utilizator.
else {
  $autor = $entitate->getOwner();
}

În acest caz, puteți folosi ceva de genul:

$message = t('Trimite un mesaj privat către @nume utilizator', [
  '@username' => $author->getDisplayName(),
]);
leymannx avatar
drapel ne
Încă se întreabă cum îl fac să suprascrie mesajul curent. Poate ar trebui să deschidă o solicitare de caracteristică și să furnizeze un patch/MR cu codul pe care l-ați sugerat.
sonfd avatar
drapel in
De acord, cu siguranță nu piratați modulul. După cum am menționat mai sus, cred că opțiunile sunt 1. Creați o problemă / postați un patch la d.o și aplicați cu compozitor. 2. Preprocesează legătura și face logica acolo. 3. Ignorați serviciul și extindeți-i clasa pentru a suprascrie doar această metodă pentru a modifica textul linkului.
leymannx avatar
drapel ne
Da, depășind serviciul, chiar mai bine.
j0e avatar
drapel in
j0e
Mulțumesc @sonfd. Nu am observat variabila $author.Am făcut ca aceasta să funcționeze pe baza a treia soluție, înlocuind linia #title cu: `'#title' => t('Trimite mesaj privat către @username', ['@username' => $author->getDisplayName() ]),`
sonfd avatar
drapel in
@j0e - Grozav! Cu siguranță vă recomand cel puțin să faceți un patch pentru modificarea dvs. și să îl pun pe compozitor să îl aplice. Composer va încerca să aplice din nou patch-ul atunci când actualizați modulul, astfel încât modificarea dvs. să fie păstrată (dacă patch-ul nu poate fi aplicat, compozitorul vă va spune că a eșuat, astfel încât să puteți remedia problema). După cum a spus leymannx mai sus, ai putea posta și ca FR pe drupal.org (aș face), dar asta depinde de tine :)

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.