Недавно я давал советы по работе с .erb-шаблонами в Discourse и заметил, что на meta нет подробной информации по этой теме, поэтому решил создать эту вики-страницу. Предполагается, что вы уже знаете, что такое .erb-шаблоны и какова их роль в Discourse и в Rails в целом. Если вам нужны дополнительные сведения об этом, сначала прочитайте следующее:
Серверные плагиновые точки расширения (server plugin outlets)
Серверные плагиновые точки расширения работают аналогично клиентским плагиновым точкам расширения, хотя их всего несколько. Они позволяют вставить ваш собственный .erb-шаблон в .erb-шаблон из репозитория discourse/discourse. Они определяются следующим образом:
<%= server_plugin_outlet [name] %>
Пример использования точки расширения unsubscribe_options в плагине chat:
HTML-строители (HTML builders)
HTML-строители предназначены для стандартного HTML, который создаётся динамически, вместо использования шаблонов и плагиновых точек расширения. Чтобы использовать HTML-строители в .erb-шаблонах, найдите следующие точки вставки:
<%= build_plugin_html [name] %>
Вы можете вставить HTML в эти точки, вернув его в блоке register_html_builder в вашем файле plugin.rb, то есть:
register_html_builder([name]) do |controller|
## создайте и верните ваш пользовательский HTML
end
Пример использования server:before-head-close-crawler в плагине solved:
Фактически, можно регистрировать HTML-строители и для добавления клиентского HTML, однако это не рекомендуется. Добавляйте клиентский HTML с помощью клиентских плагиновых точек расширения и шаблонов.
Аналогично существует серверный метод плагинного API под названием register_custom_html, который можно использовать для схожих целей. Однако, если у вас нет для этого конкретных причин и вы точно знаете, что делаете, я бы не рекомендовал его использовать.
Переопределение шаблона
Вы можете переопределить .erb-шаблоны из плагина, добавив представления вашего плагина в view_paths контроллера. Это стандартная функциональность Rails и не является специфичной для Discourse. Как это работает, описано в руководстве по Rails здесь:
Например, если вы хотите переопределить app/views/email/unsubscribed.html.erb, вам нужно сделать две вещи:
Структурируйте представления вашего плагина, используя то же пространство имён
Ваш шаблон должен находиться здесь:
your-plugin-folder/app/views/email/unsubscribed.html.erb
Добавьте путь к представлениям вашего плагина в начало списка путей соответствующего контроллера
В данном случае соответствующий контроллер — EmailController. Добавьте следующее в ваш файл plugin.rb:
EmailController.prepend_view_path File.expand_path("../views", __FILE__)
Вы можете добавить представления вашего плагина в глобальные пути к представлениям, но в большинстве случаев в этом нет необходимости.