Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pass dynamic content to template in Middleman

Tags:

yaml

middleman

I'm building a static site using Middleman that has a portfolio section of all the client's recent projects. The portfolio section will display project thumbnail images in a 3 X 3 gallery fashion and, when clicked on, will open their co-responding html page inside a lightbox.

The layout for the pages inside the light box is the same so rather than markup each individual page, I thought there would be a way for Middleman handling the content served from a yaml data file (projects.yml) using [a link.

Here's what I've got in my config.rb file

###
# Page options, layouts, aliases and proxies
###

# A path which all have the same layout
with_layout :popup do
  page "/projects/*"
end

# Proxy (fake) files
# page "/this-page-has-no-template.html", :proxy => "/template-file.html" do
#   @which_fake_page = "Rendering a fake page with a variable"
# end
data.projects.details.each do |pd|
  proxy "/projects/#{pd[:client_name]}.html", "/projects/template.html", locals: { project: pd }, ignore: true
end
like image 535
Tom Gillard Avatar asked Dec 11 '22 17:12

Tom Gillard


1 Answers

Ok so after some digging I came across the two posts below which helped me under stand how dynamic pages work in middleman. (Unfortunately there's not a lot of doco and the Middleman example for Dynamic pages is really basic)

http://benfrain.com/understanding-middleman-the-static-site-generator-for-faster-prototyping/ http://forum.middlemanapp.com/discussion/134/best-way-to-use-yaml-same-html-but-parameter-driven-data-fixed/p1

My solution...

data/projects.yml (contains project details)

details:
  - client: "Company X"
    title: "Company X Event"
    video_url: ""
    logo: 
      - "logo_companyx.gif"
    image_path: "/img/projects/companyx"
    total_images: 10
    content: "<p>Blah blah blah</p>"
    responsibilities: 
      "<li>Something</li>
      <li>Some task</li>"

config.rb:

data.projects.details.each do |pd|
    proxy "/projects/#{pd[:client]}.html", "/projects/template.html", :layout => false, :locals => { :project => pd }, :ignore => true
end

The trick with the snippet above is passing the entire project data object to the template via a proxy using locals and setting the layout to false so it doesn't inherit the default site layout (as I - or the client rather - want to display these in a lightbox popup)

The last step in the process was to create /projects/template.html.erb (in the source folder), declaring the following at the top of the template

<% p = locals[:project] %>

This allowed me to output each property of the p object within template.html.erb.

eg:

<%= p[:title] %>

I hope this helps someone as it took me a few days of playing around and LOTS of searching online for example or hints.

like image 153
Tom Gillard Avatar answered Jan 04 '23 22:01

Tom Gillard