spud_cms 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. data/README.markdown +71 -0
  2. data/app/assets/images/spud/admin/menus_thumb.png +0 -0
  3. data/app/assets/images/spud/admin/pages_thumb.png +0 -0
  4. data/app/assets/images/spud/admin/posts_thumb.png +0 -0
  5. data/app/assets/images/spud/admin/templates_thumb.png +0 -0
  6. data/app/assets/javascripts/pages.js +2 -0
  7. data/app/assets/javascripts/spud/admin/cms/application.js +24 -0
  8. data/app/assets/javascripts/spud/admin/templates.js +2 -0
  9. data/app/assets/javascripts/spud/cms/sitemaps.js +2 -0
  10. data/app/assets/stylesheets/pages.css +4 -0
  11. data/app/assets/stylesheets/spud/admin/cms/application.css +4 -0
  12. data/app/assets/stylesheets/spud/cms/sitemaps.css +4 -0
  13. data/app/controllers/pages_controller.rb +29 -0
  14. data/app/controllers/spud/admin/menu_items_controller.rb +118 -0
  15. data/app/controllers/spud/admin/menus_controller.rb +50 -0
  16. data/app/controllers/spud/admin/pages_controller.rb +149 -0
  17. data/app/controllers/spud/admin/templates_controller.rb +55 -0
  18. data/app/controllers/spud/cms/sitemaps_controller.rb +6 -0
  19. data/app/helpers/pages_helper.rb +2 -0
  20. data/app/helpers/spud/admin/contacts_helper.rb +2 -0
  21. data/app/helpers/spud/admin/media_helper.rb +2 -0
  22. data/app/helpers/spud/admin/menu_items_helper.rb +2 -0
  23. data/app/helpers/spud/admin/menus_helper.rb +2 -0
  24. data/app/helpers/spud/admin/pages_helper.rb +2 -0
  25. data/app/helpers/spud/admin/posts_helper.rb +2 -0
  26. data/app/helpers/spud/admin/templates_helper.rb +2 -0
  27. data/app/helpers/spud/admin/users_helper.rb +2 -0
  28. data/app/helpers/spud/cms/application_helper.rb +102 -0
  29. data/app/helpers/spud/cms/sitemaps_helper.rb +2 -0
  30. data/app/helpers/spud/user_sessions_helper.rb +2 -0
  31. data/app/models/spud_custom_field.rb +7 -0
  32. data/app/models/spud_menu.rb +6 -0
  33. data/app/models/spud_menu_item.rb +37 -0
  34. data/app/models/spud_page.rb +59 -0
  35. data/app/models/spud_page_partial.rb +3 -0
  36. data/app/models/spud_template.rb +7 -0
  37. data/app/views/layouts/spud/admin/cms/detail.html.erb +6 -0
  38. data/app/views/pages/show.html.erb +25 -0
  39. data/app/views/spud/admin/contacts/index.html.erb +0 -0
  40. data/app/views/spud/admin/menu_items/_form.html.erb +34 -0
  41. data/app/views/spud/admin/menu_items/_menu_item_row.html.erb +18 -0
  42. data/app/views/spud/admin/menu_items/edit.html.erb +13 -0
  43. data/app/views/spud/admin/menu_items/index.html.erb +12 -0
  44. data/app/views/spud/admin/menu_items/new.html.erb +13 -0
  45. data/app/views/spud/admin/menus/_form.html.erb +9 -0
  46. data/app/views/spud/admin/menus/edit.html.erb +13 -0
  47. data/app/views/spud/admin/menus/index.html.erb +24 -0
  48. data/app/views/spud/admin/menus/new.html.erb +13 -0
  49. data/app/views/spud/admin/pages/_form.html.erb +71 -0
  50. data/app/views/spud/admin/pages/_page_partials_form.html.erb +18 -0
  51. data/app/views/spud/admin/pages/_page_row.html.erb +18 -0
  52. data/app/views/spud/admin/pages/edit.html.erb +13 -0
  53. data/app/views/spud/admin/pages/index.html.erb +12 -0
  54. data/app/views/spud/admin/pages/new.html.erb +12 -0
  55. data/app/views/spud/admin/pages/show.html.erb +25 -0
  56. data/app/views/spud/admin/templates/_form.html.erb +31 -0
  57. data/app/views/spud/admin/templates/edit.html.erb +11 -0
  58. data/app/views/spud/admin/templates/index.html.erb +17 -0
  59. data/app/views/spud/admin/templates/new.html.erb +13 -0
  60. data/app/views/spud/cms/sitemaps/show.xml.builder +16 -0
  61. data/config/application.rb +48 -0
  62. data/config/boot.rb +6 -0
  63. data/config/routes.rb +22 -0
  64. data/lib/spud_cms.rb +7 -0
  65. data/lib/spud_cms/configuration.rb +15 -0
  66. data/lib/spud_cms/engine.rb +29 -0
  67. metadata +133 -0
