zen 0.2.4.1 → 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (189) hide show
  1. data/MANIFEST +42 -33
  2. data/README.md +14 -27
  3. data/ROADMAP.md +20 -2
  4. data/{Thorfile → Rakefile} +2 -3
  5. data/bin/zen +27 -5
  6. data/lib/zen.rb +70 -52
  7. data/lib/zen/asset.rb +258 -0
  8. data/lib/zen/bin/app.rb +42 -0
  9. data/lib/zen/controller/admin_controller.rb +53 -36
  10. data/lib/zen/controller/base_controller.rb +13 -8
  11. data/lib/zen/controller/frontend_controller.rb +4 -3
  12. data/lib/zen/controller/main_controller.rb +17 -33
  13. data/lib/zen/error/validation_error.rb +10 -0
  14. data/lib/zen/ext/string.rb +185 -0
  15. data/lib/zen/helper/acl.rb +120 -92
  16. data/lib/zen/helper/common.rb +1 -3
  17. data/lib/zen/helper/theme.rb +73 -0
  18. data/lib/zen/language.rb +66 -57
  19. data/lib/zen/layout/admin.xhtml +5 -48
  20. data/lib/zen/layout/login.xhtml +4 -44
  21. data/lib/zen/model/methods.rb +1 -1
  22. data/lib/zen/model/settings.rb +0 -3
  23. data/lib/zen/package.rb +101 -83
  24. data/lib/zen/package/base.rb +62 -0
  25. data/lib/zen/package/categories/lib/categories.rb +29 -10
  26. data/lib/zen/package/categories/lib/categories/controller/categories.rb +4 -5
  27. data/lib/zen/package/categories/lib/categories/controller/category_groups.rb +4 -5
  28. data/lib/zen/package/categories/lib/categories/language/en/category_groups.yml +4 -3
  29. data/lib/zen/package/categories/lib/categories/model/category.rb +2 -2
  30. data/lib/zen/package/categories/lib/categories/model/category_group.rb +3 -3
  31. data/lib/zen/package/categories/lib/categories/plugin/categories.rb +130 -0
  32. data/lib/zen/package/categories/lib/categories/view/admin/categories/form.xhtml +1 -1
  33. data/lib/zen/package/categories/lib/categories/view/admin/categories/index.xhtml +2 -2
  34. data/lib/zen/package/categories/lib/categories/view/admin/category-groups/index.xhtml +11 -6
  35. data/lib/zen/package/comments/lib/comments.rb +23 -13
  36. data/lib/zen/package/comments/lib/comments/controller/comments.rb +4 -5
  37. data/lib/zen/package/comments/lib/comments/controller/comments_form.rb +7 -8
  38. data/lib/zen/package/comments/lib/comments/model/comment.rb +4 -4
  39. data/lib/zen/package/comments/lib/comments/plugin/comments.rb +111 -0
  40. data/lib/zen/package/comments/lib/comments/view/admin/comments/form.xhtml +2 -2
  41. data/lib/zen/package/comments/lib/comments/view/admin/comments/index.xhtml +3 -3
  42. data/lib/zen/package/custom_fields/lib/custom_fields.rb +18 -11
  43. data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_field_groups.rb +4 -5
  44. data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_fields.rb +4 -5
  45. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field.rb +2 -2
  46. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_group.rb +3 -3
  47. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_value.rb +3 -3
  48. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-field-groups/index.xhtml +9 -5
  49. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-fields/form.xhtml +1 -1
  50. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-fields/index.xhtml +3 -3
  51. data/lib/zen/package/menus/lib/menus.rb +25 -43
  52. data/lib/zen/package/menus/lib/menus/controller/menu_items.rb +5 -6
  53. data/lib/zen/package/menus/lib/menus/controller/menus.rb +9 -5
  54. data/lib/zen/package/menus/lib/menus/helper/menu_item.rb +4 -4
  55. data/lib/zen/package/menus/lib/menus/model/menu.rb +2 -2
  56. data/lib/zen/package/menus/lib/menus/model/menu_item.rb +4 -1
  57. data/lib/zen/package/menus/lib/menus/plugin/menus.rb +152 -0
  58. data/lib/zen/package/menus/lib/menus/view/admin/menu-items/form.xhtml +1 -1
  59. data/lib/zen/package/menus/lib/menus/view/admin/menu-items/index.xhtml +3 -3
  60. data/lib/zen/package/menus/lib/menus/view/admin/menus/index.xhtml +7 -7
  61. data/lib/zen/package/sections/lib/sections.rb +32 -16
  62. data/lib/zen/package/sections/lib/sections/controller/section_entries.rb +9 -18
  63. data/lib/zen/package/sections/lib/sections/controller/sections.rb +8 -9
  64. data/lib/zen/package/sections/lib/sections/language/en/section_entries.yml +1 -1
  65. data/lib/zen/package/sections/lib/sections/model/section.rb +4 -4
  66. data/lib/zen/package/sections/lib/sections/model/section_entry.rb +9 -10
  67. data/lib/zen/package/sections/lib/sections/plugin/section_entries.rb +224 -0
  68. data/lib/zen/package/sections/lib/sections/plugin/sections.rb +85 -0
  69. data/lib/zen/package/sections/lib/sections/view/admin/form.xhtml +1 -1
  70. data/lib/zen/package/sections/lib/sections/view/admin/index.xhtml +9 -5
  71. data/lib/zen/package/sections/lib/sections/view/admin/section-entries/index.xhtml +2 -2
  72. data/lib/zen/package/settings/lib/settings.rb +145 -10
  73. data/lib/zen/package/settings/lib/settings/controller/settings.rb +28 -24
  74. data/lib/zen/package/settings/lib/settings/language/en/settings.yml +10 -0
  75. data/lib/zen/package/settings/lib/settings/model/setting.rb +3 -64
  76. data/lib/zen/package/settings/lib/settings/plugin/group_base.rb +40 -0
  77. data/lib/zen/package/settings/lib/settings/plugin/setting_base.rb +76 -0
  78. data/lib/zen/package/settings/lib/settings/plugin/settings.rb +236 -0
  79. data/lib/zen/package/settings/lib/settings/view/admin/settings/index.xhtml +20 -49
  80. data/lib/zen/package/settings/migrations/1295597111_create_schema.rb +0 -12
  81. data/lib/zen/package/settings/migrations/1303196915_settings_plugin.rb +31 -0
  82. data/lib/zen/package/users/lib/users.rb +18 -15
  83. data/lib/zen/package/users/lib/users/controller/access_rules.rb +44 -8
  84. data/lib/zen/package/users/lib/users/controller/user_groups.rb +4 -5
  85. data/lib/zen/package/users/lib/users/controller/users.rb +5 -6
  86. data/lib/zen/package/users/lib/users/language/en/access_rules.yml +11 -9
  87. data/lib/zen/package/users/lib/users/model/access_rule.rb +7 -6
  88. data/lib/zen/package/users/lib/users/model/user.rb +4 -4
  89. data/lib/zen/package/users/lib/users/model/user_group.rb +3 -3
  90. data/lib/zen/package/users/lib/users/public/admin/js/users/access_rules.js +50 -0
  91. data/lib/zen/package/users/lib/users/view/admin/access-rules/form.xhtml +32 -29
  92. data/lib/zen/package/users/lib/users/view/admin/access-rules/index.xhtml +8 -6
  93. data/lib/zen/package/users/lib/users/view/admin/user-groups/index.xhtml +3 -3
  94. data/lib/zen/package/users/lib/users/view/admin/users/index.xhtml +2 -2
  95. data/lib/zen/package/users/migrations/1303510943_class_rules.rb +13 -0
  96. data/lib/zen/plugin.rb +110 -104
  97. data/lib/zen/plugin/base.rb +46 -0
  98. data/lib/zen/{liquid/controller_behavior.rb → plugin/controller.rb} +9 -7
  99. data/lib/zen/plugin/helper.rb +47 -0
  100. data/lib/zen/plugin/markup/lib/markup.rb +14 -0
  101. data/lib/zen/plugin/markup/lib/markup/language/en/markup.yml +6 -0
  102. data/lib/zen/plugin/markup/lib/markup/markup.rb +154 -0
  103. data/lib/zen/public/admin/css/forms.css +4 -0
  104. data/lib/zen/public/admin/css/general.css +15 -15
  105. data/lib/zen/public/admin/css/layout.css +10 -10
  106. data/lib/zen/public/admin/css/reset.css +123 -0
  107. data/lib/zen/public/admin/images/icons/accept.png +0 -0
  108. data/lib/zen/public/admin/images/icons/add.png +0 -0
  109. data/lib/zen/public/admin/images/icons/back.png +0 -0
  110. data/lib/zen/public/admin/images/icons/bold.png +0 -0
  111. data/lib/zen/public/admin/images/icons/close.png +0 -0
  112. data/lib/zen/public/admin/images/icons/delete.png +0 -0
  113. data/lib/zen/public/admin/images/icons/edit.png +0 -0
  114. data/lib/zen/public/admin/images/icons/error.png +0 -0
  115. data/lib/zen/public/admin/images/icons/help.png +0 -0
  116. data/lib/zen/public/admin/images/icons/info.png +0 -0
  117. data/lib/zen/public/admin/images/icons/italic.png +0 -0
  118. data/lib/zen/public/admin/images/icons/large/error.png +0 -0
  119. data/lib/zen/public/admin/images/icons/large/notice.png +0 -0
  120. data/lib/zen/public/admin/images/icons/large/success.png +0 -0
  121. data/lib/zen/public/admin/images/icons/link.png +0 -0
  122. data/lib/zen/public/admin/images/icons/logout.png +0 -0
  123. data/lib/zen/public/admin/images/icons/ol.png +0 -0
  124. data/lib/zen/public/admin/images/icons/pdf.png +0 -0
  125. data/lib/zen/public/admin/images/icons/ul.png +0 -0
  126. data/lib/zen/public/admin/images/icons/user.png +0 -0
  127. data/lib/zen/public/admin/images/icons/view.png +0 -0
  128. data/lib/zen/public/admin/js/mootools/core.js +384 -333
  129. data/lib/zen/public/admin/js/mootools/more.js +256 -231
  130. data/lib/zen/public/admin/js/vendor/{datepicker/Picker.Date.js → datepicker.js} +447 -0
  131. data/lib/zen/public/admin/js/vendor/yepnope.js +1 -0
  132. data/lib/zen/public/admin/js/zen/editor/base.js +8 -1
  133. data/lib/zen/public/admin/js/zen/init.js +89 -26
  134. data/lib/zen/public/favicon.ico +0 -0
  135. data/lib/zen/task.rb +7 -0
  136. data/lib/zen/task/build.rake +60 -0
  137. data/lib/zen/task/clean.rake +27 -0
  138. data/lib/zen/task/db.rake +111 -0
  139. data/lib/zen/task/package.rake +67 -0
  140. data/lib/zen/task/plugin.rake +24 -0
  141. data/lib/zen/task/proto.rake +95 -0
  142. data/lib/zen/task/theme.rake +68 -0
  143. data/lib/zen/theme.rb +28 -55
  144. data/lib/zen/theme/base.rb +64 -0
  145. data/lib/zen/validation.rb +149 -0
  146. data/lib/zen/version.rb +1 -1
  147. data/lib/zen/view/bottom.xhtml +6 -0
  148. data/lib/zen/view/main.xhtml +32 -0
  149. data/proto/app/Rakefile +12 -0
  150. data/proto/app/app.rb +6 -6
  151. data/proto/app/config/config.rb +7 -14
  152. data/proto/app/config/database.rb +0 -20
  153. data/proto/app/start.rb +0 -1
  154. data/proto/app/{vendor/themes → task}/.gitkeep +0 -0
  155. data/proto/app/vendor/theme/.gitkeep +0 -0
  156. data/proto/package/lib/package.rb +8 -17
  157. data/proto/package/lib/package/controller/controllers.rb +4 -4
  158. data/proto/package/lib/package/language/en/languages.yml +3 -3
  159. data/proto/package/lib/package/model/model.rb +1 -1
  160. metadata +73 -73
  161. data/lib/zen/bin/base.rb +0 -109
  162. data/lib/zen/helper/asset.rb +0 -106
  163. data/lib/zen/liquid/general.rb +0 -94
  164. data/lib/zen/liquid/redirect.rb +0 -70
  165. data/lib/zen/liquid/strip.rb +0 -60
  166. data/lib/zen/package/categories/lib/categories/liquid/categories.rb +0 -16
  167. data/lib/zen/package/comments/lib/comments/liquid/comment_form.rb +0 -127
  168. data/lib/zen/package/comments/lib/comments/liquid/comments.rb +0 -115
  169. data/lib/zen/package/menus/lib/menus/liquid/menus.rb +0 -152
  170. data/lib/zen/package/sections/lib/sections/liquid/section_entries.rb +0 -228
  171. data/lib/zen/package/sections/lib/sections/liquid/sections.rb +0 -77
  172. data/lib/zen/package/settings/lib/settings/liquid/setting.rb +0 -58
  173. data/lib/zen/package/users/lib/users/liquid/user.rb +0 -77
  174. data/lib/zen/package/users/lib/users/liquid/users.rb +0 -82
  175. data/lib/zen/plugin/markup.rb +0 -30
  176. data/lib/zen/public/admin/css/boilerplate.css +0 -176
  177. data/lib/zen/public/admin/images/general/noise.jpg +0 -0
  178. data/lib/zen/public/admin/js/vendor/datepicker/Picker.Attach.js +0 -137
  179. data/lib/zen/public/admin/js/vendor/datepicker/Picker.js +0 -291
  180. data/lib/zen/public/admin/js/vendor/datepicker/README.md +0 -325
  181. data/lib/zen/public/admin/js/vendor/datepicker/locale.js +0 -16
  182. data/lib/zen/strict_struct.rb +0 -36
  183. data/lib/zen/task/build.rb +0 -123
  184. data/lib/zen/task/clean.rb +0 -46
  185. data/lib/zen/task/db.rb +0 -130
  186. data/lib/zen/task/package.rb +0 -87
  187. data/lib/zen/task/proto.rb +0 -116
  188. data/lib/zen/task/theme.rb +0 -88
  189. data/proto/app/Thorfile +0 -4
