From 8dcde174cf22cfb45e7443b98d0e9b12eb7f9fd3 Mon Sep 17 00:00:00 2001
From: Wen-Tien Chang
Date: Fri, 8 May 2009 01:54:33 +0800
Subject: [PATCH] Add page layout support
---
app/controllers/admin/layouts_controller.rb | 82 +++++++++++++++++++++
app/controllers/pages_controller.rb | 5 +-
app/models/layout.rb | 8 ++
app/models/page.rb | 14 ++++
app/views/admin/layouts/edit.html.erb | 21 ++++++
app/views/admin/layouts/index.html.erb | 18 +++++
app/views/admin/layouts/new.html.erb | 21 ++++++
app/views/admin/pages/edit.html.erb | 5 ++
app/views/admin/pages/new.html.erb | 5 ++
config/routes.rb | 1 +
10 files changed, 179 insertions(+), 1 deletion(-)
create mode 100644 app/controllers/admin/layouts_controller.rb
create mode 100644 app/models/layout.rb
create mode 100644 app/views/admin/layouts/edit.html.erb
create mode 100644 app/views/admin/layouts/index.html.erb
create mode 100644 app/views/admin/layouts/new.html.erb
diff --git a/app/controllers/admin/layouts_controller.rb b/app/controllers/admin/layouts_controller.rb
new file mode 100644
index 00000000..987fc4e3
--- /dev/null
+++ b/app/controllers/admin/layouts_controller.rb
@@ -0,0 +1,82 @@
+class Admin::LayoutsController < ApplicationController
+ # GET /layouts
+ # GET /layouts.xml
+ def index
+ @layouts = Layout.all
+
+ respond_to do |format|
+ format.html # index.html.erb
+ format.xml { render :xml => @layouts }
+ end
+ end
+
+ # GET /layouts/1
+ # GET /layouts/1.xml
+ def show
+ @layout = Layout.find(params[:id])
+
+ redirect_to "/#{@layout.name}"
+ end
+
+ # GET /layouts/new
+ # GET /layouts/new.xml
+ def new
+ @layout = Layout.new
+
+ respond_to do |format|
+ format.html # new.html.erb
+ format.xml { render :xml => @layouts }
+ end
+ end
+
+ # GET /layouts/1/edit
+ def edit
+ @layout = Layout.find(params[:id])
+ end
+
+ # POST /layouts
+ # POST /layouts.xml
+ def create
+ @layout = Layout.new(params[:layout])
+
+ respond_to do |format|
+ if @layout.save
+ flash[:notice] = 'Layout was successfully created.'
+ format.html { redirect_to admin_layouts_url }
+ format.xml { render :xml => @layout, :status => :created, :location => @layouts }
+ else
+ format.html { render :action => "new" }
+ format.xml { render :xml => @layout.errors, :status => :unprocessable_entity }
+ end
+ end
+ end
+
+ # PUT /layouts/1
+ # PUT /layouts/1.xml
+ def update
+ @layout = Layout.find(params[:id])
+
+ respond_to do |format|
+ if @layout.update_attributes(params[:layout])
+ flash[:notice] = 'Layout was successfully updated.'
+ format.html { redirect_to admin_layouts_url }
+ format.xml { head :ok }
+ else
+ format.html { render :action => "edit" }
+ format.xml { render :xml => @layout.errors, :status => :unprocessable_entity }
+ end
+ end
+ end
+
+ # DELETE /layouts/1
+ # DELETE /layouts/1.xml
+ def destroy
+ @layout = Layout.find(params[:id])
+ @layout.destroy
+
+ respond_to do |format|
+ format.html { redirect_to admin_layouts_url }
+ format.xml { head :ok }
+ end
+ end
+end
diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb
index 53d499ee..159d2e6c 100644
--- a/app/controllers/pages_controller.rb
+++ b/app/controllers/pages_controller.rb
@@ -2,9 +2,12 @@ class PagesController < ApplicationController
def show
@page = Page.find_by_name(params[:page_name])
+ @layout = @page.layout
if @page
- render :text => Liquid::Template.parse(@page.content).render
+ @page_content = Liquid::Template.parse(@page.content).render
+ @layout_content = (@page.layout)? @layout.content : "{{page_content}}"
+ render :text => Liquid::Template.parse(@layout_content).render( 'page_content' => @page_content )
else
render :text => '404 not found'
end
diff --git a/app/models/layout.rb b/app/models/layout.rb
new file mode 100644
index 00000000..cc1ea534
--- /dev/null
+++ b/app/models/layout.rb
@@ -0,0 +1,8 @@
+class Layout < CouchFoo::Base
+
+ property :name, String
+ property :content, String
+
+ validates_presence_of :name
+
+end
\ No newline at end of file
diff --git a/app/models/page.rb b/app/models/page.rb
index 56caa2d0..a34097fb 100644
--- a/app/models/page.rb
+++ b/app/models/page.rb
@@ -3,7 +3,21 @@ class Page < CouchFoo::Base
property :name, String
property :parent_name, String
property :content, String
+ property :layout_id, String
+ property :layout_name, String
+
+ belongs_to :layout
validates_presence_of :name
+ before_save :setup_layout_id
+
+ def setup_layout_id
+ if self.layout_name.blank?
+ self.layout_id = nil
+ else
+ self.layout_id = Layout.find_by_name( self.layout_name ).id
+ end
+ end
+
end
\ No newline at end of file
diff --git a/app/views/admin/layouts/edit.html.erb b/app/views/admin/layouts/edit.html.erb
new file mode 100644
index 00000000..41ae1874
--- /dev/null
+++ b/app/views/admin/layouts/edit.html.erb
@@ -0,0 +1,21 @@
+Editing layouts
+
+<% form_for @layout, :url => admin_layout_path(@layout) do |f| %>
+ <%= f.error_messages %>
+
+
+ <%= f.label :name, "Name" %>
+ <%= f.text_field :name %>
+
+
+
+ <%= f.label :content, "Content" %>
+ <%= f.text_area :content, :size => '100x30' %>
+
+
+
+ <%= f.submit 'Update' %>
+
+<% end %>
+
+<%= link_to 'Back', admin_layouts_path %>
\ No newline at end of file
diff --git a/app/views/admin/layouts/index.html.erb b/app/views/admin/layouts/index.html.erb
new file mode 100644
index 00000000..508ba088
--- /dev/null
+++ b/app/views/admin/layouts/index.html.erb
@@ -0,0 +1,18 @@
+Listing layouts
+
+
+
+
+
+<% @layouts.each do |layout| %>
+
+ <%= layout.name %> |
+ <%= link_to 'Edit', edit_admin_layout_path(layout) %> |
+ <%= link_to 'Destroy', admin_layout_path(layout), :confirm => 'Are you sure?', :method => :delete %> |
+
+<% end %>
+
+
+
+
+<%= link_to 'New layouts', new_admin_layout_path %>
\ No newline at end of file
diff --git a/app/views/admin/layouts/new.html.erb b/app/views/admin/layouts/new.html.erb
new file mode 100644
index 00000000..f9191224
--- /dev/null
+++ b/app/views/admin/layouts/new.html.erb
@@ -0,0 +1,21 @@
+New layouts
+
+<% form_for :layout, :url => admin_layouts_path do |f| %>
+ <%= f.error_messages %>
+
+
+ <%= f.label :name, "Name" %>
+ <%= f.text_field :name %>
+
+
+
+ <%= f.label :content, "Content" %>
+ <%= f.text_area :content, :size => '100x30' %>
+
+
+
+ <%= f.submit 'Create' %>
+
+<% end %>
+
+<%= link_to 'Back', admin_layouts_path %>
\ No newline at end of file
diff --git a/app/views/admin/pages/edit.html.erb b/app/views/admin/pages/edit.html.erb
index b9eb861b..77559c8c 100644
--- a/app/views/admin/pages/edit.html.erb
+++ b/app/views/admin/pages/edit.html.erb
@@ -8,6 +8,11 @@
<%= f.text_field :name %>
+
+ <%= f.label :layout_name, "Layout Name" %>
+ <%= f.text_field :layout_name %>
+
+
<%= f.label :content, "Content" %>
<%= f.text_area :content, :size => '100x30' %>
diff --git a/app/views/admin/pages/new.html.erb b/app/views/admin/pages/new.html.erb
index a1482467..76412879 100644
--- a/app/views/admin/pages/new.html.erb
+++ b/app/views/admin/pages/new.html.erb
@@ -8,6 +8,11 @@
<%= f.text_field :name %>
+
+ <%= f.label :layout_name, "Layout Name" %>
+ <%= f.text_field :layout_name %>
+
+
<%= f.label :content, "Content" %>
<%= f.text_area :content, :size => '100x30' %>
diff --git a/config/routes.rb b/config/routes.rb
index 7cdda3c3..6e988cb0 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -2,6 +2,7 @@ ActionController::Routing::Routes.draw do |map|
map.namespace :admin do |admin|
admin.resources :pages
+ admin.resources :layouts
end
# The priority is based upon order of creation: first created -> highest priority.