data/README.markdown ADDED
@@ -0,0 +1,71 @@
1
+ Spud CMS
2
+ ========
3
+
4
+ Spud CMS is a CMS Engine designed to be robust, easy to use, and light weight.
5
+ NOTE: This project is still in its early infancy.
6
+
7
+ Installation/Usage
8
+ ------------------
9
+
10
+ 1. In your Gemfile add the following
11
+
12
+ gem 'spud_admin', :git => "git://github.com/davydotcom/spud_core_admin.git"
13
+ gem 'spud_cms', :git => "git://github.com/davydotcom/spud_cms.git"
14
+
15
+ 2. Run bundle install
16
+ 3. Copy in database migrations to your new rails project
17
+
18
+ bundle exec rake spud_core:install:migrations
19
+ bundle exec rake spud_cms:install:migrations
20
+ rake db:migrate
21
+
22
+ 4. run a rails server instance and point your browser to /spud/admin
23
+
24
+ Routing to the CMS Engine
25
+ --------------------------
26
+ Routing your home page to the CMS engine is fairly straight forward.
27
+ in your applications environment.rb file add a configure block as such
28
+
29
+
30
+ Spud::Cms.configure do |config|
31
+ config.menus_enabled = true
32
+ config.templates_enabled = false
33
+ config.root_page_name = "home"
34
+ end
35
+
36
+
37
+
38
+ Where "home" is the page name you wish to use.
39
+
40
+ Pages will default render to the 'application' layout of your application. You can change this by using templates to specify base layouts.
41
+
42
+ Using Menus
43
+ -----------
44
+ A lot of cms engines allow you to render your navigation links in a ul block by using your page tree structure. In a lot of cases this is insufficient as some sites have urls that redirect to pages outside of your cms. This is where menus come in. They can be built in the spud admin control panel.
45
+ In your application layout file or any erb template you can render a ul block like so
46
+
47
+ <%=sp_list_menu({:id => "navigation",:name => "Main"})%>
48
+
49
+ This will output a <ul id="navigation"></ul> block for the menu you created in admin named "Main"
50
+
51
+
52
+ Adding Your Own Engines
53
+ -----------------------
54
+
55
+ Creating a rails engine that ties into spud admin is fairly straight forward
56
+ In your new engine add spud_admin as a dependency and create an initializer inside your engine class as such:
57
+
58
+ initializer :admin do
59
+ Spud::Core.configure do |config|
60
+ config.admin_applications += [{:name => "Pages",:thumbnail => "spud/admin/pages_thumb.png",:url => "/spud/admin/pages",:order => 0}]
61
+
62
+ end
63
+ end
64
+
65
+ You can use the layouts provided with spud admin by using 'spud/admin/application' or 'spud/admin/detail' layouts
66
+
67
+ When creating controllers for the admin panel create them in the Spud::Admin Namespace and have them extend Spud::Admin::ApplicationController for automatic user authentication restrictions.
68
+
69
+
70
+
71
+
@@ -0,0 +1,2 @@
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.
@@ -0,0 +1,24 @@
1
+ //= require codemirror
2
+ //= require codemirror/modes/xml
3
+ //= require codemirror/modes/javascript
4
+ //= require codemirror/modes/css
5
+ //= require codemirror/modes/htmlmixed
6
+ //= require codemirror/modes/htmlembedded
7
+ // Place all the behaviors and hooks related to the matching controller here.
8
+ // All this logic will automatically be available in application.js.
9
+
10
+ $(function() {
11
+ initWysiwym();
12
+
13
+ $("#spud_page_template_id").bind('change', function() {
14
+ var $this = $(this);
15
+ $.get($this.attr("data-source"), { template: $this.val() }, function(data) {
16
+ $('.formtabs').tabs('destroy');
17
+ $("#page_partials_form").replaceWith(data)
18
+ initFormTabs();
19
+ initWysiwym();
20
+ }, 'text').error(function(jqXHR) {
21
+ $('<p> Error: ' + jqXHR.responseText + '</p>').dialog();
22
+ });
23
+ });
24
+ });
@@ -0,0 +1,2 @@
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.
@@ -0,0 +1,2 @@
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -0,0 +1,4 @@
1
+ /*
2
+ //= require codemirror
3
+ //= require codemirror/themes/night
4
+ */
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -0,0 +1,29 @@
1
+ class PagesController < ApplicationController
2
+ def show
3
+ url_name = !params[:id].blank? ? params[:id] : Spud::Cms.root_page_name
4
+ @page = SpudPage.published_pages.where(:url_name => url_name).includes([:spud_template,:spud_page_partials]).first
5
+ if @page.blank?
6
+ flash[:error] = "Page not found"
7
+ if !params[:id].blank?
8
+ redirect_to root_url() and return
9
+ else
10
+ return
11
+ end
12
+ end
13
+ if @page.is_private?
14
+ before_filter :require_user
15
+ end
16
+ layout = Spud::Cms.default_page_layout
17
+
18
+
19
+ if !@page.spud_template.blank?
20
+ if !@page.spud_template.base_layout.blank?
21
+ layout = @page.spud_template.base_layout
22
+ end
23
+ @inline = @page.spud_template.content
24
+
25
+ end
26
+ render :layout => layout
27
+
28
+ end
29
+ end
@@ -0,0 +1,118 @@
1
+ class Spud::Admin::MenuItemsController < Spud::Admin::ApplicationController
2
+ add_breadcrumb "Menus", :spud_admin_menus_path
3
+ layout 'spud/admin/cms/detail'
4
+ before_filter :load_menu
5
+ before_filter :load_menu_item, :only => [:edit,:update,:show,:destroy]
6
+
7
+ def index
8
+ @page_thumbnail = "spud/admin/menus_thumb.png"
9
+ @page_name = "Menus"
10
+ @menu_items = @menu.spud_menu_items.order(:menu_order).includes(:spud_menu_items).paginate :page => params[:page]
11
+ end
12
+
13
+ def new
14
+ add_breadcrumb "New", :new_spud_admin_page_path
15
+
16
+ @page_thumbnail = "spud/admin/menus_thumb.png"
17
+ @page_name = "New Menu Item"
18
+
19
+ @menu_item = @menu.spud_menu_items.new
20
+ end
21
+
22
+ def create
23
+ add_breadcrumb "New", :new_spud_admin_page_path
24
+ @page_thumbnail = "spud/admin/menus_thumb.png"
25
+ @page_name = "New Menu Item"
26
+ @menu_item = SpudMenuItem.new(params[:spud_menu_item])
27
+ @menu_item.spud_menu_id = @menu.id
28
+ if params[:spud_menu_item][:parent_id].blank?
29
+ @menu_item.parent_id = @menu.id
30
+ @menu_item.parent_type = "SpudMenu"
31
+ else
32
+ @menu_item.parent_type = "SpudMenuItem"
33
+ end
34
+ if @menu_item.name.blank? && !@menu_item.spud_page.blank?
35
+ @menu_item.name = @menu_item.spud_page.name
36
+ end
37
+ if @menu_item.menu_order.blank?
38
+ highest_sibling = @menu_item.parent.spud_menu_items.order("menu_order desc").first
39
+ if !highest_sibling.blank?
40
+ @menu_item.menu_order = highest_sibling.menu_order + 1
41
+ end
42
+ end
43
+ if @menu_item.save
44
+ flash[:notice] = "Menu Created successfully!"
45
+ redirect_to spud_admin_menu_menu_items_url() and return
46
+ else
47
+ flash[:error] = "Error saving menu item"
48
+ @error_object_name = "menu_item"
49
+ render :action => "new"
50
+ end
51
+ end
52
+
53
+ def edit
54
+ add_breadcrumb "Edit #{@menu_item.name}", :edit_spud_admin_menu_menu_item_path
55
+ @page_thumbnail = "spud/admin/menus_thumb.png"
56
+ @page_name = "Edit #{@menu_item.name}"
57
+ if @menu_item.parent_type == "SpudMenu"
58
+ @menu_item.parent_id = nil
59
+ end
60
+ end
61
+
62
+ def update
63
+ add_breadcrumb "Edit #{@menu_item.name}", :edit_spud_admin_menu_menu_item_path
64
+ @page_thumbnail = "spud/admin/menus_thumb.png"
65
+ @page_name = "Edit #{@menu_item.name}"
66
+ if params[:spud_menu_item][:parent_id].blank?
67
+ params[:spud_menu_item][:parent_type] = "SpudMenu"
68
+ params[:spud_menu_item][:parent_id] = @menu.id
69
+ else
70
+ params[:spud_menu_item][:parent_type] = "SpudMenuItem"
71
+ end
72
+ @menu_item.attributes = params[:spud_menu_item]
73
+ @menu_item.spud_menu_id = @menu.id
74
+ if @menu_item.save
75
+
76
+ flash[:notice] = "Menu saved successfully!"
77
+ redirect_to spud_admin_menu_menu_items_url() and return
78
+
79
+ else
80
+ flash[:error] = "Error saving menu item"
81
+ render :action => "edit"
82
+ end
83
+ end
84
+
85
+ def destroy
86
+ status = 500
87
+ if @menu_item.destroy
88
+ status = 200
89
+ end
90
+ respond_to do |format|
91
+ format.js { render :status => status}
92
+ format.html {
93
+ flash[:notice] = "Menu Item removed!" if status == 200
94
+ flash[:error] = "Error removing menu item!" if status == 500
95
+ redirect_to spud_admin_menu_menu_items_path() and return
96
+ }
97
+ end
98
+ end
99
+ private
100
+ def load_menu
101
+
102
+ @menu = SpudMenu.where(:id => params[:menu_id]).first
103
+ if @menu.blank?
104
+ flash[:error] = "Menu not found!"
105
+ redirect_to spud_admin_menus_url() and return false
106
+ end
107
+ add_breadcrumb "#{@menu.name}", :spud_admin_menu_menu_items_path
108
+ end
109
+
110
+ def load_menu_item
111
+ @menu_item = SpudMenuItem.where(:id => params[:id]).first
112
+ if @menu_item.blank?
113
+ flash[:error] = "Menu Item not found!"
114
+ redirect_to spud_admin_menu_menu_items_url() and return false
115
+ end
116
+ end
117
+
118
+ end
@@ -0,0 +1,50 @@
1
+ class Spud::Admin::MenusController < Spud::Admin::ApplicationController
2
+ layout 'spud/admin/cms/detail'
3
+ belongs_to_spud_app :menus
4
+ add_breadcrumb "Menus", :spud_admin_menus_path
5
+ before_filter :load_menu,:only => [:edit,:update,:show,:destroy]
6
+
7
+ def index
8
+ @menus = SpudMenu.order(:name).paginate :page => params[:page]
9
+ respond_with @menus
10
+ end
11
+
12
+
13
+ def new
14
+ add_breadcrumb "New", :new_spud_admin_menu_path
15
+ @menu = SpudMenu.new
16
+ respond_with @menu
17
+ end
18
+
19
+ def create
20
+ add_breadcrumb "New", :new_spud_admin_menu_path
21
+ @menu = SpudMenu.new(params[:spud_menu])
22
+ flash[:notice] = "New menu created" if @menu.save
23
+ respond_with @menu,:location => spud_admin_menu_menu_items_url(:menu_id => @menu.id)
24
+ end
25
+
26
+ def edit
27
+ add_breadcrumb "Edit #{@menu.name}", :edit_spud_admin_menu_path
28
+ respond_with @menu
29
+ end
30
+
31
+ def update
32
+ add_breadcrumb "Edit #{@menu.name}", :edit_spud_admin_menu_path
33
+ flash[:notice] = "Menu saved successfully" if @menu.update_attributes(params[:spud_menu])
34
+ respond_with @menu,:location => spud_admin_menu_menu_items_url(:menu_id => @menu.id)
35
+ end
36
+
37
+ def destroy
38
+ flash[:notice] = "Menu removed!" if @menu.destroy
39
+ respond_with @menu,:location => spud_admin_menus_url
40
+ end
41
+
42
+ private
43
+ def load_menu
44
+ @menu = SpudMenu.find(params[:id])
45
+ if @menu.blank?
46
+ flash[:error] = "Menu not found!"
47
+ redirect_to spud_admin_menus_url() and return false
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,149 @@
1
+ class Spud::Admin::PagesController < Spud::Admin::ApplicationController
2
+ layout 'spud/admin/cms/detail'
3
+ add_breadcrumb "Pages", :spud_admin_pages_path
4
+ belongs_to_spud_app :pages
5
+ before_filter :load_page,:only => [:edit,:update,:show,:destroy]
6
+
7
+ def index
8
+
9
+ @pages = SpudPage.where(:spud_page_id => nil).order(:page_order).includes(:spud_pages).paginate :page => params[:page]
10
+ end
11
+
12
+ def show
13
+
14
+
15
+ if @page.blank?
16
+ flash[:error] = "Page not found"
17
+ if !params[:id].blank?
18
+ redirect_to spud_admin_pages_url() and return
19
+ else
20
+ return
21
+ end
22
+ end
23
+
24
+ layout = 'application'
25
+
26
+
27
+ if !@page.spud_template.blank?
28
+ if !@page.spud_template.base_layout.blank?
29
+ layout = @page.spud_template.base_layout
30
+ end
31
+ @inline = @page.spud_template.content
32
+ end
33
+ render :layout => layout
34
+ end
35
+
36
+ def new
37
+ add_breadcrumb "New", :new_spud_admin_page_path
38
+
39
+
40
+ @templates = SpudTemplate.all
41
+ @page = SpudPage.new
42
+ Spud::Cms.default_page_parts.each do |part|
43
+ @page.spud_page_partials.new(:name => part)
44
+ end
45
+
46
+ # @page.spud_page_partials.new(:name => "Sidebar")
47
+ end
48
+
49
+ def create
50
+
51
+ @page = SpudPage.new(params[:spud_page])
52
+
53
+ if @page.save
54
+ flash[:notice] = "Page Saved successfully"
55
+ redirect_to spud_admin_pages_url() and return
56
+ else
57
+ flash[:error] = "Error creating page"
58
+ @error_object_name = "page"
59
+ render :action => "new"
60
+ end
61
+ end
62
+
63
+ def edit
64
+ add_breadcrumb "#{@page.name}", :spud_admin_page_path
65
+ add_breadcrumb "Edit", :edit_spud_admin_page_path
66
+
67
+ @templates = SpudTemplate.all
68
+ if @page.spud_page_partials.blank?
69
+ Spud::Cms.default_page_parts.each do |part|
70
+ @page.spud_page_partials.new(:name => part)
71
+ end
72
+ end
73
+ if !@page.spud_template.blank?
74
+ @page.spud_template.page_parts.split(",").each do |part|
75
+ partial = @page.spud_page_partials.select{|p| p.name == part}
76
+ if partial.blank?
77
+ @page.spud_page_partials.new(:name => part)
78
+ end
79
+ end
80
+ end
81
+ end
82
+
83
+ def update
84
+ if @page.update_attributes(params[:spud_page])
85
+ flash[:notice] = "Page updated successfully!"
86
+ redirect_to spud_admin_pages_url() and return
87
+ else
88
+ flash[:error] = "There was an error saving this page"
89
+ render :action => "edit"
90
+ end
91
+
92
+ end
93
+
94
+ def destroy
95
+ status = 500
96
+ if @page.destroy
97
+ flash[:notice] = "Page removed successfully!"
98
+ status = 200
99
+ else
100
+ flash[:error] = "Error removing page"
101
+ end
102
+ respond_to do |format|
103
+ format.js {render :status => status}
104
+ format.html { redirect_to spud_admin_pages_url()}
105
+ end
106
+ end
107
+
108
+ def page_parts
109
+ template = params[:template] && !params[:template].blank? ? SpudTemplate.where(:id => params[:template]).first : nil
110
+ page = SpudPage.where(:id => params[:page]).includes(:spud_page_partials).first
111
+ page = SpudPage.new if page.blank?
112
+ old_page_partials = Array.new(page.spud_page_partials)
113
+ new_page_partials = []
114
+ if !template.blank? && !template.page_parts.blank?
115
+ template.page_parts.split(',').each do |page_part|
116
+ new_page_partials << page.spud_page_partials.build(:name => page_part.strip)
117
+ end
118
+ else
119
+ Spud::Cms.default_page_parts.each do |part|
120
+ new_page_partials << page.spud_page_partials.build(:name => part)
121
+ end
122
+
123
+ end
124
+ new_page_partials.each do |partial|
125
+ old_partial = old_page_partials.select {|pp| partial.name.strip.downcase == pp.name.strip.downcase }
126
+ partial.content = old_partial[0].content if !old_partial.blank?
127
+ end
128
+
129
+ respond_to do |format|
130
+ format.js {
131
+ if response.status == 200
132
+ render(:partial => 'page_partials_form', :locals => {:spud_page_partials => new_page_partials, :remove_page_partials => old_page_partials})
133
+ else
134
+ render(:text => message)
135
+ end
136
+ }
137
+ end
138
+ end
139
+
140
+ private
141
+ def load_page
142
+ @page = SpudPage.where(:id => params[:id]).includes(:spud_custom_fields,:spud_page_partials).first
143
+ if @page.blank?
144
+ flash[:error] = "Page not found!"
145
+ redirect_to spud_admin_pages_url() and return false
146
+ end
147
+ return true
148
+ end
149
+ end