Привет! Я работаю над своим первым плагином Discourse.
Идея
Мы хотим немного изменить поведение ссылок на теги: при клике на тег в любом месте Discourse вместо перехода сразу к нему должно появляться два варианта — обычная ссылка на тег (forum.com/tag/tag-name) или связанная (внешняя) страница на наш выбор (something.site.com/some-name). Этот вариант должен отображаться только для тегов, присутствующих в списке.
Список будет представлен в виде массива Ruby хешей (или JSON), и его можно либо добавить непосредственно в плагин, либо сделать доступным по URL. (Первый вариант кажется более ресурсоэффективным — мы можем просто обновлять список и пересобирать плагин при необходимости, так как обновления будут происходить нечасто.)
# Массив Ruby хешей
array = [
{forum_tag: "discourse", external_slug: "discourse"},
{forum_tag: "dc", external_slug: "discourse"},
{forum_tag: "xenforo", external_slug: "xenforo"},
{forum_tag: "xf", external_slug: "xenforo"}
]
# ИЛИ
array.to_json
=\u003e "[{\"forum_tag\":\"discourse\",\"external_slug\":\"discourse\"},{\"forum_tag\":\"dc\",\"external_slug\":\"discourse\"},{\"forum_tag\":\"xenforo\",\"external_slug\":\"xenforo\"},{\"forum_tag\":\"xf\",\"external_slug\":\"xenforo\"}]"
По сути, мы хотим реализовать возможность отображения, аналогичную тому, как это происходит при клике на количество replies на главной странице форума:
Мои мысли
Я нашел в API Discourse два метода, связанных с тегами:
-
addTagsHtmlCallback— в этом случае мне нужно было бы установитьtopic.tagsв пустой массив сразу после присвоения его значения другой переменной. Таким образом я предотвращу рендеринг тегов и смогу написать свой собственный код. -
replaceTagRenderer— второй метод позволяет изменить рендеринг тегов, что выглядит менее «костыльно», чем первый метод.
Однако обратите внимание, что в обоих случаях мне нужно возвращать строку raw. Насколько я понял, я не могу вручную написать и скомпилировать шаблон Ember. Конечно, я могу просто отрендерить пользовательские ссылки и написать простую функцию на jQuery, поместив её в корень app/assets/javascripts, но это совершенно иное решение по сравнению с кодом Discourse.
Я на правильном пути? Любая помощь будет очень кстати.