@@ -1,32 +1,48 @@
1
+ require __DIR__('sections/model/section')
2
+ require __DIR__('sections/model/section_entry')
3
+ require __DIR__('sections/controller/sections')
4
+ require __DIR__('sections/controller/section_entries')
5
+ require __DIR__('sections/plugin/sections')
6
+ require __DIR__('sections/plugin/section_entries')
1
7
 
2
- # Load all the classes such as controllers, models and so on.
3
- require __DIR__ 'sections/model/section'
4
- require __DIR__ 'sections/model/section_entry'
5
- require __DIR__ 'sections/controller/sections'
6
- require __DIR__ 'sections/controller/section_entries'
8
+ Zen::Language.options.paths.push(__DIR__('sections'))
9
+ Zen::Language.load('sections')
10
+ Zen::Language.load('section_entries')
7
11
 
8
- # Load and register all our liquid tags
9
- require __DIR__ 'sections/liquid/section_entries'
10
- require __DIR__ 'sections/liquid/sections'
11
-
12
- Liquid::Template.register_tag('sections', Sections::Liquid::Sections)
13
- Liquid::Template.register_tag('section_entries', Sections::Liquid::SectionEntries)
14
-
15
- # Describe what this extension is all about
16
12
  Zen::Package.add do |p|
17
- p.name = 'Sections'
13
+ p.name = 'sections'
18
14
  p.author = 'Yorick Peterse'
