2010-05-30 23:57:33 +00:00
|
|
|
module Locomotive
|
|
|
|
module Render
|
2010-07-22 22:10:40 +00:00
|
|
|
|
2010-05-30 23:57:33 +00:00
|
|
|
extend ActiveSupport::Concern
|
2010-07-22 22:10:40 +00:00
|
|
|
|
2010-05-30 23:57:33 +00:00
|
|
|
module InstanceMethods
|
2010-07-22 22:10:40 +00:00
|
|
|
|
2010-05-30 23:57:33 +00:00
|
|
|
protected
|
2010-07-22 22:10:40 +00:00
|
|
|
|
2010-05-30 23:57:33 +00:00
|
|
|
def render_locomotive_page
|
2010-07-29 10:46:13 +00:00
|
|
|
if request.fullpath =~ /^\/admin\//
|
2011-01-09 02:08:32 +00:00
|
|
|
render :template => "/admin/errors/404", :layout => '/admin/layouts/box', :status => :not_found
|
2010-07-29 10:46:13 +00:00
|
|
|
else
|
|
|
|
@page = locomotive_page
|
2010-07-22 22:10:40 +00:00
|
|
|
|
2011-01-06 14:48:41 +00:00
|
|
|
redirect_to(@page.redirect_url) and return if @page.present? && @page.redirect?
|
|
|
|
|
2010-09-21 11:45:34 +00:00
|
|
|
render_no_page_error and return if @page.nil?
|
2010-07-22 22:10:40 +00:00
|
|
|
|
2010-07-29 10:46:13 +00:00
|
|
|
output = @page.render(locomotive_context)
|
2010-07-22 22:10:40 +00:00
|
|
|
|
2010-09-02 23:03:20 +00:00
|
|
|
self.prepare_and_set_response(output)
|
2010-07-29 10:46:13 +00:00
|
|
|
end
|
2010-05-30 23:57:33 +00:00
|
|
|
end
|
2010-07-22 22:10:40 +00:00
|
|
|
|
2010-09-21 11:45:34 +00:00
|
|
|
def render_no_page_error
|
|
|
|
render :template => "/admin/errors/no_page", :layout => false
|
|
|
|
end
|
|
|
|
|
2010-05-30 23:57:33 +00:00
|
|
|
def locomotive_page
|
2010-09-22 08:47:21 +00:00
|
|
|
path = (params[:path] || request.fullpath).clone # TODO: params[:path] is more consistent
|
2010-05-30 23:57:33 +00:00
|
|
|
path.gsub!(/\.[a-zA-Z][a-zA-Z0-9]{2,}$/, '')
|
|
|
|
path.gsub!(/^\//, '')
|
|
|
|
path = 'index' if path.blank?
|
2010-07-22 22:10:40 +00:00
|
|
|
|
2010-07-16 20:36:07 +00:00
|
|
|
if path != 'index'
|
|
|
|
dirname = File.dirname(path).gsub(/^\.$/, '') # also look for templatized page path
|
|
|
|
path = [path, File.join(dirname, 'content_type_template').gsub(/^\//, '')]
|
|
|
|
end
|
2010-07-22 22:10:40 +00:00
|
|
|
|
2010-07-16 20:36:07 +00:00
|
|
|
if page = current_site.pages.any_in(:fullpath => [*path]).first
|
2010-06-10 22:07:59 +00:00
|
|
|
if not page.published? and current_admin.nil?
|
2010-06-01 00:06:46 +00:00
|
|
|
page = nil
|
2010-07-16 20:36:07 +00:00
|
|
|
else
|
|
|
|
if page.templatized?
|
|
|
|
@content_instance = page.content_type.contents.where(:_slug => File.basename(path.first)).first
|
2010-07-22 22:10:40 +00:00
|
|
|
|
2010-07-19 00:09:10 +00:00
|
|
|
if @content_instance.nil? || (!@content_instance.visible? && current_admin.nil?) # content instance not found or not visible
|
2010-07-16 20:36:07 +00:00
|
|
|
page = nil
|
|
|
|
end
|
|
|
|
end
|
2010-06-01 00:06:46 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2011-01-09 02:08:32 +00:00
|
|
|
page || not_found_page
|
2010-05-30 23:57:33 +00:00
|
|
|
end
|
2010-07-22 22:10:40 +00:00
|
|
|
|
2010-05-30 23:57:33 +00:00
|
|
|
def locomotive_context
|
|
|
|
assigns = {
|
|
|
|
'site' => current_site,
|
2010-06-16 14:43:29 +00:00
|
|
|
'page' => @page,
|
2011-06-21 13:12:20 +00:00
|
|
|
'asset_collections' => Locomotive::Liquid::Drops::AssetCollections.new, # depracated, will be removed shortly
|
2010-09-28 22:08:11 +00:00
|
|
|
'contents' => Locomotive::Liquid::Drops::Contents.new,
|
2011-04-28 23:16:40 +00:00
|
|
|
'current_page' => self.params[:page],
|
2011-06-03 00:25:19 +00:00
|
|
|
'params' => self.params,
|
2011-06-28 13:38:13 +00:00
|
|
|
'url' => request.url,
|
|
|
|
'now' => Date.today
|
2010-10-28 23:36:45 +00:00
|
|
|
}.merge(flash.stringify_keys) # data from api
|
2010-07-22 22:10:40 +00:00
|
|
|
|
2010-07-16 20:36:07 +00:00
|
|
|
if @page.templatized? # add instance from content type
|
|
|
|
assigns['content_instance'] = @content_instance
|
|
|
|
assigns[@page.content_type.slug.singularize] = @content_instance # just here to help to write readable liquid code
|
|
|
|
end
|
2010-07-22 22:10:40 +00:00
|
|
|
|
2010-09-03 23:47:28 +00:00
|
|
|
registers = {
|
|
|
|
:controller => self,
|
|
|
|
:site => current_site,
|
|
|
|
:page => @page,
|
|
|
|
:inline_editor => self.editing_page?,
|
|
|
|
:current_admin => current_admin
|
|
|
|
}
|
2010-07-22 22:10:40 +00:00
|
|
|
|
2010-08-04 13:12:14 +00:00
|
|
|
::Liquid::Context.new({}, assigns, registers)
|
2010-05-30 23:57:33 +00:00
|
|
|
end
|
2010-07-22 22:10:40 +00:00
|
|
|
|
2010-07-09 10:38:50 +00:00
|
|
|
def prepare_and_set_response(output)
|
2010-10-28 23:36:45 +00:00
|
|
|
flash.discard
|
|
|
|
|
2010-06-16 14:43:29 +00:00
|
|
|
response.headers['Content-Type'] = 'text/html; charset=utf-8'
|
2010-07-09 10:38:50 +00:00
|
|
|
|
|
|
|
if @page.with_cache?
|
|
|
|
fresh_when :etag => @page, :last_modified => @page.updated_at.utc, :public => true
|
2010-07-22 22:10:40 +00:00
|
|
|
|
2010-07-09 10:38:50 +00:00
|
|
|
if @page.cache_strategy != 'simple' # varnish
|
|
|
|
response.cache_control[:max_age] = @page.cache_strategy
|
|
|
|
end
|
|
|
|
end
|
2010-07-22 22:10:40 +00:00
|
|
|
|
2011-01-09 02:08:32 +00:00
|
|
|
render :text => output, :layout => false, :status => page_status
|
|
|
|
end
|
|
|
|
|
|
|
|
def not_found_page
|
|
|
|
current_site.pages.not_found.published.first
|
2010-07-22 22:10:40 +00:00
|
|
|
end
|
|
|
|
|
2010-09-02 23:03:20 +00:00
|
|
|
def editing_page?
|
2010-09-03 23:47:28 +00:00
|
|
|
self.params[:editing] == true && current_admin
|
2010-09-02 23:03:20 +00:00
|
|
|
end
|
|
|
|
|
2011-01-09 02:08:32 +00:00
|
|
|
def page_status
|
2011-06-20 19:05:12 +00:00
|
|
|
@page.not_found? ? :not_found : :ok
|
2011-01-09 02:08:32 +00:00
|
|
|
end
|
|
|
|
|
2010-05-30 23:57:33 +00:00
|
|
|
end
|
2010-07-22 22:10:40 +00:00
|
|
|
|
2010-05-30 23:57:33 +00:00
|
|
|
end
|
2010-07-23 20:09:54 +00:00
|
|
|
end
|