Theme-Component v Plugin: в чем разница

Спасибо, @tshenry. Не совсем понимаю, почему код владельца группы у меня не сработал — вероятно, дело в том, как я настроил плагин.

Я обнаружил, что подход с AJAX работает как метод «MVP» (минимально жизнеспособный продукт). Кстати, я полагаю, что можно сделать API-запрос к [forum-url]/groups.json, чтобы получить все группы сайта, а затем перебрать их в цикле, так что нет необходимости делать несколько запросов.

Я хотел бы спросить:

–Для подхода с AJAX/JSON API, знаете ли вы, как сделать так, чтобы функция выполнялась только при переходе пользователя на конкретную страницу? Сейчас, если я размещаю код AJAX в секции </head> моей панели настройки, он работает, но выполняется при каждой загрузке сайта (хотя мне нужно, чтобы он запускался только при загрузке страницы индекса групп).

–В моём случае я использую AJAX именно потому, что мне нужно не только отображать владельцев групп, но и несколько новых атрибутов группы, которые я добавляю. Это будут как пользовательские поля группы, которые я пытаюсь получить и отобразить. В настоящее время «MVP»-версия (пока я ещё изучаю, как работает кодовая база Discourse) заключается в сохранении этих данных в отдельную базу данных, не связанную с Discourse, из которой я их получаю и добавляю на страницу индекса групп.

Очевидно, что более чистым решением было бы добавить пользовательские атрибуты непосредственно в группы в базе данных Discourse и получать их оттуда. Просто пытаюсь оценить, какой объём работы это потребует. Потребуется ли при этом переделывать множество файлов Discourse (контроллеры, модели, шаблоны)?

Я могу разместить это в небольшом репозитории GitHub, как только появится возможность.

Мне кажется, что это не даёт доступа к данным владельца, но возможно, я что-то упускаю.

Касательно ваших вопросов:

  1. Компонент темы, на который я дал ссылку, делает нечто подобное, чтобы убедиться, что AJAX-запрос выполняется только на /latest или на главной странице. Я бы попробовал развить эту идею: discourse-featured-topics/common/head_tag.html at ddf3d7e003423e2e5f83446a80cab78d51f09e2d · awesomerobot/discourse-featured-topics · GitHub

    Также, если вы ещё не сделали этого, обязательно ознакомьтесь с Developing Discourse Themes & Theme Components

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

Вы правы. Я забыл — это то, что я также храню в отдельной базе данных, к которой обращаюсь через AJAX (и некоторые другие «магические» приемы) прямо сейчас.

Отличная идея — я вижу, что вы сделали с if ((url == "/") || (url == "/latest") ) в том репозитории. Я могу сделать что-то подобное.

Да — я прошелся по этому руководству, а также по другим, которые смог найти. Это отличное руководство, но я обнаружил, что переход от него (и других материалов на meta) к реализации подобных настроек оказывается сложным. Эти настройки требуют, насколько я могу судить, глубокого понимания того, как шаблоны, контроллеры и модели взаимодействуют друг с другом в коде Discourse.

Отступление

Ember может быть отличной системой для создания производительных приложений, но я нахожу сложным понять, как связаны различные файлы. Например, поиск нужного шаблона в представлении в репозитории на Github мало говорит о том, какие другие шаблоны с ним связаны, а тем более — какие контроллеры и модели могут быть relevant. Это возможно, но процесс идет медленно, и для выполнения таких настроек действительно необходимо понимать эти взаимосвязи.

В Angular, как альтернативный метод, части компонентов представления обычно группируются вместе с файлами html, typescript и css, а затем другие релевантные файлы четко обозначены в этих файлах (так что используемые сервисы указаны в файле typescript, а другие внедряемые компоненты явно отмечены в файле html). Насколько я вижу, структура Discourse на базе Ember работает иначе (не чтобы критиковать эту структуру — это очень стабильное и высокопроизводительное приложение — просто к ней нужно привыкнуть).

Поэтому я использую такие вещи, как AJAX, чтобы достичь того же результата, пока продолжаю пытаться понять, как части Discourse взаимодействуют друг с другом.