spud_cms 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +71 -0
- data/app/assets/images/spud/admin/menus_thumb.png +0 -0
- data/app/assets/images/spud/admin/pages_thumb.png +0 -0
- data/app/assets/images/spud/admin/posts_thumb.png +0 -0
- data/app/assets/images/spud/admin/templates_thumb.png +0 -0
- data/app/assets/javascripts/pages.js +2 -0
- data/app/assets/javascripts/spud/admin/cms/application.js +24 -0
- data/app/assets/javascripts/spud/admin/templates.js +2 -0
- data/app/assets/javascripts/spud/cms/sitemaps.js +2 -0
- data/app/assets/stylesheets/pages.css +4 -0
- data/app/assets/stylesheets/spud/admin/cms/application.css +4 -0
- data/app/assets/stylesheets/spud/cms/sitemaps.css +4 -0
- data/app/controllers/pages_controller.rb +29 -0
- data/app/controllers/spud/admin/menu_items_controller.rb +118 -0
- data/app/controllers/spud/admin/menus_controller.rb +50 -0
- data/app/controllers/spud/admin/pages_controller.rb +149 -0
- data/app/controllers/spud/admin/templates_controller.rb +55 -0
- data/app/controllers/spud/cms/sitemaps_controller.rb +6 -0
- data/app/helpers/pages_helper.rb +2 -0
- data/app/helpers/spud/admin/contacts_helper.rb +2 -0
- data/app/helpers/spud/admin/media_helper.rb +2 -0
- data/app/helpers/spud/admin/menu_items_helper.rb +2 -0
- data/app/helpers/spud/admin/menus_helper.rb +2 -0
- data/app/helpers/spud/admin/pages_helper.rb +2 -0
- data/app/helpers/spud/admin/posts_helper.rb +2 -0
- data/app/helpers/spud/admin/templates_helper.rb +2 -0
- data/app/helpers/spud/admin/users_helper.rb +2 -0
- data/app/helpers/spud/cms/application_helper.rb +102 -0
- data/app/helpers/spud/cms/sitemaps_helper.rb +2 -0
- data/app/helpers/spud/user_sessions_helper.rb +2 -0
- data/app/models/spud_custom_field.rb +7 -0
- data/app/models/spud_menu.rb +6 -0
- data/app/models/spud_menu_item.rb +37 -0
- data/app/models/spud_page.rb +59 -0
- data/app/models/spud_page_partial.rb +3 -0
- data/app/models/spud_template.rb +7 -0
- data/app/views/layouts/spud/admin/cms/detail.html.erb +6 -0
- data/app/views/pages/show.html.erb +25 -0
- data/app/views/spud/admin/contacts/index.html.erb +0 -0
- data/app/views/spud/admin/menu_items/_form.html.erb +34 -0
- data/app/views/spud/admin/menu_items/_menu_item_row.html.erb +18 -0
- data/app/views/spud/admin/menu_items/edit.html.erb +13 -0
- data/app/views/spud/admin/menu_items/index.html.erb +12 -0
- data/app/views/spud/admin/menu_items/new.html.erb +13 -0
- data/app/views/spud/admin/menus/_form.html.erb +9 -0
- data/app/views/spud/admin/menus/edit.html.erb +13 -0
- data/app/views/spud/admin/menus/index.html.erb +24 -0
- data/app/views/spud/admin/menus/new.html.erb +13 -0
- data/app/views/spud/admin/pages/_form.html.erb +71 -0
- data/app/views/spud/admin/pages/_page_partials_form.html.erb +18 -0
- data/app/views/spud/admin/pages/_page_row.html.erb +18 -0
- data/app/views/spud/admin/pages/edit.html.erb +13 -0
- data/app/views/spud/admin/pages/index.html.erb +12 -0
- data/app/views/spud/admin/pages/new.html.erb +12 -0
- data/app/views/spud/admin/pages/show.html.erb +25 -0
- data/app/views/spud/admin/templates/_form.html.erb +31 -0
- data/app/views/spud/admin/templates/edit.html.erb +11 -0
- data/app/views/spud/admin/templates/index.html.erb +17 -0
- data/app/views/spud/admin/templates/new.html.erb +13 -0
- data/app/views/spud/cms/sitemaps/show.xml.builder +16 -0
- data/config/application.rb +48 -0
- data/config/boot.rb +6 -0
- data/config/routes.rb +22 -0
- data/lib/spud_cms.rb +7 -0
- data/lib/spud_cms/configuration.rb +15 -0
- data/lib/spud_cms/engine.rb +29 -0
- metadata +133 -0
@@ -0,0 +1,55 @@
|
|
1
|
+
class Spud::Admin::TemplatesController < Spud::Admin::ApplicationController
|
2
|
+
layout 'spud/admin/cms/detail'
|
3
|
+
add_breadcrumb "Templates", :spud_admin_templates_path
|
4
|
+
belongs_to_spud_app :templates
|
5
|
+
before_filter :load_template,:only => [:edit,:update,:show,:destroy]
|
6
|
+
|
7
|
+
|
8
|
+
def index
|
9
|
+
flash.now[:warning] = "Templates are an advanced way to create modified pages and require some experience in HTML and Ruby."
|
10
|
+
@templates = SpudTemplate.order(:name).paginate :page => params[:page]
|
11
|
+
respond_with @templates
|
12
|
+
end
|
13
|
+
|
14
|
+
def new
|
15
|
+
add_breadcrumb "New", :new_spud_admin_template_path
|
16
|
+
@template = SpudTemplate.new(:base_layout => "application",:page_parts => "Body")
|
17
|
+
respond_with @template
|
18
|
+
end
|
19
|
+
|
20
|
+
def create
|
21
|
+
add_breadcrumb "New", :new_spud_admin_template_path
|
22
|
+
|
23
|
+
@template = SpudTemplate.new(params[:spud_template])
|
24
|
+
|
25
|
+
flash[:notice] = "Template created successfully!" if @template.save
|
26
|
+
|
27
|
+
respond_with @template, :location => spud_admin_templates_url
|
28
|
+
end
|
29
|
+
|
30
|
+
def edit
|
31
|
+
add_breadcrumb "Edit #{@template.name}", :edit_spud_admin_template_path
|
32
|
+
respond_with @template
|
33
|
+
end
|
34
|
+
|
35
|
+
def update
|
36
|
+
add_breadcrumb "Edit #{@template.name}", :edit_spud_admin_template_path
|
37
|
+
flash[:notice] = "Template updated successfully" if @template.update_attributes(params[:spud_template])
|
38
|
+
respond_with @template, :location => spud_admin_templates_url
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
def destroy
|
43
|
+
flash[:notice] = "Template removed" if @template.destroy
|
44
|
+
respond_with @template, :location => spud_admin_templates_url
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
def load_template
|
49
|
+
@template = SpudTemplate.where(:id => params[:id]).first
|
50
|
+
if @template.blank?
|
51
|
+
flash[:error] = "Template not found!"
|
52
|
+
redirect_to spud_admin_templates_url and return false
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
module Spud::Cms::ApplicationHelper
|
2
|
+
def sp_list_pages(options = {})
|
3
|
+
pages = SpudPage.parent_pages
|
4
|
+
if !options.blank?
|
5
|
+
if options.has_key?(:exclude)
|
6
|
+
|
7
|
+
pages = pages.where(["name NOT IN (?)",options[:exclude]])
|
8
|
+
end
|
9
|
+
if options.has_key?(:id)
|
10
|
+
content = "<ul id='#{options.id}'>"
|
11
|
+
else
|
12
|
+
content = "<ul>"
|
13
|
+
end
|
14
|
+
else
|
15
|
+
content = "<ul>"
|
16
|
+
end
|
17
|
+
|
18
|
+
pages.order(:page_order).each do |page|
|
19
|
+
content += "<li><a href='#{page_path(:id => page.url_name)}'>#{page.name}</a>"
|
20
|
+
content += sp_list_page(page)
|
21
|
+
content += "</li>"
|
22
|
+
end
|
23
|
+
content += "</ul>"
|
24
|
+
return content.html_safe
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
def sp_list_menu(options = {})
|
29
|
+
|
30
|
+
menu = SpudMenu
|
31
|
+
if !options.blank?
|
32
|
+
if options.has_key?(:menu_id)
|
33
|
+
menu = menu.where(:id => options[:menu_id])
|
34
|
+
end
|
35
|
+
if options.has_key?(:name)
|
36
|
+
menu = menu.where(:name => options[:name])
|
37
|
+
end
|
38
|
+
if options.has_key?(:id)
|
39
|
+
content = "<ul id='#{options[:id]}'>"
|
40
|
+
else
|
41
|
+
content = "<ul>"
|
42
|
+
end
|
43
|
+
else
|
44
|
+
content = "<ul>"
|
45
|
+
end
|
46
|
+
menu = menu.first
|
47
|
+
if menu.blank?
|
48
|
+
return ""
|
49
|
+
end
|
50
|
+
menu_items = menu.spud_menu_items_combined.select("spud_menu_items.id as id,spud_menu_items.url as url,spud_menu_items.classes as classes,spud_menu_items.parent_type as parent_type,spud_menu_items.menu_order as menu_order,spud_menu_items.parent_id as parent_id,spud_menu_items.name as name,spud_pages.url_name as url_name").order(:parent_type,:parent_id).joins("LEFT JOIN spud_pages ON (spud_pages.id = spud_menu_items.spud_page_id)").all
|
51
|
+
|
52
|
+
grouped_items = menu_items.group_by(&:parent_type)
|
53
|
+
if grouped_items["SpudMenu"].blank?
|
54
|
+
return ""
|
55
|
+
end
|
56
|
+
child_items = grouped_items["SpudMenuItem"].blank? ? [] : grouped_items["SpudMenuItem"].group_by(&:parent_id)
|
57
|
+
|
58
|
+
|
59
|
+
grouped_items["SpudMenu"].sort_by{|p| p.menu_order}.each do |item|
|
60
|
+
content += "<li><a #{"class='#{item.classes}' " if !item.classes.blank?}href='#{!item.url_name.blank? ? page_path(:id => item.url_name) : item.url}'>#{item.name}</a>"
|
61
|
+
content += sp_list_menu_item(child_items,item.id)
|
62
|
+
content += "</li>"
|
63
|
+
end
|
64
|
+
# menu.spud_menu_items.order(:menu_order).each do |item|
|
65
|
+
# content += "<li><a href='#{item.spud_page_id ? page_path(:id => item.spud_page.url_name) : item.url}'>#{item.name}</a>"
|
66
|
+
# content += sp_list_menu_item(item)
|
67
|
+
# content += "</li>"
|
68
|
+
# end
|
69
|
+
content += "</ul>"
|
70
|
+
return content.html_safe
|
71
|
+
end
|
72
|
+
private
|
73
|
+
def sp_list_menu_item(items,item_id)
|
74
|
+
|
75
|
+
spud_menu_items = items[item_id]
|
76
|
+
if spud_menu_items == nil
|
77
|
+
return ""
|
78
|
+
end
|
79
|
+
content = "<ul>"
|
80
|
+
|
81
|
+
spud_menu_items.sort_by{|p| p.menu_order}.each do |item|
|
82
|
+
content += "<li><a #{"class='#{item.classes}' " if !item.classes.blank?}href='#{!item.url_name.blank? ? page_path(:id => item.url_name) : item.url}'>#{item.name}</a>"
|
83
|
+
content += sp_list_menu_item(items,item.id)
|
84
|
+
content += "</li>"
|
85
|
+
end
|
86
|
+
content += "</ul>"
|
87
|
+
return content.html_safe
|
88
|
+
end
|
89
|
+
def sp_list_page(page)
|
90
|
+
if page.spud_pages.count == 0
|
91
|
+
return ""
|
92
|
+
end
|
93
|
+
content = "<ul>"
|
94
|
+
page.spud_pages.order(:page_order).each do |page|
|
95
|
+
content += "<li><a href='#{page_path(:id => page.url_name)}'>#{page.name}</a>"
|
96
|
+
content += sp_list_page(page)
|
97
|
+
content += "</li>"
|
98
|
+
end
|
99
|
+
content += "</ul>"
|
100
|
+
return content.html_safe
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
class SpudMenuItem < ActiveRecord::Base
|
2
|
+
belongs_to :parent, :polymorphic=>true
|
3
|
+
belongs_to :spud_menu
|
4
|
+
belongs_to :spud_page
|
5
|
+
has_many :spud_menu_items,:as => :parent,:dependent => :destroy
|
6
|
+
|
7
|
+
validates :name,:presence => true
|
8
|
+
validates :parent_type,:presence => true
|
9
|
+
validates :parent_id,:presence => true
|
10
|
+
|
11
|
+
|
12
|
+
def options_tree(options,depth,current = nil)
|
13
|
+
sub_items = self.spud_menu_items
|
14
|
+
sub_items = sub_items.where(["id != ?",current.id]) if !current.blank? && !current.id.blank?
|
15
|
+
if(sub_items.blank?)
|
16
|
+
return options
|
17
|
+
end
|
18
|
+
sub_items.each do |item|
|
19
|
+
options << ["#{'-'*depth} #{item.name}",item.id]
|
20
|
+
options = item.options_tree(options,depth+1,current)
|
21
|
+
end
|
22
|
+
return options
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.options_tree_for_item(item,menu)
|
26
|
+
items = menu.spud_menu_items
|
27
|
+
items = items.where(["id != ?",item.id]) if !item.blank? && !item.id.blank?
|
28
|
+
|
29
|
+
|
30
|
+
options = []
|
31
|
+
items.each do |item|
|
32
|
+
options << ["#{item.name}",item.id]
|
33
|
+
options = item.options_tree(options,1,item)
|
34
|
+
end
|
35
|
+
return options
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
class SpudPage < ActiveRecord::Base
|
2
|
+
belongs_to :spud_page
|
3
|
+
belongs_to :spud_template,:foreign_key => :template_id
|
4
|
+
has_many :spud_pages, :dependent => :nullify
|
5
|
+
has_many :spud_page_partials,:dependent => :destroy
|
6
|
+
has_many :spud_custom_fields,:as => :parent,:dependent => :destroy
|
7
|
+
belongs_to :created_by_user,:class_name => "SpudUser",:foreign_key => :created_by
|
8
|
+
belongs_to :updated_by_user,:class_name => "SpudUser",:foreign_key => :updated_by
|
9
|
+
|
10
|
+
before_validation :generate_url_name
|
11
|
+
validates :name,:presence => true
|
12
|
+
validates :url_name,:presence => true, :uniqueness => true
|
13
|
+
|
14
|
+
accepts_nested_attributes_for :spud_custom_fields
|
15
|
+
accepts_nested_attributes_for :spud_page_partials, :allow_destroy => true
|
16
|
+
scope :parent_pages, where(:spud_page_id => nil)
|
17
|
+
scope :published_pages, where(:published => true)
|
18
|
+
scope :public, where(:visibility => 0)
|
19
|
+
|
20
|
+
def options_tree(options,depth,current_page = nil)
|
21
|
+
sub_pages = self.spud_pages
|
22
|
+
sub_pages = sub_pages.where(["id != ?",current_page.id]) if !current_page.blank? && !current_page.id.blank?
|
23
|
+
if(sub_pages.blank?)
|
24
|
+
return options
|
25
|
+
end
|
26
|
+
sub_pages.each do |page|
|
27
|
+
options << ["#{'-'*depth} #{page.name}",page.id]
|
28
|
+
options = page.options_tree(options,depth+1,current_page)
|
29
|
+
end
|
30
|
+
return options
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.options_tree_for_page(page)
|
34
|
+
pages = SpudPage.parent_pages
|
35
|
+
pages = pages.where(["id != ?",page.id]) if !page.blank? && !page.id.blank?
|
36
|
+
|
37
|
+
|
38
|
+
options = []
|
39
|
+
pages.each do |sub_page|
|
40
|
+
options << ["#{sub_page.name}",sub_page.id]
|
41
|
+
options = sub_page.options_tree(options,1,page)
|
42
|
+
end
|
43
|
+
return options
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
def generate_url_name
|
49
|
+
if !self.use_custom_url_name || self.url_name.blank?
|
50
|
+
self.url_name = self.name.gsub(/[^a-zA-Z0-9\ ]/," ").gsub(/\ \ +/," ").gsub(/\ /,"-").downcase
|
51
|
+
self.use_custom_url_name = false
|
52
|
+
end
|
53
|
+
return true
|
54
|
+
end
|
55
|
+
|
56
|
+
def is_private?
|
57
|
+
return self.visibility == 1
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,6 @@
|
|
1
|
+
<%=content_for :head do%>
|
2
|
+
<%= javascript_include_tag "wymeditor/jquery.wymeditor.min" %>
|
3
|
+
<%= stylesheet_link_tag "spud/admin/cms/application" %>
|
4
|
+
<%= javascript_include_tag "spud/admin/cms/application" %>
|
5
|
+
<%end%>
|
6
|
+
<%= render :template => 'layouts/spud/admin/detail' %>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
|
2
|
+
<%=content_for :head do%>
|
3
|
+
<%if !@page.meta_description.blank?%>
|
4
|
+
<meta name="description" content="<%=@page.meta_description%>" />
|
5
|
+
<%end%>
|
6
|
+
<%if !@page.meta_keywords.blank?%>
|
7
|
+
<meta name="keywords" content="<%=@page.meta_keywords%>" />
|
8
|
+
<%end%>
|
9
|
+
<%end%>
|
10
|
+
|
11
|
+
<%if !@inline.blank?%>
|
12
|
+
<%=render :inline => @inline%>
|
13
|
+
<%else%>
|
14
|
+
<h2><%=@page.name%></h2>
|
15
|
+
<%end%>
|
16
|
+
<%@page.spud_page_partials.each do |page_partial|%>
|
17
|
+
|
18
|
+
<%if(page_partial.name.downcase == 'body' && Spud::Cms.yield_body_as_content_block == false)%>
|
19
|
+
<%=page_partial.content.html_safe%>
|
20
|
+
<%else%>
|
21
|
+
<%=content_for page_partial.name.parameterize.underscore.to_sym do%>
|
22
|
+
<%=page_partial.content.html_safe%>
|
23
|
+
<%end%>
|
24
|
+
<%end%>
|
25
|
+
<%end%>
|
File without changes
|
@@ -0,0 +1,34 @@
|
|
1
|
+
<fieldset>
|
2
|
+
<ol>
|
3
|
+
<li><%=f.label :name, :required=>true%>
|
4
|
+
<%=f.text_field :name,:title => "",:size=>40%>
|
5
|
+
<%=error_message_on "menu_item","name"%>
|
6
|
+
</li>
|
7
|
+
<li><%=f.label :menu_order, :required=>true%>
|
8
|
+
<%=f.text_field :menu_order,:title => "",:size=>5%>
|
9
|
+
<%=error_message_on "menu_item","menu_order"%>
|
10
|
+
</li>
|
11
|
+
<li><%=f.label :spud_page_id, "Page"%>
|
12
|
+
<%=f.select :spud_page_id,options_for_select(SpudPage.options_tree_for_page(nil),@menu_item.spud_page_id),{:include_blank => 'Use URL instead'},{:title => "",:onchange => "if($(this).val() != '') {$('#spud_menu_item_url').val('');}"}%>
|
13
|
+
<%=error_message_on "menu_item","spud_page_id"%>
|
14
|
+
</li>
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
<li><%=f.label :url%>
|
19
|
+
<%=f.text_field :url,:title => "",:size=>40%>
|
20
|
+
<%=error_message_on "menu_item","url"%>
|
21
|
+
</li>
|
22
|
+
<li><%=f.label :classes%>
|
23
|
+
<%=f.text_field :classes,:title => "",:size=>40%>
|
24
|
+
<%=error_message_on "menu_item","classes"%>
|
25
|
+
</li>
|
26
|
+
<li><%=f.label :parent, "Parent Menu"%>
|
27
|
+
<%=f.select :parent_id,options_for_select(SpudMenuItem.options_tree_for_item(@menu_item,@menu),@menu_item.parent_id),{:include_blank => "#{@menu.name}"},{:title => ""}%>
|
28
|
+
<%=error_message_on "menu_item","parent"%>
|
29
|
+
</li>
|
30
|
+
</ol>
|
31
|
+
</fieldset>
|
32
|
+
|
33
|
+
|
34
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<div class="page_row">
|
2
|
+
|
3
|
+
<span class="row_meta"><%=prefix if defined? prefix%><%=link_to menu_item.name,edit_spud_admin_menu_menu_item_path(:id => menu_item.id)%></span>
|
4
|
+
|
5
|
+
<span class="edit_controls"><%=link_to "Edit",edit_spud_admin_menu_menu_item_path(:id => menu_item.id), :title => "Edit Menu Item",:class => 'button'%> <%=link_to "Remove",spud_admin_menu_menu_item_path(:id => menu_item.id),:method => :delete,:class => 'button',:confirm => "Are you sure you want to remove this menu item?"%></span>
|
6
|
+
<br style="clear:both;"/>
|
7
|
+
</div>
|
8
|
+
<%if !menu_item.spud_menu_items.all.blank?%>
|
9
|
+
|
10
|
+
<div class="left_guide">
|
11
|
+
|
12
|
+
<%menu_item.spud_menu_items.order(:menu_order).each do |menu_item|%>
|
13
|
+
<%=render :partial => 'menu_item_row',:locals => {:menu_item => menu_item}%>
|
14
|
+
<%end%>
|
15
|
+
|
16
|
+
</div>
|
17
|
+
|
18
|
+
<%end%>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
|
4
|
+
<%=form_for @menu_item,:url => spud_admin_menu_menu_item_path(:id => @menu_item.id),:html=>{:class=>"right_aligned_form"} do |f|%>
|
5
|
+
<%=render :partial => "form",:locals => {:f => f}%>
|
6
|
+
<fieldset class="submit"><%=f.submit%> or <%=link_to "cancel",request.referer%></fieldset>
|
7
|
+
<%end%>
|
8
|
+
|
9
|
+
<script type="text/javascript">
|
10
|
+
$('input[type=submit],.close_dialog').button();
|
11
|
+
|
12
|
+
</script>
|
13
|
+
|