Puncte:1

View only your own comments, no one else's?

drapel cn

I have a client who would like users to be able to comment on content without being able to see any other users' comments. This is for a review system where users shouldn't feel influenced by the views of other users. I'm using Drupal 9.3.14 and a subtheme of Radix.

I have tried adding this to my theme's comment.html.twig:

{% if author_id == user.id %}
    {{ content }}
{% endif %}

That works for a while, but after a while, users report that they can see some other users' comments, but not all of them.

How can I make sure that users can always see only their own comments and no one else's?

leymannx avatar
drapel ne
Pentru că nu ați implementat niciun cache bazat pe utilizator pe acel conținut.
sjhuskey avatar
drapel cn
Mulțumesc, @leymannx. Am căutat să implementez memorarea în cache bazată pe utilizator, dar nu am reușit să găsesc sfaturi practice sau exemple pentru a face asta. Ceva indicii? Există un cârlig pe care să-l pot implementa pentru a face față stocării în cache a comentariilor?
Puncte:1
drapel ne

Găsind hook_ENTITY_TYPE_access/hook_comment_access nu funcționează când încearcă să revină AccessResult::forbidden()->cachePerUser() după compararea ID-ului proprietarului comentariului și ID-ul utilizatorului actual (probabil legat de: #2879087), puteți încerca, vă rog, următoarea logică de preprocesare? Deoarece în prezent nu am niciun proiect pentru a verifica acest lucru în mod corespunzător, nu sunt sigur dacă funcționează așa și dacă #text simplu poate fi pur și simplu folosit (greșit) ca comutator de blocare a memoriei cache într-un șablon.

/**
 * Implementează hook_preprocess_HOOK().
 */
funcția MYMODULE_preprocess_comment(&$variabile) {
  $variables['own_comment'] = [
    '#plain_text' => 'nu',
    '#cache' => [
      'contexts' => ['utilizator'],
    ],
  ];
  /** @var \Drupal\comment\Entity\Comment $comentar */
  $comment = $variables['elements']['#comment'];
  if ($comment->getOwner()->id() === \Drupal::currentUser()->id()) {
    $variables['own_comment']['#plain_text'] = 'da';
  }
}
{% if own_comment['#plain_text'] == 'da' %}
  {{ continut }}
{% altfel %}
  {{ „Nu este comentariul tău”|t }}
{% endif %}

Poate că eu fac de fapt același lucru pe care l-ați făcut și, în cele din urmă, singura modalitate este să implementați propriul dvs. formatator de câmpuri de comentarii, similar cu cel din Gestionați comentariile la propriul conținut modul.

sjhuskey avatar
drapel cn
Wow! Vă mulțumim că ați depus atât de mult efort în asta, @leymannx! Din păcate, se pare că variabila „own_comment” nu este setată, așa că logica ramificată pe care ați inclus-o merge întotdeauna la „Nu comentariul dvs.”. Cred că s-ar putea să ai dreptate că trebuie să implementezi propriul meu formatator de câmpuri de comentarii. Mă voi uita la modulul la care ați conectat și voi vedea ce pot face.
4uk4 avatar
drapel cn
Metadatele atașate unui element de randare apar numai dacă sunt redate. Dacă nu ai nimic de redat, există o alternativă. Cârligele de preprocesare au o caracteristică ascunsă prin care puteți adăuga metadate cache la nivelul superior: `$variables['#cache']['contexts'][] = 'user';`. Stratul tematic bulează acest lucru, independent de alt conținut redat.
Puncte:0
drapel us

Ne pare rău, nu există cod cu asta, doar o idee de încercat. Concentrați-vă pe scrierea unei noi permisiuni cu un modul personalizat, nu modificarea codului HTML care este în cache. Dacă vă conectați la permisiunile Drupal, atunci este posibil ca cache-ul să nu mai fie o problemă. În plus, aceasta se simte mai mult ca o problemă de permisiune decât o problemă html.

Dacă instalați drupal/consola, puteți rula linii de comandă precum drupal generate:module pentru a scoate apoi modulul inițial drupal generate:permisiuni pentru a adăuga la acel modul o permisiune. O modalitate rapidă de a elimina un modul personalizat și apoi de a pune o logică php similară pe care o aveți deja în cap, dar adăugați-l la drupal într-un mod diferit.

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.