Permalink
Browse files

added a snippet option to the liquid nav tag

this is useful if you want to render more than
just a page.title string within the nav list item.
(page.menue_image, page.menue_teaser...)
use nav snippet: "<liquid snippet>" to provide a string
or nav snippet: "<snippetname>" to load the snippet from db.

added page.<editable_field> for usage within liquid templates
  • Loading branch information...
1 parent f77bdd9 commit b13c5d1d408777671c79d35443fc0ef6649f85f1 @paulsponagl committed Mar 6, 2012
@@ -78,8 +78,8 @@ def children; @children || []; end
#
# @return [ Array ] The children pages ordered by their position
#
- def children_with_minimal_attributes
- self.children.minimal_attributes
+ def children_with_minimal_attributes( attrs = [] )
+ self.children.minimal_attributes( attrs )
end
# Assigns the new position of each child of this node.
@@ -109,4 +109,4 @@ def persist_depth
end
end
end
-end
+end
@@ -51,7 +51,7 @@ class Page
scope :published, :where => { :published => true }
scope :fullpath, lambda { |fullpath| { :where => { :fullpath => fullpath } } }
scope :handle, lambda { |handle| { :where => { :handle => handle } } }
- scope :minimal_attributes, :only => %w(title slug fullpath position depth published templatized redirect listed parent_id created_at updated_at)
+ scope :minimal_attributes, lambda { |attrs=[]| {:only => attrs + %w(title slug fullpath position depth published templatized redirect listed parent_id created_at updated_at) } }
## methods ##
@@ -41,6 +41,10 @@ def published?
self._source.published?
end
+ def before_method(meth)
+ self._source.editable_elements.where(:slug => meth).try(:first).try(:content)
+ end
+
end
end
end
@@ -23,6 +23,16 @@ def initialize(tag_name, markup, tokens, context)
markup.scan(::Liquid::TagAttributes) { |key, value| @options[key.to_sym] = value.gsub(/"|'/, '') }
@options[:exclude] = Regexp.new(@options[:exclude]) if @options[:exclude]
+
+ @options[:add_attributes] = []
+ if @options[:snippet]
+ template = @options[:snippet].include?('{') ? @options[:snippet] : context[:site].snippets.where(:slug => @options[:snippet] ).try(:first).try(:template)
+ unless template.blank?
+ @options[:liquid_render] = ::Liquid::Template.parse( template )
+ @options[:add_attributes] = ['editable_elements']
+ end
+ end
+
else
raise ::Liquid::SyntaxError.new("Syntax Error in 'nav' - Valid syntax: nav <page|site> <options>")
end
@@ -60,12 +70,12 @@ def fetch_entries(context)
@site, @page = context.registers[:site], context.registers[:page]
children = (case @source
- when 'site' then @site.pages.root.minimal_attributes.first # start from home page
+ when 'site' then @site.pages.root.minimal_attributes( @options[:add_attributes] ).first # start from home page
when 'parent' then @page.parent || @page
when 'page' then @page
else
- @site.pages.fullpath(@source).minimal_attributes.first
- end).children_with_minimal_attributes.to_a
+ @site.pages.fullpath(@source).minimal_attributes( @options[:add_attributes] ).first
+ end).children_with_minimal_attributes( @options[:add_attributes] ).to_a
children.delete_if { |p| !include_page?(p) }
end
@@ -75,7 +85,10 @@ def render_entry_link(page, css, depth)
selected = @page.fullpath =~ /^#{page.fullpath}/ ? " #{@options[:active_class]}" : ''
icon = @options[:icon] ? '<span></span>' : ''
- label = %{#{icon if @options[:icon] != 'after' }#{page.title}#{icon if @options[:icon] == 'after' }}
+
+ title = @options[:liquid_render] ? @options[:liquid_render].render( 'page' => page ) : page.title
+
+ label = %{#{icon if @options[:icon] != 'after' }#{title}#{icon if @options[:icon] == 'after' }}
output = %{<li id="#{page.slug.dasherize}-link" class="link#{selected} #{css}">}
output << %{<a href="/#{@site.localized_page_fullpath(page)}">#{label}</a>}
@@ -89,7 +102,7 @@ def render_entry_link(page, css, depth)
def render_entry_children(page, depth)
output = %{}
- children = page.children_with_minimal_attributes.reject { |c| !include_page?(c) }
+ children = page.children_with_minimal_attributes( @options[:add_attributes] ).reject { |c| !include_page?(c) }
if children.present?
output = %{<ul id="#{@options[:id]}-#{page.slug.dasherize}">}
children.each do |c, page|
@@ -81,6 +81,21 @@
end
+ context '#rendering page with editable_elements' do
+
+ before(:each) do
+ @site = FactoryGirl.create(:site)
+ @home = @site.pages.root.first
+ @home.update_attributes :raw_template => "{% block body %}{% editable_short_text 'body' %}Lorem ipsum{% endeditable_short_text %}{% endblock %}"
+ @home.editable_elements.first.content = 'Lorem ipsum'
+ end
+
+ it 'renders the text of the editable field' do
+ render_template('{{ home.body }}').should == 'Lorem ipsum'
+ end
+
+ end
+
describe 'published?' do
subject { render_template('{{ home.published? }}') }
it { should == @home.published?.to_s }
@@ -96,6 +96,10 @@
render_nav('site', {}, 'icon: after').should match /<li id="child-1-link" class="link first"><a href="\/child_1">Child #1<span><\/span><\/a><\/li>/
end
+ it 'renders a snippet for the title' do
+ render_nav('site', {}, 'snippet: "-{{page.title}}-"').should match /<li id="child-1-link" class="link first"><a href="\/child_1">-Child #1-<\/a><\/li>/
+ end
+
it 'assigns a different dom id' do
render_nav('site', {}, 'id: "main-nav"').should match /<ul id="main-nav">/
end

0 comments on commit b13c5d1

Please sign in to comment.