19
15
  p.url = 'http://yorickpeterse.com/'
20
16
  p.about = "The sections module allows users to create and manage sections.
21
17
  Sections can be seen as small web applications that live inside the CMS.
22
18
  For example, you could have a section for your blog and for your pages."
23
19
 
24
- p.identifier = 'com.zen.sections'
25
20
  p.directory = __DIR__('sections')
26
21
  p.migration_dir = __DIR__('../migrations')
27
22
 
28
23
  p.menu = [{
29
- :title => "Sections",
24
+ :title => lang('sections.titles.index'),
30
25
  :url => "admin"
31
26
  }]
27
+
28
+ p.controllers = {
29
+ lang('sections.titles.index') => Sections::Controller::Sections,
30
+ lang('section_entries.titles.index') => Sections::Controller::SectionEntries
31
+ }
32
+ end
33
+
34
+ Zen::Plugin.add do |p|
35
+ p.name = 'sections'
36
+ p.author = 'Yorick Peterse'
37
+ p.about = 'Plugin for retrieving multiple or individual sections.'
38
+ p.url = 'http://yorickpeterse.com/'
39
+ p.plugin = Sections::Plugin::Sections
40
+ end
41
+
42
+ Zen::Plugin.add do |p|
43
+ p.name = 'section_entries'
44
+ p.author = 'Yorick Peterse'
45
+ p.about = 'Plugin for retrieving multiple or individual section entries.'
46
+ p.url = 'http://yorickpeterse.com/'
47
+ p.plugin = Sections::Plugin::SectionEntries
32
48
  end
