Adds JSONP support to the API (#11469).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10088 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
@@ -19,7 +19,7 @@ module Redmine
|
||||
module Views
|
||||
class ApiTemplateHandler
|
||||
def self.call(template)
|
||||
"Redmine::Views::Builders.for(params[:format]) do |api|; #{template.source}; self.output_buffer = api.output; end"
|
||||
"Redmine::Views::Builders.for(params[:format], request, response) do |api|; #{template.source}; self.output_buffer = api.output; end"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -18,10 +18,10 @@
|
||||
module Redmine
|
||||
module Views
|
||||
module Builders
|
||||
def self.for(format, &block)
|
||||
def self.for(format, request, response, &block)
|
||||
builder = case format
|
||||
when 'xml', :xml; Builders::Xml.new
|
||||
when 'json', :json; Builders::Json.new
|
||||
when 'xml', :xml; Builders::Xml.new(request, response)
|
||||
when 'json', :json; Builders::Json.new(request, response)
|
||||
else; raise "No builder for format #{format}"
|
||||
end
|
||||
if block
|
||||
|
||||
@@ -21,8 +21,20 @@ module Redmine
|
||||
module Views
|
||||
module Builders
|
||||
class Json < Structure
|
||||
attr_accessor :jsonp
|
||||
|
||||
def initialize(request, response)
|
||||
super
|
||||
self.jsonp = (request.params[:callback] || request.params[:jsonp]).to_s.gsub(/[^a-zA-Z0-9_]/, '')
|
||||
end
|
||||
|
||||
def output
|
||||
@struct.first.to_json
|
||||
json = @struct.first.to_json
|
||||
if jsonp.present?
|
||||
json = "#{jsonp}(#{json})"
|
||||
response.content_type = 'application/javascript'
|
||||
end
|
||||
json
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -21,8 +21,12 @@ module Redmine
|
||||
module Views
|
||||
module Builders
|
||||
class Structure < BlankSlate
|
||||
def initialize
|
||||
attr_accessor :request, :response
|
||||
|
||||
def initialize(request, response)
|
||||
@struct = [{}]
|
||||
self.request = request
|
||||
self.response = response
|
||||
end
|
||||
|
||||
def array(tag, options={}, &block)
|
||||
|
||||
@@ -21,8 +21,8 @@ module Redmine
|
||||
module Views
|
||||
module Builders
|
||||
class Xml < ::Builder::XmlMarkup
|
||||
def initialize
|
||||
super
|
||||
def initialize(request, response)
|
||||
super()
|
||||
instruct!
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user