mirror of
https://github.com/discourse/discourse.git
synced 2025-06-01 09:08:10 +08:00
FEATURE: Embed topics list on remote sites via Javascript API. (#8008)
This adds support for a `<d-topics-list>` tag you can embed in your site that will be rendered as a list of discourse topics. Any attributes on the tag will be passed as filters. For example: `<d-topics-list discourse-url="URL" category="1234">` will filter to category 1234. To use this feature, enable the `embed topics list` site setting. Then on the site you want to embed, include the following javascript: `<script src="http://URL/javascripts/embed-topics.js"></script>` Where `URL` is your discourse forum's URL. Then include the `<d-topics-list discourse-url="URL">` tag in your HTML document and it will be replaced with the list of topics.
This commit is contained in:
@ -1,10 +1,12 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class EmbedController < ApplicationController
|
||||
include TopicQueryParams
|
||||
|
||||
skip_before_action :check_xhr, :preload_json, :verify_authenticity_token
|
||||
|
||||
before_action :ensure_embeddable, except: [ :info ]
|
||||
before_action :get_embeddable_css_class, except: [ :info ]
|
||||
before_action :ensure_embeddable, except: [ :info, :topics ]
|
||||
before_action :get_embeddable_css_class, except: [ :info, :topics ]
|
||||
before_action :ensure_api_request, only: [ :info ]
|
||||
|
||||
layout 'embed'
|
||||
@ -16,7 +18,26 @@ class EmbedController < ApplicationController
|
||||
@show_reason = true
|
||||
@hosts = EmbeddableHost.all
|
||||
end
|
||||
render 'embed_error'
|
||||
render 'embed_error', status: 400
|
||||
end
|
||||
|
||||
def topics
|
||||
discourse_expires_in 1.minute
|
||||
|
||||
response.headers['X-Frame-Options'] = "ALLOWALL"
|
||||
unless SiteSetting.embed_topics_list?
|
||||
render 'embed_topics_error', status: 400
|
||||
return
|
||||
end
|
||||
|
||||
if @embed_id = params[:discourse_embed_id]
|
||||
raise Discourse::InvalidParameters.new(:embed_id) unless @embed_id =~ /^de\-[a-zA-Z0-9]+$/
|
||||
end
|
||||
|
||||
list_options = build_topic_list_options
|
||||
list_options[:per_page] = params[:per_page].to_i if params.has_key?(:per_page)
|
||||
topic_query = TopicQuery.new(current_user, list_options)
|
||||
@list = topic_query.list_latest
|
||||
end
|
||||
|
||||
def comments
|
||||
|
@ -1,9 +1,11 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_dependency 'topic_list_responder'
|
||||
require_dependency 'topic_query_params'
|
||||
|
||||
class ListController < ApplicationController
|
||||
include TopicListResponder
|
||||
include TopicQueryParams
|
||||
|
||||
skip_before_action :check_xhr
|
||||
|
||||
@ -376,28 +378,6 @@ class ListController < ApplicationController
|
||||
end
|
||||
end
|
||||
|
||||
def build_topic_list_options
|
||||
options = {}
|
||||
params[:tags] = [params[:tag_id].parameterize] if params[:tag_id].present? && guardian.can_tag_pms?
|
||||
|
||||
TopicQuery.public_valid_options.each do |key|
|
||||
if params.key?(key)
|
||||
val = options[key] = params[key]
|
||||
if !TopicQuery.validate?(key, val)
|
||||
raise Discourse::InvalidParameters.new key
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# hacky columns get special handling
|
||||
options[:topic_ids] = param_to_integer_list(:topic_ids)
|
||||
if options[:no_subcategories] == 'true'
|
||||
options[:no_subcategories] = true
|
||||
end
|
||||
|
||||
options
|
||||
end
|
||||
|
||||
def list_target_user
|
||||
if params[:user_id] && guardian.is_staff?
|
||||
User.find(params[:user_id].to_i)
|
||||
|
Reference in New Issue
Block a user