@@ -1,7 +1,7 @@
1
1
  #:nodoc:
2
2
  module Sections
3
3
  #:nodoc:
4
- module Controllers
4
+ module Controller
5
5
  ##
6
6
  # Section entries can be seen as blog entries, products, all sorts of things.
7
7
  # Each section belongs to a section and can't be created without one.
@@ -9,12 +9,11 @@ module Sections
9
9
  # @author Yorick Peterse
10
10
  # @since 0.1
11
11
  #
12
- class SectionEntries < Zen::Controllers::AdminController
13
- include ::Sections::Models
14
-
15
- map '/admin/section-entries'
16
- trait :extension_identifier => 'com.zen.sections'
12
+ class SectionEntries < Zen::Controller::AdminController
13
+ include ::Sections::Model
17
14
 
15
+ map('/admin/section-entries')
16
+
18
17
  before_all do
19
18
  csrf_protection(:save, :delete) do
20
19
  respond(lang('zen_general.errors.csrf'), 403)
@@ -49,14 +48,6 @@ module Sections
49
48
  @page_title = lang("section_entries.titles.#{method}") rescue nil
50
49
  end
51
50
 
52
- # Load our datepicker that ships with Zen itself
53
- require_js(
54
- 'vendor/datepicker/Picker', 'vendor/datepicker/Picker.Attach',
55
- 'vendor/datepicker/Picker.Date', 'vendor/datepicker/locale'
56
- )
57
-
58
- require_css('datepicker')
59
-
60
51
  @status_hash = {
61
52
  'draft' => lang('section_entries.special.status_hash.draft'),
62
53
  'published' => lang('section_entries.special.status_hash.published')
@@ -123,7 +114,7 @@ module Sections
123
114
 
124
115
  @users_hash = {}
125
116
 
126
- Users::Models::User.each { |u| @users_hash[u.id] = u.name }
117
+ Users::Model::User.each { |u| @users_hash[u.id] = u.name }
127
118
  end
128
119
 
129
120
  ##
@@ -153,7 +144,7 @@ module Sections
153
144
  @entry = SectionEntry.new(:section_id => @section_id)
154
145
  @users_hash = {}
155
146
 
156
- Users::Models::User.each { |u| @users_hash[u.id] = u.name }
147
+ Users::Model::User.each { |u| @users_hash[u.id] = u.name }
157
148
  end
158
149
 
159
150
  ##
@@ -172,7 +163,7 @@ module Sections
172
163
  # patches as it executes quite a few queries. I'll keep it as it is for now.
173
164
  #
174
165
  def save
175
- if !user_authorized?([:create, :save])
166
+ if !user_authorized?([:create, :update])
176
167
  respond(lang('zen_general.errors.not_authorized'), 403)
177
168
  end
178
169
 
@@ -214,7 +205,7 @@ module Sections
214
205
 
215
206
  # Update the field values
216
207
  field_values.each do |field_id, value|
217
- field_value = CustomFields::Models::CustomFieldValue[
208
+ field_value = CustomFields::Model::CustomFieldValue[
218
209
  :custom_field_id => field_id,
219
210
  :section_entry_id => @entry.id
220
211
  ]
@@ -1,7 +1,7 @@
1
1
  #:nodoc:
2
2
  module Sections
3
3
  #:nodoc:
4
- module Controllers
4
+ module Controller
5
5
  ##
6
6
  # Sections can be seen as mini applications inside your website.
7
7
  # Examples of sections can be a blog, pages, a products listing, etc.
@@ -14,11 +14,10 @@ module Sections
14
14
  # @author Yorick Peterse
15
15
  # @since 0.1
16
16
  #
17
- class Sections < Zen::Controllers::AdminController
18
- include ::Sections::Models
17
+ class Sections < Zen::Controller::AdminController
18
+ include ::Sections::Model
19
19
 
20
- map '/admin'
21
- trait :extension_identifier => 'com.zen.sections'
20
+ map('/admin')
22
21
 
23
22
  before_all do
24
23
  csrf_protection(:save, :delete) do
@@ -95,8 +94,8 @@ module Sections
95
94
  @page_title
96
95
  )
97
96
 
98
- @custom_field_group_pk_hash = CustomFields::Models::CustomFieldGroup.pk_hash(:name)
99
- @category_group_pk_hash = Categories::Models::CategoryGroup.pk_hash(:name)
97
+ @custom_field_group_pk_hash = CustomFields::Model::CustomFieldGroup.pk_hash(:name)
98
+ @category_group_pk_hash = Categories::Model::CategoryGroup.pk_hash(:name)
100
99
 
101
100
  if flash[:form_data]
102
101
  @section = flash[:form_data]
@@ -126,8 +125,8 @@ module Sections
126
125
  @page_title
127
126
  )
