ID темы как переменная?

Есть ли способ получить ID темы как переменную внутри самой темы?

Сценарий использования: у нас есть категории для заявок в службу поддержки и отслеживания ошибок. Я хочу настроить их с использованием шаблонов следующим образом.
Так:

> **Не** удаляйте эту строку: Запрос в поддержку #$(topicid)

Выглядит так:

Не удаляйте эту строку: Запрос в поддержку #246

Открыт к другим способам получения этой информации. Просто не уверен, как это сделать.

Вы пытаетесь вставить ID темы в исходный текст самой темы?

Какую проблему это должно решить?

Это решит проблему, когда мне приходится говорить сотрудникам поддержки, что им нужно сначала создать новую тему, сохранить её, посмотреть URL и получить ID #, затем вернуться и отредактировать тему, чтобы вручную вставить # в тело сообщения.

Для чего в вашем конкретном случае используется ID темы в теле первого сообщения?

Уникальный идентификатор # для тикета/ошибки.

Куда направляется этот тикет/баг? ID находится в URL; он там постоянный и никогда не бывает неверным. Как помогает наличие ID темы в тексте самой темы? И, как вы сами отметили, если он находится в теле сообщения, любой может его изменить, удалить или ввести с ошибкой.

Использует ли что-то ещё ID темы? Если да, то что и как?

Создать пользовательский компонент, который добавляет это к соответствующим сообщениям, будет проще, чем заполнять шаблон.

Если вы отредактируете код вашей темы в разделе admin > темы и компоненты… и добавите этот код во вкладку JS, то с некоторыми доработками вы получите нужный результат:

import { apiInitializer } from "discourse/lib/api";
import Component from "@glimmer/component";

class TopicIdentifier extends Component {
  get topicId() {
    return this.args.post?.topic?.id;
  }

  get shouldShow() {
    const firstPost = this.args.post?.post_number === 1; // первое сообщение в теме
    const desiredCategories = [45, 3]; // список ID категорий, в которых должно отображаться это (через запятую)
    const isInCategory = desiredCategories.includes(
      this.args.post?.topic.category.id
    );

    return firstPost && isInCategory;
  }

