In the spirit of The Rails Way Free-for-all (http:// www.therailsway.com/2007/6/4/free-for-all-tab-helper), I thought it would be fun to see how we all handle making dynamic navigation for Radiant sites.
PROBLEM: I have a hierarchical site, where each page has several children, and some children also have children. I want a standard left-hand navigation menu. It should be automatically generated. The navigation menu should show the children for only the current page, and it should expand to show the parents and ancestors of the current page. Example: - Home + About - Articles - Article 1 -- you are here + Article 2 + Widgets + Hoozits + Whatzits (- expanded pages) (+ unexpanded pages) If you've done this in Radiant, please post your solution. See mine in action at http://radiant.artofmission.com/ Username: demo, password: radiant. Also see http://biola.artofmission.com (under construction) Pro: * Easy & foolproof - content editors don't even have to think about navigation - it just happens for them. * Automatic - new pages show up in nav automatically. Con: * Slow as molasses. On http://biola.artofmission.com, regenerating a page can take as long as 2 seconds. Here's my code: == Snippets == === Nav === <div id="nav"> <r:find url="/"> <ul> <li<r:if_self> class="current"</r:if_self>><a href="/">Home</ a></li> <r:children:each> <r:snippet name="sub-nav" /> </r:children:each> </ul> </r:find> </div> === sub-nav === <r:unless_content part="no-map"> <li<r:if_self> class="current"</r:if_self>><a href="<r:url />" title="<r:title />"><r:breadcrumb /></a> <r:if_children> <r:if_ancestor_or_self> <ul> <r:children:each> <r:snippet name="sub-nav" /> </r:children:each> </ul> </r:if_ancestor_or_self> </r:if_children> </li> </r:unless_content> == Tags == http://svn.artofmission.com/svn/plugins/radiant/plugins/navigation_tags require 'standard_tags' # make sure we have the previous definition first module StandardTags include Radiant::Taggable # Inspired by this thread: # http://www.mail-archive.com/radiant@lists.radiantcms.org/ msg03234.html desc %{ Renders the contained element if the current item is an ancestor of the current page or if it is the page itself. } tag "if_ancestor_or_self" do |tag| tag.expand if tag.globals.actual_page.url.starts_with? (tag.locals.page.url) end desc %{ Renders the contained element if the current item is also the current page. } tag "if_self" do |tag| tag.expand if tag.locals.page == tag.globals.actual_page end desc %{ Renders the contained elements only if the current contextual page has children. *Usage:* <pre><code><r:if_children>...</r:if_children></code></pre> } tag "if_children" do |tag| children = tag.locals.page.children tag.expand if children.size > 0 end end _______________________________________________ Radiant mailing list Post: Radiant@lists.radiantcms.org Search: http://radiantcms.org/mailing-list/search/ Site: http://lists.radiantcms.org/mailman/listinfo/radiant