128
127
 
129
- @custom_field_group_pk_hash = CustomFields::Models::CustomFieldGroup.pk_hash(:name)
130
- @category_group_pk_hash = Categories::Models::CategoryGroup.pk_hash(:name)
128
+ @custom_field_group_pk_hash = CustomFields::Model::CustomFieldGroup.pk_hash(:name)
129
+ @category_group_pk_hash = Categories::Model::CategoryGroup.pk_hash(:name)
131
130
  @section = Section.new
132
131
  end
133
132
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  titles:
3
- index : 'Entries'
3
+ index : 'Section Entries'
4
4
  edit : 'Edit Entry'
5
5
  new : 'Add Entry'
6
6
 
@@ -1,7 +1,7 @@
1
1
  #:nodoc:
2
2
  module Sections
3
3
  #:nodoc:
4
- module Models
4
+ module Model
5
5
  ##
6
6
  # Model that represents a single section. This model has the following
7
7
  # relations:
@@ -20,18 +20,18 @@ module Sections
20
20
  class Section < Sequel::Model
21
21
  one_to_many(
22
22
  :section_entries,
23
- :class => "Sections::Models::SectionEntry",
23
+ :class => "Sections::Model::SectionEntry",
24
24
  :eager => [:custom_field_values]
25
25
  )
