security bingo!
[leap_website.git] / app / helpers / application_helper.rb
1 module ApplicationHelper
2
3   def main_column_class
4     if has_side_column?
5       'with_side_column'
6     else
7       'full'
8     end
9   end
10
11   #
12   # two forms:
13   #
14   #  (1) link('page-name')
15   #  (2) link('label' => 'page-name')
16   #
17   # both accept optional options hash:
18   #
19   #  (1) link('page-name', :class => 'x')
20   #  (2) link('label' => 'page-name', :class => 'x')
21   #
22   def link(name, options=nil)
23     if name.is_a? Hash
24       klass = name.delete(:class)
25       label, name = name.to_a.first
26       if label.is_a? Symbol
27         label = I18n.t label
28       end
29     else
30       klass = options[:class] if options
31     end
32     if name.starts_with?('#')
33       path = name
34     else
35       page = StaticPage.find(name)
36       if page
37         label ||= page.title
38         path = page_path(page)
39       else
40         label = '[dead link]'
41         path = '/'
42       end
43     end
44     link_to label, path, {:class => klass}
45   end
46
47   def page_path(page)
48     if page.props.path_prefix
49       "/#{I18n.locale.to_s}/#{page.props.path_prefix}/#{page.name}"
50     else
51       '/' + ([I18n.locale.to_s] + page.path).join('/')
52     end
53   end
54
55   #
56   # allows a template to render a partial giving a relative path (relative to the calling template)
57   #
58   def render_local_template(arg, locals={})
59     caller_path = Pathname.new(caller.first.gsub(/^([^:]*).*$/, '\1'))
60     doc_root = Pathname.new(Rails.root + 'app/views')
61     template_path = File.dirname(caller_path.relative_path_from(doc_root).to_s) + '/' + arg
62     begin
63       render :template => template_path, :locals => locals
64     rescue ActionView::MissingTemplate => exc
65       "<!-- template missing %s -->" % template_path
66     end
67   end
68
69   def page_title
70     if @page
71       @page.props.title || @page.title
72     else
73       ""
74     end
75   end
76
77   #
78   # renders the content of a static page
79   # this is an ugly duplicate of the application controller render_page, because
80   # they call two different 'render' methods (controller and view renders behave differently).
81   # TODO: figure out how to combine into one helper_method.
82   #
83   def render_page(page)
84     begin
85       render :template => page.template_path
86     rescue ActionView::MissingTemplate => exc
87       begin
88         render :template => page.template_path(DEFAULT_LOCALE)
89       rescue
90         raise exc
91       end
92     end
93   end
94
95 end