Есть ли способ получить ID темы как переменную внутри самой темы?
Сценарий использования: у нас есть категории для заявок в службу поддержки и отслеживания ошибок. Я хочу настроить их с использованием шаблонов следующим образом.
Так:
> **Не** удаляйте эту строку: Запрос в поддержку #$(topicid)
Выглядит так:
Не удаляйте эту строку: Запрос в поддержку #246
Открыт к другим способам получения этой информации. Просто не уверен, как это сделать.
Это решит проблему, когда мне приходится говорить сотрудникам поддержки, что им нужно сначала создать новую тему, сохранить её, посмотреть URL и получить 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… например:
Да, его можно ввести неправильно. Поэтому, если вы используете переменную, вам не нужно беспокоиться об ошибках ввода.
Это помогает, потому что я — пользователь, и именно так я хочу настроить свой рабочий процесс.
В настоящее время в Discourse нельзя искать по идентификатору темы. Если символ # находится в теле темы, он теперь становится частью результатов поиска.
Поэтому я могу сказать коллеге: «Эй, найди баг #138 и дай мне знать, что ты думаешь».
Тогда Нэнси действительно легко зайти на сайт, выполнить поиск по 138 и получить результат.
Они могут просто ввести /t/138 и не выполнять поиск. Но если вы общаетесь с человеком, не кажется ли логичнее в разговоре сказать «найди баг по словам, которые они знают», а не по номеру?
И это было бы моим следующим предложением.
Думаю, я бы использовал renderInOutlet вместо decorateCookedElement, но, вероятно, потому, что я не до конца понимаю decorateCookedElement.
Однако это не позволит искать баг или тему по ID темы.
Но я хочу искать. Так проще.
Зайти на сайт, а затем добавить /t/id к URL в верхней части окна, ВМЕСТО того чтобы зайти на сайт и ввести ID в поле поиска, которое находится прямо в центре страницы.
Если я разговариваю с человеком или пишу сообщение, да, номер более краток и менее подвержен ошибкам, чем «Найти точное заглавие, которое может состоять из 5 слов».
Я разберусь с этим, но если это лишит возможности использовать поиск по полю, то такой вариант мне не подойдёт.
Мне очень нравится Discourse, и я получил ОГРОМНОЕ количество полезной обратной связи и помощи от всех здесь.
То, чего я не понимаю, так это то, что иногда люди говорят мне: «Тебе не следует делать это так, потому что вот так лучше». Ну нет, вот так лучше для вас, а так — лучше для меня. И ни один из способов не является неправильным.
Тогда лучше не тратьте время. К сожалению, контент добавляется к теме только при её отображении… он не сохраняется в базе данных для индексации в поиске. Думаю, для полной автоматизации вам понадобится либо кастомный плагин, либо кастомный скрипт, добавленный на Discourse Automation.
Поиск по ID темы или включение его в шаблон — это нечастый запрос, поэтому мы не поддерживаем это из коробки.
Думаю, дело в том, что постоянные участники здесь знают, что такой функции у нас сейчас нет, поэтому мы пытаемся помочь вам, предлагая возможные обходные пути.
И часто, если вернуться назад, можно найти лучшее решение.
Если вы действительно хотите вставить идентификатор темы прямо в текст, чтобы найти его через поиск, вам понадобится плагин. Он мог бы добавлять, например, ticket123 в исходный текст (по-моему, поиск работает именно с ним). Идентификатор темы не существует до её создания, поэтому вставить его в момент создания невозможно.
О! Возможно, вам нужен плагин, который добавлял бы тег bug123, когда создаётся тема в категории багов. Тогда вы могли бы ссылаться на неё как #bug123, и ссылка появлялась бы везде, где вы упоминаете этот тег, плюс можно было бы искать по нему. Если вы используете самохостинг или корпоративную версию, это не составит большого труда. Думаю, кто-то из канала Marketplace сделает это за 250–500 долларов.
Или, если вы хотите иметь возможность «искать» баг по номеру, можно добавить компонент темы, который позволит ввести номер в «поле для багов» и сразу перейти к нему. Возможно, это будет рабочим решением, и плагин для этого не понадобится.
В итоге я получил более ненавязчивое отображение ID темы. Оно по-прежнему не подлежит поиску, но я смирюсь с этим, пока не появится то, что мне действительно нужно.
— это тривиальный пример вставки компонента. Таким образом, вам нужно будет добавить код перед <template>, чтобы получить ID темы и логику для определения, нужно ли отображать компонент.
Думаю, вам может подойти topic-list-before-link в качестве плагина-выхода.
Вы имеете в виду topic:124240? Слово-заполнитель («hello») было всего лишь примером. В случае с баннерами тегов работает «hi». Возможно, если у вас есть общее слово в тикетах поддержки или просто распространённое слово в целом, вы можете попробовать его? Просто предлагаю временное решение :).