26
26
 
27
27
  many_to_many(
28
28
  :custom_field_groups,
29
- :class => "CustomFields::Models::CustomFieldGroup"
29
+ :class => "CustomFields::Model::CustomFieldGroup"
30
30
  )
31
31
 
32
32
  many_to_many(
33
33
  :category_groups,
34
- :class => "Categories::Models::CategoryGroup"
34
+ :class => "Categories::Model::CategoryGroup"
35
35
  )
36
36
 
37
37
  plugin(:sluggable, :source => :name, :freeze => false)
@@ -1,7 +1,7 @@
1
1
  #:nodoc:
2
2
  module Sections
3
3
  #:nodoc:
4
- module Models
4
+ module Model
5
5
  ##
6
6
  # Model that represents a singe section entry. This model has the following
7
7
  # relations:
@@ -19,21 +19,19 @@ module Sections
19
19
  # @author Yorick Peterse
20
20
  # @since 0.1
21
21
  #
22
- class SectionEntry < Sequel::Model
23
- one_to_many(
24
- :comments,
25
- :class => "Comments::Models::Comment"
26
- )
22
+ class SectionEntry < Sequel::Model
23
+
24
+ one_to_many(:comments, :class => "Comments::Model::Comment")
27
25
 
28
26
  one_to_many(
29
27
  :custom_field_values,
30
- :class => "CustomFields::Models::CustomFieldValue",
28
+ :class => "CustomFields::Model::CustomFieldValue",
31
29
  :eager => [:custom_field]
32
30
  )
33
31
 
