lib/spiderfw/controller/mixins/visual.rb in spiderfw-0.5.10 vs lib/spiderfw/controller/mixins/visual.rb in spiderfw-0.5.11
- old
+ new
@@ -59,41 +59,43 @@
def visual_params
@visual_params ||= {}
end
- def init_widgets(template)
+ def init_widgets(template, layout=nil)
widget_target = @request.params['_wt']
widget_execute = @request.params['_we']
if (widget_target && !@rendering_error)
first, rest = widget_target.split('/', 2)
- @_widget = find_widget(first)
+ @_widget = template.find_widget(first)
+ @_widget = layout.find_widget(first) if !@_widget && layout
raise Spider::Controller::NotFound.new("Widget #{widget_target}") unless @_widget
@_widget.is_target = true unless rest
@_widget.set_action(widget_execute) if widget_execute
@_widget.target_mode = true
@_widget.widget_target = rest
end
template.do_widgets_before
+ layout.do_widgets_before if layout
if @_widget
@_widget.execute
done
end
end
def execute(action='', *params)
@visual_params = @executed_format_params
- @is_target = false if @request.params['_wt']
+ @is_target = false if @request.params['_wt'] && !self.is_a?(Spider::Widget)
if (self.is_a?(Widget) && @is_target && @request.params['_wp'])
params = @request.params['_wp']
elsif (@visual_params.is_a?(Hash) && @visual_params[:params])
p_first, p_rest = action.split('/')
params = format_params[:params].call(p_rest) if p_rest
end
super(action, *params)
return unless @visual_params.is_a?(Hash)
- @template = init_template if !@template && @visual_params[:template]
+ @template = get_template if !@template && @visual_params[:template]
init_widgets(@template) if @template
if @visual_params[:call]
send(@visual_params[:call], *params)
end
if @visual_params[:template] && !@_widget && !done?
@@ -136,49 +138,43 @@
def template_exists?(name)
self.class.template_exists?(name)
end
- def init_template(path=nil, scene=nil, options={})
+ def get_template(path=nil, scene=nil, options={})
return @template if @template && @loaded_template_path == path
scene ||= @scene
scene ||= get_scene
if (!path)
format_params = @visual_params || self.class.output_format_params(@executed_method, @executed_format)
return unless format_params && format_params[:template]
path = format_params[:template]
options = format_params.merge(options)
end
template = load_template(path)
- do_template_init(template, options)
+ init_template(template, options)
@template = template
@loaded_template_path = path
return template
end
- def do_template_init(template, options={})
+ def init_template(template, options={})
+ prepare_template(template) unless template.owner # if called directly
template.init(scene)
if (@request.params['_action'])
template._widget_action = @request.params['_action']
else
template._action_to = options[:action_to]
template._action = @controller_action
end
return template
end
-
- def render_layout(path, content={})
- layout = self.class.load_layout(path)
- layout.request = @request
- layout.render(content)
- end
-
+
def init_layout(layout)
l = layout.is_a?(Layout) ? layout : self.class.load_layout(layout)
- l.owner = self
- l.request = request
+ prepare_template(l)
return l
end
def render(path=nil, options={})
scene = options[:scene] || @scene
@@ -187,25 +183,29 @@
request = options[:request] || @request
response = options[:response] || @response
if (path.is_a?(Spider::Template))
template = path
else
- template = init_template(path, scene, options)
+ template = get_template(path, scene, options)
end
- init_widgets(template)
- return template if done?
+ layout = nil
chosen_layouts = options[:layout] || @layout
chosen_layouts = [chosen_layouts] if chosen_layouts && !chosen_layouts.is_a?(Array)
if (chosen_layouts)
t = template
- l = nil
+ layout = nil
(chosen_layouts.length-1).downto(0) do |i|
- l = init_layout(chosen_layouts[i])
- l.template = t
- t = l
+ layout = init_layout(chosen_layouts[i])
+ layout.template = t
+ t = layout
end
- l.render(scene)
+ end
+ layout.init(scene) if layout
+ init_widgets(template, layout)
+ return template if done?
+ if layout
+ layout.render(scene)
else
template.render(scene)
end
return template
end
@@ -263,10 +263,10 @@
begin
@scene.devel = true
@scene.backtrace = build_backtrace(exc)
client_editor = Spider.conf.get('client.text_editor')
prefix = 'txmt://open?url=' if client_editor == 'textmate'
- @scene.exception = "#{exc.class.name}: #{exc.message}"
+ @scene.exception = "#{exc.class.name}: #{CGI.escapeHTML(exc.message)}"
cnt = 0
@scene.backtrace.each do |tr|
tr[:index] = cnt
cnt += 1
suffix = ''