토픽 ID를 변수로 사용할 수 있나요?

토픽 내에서 토픽 ID를 변수로 가져오는 방법이 있을까요?

사용 사례를 설명하자면, 지원 및 버그 추적 티켓을 위한 카테고리가 있습니다. 다음과 같은 템플릿으로 설정하고 싶습니다.
이것:

> 이 줄을 **삭제하지** 마세요: 지원 요청 #$(topicid)

이렇게 보입니다:

이 줄을 삭제하지 마세요: 지원 요청 #246

이 정보를 가져오는 다른 방법도 환영합니다. 다만 어떻게 해야 할지 잘 모르겠습니다.

토픽 ID를 토픽의 원본 텍스트에 넣으려고 하는 건가요?

그걸로 어떤 문제를 해결할 수 있나요?

이 기능을 통해 지원 팀에게 새 주제를 먼저 만들고, 저장한 뒤, URL에서 ID 번호를 확인한 다음, 다시 해당 주제로 돌아가 본문에 번호를 수동으로 입력하라고 지시해야 하는 문제를 해결할 수 있습니다.

여기서 OP 본문에 주제 ID#를 어떤 용도로 사용하고 있나요?

티켓/버그에 대한 고유 ID #.

그 티켓/버그는 어디로 가나요? ID는 URL에 있으며, 그곳에서는 영구적으로 유지되고 절대 틀리지 않습니다. 토픽 ID를 토픽 텍스트에 포함하는 것이 어떻게 도움이 되나요? 그리고 지적하신 대로, 메시지 본문에 ID가 있으면 누구나 변경하거나 삭제하거나 잘못 입력할 수 있습니다.

토픽 ID를 사용하는 다른 것이 있나요? 있다면, 무엇이고 어떻게 사용하나요?

템플릿을 채우는 것보다 이 내용을 올바른 게시물에 추가하는 사용자 정의 컴포넌트를 만드는 것이 더 쉬울 것입니다.

admin > themes & components에서 테마 코드를 편집한 다음 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);
  });
});

desiredCategories를 설정하려면 URL에서 카테고리 ID를 찾을 수 있습니다. 예를 들어, Meta의 support 카테고리의 ID는 6입니다.

CSS 탭에서 CSS를 추가하여 원하는 대로 스타일을 지정할 수 있습니다… 예를 들어

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

네, 잘못 입력할 수 있습니다. 그래서 변수를 사용하면 오타를 걱정할 필요가 없죠.

저는 사용자이고, 제 워크플로우를 이렇게 설정하고 싶기 때문에 도움이 됩니다.

현재 Discourse에서는 주제 ID로 검색할 수 없습니다. 만약 #가 주제 본문에 포함되어 있다면, 이제 그것은 검색 결과의 일부가 됩니다.

그래서 동료에게 "버그 #138로 검색해서 어떻게 생각하는지 알려줘"라고 말할 수 있습니다.

그렇게 하면 Nancy가 사이트에 가서 138로 검색하고 결과를 얻는 것이 정말 쉬워집니다.

검색할 필요가 없습니다:

/t/-/id – 하지만 실제로는 /t/id가 작동합니다.

그들은 단순히 /t/138을 입력하면 되고 검색할 필요가 없습니다. 하지만 사람에게 이야기하고 있다면, 숫자보다는 "알고 있는 몇 가지 단어에 대한 버그를 검색해 봐"라고 말하는 것이 대화에서 더 자연스럽지 않을까요?

그리고 그것이 제가 드릴 다른 제안이었습니다.

decorateCookedElement 대신 renderInOutlet을 사용했을 것 같습니다. 하지만 그것은 아마도 제가 decorateCookedElement를 완전히 이해하지 못해서일 것입니다.

하지만 이 방법은 topic_id로 버그/주제를 검색할 수 없게 만듭니다.

이것을 테스트해 보겠습니다. 정보를 알려주셔서 감사합니다. 이것이 검색 가능한 부분인가요?

하지만 저는 검색하고 싶습니다. 그게 더 쉽거든요.
사이트에 들어간 후, 창 상단의 URL에 /t/id를 붙이는 것과, 사이트에 들어간 후 페이지 중앙에 있는 검색란에 ID를 입력하는 것 중 후자가 더 쉽습니다.

사람에게 말을 건다거나, 메시지를 타이핑할 때는, "길이가 5단어일 수도 있는 정확한 제목을 검색하세요"라고 하는 것보다 숫자가 더 간결하고 오류 가능성이 적습니다.