34
- many_to_one(:user , :class => "Users::Models::User")
35
- many_to_many(:categories, :class => "Categories::Models::Category")
36
- many_to_one(:section , :class => "Sections::Models::Section")
32
+ many_to_one(:user , :class => "Users::Model::User")
33
+ many_to_many(:categories, :class => "Categories::Model::Category")
34
+ many_to_one(:section , :class => "Sections::Model::Section")
37
35
 
38
36
  plugin(:sluggable , :source => :title , :freeze => false)
39
37
  plugin(:timestamps, :create => :created_at, :update => false)
@@ -48,6 +46,7 @@ module Sections
48
46
  validates_presence([:title, :status, :user_id])
49
47
  validates_presence(:slug) unless new?
50
48
  end
49
+
51
50
  end
52
51
  end
53
52
  end
@@ -0,0 +1,224 @@
1
+ #:nodoc:
2
+ module Sections
3
+ #:nodoc:
4
+ module Plugin
5
+ ##
6
+ # The SectionEntries plugin can be used to retrieve section entries as well as the
7
+ # associated comments and user data. This allows you to relatively easily build a list
8
+ # of entries (e.g. blog articles) without having to retrieve and process the
9
+ # associated data manually.
10
+ #
11
+ # ## Usage
12
+ #
13
+ # Basic usage is as following:
14
+ #
15
+ # entries = plugin(:section_entries, :limit => 10, :section => 'blog')
16
+ # entries.each do |e|
17
+ # puts e[:title]
18
+ # end
19
+ #
20
+ # The values of custom fields are stored under the key :fields. This key contains a
21
+ # hash where the keys are the slugs of the custom fields and the values the values for
22
+ # the current entry.
23
+ #
24
+ # entries.each do |e|
25
+ # e[:fields][:thumbnail]
26
+ # end
27
+ #
28
+ # User data can be found in the key :user:
29
+ #
30
+ # entries.each do |e|
31
+ # e[:user][:name]
32
+ # end
33
+ #
34
+ # Last but not least, comments can be found under the key :comments:
35
+ #
36
+ # entries.each do |e|
37
+ # e[:comments].each do |c|
38
+ # c[:comment]
39
+ # end
40
+ # end
41
+ #
42
+ # For a full list of available options see Sections::Plugin::SectionEntries.initialize.
43
+ #
44
+ # @author Yorick Peterse
45
+ # @since 0.2.5
46
+ #
47
+ class SectionEntries
48
+ include ::Zen::Plugin::Helper
49
+ include ::Sections::Model
50
+
51
+ ##
52
+ # Creates a new instance of the plugin and validates/stores the given configuration
53
+ # options. Please note that you always need to either specify a section from which
54
+ # to retrieve all entries or a single entry in order to use this plugin. You can
55
+ # retrieve a list of entries (or just a single one) by specifying the ID or the
56
+ # slug:
57
+ #
58
+ # plugin(:section_entries, :section => 'blog')
59
+ # plugin(:section_entries, :section => 10)
60
+ #
61
+ # @author Yorick Peterse
62
+ # @since 0.2.5
63
+ # @param [Hash] options Hash with a collection of custom configuration options that
64
+ # determine how and what entries should be retrieved.
65
+ # @option options [Fixnum/Integer] :limit
66
+ # @option options [Fixnum/Integer] :offset
67
+ # @option options [NilClass/String/Integer/Fixnum] :section
68
+ # @option options [NilClass/String/Integer/Fixnum] :entry
69
+ # @option options [TrueClass] :markup When set to true the markup of all entries will
70
+ # be converted to the desired output (usually this is HTML).
71
+ # @option options [TrueClass] :comments When set to true all comments for each entry
72
+ # will be retrieved.
73
+ # @option options [TrueClass] :comment_markup When set to true the markup of comments
74
+ # will be converted to the desired output.
75
+ # @option options [TrueClass] :categories When set to true all categories for each
76
+ # entry will be retrieved as well.
77
+ #
78
+ def initialize(options = {})
79
+ @options = {
80
+ :limit => 20,
81
+ :offset => 0,
82
+ :section => nil,
83
+ :entry => nil,
84
+ :markup => true,
85
+ :comments => true,
86
+ :comment_markup => true,
87
+ :categories => true
88
+ }.merge(options)
89
+
90
+ validate_type(@options[:limit] , :limit , [Fixnum, Integer])
91
+ validate_type(@options[:offset] , :limit , [Fixnum, Integer])
92
+ validate_type(@options[:section] , :section , [NilClass, String, Integer, Fixnum])
93
+ validate_type(@options[:entry] , :entry , [NilClass, String, Integer, Fixnum])
94
+ validate_type(@options[:markup] , :markup , [TrueClass, FalseClass])
95
+ validate_type(@options[:comments], :comments, [TrueClass, FalseClass])
96
+
97
+ if @options[:section].nil? and @options[:entry].nil?
98
+ raise(
99
+ ArgumentError,
100
+ "You need to specify either an entry or a section to retrieve."
101
+ )
102
+ end
103
+ end
104
+
105
+ ##
106
+ # Fetches all the data and converts everything to a hash. Once this is done either
107
+ # an array of entries or a single entry hash will be returned.
108
+ #
109
+ # @author Yorick Peterse
110
+ # @since 0.2.5
111
+ # @return [Array/Hash]
112
+ #
113
+ def call
114
+ # Create the list with models to load using eager()
115
+ eager_models = [:custom_field_values, :categories, :section, :user]
116
+ filter_hash = {}
117
+
118
+ if @options[:comments] === true
119
+ eager_models.push(:comments)
120
+ end
121
+
122
+ # Retrieve multiple entries
123
+ if !@options[:section].nil?
124
+ # Retrieve the section by it's slug
125
+ if @options[:section].class == String
126
+ section_id = Section[:slug => @options[:section]].id
127
+ else
128
+ section_id = @options[:section]
129
+ end
130
+
131
+ filter_hash[:section_id] = section_id
132
+ end
133
+
134
+ # Retrieve a specific entry
135
+ if !@options[:entry].nil?
136
+ # Retrieve it by it's slug
137
+ if @options[:entry].class == String
138
+ filter_hash[:slug] = @options[:entry]
139
+ # Retrieve the entry by it's ID
140
+ else
141
+ filter_hash[:id] = @options[:entry]
142
+ end
143
+ end
144
+
145
+ # Get the entries
146
+ entries = SectionEntry.filter(filter_hash)
147
+ .eager(*eager_models)
148
+ .limit(@options[:limit], @options[:offset])
149
+ .all
150
+
151
+ comment_format = nil
152
+
153
+ # Loop through all entries so we can process our custom field values
154
+ entries.each_with_index do |entry, index|
155
+ if comment_format.nil?
156
+ comment_format = entry.section.comment_format
157
+ end
158
+
159
+ field_values = {}
160
+ user = {}
161
+ comments = []
162
+ categories = []
163
+
164
+ # Store all the custom field values
165
+ entry.custom_field_values.each do |v|
166
+ name = v.custom_field.slug.to_sym
167
+ value = v.value
168
+
169
+ # Convert the markup
170
+ if @options[:markup] === true
171
+ value = plugin(:markup, v.custom_field.format, value)
172
+ end
173
+
174
+ field_values[name] = value
175
+ end
176
+
177
+ # Get all the comments if the developer wants them
178
+ if @options[:comments] === true
179
+ entry.comments.each do |c|
180
+ comment = c.values
181
+
182
+ if c.user
183
+ comment[:user] = c.user.values
184
+ end
185
+
186
+ # Convert the comment's markup
187
+ if @options[:comment_markup]
188
+ comment[:comment] = plugin(:markup, comment_format, comment[:comment])
189
+ end
190
+
191
+ comments.push(comment)
192
+ end
193
+ end
194
+
195
+ # Get the user data
196
+ if !entry.user.nil?
197
+ user = entry.user.values
198
+ end
199
+
200
+ # Get all categories
201
+ categories = entry.categories.map do |cat|
202
+ cat.values
203
+ end
204
+
205
+ # Convert the entry to a hash and re-assign all data
206
+ entry = entry.values
207
+ entry[:fields] = field_values
208
+ entry[:user] = user
209
+ entry[:comments] = comments
210
+ entry[:categories] = categories
211
+ entries[index] = entry
212
+ end
213
+
214
+ # Do we only want a single entry?
215
+ if !@options[:entry].nil?
216
+ entries = entries[0]
217
+ end
218
+
219
+ return entries
220
+ end
221
+
222
+ end
223
+ end
224
+ end