tb_cms 0.9.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
- data/MIT-LICENSE +20 -0
- data/README.markdown +110 -0
- data/Rakefile +28 -0
- data/app/assets/images/spud/admin/menus_thumb.png +0 -0
- data/app/assets/images/spud/admin/menus_thumb@2x.png +0 -0
- data/app/assets/images/spud/admin/pages_thumb.png +0 -0
- data/app/assets/images/spud/admin/snippets_thumb.png +0 -0
- data/app/assets/images/spud/admin/snippets_thumb@2x.png +0 -0
- data/app/assets/javascripts/spud/admin/cms/application.js +25 -0
- data/app/assets/javascripts/spud/admin/cms/menu_items.js +35 -0
- data/app/assets/javascripts/spud/admin/cms/pages.js +29 -0
- data/app/assets/javascripts/spud/admin/snippets.js +2 -0
- data/app/assets/stylesheets/spud/admin/cms/application.css +28 -0
- data/app/assets/stylesheets/spud/admin/cms.css +4 -0
- data/app/assets/stylesheets/spud/admin/snippets.css +4 -0
- data/app/controllers/pages_controller.rb +90 -0
- data/app/controllers/spud/admin/cms_controller.rb +3 -0
- data/app/controllers/spud/admin/menu_items_controller.rb +115 -0
- data/app/controllers/spud/admin/menus_controller.rb +55 -0
- data/app/controllers/spud/admin/pages_controller.rb +182 -0
- data/app/controllers/spud/admin/snippets_controller.rb +61 -0
- data/app/controllers/spud/cms/sitemaps_controller.rb +13 -0
- data/app/helpers/spud/cms/application_helper.rb +283 -0
- data/app/models/spud_menu.rb +9 -0
- data/app/models/spud_menu_item.rb +72 -0
- data/app/models/spud_page.rb +131 -0
- data/app/models/spud_page_liquid_tag.rb +4 -0
- data/app/models/spud_page_partial.rb +67 -0
- data/app/models/spud_page_partial_revision.rb +5 -0
- data/app/models/spud_snippet.rb +42 -0
- data/app/observers/page_sweeper.rb +48 -0
- data/app/observers/snippet_sweeper.rb +41 -0
- data/app/views/pages/not_found.html.erb +2 -0
- data/app/views/pages/show.html.erb +24 -0
- data/app/views/spud/admin/menu_items/_form.html.erb +51 -0
- data/app/views/spud/admin/menu_items/_menu_item_row.html.erb +22 -0
- data/app/views/spud/admin/menu_items/edit.html.erb +10 -0
- data/app/views/spud/admin/menu_items/index.html.erb +17 -0
- data/app/views/spud/admin/menu_items/new.html.erb +12 -0
- data/app/views/spud/admin/menus/_form.html.erb +11 -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 +7 -0
- data/app/views/spud/admin/pages/_form.html.erb +95 -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 +32 -0
- data/app/views/spud/admin/pages/index.html.erb +13 -0
- data/app/views/spud/admin/pages/new.html.erb +34 -0
- data/app/views/spud/admin/pages/show.html.erb +20 -0
- data/app/views/spud/admin/snippets/_form.html.erb +8 -0
- data/app/views/spud/admin/snippets/edit.html.erb +7 -0
- data/app/views/spud/admin/snippets/index.html.erb +24 -0
- data/app/views/spud/admin/snippets/new.html.erb +7 -0
- data/app/views/spud/admin/templates/_form.html.erb +43 -0
- data/app/views/spud/admin/templates/edit.html.erb +9 -0
- data/app/views/spud/admin/templates/index.html.erb +17 -0
- data/app/views/spud/admin/templates/new.html.erb +11 -0
- data/app/views/spud/cms/sitemaps/show.xml.builder +16 -0
- data/config/boot.rb +6 -0
- data/config/routes.rb +29 -0
- data/db/migrate/20120101192412_create_spud_pages.rb +19 -0
- data/db/migrate/20120101193138_create_spud_menus.rb +10 -0
- data/db/migrate/20120101193255_create_spud_menu_items.rb +17 -0
- data/db/migrate/20120101194124_create_spud_templates.rb +11 -0
- data/db/migrate/20120103034659_create_spud_page_partials.rb +13 -0
- data/db/migrate/20120104194032_add_visibility_to_spud_pages.rb +6 -0
- data/db/migrate/20120107181337_add_menu_name_to_spud_menu_items.rb +5 -0
- data/db/migrate/20120111134754_add_use_custom_url_name_to_spud_pages.rb +5 -0
- data/db/migrate/20120118141852_add_notes_to_spud_pages.rb +5 -0
- data/db/migrate/20120126232428_add_menu_id_to_spud_menu_items.rb +7 -0
- data/db/migrate/20120128163601_add_classes_to_spud_menu_items.rb +6 -0
- data/db/migrate/20120329132314_add_site_id_to_spud_pages.rb +6 -0
- data/db/migrate/20120329132322_add_site_id_to_spud_templates.rb +6 -0
- data/db/migrate/20120329132330_add_site_id_to_spud_menus.rb +6 -0
- data/db/migrate/20120510195151_create_spud_page_partial_revisions.rb +13 -0
- data/db/migrate/20120911190030_add_symbol_name_to_spud_page_partials.rb +5 -0
- data/db/migrate/20120912121313_modify_site_id_for_spud_pages.rb +15 -0
- data/db/migrate/20121016233715_add_content_processed_to_spud_page_partials.rb +5 -0
- data/db/migrate/20121112151110_add_layout_to_spud_pages.rb +8 -0
- data/db/migrate/20121112212113_create_spud_page_liquid_tags.rb +11 -0
- data/db/migrate/20121119025608_create_spud_snippets.rb +17 -0
- data/db/migrate/20121119030136_change_liquid_tags_to_polymorphic.rb +17 -0
- data/lib/generators/spud/cms/template_generator.rb +17 -0
- data/lib/generators/spud/cms/templates/template.html.erb +28 -0
- data/lib/spud_cms/configuration.rb +27 -0
- data/lib/spud_cms/engine.rb +69 -0
- data/lib/spud_cms/liquid_snippet.rb +29 -0
- data/lib/spud_cms/page_route.rb +5 -0
- data/lib/spud_cms/template_parser.rb +126 -0
- data/lib/spud_cms/test_files.rb +25 -0
- data/lib/spud_cms/version.rb +5 -0
- data/lib/spud_cms.rb +10 -0
- data/lib/tasks/spud_cms_tasks.rake +4 -0
- data/spec/controllers/pages_controller_spec.rb +108 -0
- data/spec/controllers/spud/admin/cms_controller_spec.rb +11 -0
- data/spec/controllers/spud/admin/menu_items_controller_spec.rb +148 -0
- data/spec/controllers/spud/admin/menus_controller_spec.rb +121 -0
- data/spec/controllers/spud/admin/pages_controller_spec.rb +111 -0
- data/spec/controllers/spud/admin/snippets_controller_spec.rb +5 -0
- data/spec/controllers/spud/cms/sitemaps_controller_spec.rb +48 -0
- data/spec/dummy/README.rdoc +261 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +15 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/app/views/layouts/content_left.html.erb +0 -0
- data/spec/dummy/config/application.rb +59 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +15 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +67 -0
- data/spec/dummy/config/environments/test.rb +37 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +15 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +3 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/db/migrate/20120307002859_create_spud_admin_permissions.spud_core.rb +12 -0
- data/spec/dummy/db/migrate/20120307002860_create_spud_users.spud_core.rb +30 -0
- data/spec/dummy/db/migrate/20120307003559_create_spud_permalinks.spud_permalinks.rb +12 -0
- data/spec/dummy/db/migrate/20120610123555_add_time_zone_to_spud_user.spud_core.rb +7 -0
- data/spec/dummy/db/migrate/20120610123556_add_scope_to_spud_admin_permissions.spud_core.rb +7 -0
- data/spec/dummy/db/migrate/20120610123557_create_spud_user_settings.spud_core.rb +12 -0
- data/spec/dummy/db/migrate/20120610123615_add_site_id_to_spud_permalinks.spud_permalinks.rb +7 -0
- data/spec/dummy/db/schema.rb +171 -0
- data/spec/dummy/log/test.log +1874 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +25 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/helpers/spud/cms/application_helper_spec.rb +160 -0
- data/spec/models/spud_menu_item_spec.rb +31 -0
- data/spec/models/spud_page_liquid_tag_spec.rb +5 -0
- data/spec/models/spud_page_partial_revision_spec.rb +5 -0
- data/spec/models/spud_page_partial_spec.rb +44 -0
- data/spec/models/spud_page_spec.rb +163 -0
- data/spec/models/spud_snippet_spec.rb +5 -0
- data/spec/spec_helper.rb +40 -0
- data/spec/support/authlogic_helper.rb +2 -0
- metadata +427 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
class SpudPage < ActiveRecord::Base
|
|
2
|
+
spud_searchable
|
|
3
|
+
belongs_to :spud_page
|
|
4
|
+
has_many :spud_page_partial_revisions
|
|
5
|
+
has_many :spud_pages, :dependent => :nullify
|
|
6
|
+
has_many :spud_page_partials,:dependent => :destroy
|
|
7
|
+
has_many :spud_permalinks,:as => :attachment, :dependent => :destroy
|
|
8
|
+
belongs_to :created_by_user,:class_name => "SpudUser",:foreign_key => :created_by
|
|
9
|
+
belongs_to :updated_by_user,:class_name => "SpudUser",:foreign_key => :updated_by
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
attr_accessible :name,:url_name,:created_by,:updated_by,:layout,:visibility,:spud_page_id,:publish_at,:format,:meta_description,:meta_keywords,:page_order,:spud_page_partials_attributes,:use_custom_url_name,:published,:notes
|
|
13
|
+
|
|
14
|
+
before_validation :generate_url_name
|
|
15
|
+
validates :name,:presence => true
|
|
16
|
+
validates_uniqueness_of :name, :scope => [:site_id,:spud_page_id]
|
|
17
|
+
validates :url_name,:presence => true
|
|
18
|
+
validates_uniqueness_of :url_name, :scope => :site_id
|
|
19
|
+
|
|
20
|
+
accepts_nested_attributes_for :spud_page_partials, :allow_destroy => true
|
|
21
|
+
scope :parent_pages, where(:spud_page_id => nil)
|
|
22
|
+
scope :site, lambda {|sid| where(:site_id => sid)}
|
|
23
|
+
scope :published_pages, where(:published => true)
|
|
24
|
+
scope :public, where(:visibility => 0)
|
|
25
|
+
|
|
26
|
+
def full_content_processed
|
|
27
|
+
self.spud_page_partials.collect{|partial| partial.content_processed }.join(' ')
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def self.grouped(site_id=0)
|
|
31
|
+
|
|
32
|
+
if(Spud::Core.multisite_mode_enabled)
|
|
33
|
+
return site(site_id).all.group_by(&:spud_page_id)
|
|
34
|
+
else
|
|
35
|
+
return all.group_by(&:spud_page_id)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def to_liquid
|
|
40
|
+
return {'name' => self.name, 'url_name' => self.url_name}
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Returns an array of pages in order of heirarchy
|
|
44
|
+
# :fitler Filters out a page by ID, and all of its children
|
|
45
|
+
# :value Pick an attribute to be used in the value field, defaults to ID
|
|
46
|
+
def self.options_tree_for_page(config={})
|
|
47
|
+
collection = config[:collection] || self.grouped(config[:site_id])
|
|
48
|
+
level = config[:level] || 0
|
|
49
|
+
parent_id = config[:parent_id] || nil
|
|
50
|
+
filter = config[:filter] || nil
|
|
51
|
+
value = config[:value] || :id
|
|
52
|
+
list = []
|
|
53
|
+
if collection[parent_id]
|
|
54
|
+
collection[parent_id].each do |c|
|
|
55
|
+
if filter.blank? || c.id != filter.id
|
|
56
|
+
list << [level.times.collect{ '- ' }.join('') + c.name, c[value]]
|
|
57
|
+
list += self.options_tree_for_page({:collection => collection, :parent_id => c.id, :level => level+1, :filter => filter})
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
return list
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def generate_url_name
|
|
66
|
+
return true if self.name.blank?
|
|
67
|
+
if !self.use_custom_url_name || self.url_name.blank?
|
|
68
|
+
url_name = ""
|
|
69
|
+
if !self.spud_page.blank?
|
|
70
|
+
url_name += self.spud_page.url_name + "/"
|
|
71
|
+
end
|
|
72
|
+
url_name += self.name.parameterize.downcase
|
|
73
|
+
if !self.use_custom_url_name
|
|
74
|
+
pages = SpudPage
|
|
75
|
+
|
|
76
|
+
if !self.id.blank?
|
|
77
|
+
pages = pages.where("id != #{self.id}")
|
|
78
|
+
end
|
|
79
|
+
url_names = pages.site(self.site_id).all.collect{|p| p.url_name}
|
|
80
|
+
|
|
81
|
+
counter = 1
|
|
82
|
+
url_name_new = url_name
|
|
83
|
+
while url_names.include?(url_name_new) do
|
|
84
|
+
url_name_new = url_name + "-#{counter}"
|
|
85
|
+
counter += 1
|
|
86
|
+
end
|
|
87
|
+
# url_name = url_name_new
|
|
88
|
+
# Check Permalinks List
|
|
89
|
+
|
|
90
|
+
permalink = SpudPermalink.site(self.site_id).where(:url_name => url_name_new).first
|
|
91
|
+
counter = 1
|
|
92
|
+
while permalink.blank? == false
|
|
93
|
+
|
|
94
|
+
if permalink.attachment == self
|
|
95
|
+
permalink.destroy
|
|
96
|
+
permalink = nil
|
|
97
|
+
else
|
|
98
|
+
url_name_new = url_name + "-#{counter}"
|
|
99
|
+
counter += 1
|
|
100
|
+
permalink = SpudPermalink.site(self.site_id).where(:url_name => url_name_new).first
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
url_name = url_name_new
|
|
104
|
+
end
|
|
105
|
+
if self.url_name.blank? == false && url_name != self.url_name
|
|
106
|
+
self.spud_permalinks.create(:url_name => self.url_name,:site_id => self.site_id)
|
|
107
|
+
end
|
|
108
|
+
self.url_name = url_name
|
|
109
|
+
self.use_custom_url_name = false
|
|
110
|
+
elsif self.id.to_i > 0
|
|
111
|
+
page = SpudPage.where(:id => self.id).first
|
|
112
|
+
if page.url_name.blank? == false && page.url_name != self.url_name
|
|
113
|
+
permalink = SpudPermalink.site(self.site_id).where(:url_name => self.url_name).first
|
|
114
|
+
if permalink.blank? == false
|
|
115
|
+
if permalink.attachment == self
|
|
116
|
+
permalink.destroy
|
|
117
|
+
else
|
|
118
|
+
self.errors.add :url_name, "This permalink has already been used by another page."
|
|
119
|
+
return false
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
self.spud_permalinks.create(:url_name => page.url_name,:site_id => self.site_id)
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
return true
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def is_private?
|
|
129
|
+
return self.visibility == 1
|
|
130
|
+
end
|
|
131
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
class SpudPagePartial < ActiveRecord::Base
|
|
2
|
+
belongs_to :spud_page
|
|
3
|
+
has_many :spud_page_liquid_tags, :as => :attachment, :dependent => :destroy
|
|
4
|
+
validates :name,:presence => true
|
|
5
|
+
attr_accessible :name, :spud_page_id, :content, :format, :content_processed
|
|
6
|
+
before_save :maintain_revisions
|
|
7
|
+
before_save :update_symbol_name
|
|
8
|
+
before_save :postprocess_content
|
|
9
|
+
after_save :update_taglist
|
|
10
|
+
def update_symbol_name
|
|
11
|
+
self.symbol_name = self.name.parameterize.underscore
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def symbol_name
|
|
15
|
+
return @symbol_name || self.name.parameterize.underscore
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def postprocess_content
|
|
19
|
+
template = Liquid::Template.parse(self.content) # Parses and compiles the template
|
|
20
|
+
|
|
21
|
+
self.content_processed = template.render('page' => self.spud_page)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def update_taglist
|
|
25
|
+
template = Liquid::Template.parse(self.content) # Parses and compiles the template
|
|
26
|
+
|
|
27
|
+
self.spud_page_liquid_tags.all.each do |tag|
|
|
28
|
+
tag.destroy
|
|
29
|
+
end
|
|
30
|
+
template.root.nodelist.each do |node|
|
|
31
|
+
if !node.is_a?(String) && defined?(node.tag_name) && defined?(node.tag_value)
|
|
32
|
+
self.spud_page_liquid_tags.create(:tag_name => node.tag_name,:value => node.tag_value)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def content_processed=(content)
|
|
38
|
+
write_attribute(:content_processed,content)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def content_processed
|
|
42
|
+
if read_attribute(:content_processed).blank?
|
|
43
|
+
if self.new_record?
|
|
44
|
+
self.content_processed = postprocess_content()
|
|
45
|
+
else
|
|
46
|
+
self.update_column(:content_processed, postprocess_content)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
return read_attribute(:content_processed)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def maintain_revisions
|
|
53
|
+
if !self.changed.include?('content')
|
|
54
|
+
return true
|
|
55
|
+
end
|
|
56
|
+
revision = SpudPagePartialRevision.new(:spud_page_id => self.spud_page_id,:name => self.name,:format => self.format,:content => self.content)
|
|
57
|
+
revision.save
|
|
58
|
+
if Spud::Cms.max_revisions > 0
|
|
59
|
+
revision_count = SpudPagePartialRevision.where(:spud_page_id => self.spud_page_id,:name => self.name).count
|
|
60
|
+
if revision_count > Spud::Cms.max_revisions
|
|
61
|
+
revision_bye = SpudPagePartialRevision.where(:spud_page_id => self.spud_page_id,:name => self.name).order("created_at ASC").first
|
|
62
|
+
revision_bye.destroy if !revision_bye.blank?
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
return true
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
class SpudSnippet < ActiveRecord::Base
|
|
2
|
+
attr_accessible :content, :content_processed, :format, :name
|
|
3
|
+
has_many :spud_page_liquid_tags, :as => :attachment, :dependent => :destroy
|
|
4
|
+
|
|
5
|
+
validates :name, :presence => true
|
|
6
|
+
validates_uniqueness_of :name, :scope => :site_id
|
|
7
|
+
|
|
8
|
+
scope :site, lambda {|sid| where(:site_id => sid)}
|
|
9
|
+
|
|
10
|
+
before_save :postprocess_content
|
|
11
|
+
after_save :update_taglist
|
|
12
|
+
def postprocess_content
|
|
13
|
+
template = Liquid::Template.parse(self.content) # Parses and compiles the template
|
|
14
|
+
self.content_processed = template.render()
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def content_processed=(content)
|
|
18
|
+
write_attribute(:content_processed,content)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def content_processed
|
|
22
|
+
if read_attribute(:content_processed).blank?
|
|
23
|
+
self.update_column(:content_processed, postprocess_content)
|
|
24
|
+
end
|
|
25
|
+
return read_attribute(:content_processed)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def update_taglist
|
|
30
|
+
template = Liquid::Template.parse(self.content) # Parses and compiles the template
|
|
31
|
+
|
|
32
|
+
self.spud_page_liquid_tags.all.each do |tag|
|
|
33
|
+
tag.destroy
|
|
34
|
+
end
|
|
35
|
+
template.root.nodelist.each do |node|
|
|
36
|
+
if !node.is_a?(String) && defined?(node.tag_name) && defined?(node.tag_value)
|
|
37
|
+
self.spud_page_liquid_tags.create(:tag_name => node.tag_name,:value => node.tag_value)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
class PageSweeper < ActionController::Caching::Sweeper
|
|
2
|
+
observe :spud_page,:spud_menu_item
|
|
3
|
+
|
|
4
|
+
def before_save(record)
|
|
5
|
+
if record.is_a?(SpudPage) && record.url_name_was.blank? == false && record.url_name_was != record.url_name
|
|
6
|
+
if Spud::Cms.cache_mode == :full_page
|
|
7
|
+
expire_page cache_path_for_page(record.url_name_was)
|
|
8
|
+
elsif Spud::Cms.cache_mode == :action
|
|
9
|
+
expire_action cache_path_for_page(record.url_name_was)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def after_save(record)
|
|
15
|
+
expire_cache_for(record)
|
|
16
|
+
expire_page spud_cms_sitemap_path(:format => :xml)
|
|
17
|
+
expire_page spud_sitemap_path(:format => :xml)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def after_destroy(record)
|
|
21
|
+
expire_cache_for(record)
|
|
22
|
+
expire_page spud_cms_sitemap_path
|
|
23
|
+
expire_page spud_sitemap_path
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
def expire_cache_for(record)
|
|
28
|
+
if record.is_a?(SpudPage)
|
|
29
|
+
if Spud::Cms.cache_mode == :full_page
|
|
30
|
+
expire_page cache_path_for_page(record.url_name)
|
|
31
|
+
elsif Spud::Cms.cache_mode == :action
|
|
32
|
+
expire_action cache_path_for_page(record.url_name)
|
|
33
|
+
end
|
|
34
|
+
else
|
|
35
|
+
Rails.cache.clear
|
|
36
|
+
SpudPage.published_pages.all.each {|page| expire_cache_for(page)}
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def cache_path_for_page(url_name)
|
|
41
|
+
if url_name == Spud::Cms.root_page_name
|
|
42
|
+
root_path
|
|
43
|
+
else
|
|
44
|
+
page_path(:id => url_name)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
class SnippetSweeper < ActionController::Caching::Sweeper
|
|
2
|
+
observe :spud_snippet
|
|
3
|
+
|
|
4
|
+
def before_save(record)
|
|
5
|
+
if record.is_a?(SpudSnippet)
|
|
6
|
+
@old_name = record.name_was
|
|
7
|
+
else
|
|
8
|
+
@old_name = nil
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def after_save(record)
|
|
13
|
+
reset_cms_pages(record)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def after_destroy(record)
|
|
17
|
+
reset_cms_pages(record)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
def reset_cms_pages(record)
|
|
22
|
+
|
|
23
|
+
values = [record.name]
|
|
24
|
+
values << @old_name if !@old_name.blank?
|
|
25
|
+
SpudPageLiquidTag.where(:tag_name => "snippet",:value => values).includes(:attachment).each do |tag|
|
|
26
|
+
partial = tag.attachment
|
|
27
|
+
partial.postprocess_content
|
|
28
|
+
partial.save
|
|
29
|
+
page = partial.try(:spud_page)
|
|
30
|
+
if page.blank? == false
|
|
31
|
+
page.updated_at = Time.now.utc
|
|
32
|
+
page.save
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<%=content_for :title do%>
|
|
2
|
+
<%= @page.name %> | <%=current_site_name%>
|
|
3
|
+
<% end %>
|
|
4
|
+
<%=content_for :head do%>
|
|
5
|
+
<%if !@page.meta_description.blank?%>
|
|
6
|
+
<meta name="description" content="<%=@page.meta_description%>" />
|
|
7
|
+
<%end%>
|
|
8
|
+
|
|
9
|
+
<meta name="keywords" content="<%=@page.meta_keywords%>" />
|
|
10
|
+
|
|
11
|
+
<%end%>
|
|
12
|
+
|
|
13
|
+
<%if !@inline.blank?%>
|
|
14
|
+
<%=render :inline => @inline%>
|
|
15
|
+
<%end%>
|
|
16
|
+
<%@page.spud_page_partials.each do |page_partial|%>
|
|
17
|
+
<%if(page_partial.name.match(/^body$/i) && Spud::Cms.yield_body_as_content_block == false)%>
|
|
18
|
+
<%=page_partial.content_processed.html_safe%>
|
|
19
|
+
<%else%>
|
|
20
|
+
<%=content_for page_partial.symbol_name.to_sym do%>
|
|
21
|
+
<%=page_partial.content_processed.html_safe%>
|
|
22
|
+
<%end%>
|
|
23
|
+
<%end%>
|
|
24
|
+
<%end%>
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<%=error_messages_for(f.object)%>
|
|
2
|
+
<fieldset>
|
|
3
|
+
<div class="control-group">
|
|
4
|
+
<%=f.label :name, :required=>true,:class => "control-label"%>
|
|
5
|
+
<div class="controls">
|
|
6
|
+
<%=f.text_field :name,:title => "",:size=>40%>
|
|
7
|
+
</div>
|
|
8
|
+
|
|
9
|
+
</div>
|
|
10
|
+
<div class="control-group">
|
|
11
|
+
|
|
12
|
+
<%=f.label :menu_order, :required=>true,:class => "control-label"%>
|
|
13
|
+
<div class="controls">
|
|
14
|
+
<%=f.text_field :menu_order,:title => "",:size=>5%>
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
</div>
|
|
18
|
+
<div class="control-group">
|
|
19
|
+
<%=f.label :spud_page_id, "Page",:class => "control-label"%>
|
|
20
|
+
<div class="controls">
|
|
21
|
+
<%=f.select :spud_page_id,options_for_select(SpudPage.options_tree_for_page(:site_id => session[:admin_site]),@menu_item.spud_page_id),{:include_blank => 'Use URL instead'},{:title => "",:onchange => "if($(this).val() != '') {$('#spud_menu_item_url').val('');}"}%>
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
</div>
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
<div class="control-group">
|
|
29
|
+
<%=f.label :url,:class => "control-label"%>
|
|
30
|
+
<div class="controls">
|
|
31
|
+
<%=f.text_field :url,:title => "",:size=>40%>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
<div class="control-group">
|
|
35
|
+
<%=f.label :classes,:class => "control-label"%>
|
|
36
|
+
<div class="controls">
|
|
37
|
+
<%=f.text_field :classes,:title => "",:size=>40%>
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
40
|
+
<div class="control-group">
|
|
41
|
+
<%=f.label :parent, "Parent Menu",:class => "control-label"%>
|
|
42
|
+
<div class="controls">
|
|
43
|
+
<%=f.select :parent_id,options_for_select(SpudMenuItem.options_tree_for_item(@menu,:filter => @menu_item),@menu_item.parent_type == 'SpudMenuItem' ? @menu_item.parent_id : nil),{:include_blank => "#{@menu.name}"},{:title => ""}%>
|
|
44
|
+
</div>
|
|
45
|
+
|
|
46
|
+
</div>
|
|
47
|
+
|
|
48
|
+
</fieldset>
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<div class="page_row" menu_item_id="<%=menu_item.id%>">
|
|
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 => 'btn'%> <%=link_to "Remove",spud_admin_menu_menu_item_path(:id => menu_item.id),:method => :delete,:class => 'btn btn-danger',:confirm => "Are you sure you want to remove this menu item?"%></span>
|
|
6
|
+
<br style="clear:both;"/>
|
|
7
|
+
</div>
|
|
8
|
+
<ul class="menu_list subitem sortable connectedSortable">
|
|
9
|
+
|
|
10
|
+
<%if !menu_item.spud_menu_items.all.blank?%>
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
<%menu_item.spud_menu_items.order(:menu_order).each do |menu_item|%>
|
|
14
|
+
<li>
|
|
15
|
+
<%=render :partial => 'menu_item_row',:locals => {:menu_item => menu_item}%>
|
|
16
|
+
</li>
|
|
17
|
+
<%end%>
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
<%end%>
|
|
22
|
+
</ul>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
<%=form_for @menu_item,:url => spud_admin_menu_menu_item_path(:id => @menu_item.id),:html=>{:class=>"form-horizontal"} do |f|%>
|
|
5
|
+
<%=render :partial => "form",:locals => {:f => f}%>
|
|
6
|
+
<div class="form-actions">
|
|
7
|
+
<%=f.submit "Save Menu Item", :class=>"btn btn-primary"%> or <%=link_to "cancel",spud_admin_menu_menu_items_path,:class => "btn"%>
|
|
8
|
+
</div>
|
|
9
|
+
<%end%>
|
|
10
|
+
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<%=content_for :data_controls do%>
|
|
2
|
+
<%=link_to "New Menu Item",new_spud_admin_menu_menu_item_path(),:class => "btn btn-primary",:title => "New Menu Item"%>
|
|
3
|
+
<%end%>
|
|
4
|
+
<%=content_for :detail do%>
|
|
5
|
+
<ul id="root_menu_list" class="menu_list page_list sortable connectedSortable">
|
|
6
|
+
<%@menu_items.each do |menu_item|%>
|
|
7
|
+
<li>
|
|
8
|
+
<%=render :partial => "menu_item_row",:locals => {:menu_item => menu_item}%>
|
|
9
|
+
</li>
|
|
10
|
+
<%end%>
|
|
11
|
+
|
|
12
|
+
</ul>
|
|
13
|
+
|
|
14
|
+
<script type="text/javascript">
|
|
15
|
+
$(document).ready(function() { spud.admin.cms.menu_items.init();})
|
|
16
|
+
</script>
|
|
17
|
+
<%end%>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
<%=form_for @menu_item,:url => spud_admin_menu_menu_items_path,:html=>{:class=>"form-horizontal"} do |f|%>
|
|
5
|
+
<%=render :partial => "form",:locals => {:f => f}%>
|
|
6
|
+
<div class="form-actions">
|
|
7
|
+
<%=f.submit "Create Menu Item", :class=>"btn btn-primary"%> or <%=link_to "cancel",spud_admin_menu_menu_items_path,:class => "btn"%>
|
|
8
|
+
</div>
|
|
9
|
+
<%end%>
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
<%=form_for @menu,:url => spud_admin_menu_path(:id => @menu.id),:html=>{:class=>"form-horizontal"} do |f|%>
|
|
5
|
+
<%=render :partial => "form",:locals => {:f => f}%>
|
|
6
|
+
<div class="form-actions">
|
|
7
|
+
<%=f.submit "Save Menu", :class=>"btn btn-primary"%> or <%=link_to "cancel",spud_admin_menus_path,:class => "btn"%>
|
|
8
|
+
</div>
|
|
9
|
+
|
|
10
|
+
<%end%>
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<%=content_for :data_controls do%>
|
|
2
|
+
<%=link_to "New Menu",new_spud_admin_menu_path(),:class => "btn btn-primary",:title => "New Menu"%>
|
|
3
|
+
<%end%>
|
|
4
|
+
<%=content_for :detail do%>
|
|
5
|
+
<div class="page_list">
|
|
6
|
+
<%@menus.each do |menu|%>
|
|
7
|
+
<div class="page_row">
|
|
8
|
+
|
|
9
|
+
<span class="row_meta"><%=link_to menu.name,spud_admin_menu_menu_items_path(:menu_id => menu.id)%></span>
|
|
10
|
+
|
|
11
|
+
<span class="edit_controls">
|
|
12
|
+
<%=link_to "Edit",edit_spud_admin_menu_path(:id => menu.id),:class => 'btn'%>
|
|
13
|
+
<%=link_to "Remove",spud_admin_menu_path(:id => menu.id),:method => :delete,:class => 'btn btn-danger',:confirm => "Are you sure you want to remove this menu and all items associated with it?"%>
|
|
14
|
+
</span>
|
|
15
|
+
<br style="clear:both;"/>
|
|
16
|
+
</div>
|
|
17
|
+
<%end%>
|
|
18
|
+
<%=will_paginate @menus%>
|
|
19
|
+
|
|
20
|
+
</div>
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
<%end%>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<%=form_for @menu,:url => spud_admin_menus_path,:html=>{:class=>"form-horizontal"} do |f|%>
|
|
2
|
+
<%=render :partial => "form",:locals => {:f => f}%>
|
|
3
|
+
<div class="form-actions">
|
|
4
|
+
<%=f.submit "Create Menu", :class=>"btn btn-primary"%> or <%=link_to "cancel",spud_admin_menus_path,:class => "btn"%>
|
|
5
|
+
</div>
|
|
6
|
+
|
|
7
|
+
<%end%>
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
<%=error_messages_for(f.object)%>
|
|
2
|
+
<fieldset>
|
|
3
|
+
<div class="control-group">
|
|
4
|
+
<legend>Page Title</legend>
|
|
5
|
+
<%=f.label :name, :required=>true,:style =>"display:none;", :class=>"control-label"%>
|
|
6
|
+
|
|
7
|
+
<%=f.text_field :name, :class => "full-width"%>
|
|
8
|
+
|
|
9
|
+
</div>
|
|
10
|
+
</fieldset>
|
|
11
|
+
<div id="page_partials_form" class="formtabs tab-content">
|
|
12
|
+
<ul class="formtab_buttons nav nav-tabs">
|
|
13
|
+
</ul>
|
|
14
|
+
<%=f.fields_for :spud_page_partials do |b|%>
|
|
15
|
+
<div class="formtab tab-pane">
|
|
16
|
+
<%=b.hidden_field :name,:class => "tab_name"%>
|
|
17
|
+
<%=b.text_area :content,:class => "tinymce"%>
|
|
18
|
+
</div>
|
|
19
|
+
<%end%>
|
|
20
|
+
</div>
|
|
21
|
+
<br />
|
|
22
|
+
<fieldset>
|
|
23
|
+
<legend>Advanced Settings (optional)</legend>
|
|
24
|
+
|
|
25
|
+
<div class="control-group">
|
|
26
|
+
|
|
27
|
+
<%=f.label :layout, "Template", :class=>"control-label"%>
|
|
28
|
+
<div class="controls">
|
|
29
|
+
<%=f.select :layout, options_for_select(layout_options,@page.layout),{},{:title => "", 'data-source' => page_parts_spud_admin_pages_path(:page => @page.id) }%>
|
|
30
|
+
<span class="help-inline">Use this to control the layout template to be used for this page if they are available.</span>
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
|
|
34
|
+
<div class="control-group">
|
|
35
|
+
|
|
36
|
+
<%=f.label :spud_page_id, "Parent Page", :class=>"control-label"%>
|
|
37
|
+
<div class="controls">
|
|
38
|
+
<%=f.select :spud_page_id,options_for_select(SpudPage.options_tree_for_page(:filter => @page,:site_id => session[:admin_site]),@page.spud_page_id),{:include_blank => 'None'},{:title => ""}%>
|
|
39
|
+
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
<div class="control-group">
|
|
43
|
+
|
|
44
|
+
<%=f.label :url_name, "Perma Link",:disabled => true, :class=>"control-label"%>
|
|
45
|
+
<div class="controls">
|
|
46
|
+
<%=root_url%><%=f.text_field :url_name,:title => "",:size=>20%>
|
|
47
|
+
<label class="checkbox inline">
|
|
48
|
+
<%=f.check_box :use_custom_url_name,:onchange => "$('#spud_page_url_name').attr('disabled',!this.checked);"%>
|
|
49
|
+
Customize this pages url
|
|
50
|
+
</label>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
|
|
54
|
+
</fieldset>
|
|
55
|
+
<fieldset>
|
|
56
|
+
<legend>Meta Information (optional)</legend>
|
|
57
|
+
<p>These fields are used to notify search engines about important keywords and the appropriate description to display in a search result.</p>
|
|
58
|
+
|
|
59
|
+
<div class="control-group">
|
|
60
|
+
<%=f.label :meta_keywords,"Keywords", :class=>"control-label"%>
|
|
61
|
+
<div class="controls">
|
|
62
|
+
<%=f.text_field :meta_keywords,:title => "",:style=>"width:600px;" %>
|
|
63
|
+
<span class="help-inline">A Comma seperated list of keywords for search engines. Keep it short (no more than 10 keywords)</span>
|
|
64
|
+
</div>
|
|
65
|
+
|
|
66
|
+
</div>
|
|
67
|
+
<div class="control-group">
|
|
68
|
+
<%=f.label :meta_description,"Description", :class=>"control-label"%>
|
|
69
|
+
<div class="controls">
|
|
70
|
+
<%=f.text_area :meta_description,:style =>"width:600px;height:40px;"%>
|
|
71
|
+
<span class="help-inline">A short description of the page. This is what appears on a search engines search result page.</span>
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
<div class="control-group">
|
|
75
|
+
<%=f.label :visibility, :class=>"control-label"%>
|
|
76
|
+
<div class="controls">
|
|
77
|
+
<%=f.select :visibility, [["Public",0],["Private",1]]%>
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
<div class="control-group">
|
|
81
|
+
<%=f.label :published, :class=>"control-label"%>
|
|
82
|
+
<div class="controls">
|
|
83
|
+
<%=f.check_box :published%>
|
|
84
|
+
</div>
|
|
85
|
+
</div>
|
|
86
|
+
<div class="control-group">
|
|
87
|
+
<%=f.label :notes,"Notes", :class=>"control-label"%>
|
|
88
|
+
<div class="controls">
|
|
89
|
+
<%=f.text_area :notes,:style =>"width:400px;height:40px;"%>
|
|
90
|
+
<span class="help-inline">Have a note to make about this page while you work? Place it here for later.</span>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
<%=hidden_field_tag "preview",:value => 0%>
|
|
94
|
+
</fieldset>
|
|
95
|
+
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<div id="page_partials_form" class="formtabs tab-content">
|
|
2
|
+
<ul class="formtab_buttons nav nav-tabs">
|
|
3
|
+
</ul>
|
|
4
|
+
<% last_index = 0 %>
|
|
5
|
+
<% spud_page_partials.each_with_index do |spud_page_partial, index| %>
|
|
6
|
+
<div class="formtab tab-pane">
|
|
7
|
+
<input type="hidden" class="tab_name" name="spud_page[spud_page_partials_attributes][<%= index %>][name]" value="<%= spud_page_partial.name %>" />
|
|
8
|
+
<textarea class="wysiwym tinymce" name="spud_page[spud_page_partials_attributes][<%= index %>][content]">
|
|
9
|
+
<%= spud_page_partial.content %>
|
|
10
|
+
</textarea>
|
|
11
|
+
</div>
|
|
12
|
+
<% last_index = index + 1 %>
|
|
13
|
+
<% end %>
|
|
14
|
+
<% remove_page_partials.each_with_index do |spud_page_partial, index| %>
|
|
15
|
+
<input type="hidden" name="spud_page[spud_page_partials_attributes][<%= last_index + index %>][id]" value="<%= spud_page_partial.id %>" />
|
|
16
|
+
<input type="hidden" name="spud_page[spud_page_partials_attributes][<%= last_index + index %>][_destroy]", value="1" />
|
|
17
|
+
<% end %>
|
|
18
|
+
</div>
|