Как показать общее количество постов пользователя рядом с именем

Всем привет, это мой первый пост здесь. Я хочу узнать, как форум Blizzard отображает общее количество сообщений пользователя рядом с его именем.


Я реализовал нечто подобное на своём форуме, используя API Discourse, как показано ниже:

Но, думаю, есть более эффективные способы сделать это. Также я планирую отображать значки пользователей и т. д. Кто-нибудь может помочь с этим? Спасибо.

Интересно, существует ли какая-либо система шаблонов/шорткодов.

Привет!

Если вы используете API, я полагаю, это правильный способ.

Не могли бы вы поделиться с нами своим кодом? При необходимости мы сможем предложить улучшения. :slight_smile:

Конечно

<script type="text/discourse-plugin" version="0.1">
  api.onPageChange(() => {
    // Проверить, существует ли элемент с ID 'topic'
    if ($('#topic').length > 0) {
      // Если элемент 'topic' существует, найти атрибут 'data-user-id'
      var userId = $('#topic article').data('user-id');

      // Проверить, существует ли атрибут 'data-user-id'
      if (userId !== undefined) {
        // Выполнить API-запрос для получения информации о пользователе
        apiReq(`admin/users/${userId}.json`, 'GET')
          .then(data => {
            // Обработать данные ответа
            console.log('Количество постов пользователя:', data.post_count);

            // Проверить, есть ли значение в user_fields["1"]
            if (data.user_fields && data.user_fields["1"]) {
              // Отобразить поле пользователя внутри первого div с классом 'names'
              displayUserField(data.user_fields["1"]);
            }

            // Отобразить количество постов внутри первого div с классом 'names'
            displayPostCount(data.post_count);
          })
          .catch(error => {
            // Обработать ошибки
            console.error('Ошибка API-запроса:', error);
          });
      } else {
        console.log('Атрибут data-user-id не найден');
      }
    } else {
      console.log('Элемент с ID "topic" не найден');
    }
  });

  // Функция для отображения поля пользователя внутри первого div с классом 'names'
  function displayUserField(userFieldValue) {
    // Найти первый div с классом 'names'
    var firstNamesDiv = $('.names:first');

    // Создать элемент span с классом 'user-title'
    var userFieldSpan = $('<span></span>').addClass('user-title');
    userFieldSpan.text(userFieldValue);

    // Добавить элемент span в первый div с классом 'names'
    firstNamesDiv.append(userFieldSpan);
  }

  // Функция для отображения количества постов внутри первого div с классом 'names'
  function displayPostCount(postCount) {
    // Найти первый div с классом 'names'
    var firstNamesDiv = $('.names:first');

    // Создать элемент span с классом 'user-title'
    var postCountSpan = $('<span></span>').addClass('user-title');
    postCountSpan.text(postCount + ' постов');

    // Добавить элемент span с количеством постов в первый div с классом 'names'
    firstNamesDiv.append(postCountSpan);
  }

</script>

Функция apiReq у меня находится в другом компоненте

В Blizzard отображается количество сообщений рядом с комментаторами, чего мне не удалось реализовать.

Понял, вы частично используете API. Этот код можно определённо улучшить. Дайте мне несколько минут, и я вернусь к вам.

Звучит хорошо. Я новичок в Discourse, поэтому знаю о нём очень мало.

Мне пришлось создать плагин.

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

Попробуйте. Часть на JS находится в папке assets, если захотите посмотреть.
Одна конкретная вещь, которую вы могли упустить при использовании API, — это возможность кастомизации через outlets.

Дайте знать, если нужны дополнительные варианты.
Не знаю, стоит ли выпускать этот плагин, так как он небольшой, но всё же вот он:

Спасибо большое за усилия. Я попробую.
Мой первоначальный план заключался в реализации следующих функций:

  1. Отображение количества публикаций пользователя в постах и комментариях рядом с аватаром.
  2. Назначение заголовка по умолчанию всем участникам группы (например, «Администратор»).
  3. Отображение уровня доверия рядом с аватаром.
  4. Отображение значка рядом с аватаром.
  5. Отображение значения пользовательского поля рядом с аватаром.
    При этом настройки должны быть изменяемыми администратором.
    Я также планировал сделать количество публикаций кликабельной ссылкой, чтобы другие могли увидеть список публикаций.
    Хотя это небольшой плагин, я считаю, что его стоит опубликовать. Вы можете рассмотреть возможность добавления новых функций, как было предложено.
    Спасибо.

Я установил плагин, но он не работает.

Я снова проверил, и у меня всё работает нормально.

Включён ли плагин?

Теперь всё работает. Спасибо.

Извините, что снова вас беспокою. После использования в течение некоторого времени я заметил, что там нет тем. Насколько я знаю, тема — это тоже пост.

Созданные темы — это ещё одна статистика. Хотите добавить этот счётчик к количеству сообщений или добавить новый текст, чтобы у вас было «темы: xx, сообщения: yy»?

Я пытаюсь получить что-то вроде postCount + TopicCount — просто хочу считать темы как посты. Также пытаюсь отображать это после заголовка пользователя (если он есть). Я пробовал модифицировать код плагина (после форка), но пока безрезультатно.

Я обновил плагин; дайте знать, если он у вас заработает.

Большое спасибо. Всё сработало.

Выглядит очень круто. Можно ли добавить общее количество реакций и иконки FA?

Я не могу редактировать, поэтому я просто установил и протестировал плагин, и он работает очень хорошо. За исключением мобильных устройств, где общее количество сообщений отображается слева от имени. :frowning:

@David_Ghost

Это можно исправить с помощью CSS:

.names.trigger-user-card > div:has(.user-post-user__container) {
    order: 2;
}