Рейтинг:1

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

флаг 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
флаг ne
Потому что вы не реализовали кеширование на основе пользователей для этого фрагмента контента.
sjhuskey avatar
флаг cn
Спасибо, @leymannx. Я пытался внедрить кэширование на основе пользователей, но не смог найти практических советов или примеров для этого. Любые указатели? Есть ли хук, который я могу реализовать для кэширования комментариев?
Рейтинг:1
флаг ne

Нахождение hook_ENTITY_TYPE_access/hook_comment_access не работает при попытке возврата AccessResult::forbidden()->cachePerUser() после сравнения идентификатора владельца комментария и текущего идентификатора пользователя (вероятно, связанного: #2879087), не могли бы вы попробовать следующую логику предварительной обработки? Поскольку в настоящее время у меня нет проекта, чтобы проверить это самостоятельно, я не уверен, работает ли он таким образом, и если #простой текст может быть просто (неправильно) использован в качестве переключателя очистки кеша в шаблоне.

/**
 * Реализует hook_preprocess_HOOK().
 */
функция MYMODULE_preprocess_comment(&$variables) {
  $переменные['собственный_комментарий'] = [
    '#plain_text' => 'нет',
    '#кэш' => [
      'контексты' => ['пользователь'],
    ],
  ];
  /** @var \Drupal\comment\Entity\Comment $comment */
  $comment = $variables['elements']['#comment'];
  if ($comment->getOwner()->id() === \Drupal::currentUser()->id()) {
    $variables['own_comment']['#plain_text'] = 'yes';
  }
}
{% if own_comment['#plain_text'] == 'да' %}
  {{ содержание }}
{% еще %}
  {{ 'Это не ваш комментарий'|t }}
{% конец%}

Может быть, я на самом деле делаю то же самое, что и вы, и, в конце концов, единственный способ - реализовать свой собственный форматировщик полей комментариев, подобный тому, что в Управление комментариями к собственному контенту модуль.

sjhuskey avatar
флаг cn
Ух ты! Спасибо, что приложил столько усилий, @leymannx! К сожалению, похоже, что переменная «own_comment» не установлена, поэтому включенная вами логика ветки всегда переходит в «Не ваш комментарий». Я думаю, вы можете быть правы в том, что вам нужно реализовать мой собственный форматировщик полей комментариев. Я собираюсь посмотреть на модуль, на который вы ссылаетесь, и посмотреть, что я могу сделать.
4uk4 avatar
флаг cn
Метаданные, прикрепленные к элементу рендеринга, всплывают только при рендеринге. Если вам нечего рендерить, есть альтернатива. У хуков предварительной обработки есть скрытая функция, позволяющая добавлять метаданные кеша на верхний уровень: `$variables['#cache']['contexts'][] = 'user';`. Слой темы поднимает это вверх независимо от другого визуализируемого содержимого.
Рейтинг:0
флаг us

Извините, нет кода с этим, просто идея попробовать. Сосредоточьтесь на написании нового разрешения с помощью пользовательского модуля, а не на изменении кэшированного HTML-кода. Если вы подключитесь к разрешениям Drupal, кеш больше не будет проблемой. Кроме того, это больше похоже на проблему с разрешением, чем на проблему с html.

Если вы устанавливаете drupal/console, вы можете запустить командную строку, например Drupal генерировать:модуль затем заглушить начальный модуль Drupal генерирует: разрешения добавить к этому модулю разрешение. Быстрый способ заглушить пользовательский модуль, а затем поместить аналогичную php-логику, которая у вас уже есть в голове, но просто добавить ее в drupal другим способом.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.