  <template>
    {{#if this.shouldShow}}
      <!-- вы можете отредактировать содержимое ниже, {{this.topicId}} — место, куда будет вставлен ID темы -->
      ID этой темы:
      {{this.topicId}} 
      <!-- вы можете отредактировать содержимое выше -->
    {{/if}}
  </template>
}

export default apiInitializer((api) => {
  api.decorateCookedElement((element, helper) => {
    const wrapper = document.createElement("div");
    wrapper.className = "custom-topic-id";
 
    helper?.renderGlimmer(
      wrapper,
      <template><TopicIdentifier @post={{helper.model}} /></template>
    );

    element.appendChild(wrapper);
  });
});

ID категории можно найти в её URL, чтобы настроить desiredCategories. Например, категория поддержки здесь, на Meta, имеет ID 6.

Вы можете добавить CSS-стили, чтобы оформить это так, как вам нужно, во вкладке CSS… например:

.custom-topic-id {
  display: inline-block;
  background: yellow;
}

Да, его можно ввести неправильно. Поэтому, если вы используете переменную, вам не нужно беспокоиться об ошибках ввода.

Это помогает, потому что я — пользователь, и именно так я хочу настроить свой рабочий процесс.

В настоящее время в Discourse нельзя искать по идентификатору темы. Если символ # находится в теле темы, он теперь становится частью результатов поиска.

Поэтому я могу сказать коллеге: «Эй, найди баг #138 и дай мне знать, что ты думаешь».

Тогда Нэнси действительно легко зайти на сайт, выполнить поиск по 138 и получить результат.

Вам не нужно выполнять поиск:

/t/-/id — но на самом деле работает и /t/id.

Они могут просто ввести /t/138 и не выполнять поиск. Но если вы общаетесь с человеком, не кажется ли логичнее в разговоре сказать «найди баг по словам, которые они знают», а не по номеру?

И это было бы моим следующим предложением.

Думаю, я бы использовал renderInOutlet вместо decorateCookedElement, но, вероятно, потому, что я не до конца понимаю decorateCookedElement.

Однако это не позволит искать баг или тему по ID темы.

Я проверю это. Спасибо за информацию. Эта часть тела становится доступной для поиска?

Но я хочу искать. Так проще.
Зайти на сайт, а затем добавить /t/id к URL в верхней части окна, ВМЕСТО того чтобы зайти на сайт и ввести ID в поле поиска, которое находится прямо в центре страницы.

Если я разговариваю с человеком или пишу сообщение, да, номер более краток и менее подвержен ошибкам, чем «Найти точное заглавие, которое может состоять из 5 слов».

Я разберусь с этим, но если это лишит возможности использовать поиск по полю, то такой вариант мне не подойдёт.

Мне очень нравится Discourse, и я получил ОГРОМНОЕ количество полезной обратной связи и помощи от всех здесь.
То, чего я не понимаю, так это то, что иногда люди говорят мне: «Тебе не следует делать это так, потому что вот так лучше». Ну нет, вот так лучше для вас, а так — лучше для меня. И ни один из способов не является неправильным.

Тогда лучше не тратьте время. К сожалению, контент добавляется к теме только при её отображении… он не сохраняется в базе данных для индексации в поиске. Думаю, для полной автоматизации вам понадобится либо кастомный плагин, либо кастомный скрипт, добавленный на Discourse Automation.

Поиск по ID темы или включение его в шаблон — это нечастый запрос, поэтому мы не поддерживаем это из коробки.

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

И часто, если вернуться назад, можно найти лучшее решение.

Если вы действительно хотите вставить идентификатор темы прямо в текст, чтобы найти его через поиск, вам понадобится плагин. Он мог бы добавлять, например, ticket123 в исходный текст (по-моему, поиск работает именно с ним). Идентификатор темы не существует до её создания, поэтому вставить его в момент создания невозможно.

О! Возможно, вам нужен плагин, который добавлял бы тег bug123, когда создаётся тема в категории багов. Тогда вы могли бы ссылаться на неё как #bug123, и ссылка появлялась бы везде, где вы упоминаете этот тег, плюс можно было бы искать по нему. Если вы используете самохостинг или корпоративную версию, это не составит большого труда. Думаю, кто-то из канала Marketplace сделает это за 250–500 долларов.

Или, если вы хотите иметь возможность «искать» баг по номеру, можно добавить компонент темы, который позволит ввести номер в «поле для багов» и сразу перейти к нему. Возможно, это будет рабочим решением, и плагин для этого не понадобится.

В итоге я получил более ненавязчивое отображение ID темы. Оно по-прежнему не подлежит поиску, но я смирюсь с этим, пока не появится то, что мне действительно нужно.

<script type="text/discourse-plugin" version="0.5">
api.decorateWidget('post-meta-data:after', dec => {
  if (dec.attrs.post_number === 1) {
    const topic = dec.getModel().get('topic');
    return dec.rawHtml(`<div class="post-info topic-id"><b>&nbsp;#${topic.get('id')}</b></div>`);
  }
});
</script>

Проблема в том, что этот код теперь устарел, и я не знаю, как его исправить.
До чего его следует обновить, чтобы он соответствовал требованиям?

Я создал GitHub - literatecomputing/discourse-custom-components · GitHub в качестве примера того, как это сделать.

— это тривиальный пример вставки компонента. Таким образом, вам нужно будет добавить код перед <template>, чтобы получить ID темы и логику для определения, нужно ли отображать компонент.

Думаю, вам может подойти topic-list-before-link в качестве плагина-выхода.

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


Как бы я мог сделать это с помощью вашего кода?

Если я не ошибаюсь, ввод topic:id в строку поиска покажет тему в результатах.

Например, поиск topic:374168 this показывает сообщения только из этой темы.

Интересно… хватило бы ли TC, который отправляет AJAX-запрос для обновления необработанного текста темы?

Это работает только для этой темы, попробуйте другую случайную. Попробуйте поискать «one two four two four zero» — это ID темы с баннерами тегов.

Вы имеете в виду topic:124240? Слово-заполнитель («hello») было всего лишь примером. В случае с баннерами тегов работает «hi». Возможно, если у вас есть общее слово в тикетах поддержки или просто распространённое слово в целом, вы можете попробовать его? Просто предлагаю временное решение :).

Вы пробовали код из Topic ID as a variable? - #7 by awesomerobot?

Также, если ваша цель — «поиск» по ID темы, то, вероятно, можно создать компонент, который принимает ID темы и просто переходит к ней.