그 부분을 알아볼 것이지만, 검색란에서 사용할 수 없게 만든다면 저에게는 적합하지 않을 것입니다.

저는 Discourse를 정말 좋아하고, 여기 있는 모든 분들에게 많은 유용한 피드백과 도움을 받았습니다.
제가 이해하지 못하는 것은 가끔 사람들이 "이 방식은 더 좋으니 그렇게 하면 안 됩니다"라고 할 때입니다. 아니요, 그 방식은 당신에게는 더 좋지만, 저에게는 이 방식이 더 좋습니다. 그리고 어느 쪽이 틀린 것도 아닙니다.

그렇다면 굳이 시도하지 마세요. 안타깝게도 해당 기능은 렌더링될 때만 주제(topic)에 콘텐츠를 추가할 뿐, 검색이 가능하도록 데이터베이스에 추가하지는 않습니다. 완전히 자동화하려면 Discourse Automation 에 커스텀 플러그인이나 커스텀 스크립트를 추가해야 할 것 같습니다.

주제 ID로 검색하거나 템플릿에 포함시키는 것은 흔한 요청 사항이 아니기 때문에 기본 지원(out of the box) 기능으로 제공되지 않습니다.

이곳의 단골 사용자들은 현재 우리가 가지고 있지 않은 기능이라는 것을 알고 있기 때문에, 잠재적인 우회 방법(work-around)을 찾아서 도움을 드리고자 하는 것입니다.

종종 돌아가 보면 더 나은 해결책을 찾을 수 있습니다.

정말 텍스트 안에 토픽 ID를 포함해서 검색할 때 찾을 수 있게 하려면 플러그인이 필요할 거예요. 그러면 원시 텍스트에 ticket123을 추가할 수 있겠죠 (검색은 원시 텍스트를 기준으로 하는 것 같아요). 토픽 ID는 토픽을 만들기 전에 존재하지 않으므로, 토픽을 만들 때 이를 삽입할 수 없습니다.

아! 여러분이 원하는 건 버그 카테고리에 토픽이 생성될 때 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>

문제는 이 코드가 이제 구식이 되어 버렸다는 점이고, 어떻게 수정해야 할지 모르겠습니다.
준수하려면 어떻게 업데이트해야 하나요?

이를 어떻게 해야 하는지 보여주기 위해 https://github.com/literatecomputing/discourse-custom-components를 예제로 만들었습니다.

이는 컴포넌트를 삽입하는 매우 간단한 예시입니다. 따라서 <template> 앞에 코드를 추가하여 토픽 ID를 가져오고 표시 여부를 결정하는 로직을 구현해야 합니다.

플러그인 아웃렛으로 topic-list-before-link를 사용하는 것이 좋을 것 같습니다.

그걸 전혀 이해하지 못해요. 저는 코딩을 할 줄 몰라요.
제가 올린 코드는 이렇게 작동해요:


선생님의 코드로는 어떻게 하면 될까요?

제가 틀리지 않았다면, 검색란에 topic:id를 입력하면 검색 결과에 해당 토픽이 표시됩니다.

예를 들어, topic:374168 this로 검색하면 이 토픽의 게시글만 표시됩니다.

궁금한 점이 있는데요… 토픽의 원본(raw)을 업데이트하기 위해 AJAX 요청을 보내는 TC(토픽 컨트롤러)가 충분할까요?

이것은 이 토픽에서만 작동합니다. 다른 랜덤한 토픽을 시도해 보세요. "one two four two four zero"를 검색해 보세요. 그건 태그 배너 토픽 ID입니다.

topic:124240를 말씀하시는 건가요?填充語(‘hello’)는 단순히 예시였을 뿐입니다. 태그 배너의 경우 'hi’가 작동합니다. 지원 티켓에 공통적으로 사용되는 단어가 있거나, 일반적으로 자주 쓰이는 단어가 있다면 그것을 시도해 볼 수 있습니다. 단순히 워크어라운드를 제안해 본 것입니다 :slight_smile: .

Topic ID as a variable? - #7 by awesomerobot 에 있는 코드를 시도해 보셨나요?

또한, 하려는 작업이 주제 ID를 "검색"하는 것이라면, 주제 ID를 받아 해당 주제로 바로 이동하는 컴포넌트를 만들 수도 있을 것입니다.