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.
- data/MANIFEST +42 -33
- data/README.md +14 -27
- data/ROADMAP.md +20 -2
- data/{Thorfile → Rakefile} +2 -3
- data/bin/zen +27 -5
- data/lib/zen.rb +70 -52
- data/lib/zen/asset.rb +258 -0
- data/lib/zen/bin/app.rb +42 -0
- data/lib/zen/controller/admin_controller.rb +53 -36
- data/lib/zen/controller/base_controller.rb +13 -8
- data/lib/zen/controller/frontend_controller.rb +4 -3
- data/lib/zen/controller/main_controller.rb +17 -33
- data/lib/zen/error/validation_error.rb +10 -0
- data/lib/zen/ext/string.rb +185 -0
- data/lib/zen/helper/acl.rb +120 -92
- data/lib/zen/helper/common.rb +1 -3
- data/lib/zen/helper/theme.rb +73 -0
- data/lib/zen/language.rb +66 -57
- data/lib/zen/layout/admin.xhtml +5 -48
- data/lib/zen/layout/login.xhtml +4 -44
- data/lib/zen/model/methods.rb +1 -1
- data/lib/zen/model/settings.rb +0 -3
- data/lib/zen/package.rb +101 -83
- data/lib/zen/package/base.rb +62 -0
- data/lib/zen/package/categories/lib/categories.rb +29 -10
- data/lib/zen/package/categories/lib/categories/controller/categories.rb +4 -5
- data/lib/zen/package/categories/lib/categories/controller/category_groups.rb +4 -5
- data/lib/zen/package/categories/lib/categories/language/en/category_groups.yml +4 -3
- data/lib/zen/package/categories/lib/categories/model/category.rb +2 -2
- data/lib/zen/package/categories/lib/categories/model/category_group.rb +3 -3
- data/lib/zen/package/categories/lib/categories/plugin/categories.rb +130 -0
- data/lib/zen/package/categories/lib/categories/view/admin/categories/form.xhtml +1 -1
- data/lib/zen/package/categories/lib/categories/view/admin/categories/index.xhtml +2 -2
- data/lib/zen/package/categories/lib/categories/view/admin/category-groups/index.xhtml +11 -6
- data/lib/zen/package/comments/lib/comments.rb +23 -13
- data/lib/zen/package/comments/lib/comments/controller/comments.rb +4 -5
- data/lib/zen/package/comments/lib/comments/controller/comments_form.rb +7 -8
- data/lib/zen/package/comments/lib/comments/model/comment.rb +4 -4
- data/lib/zen/package/comments/lib/comments/plugin/comments.rb +111 -0
- data/lib/zen/package/comments/lib/comments/view/admin/comments/form.xhtml +2 -2
- data/lib/zen/package/comments/lib/comments/view/admin/comments/index.xhtml +3 -3
- data/lib/zen/package/custom_fields/lib/custom_fields.rb +18 -11
- data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_field_groups.rb +4 -5
- data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_fields.rb +4 -5
- data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field.rb +2 -2
- data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_group.rb +3 -3
- data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_value.rb +3 -3
- data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-field-groups/index.xhtml +9 -5
- data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-fields/form.xhtml +1 -1
- data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-fields/index.xhtml +3 -3
- data/lib/zen/package/menus/lib/menus.rb +25 -43
- data/lib/zen/package/menus/lib/menus/controller/menu_items.rb +5 -6
- data/lib/zen/package/menus/lib/menus/controller/menus.rb +9 -5
- data/lib/zen/package/menus/lib/menus/helper/menu_item.rb +4 -4
- data/lib/zen/package/menus/lib/menus/model/menu.rb +2 -2
- data/lib/zen/package/menus/lib/menus/model/menu_item.rb +4 -1
- data/lib/zen/package/menus/lib/menus/plugin/menus.rb +152 -0
- data/lib/zen/package/menus/lib/menus/view/admin/menu-items/form.xhtml +1 -1
- data/lib/zen/package/menus/lib/menus/view/admin/menu-items/index.xhtml +3 -3
- data/lib/zen/package/menus/lib/menus/view/admin/menus/index.xhtml +7 -7
- data/lib/zen/package/sections/lib/sections.rb +32 -16
- data/lib/zen/package/sections/lib/sections/controller/section_entries.rb +9 -18
- data/lib/zen/package/sections/lib/sections/controller/sections.rb +8 -9
- data/lib/zen/package/sections/lib/sections/language/en/section_entries.yml +1 -1
- data/lib/zen/package/sections/lib/sections/model/section.rb +4 -4
- data/lib/zen/package/sections/lib/sections/model/section_entry.rb +9 -10
- data/lib/zen/package/sections/lib/sections/plugin/section_entries.rb +224 -0
- data/lib/zen/package/sections/lib/sections/plugin/sections.rb +85 -0
- data/lib/zen/package/sections/lib/sections/view/admin/form.xhtml +1 -1
- data/lib/zen/package/sections/lib/sections/view/admin/index.xhtml +9 -5
- data/lib/zen/package/sections/lib/sections/view/admin/section-entries/index.xhtml +2 -2
- data/lib/zen/package/settings/lib/settings.rb +145 -10
- data/lib/zen/package/settings/lib/settings/controller/settings.rb +28 -24
- data/lib/zen/package/settings/lib/settings/language/en/settings.yml +10 -0
- data/lib/zen/package/settings/lib/settings/model/setting.rb +3 -64
- data/lib/zen/package/settings/lib/settings/plugin/group_base.rb +40 -0
- data/lib/zen/package/settings/lib/settings/plugin/setting_base.rb +76 -0
- data/lib/zen/package/settings/lib/settings/plugin/settings.rb +236 -0
- data/lib/zen/package/settings/lib/settings/view/admin/settings/index.xhtml +20 -49
- data/lib/zen/package/settings/migrations/1295597111_create_schema.rb +0 -12
- data/lib/zen/package/settings/migrations/1303196915_settings_plugin.rb +31 -0
- data/lib/zen/package/users/lib/users.rb +18 -15
- data/lib/zen/package/users/lib/users/controller/access_rules.rb +44 -8
- data/lib/zen/package/users/lib/users/controller/user_groups.rb +4 -5
- data/lib/zen/package/users/lib/users/controller/users.rb +5 -6
- data/lib/zen/package/users/lib/users/language/en/access_rules.yml +11 -9
- data/lib/zen/package/users/lib/users/model/access_rule.rb +7 -6
- data/lib/zen/package/users/lib/users/model/user.rb +4 -4
- data/lib/zen/package/users/lib/users/model/user_group.rb +3 -3
- data/lib/zen/package/users/lib/users/public/admin/js/users/access_rules.js +50 -0
- data/lib/zen/package/users/lib/users/view/admin/access-rules/form.xhtml +32 -29
- data/lib/zen/package/users/lib/users/view/admin/access-rules/index.xhtml +8 -6
- data/lib/zen/package/users/lib/users/view/admin/user-groups/index.xhtml +3 -3
- data/lib/zen/package/users/lib/users/view/admin/users/index.xhtml +2 -2
- data/lib/zen/package/users/migrations/1303510943_class_rules.rb +13 -0
- data/lib/zen/plugin.rb +110 -104
- data/lib/zen/plugin/base.rb +46 -0
- data/lib/zen/{liquid/controller_behavior.rb → plugin/controller.rb} +9 -7
- data/lib/zen/plugin/helper.rb +47 -0
- data/lib/zen/plugin/markup/lib/markup.rb +14 -0
- data/lib/zen/plugin/markup/lib/markup/language/en/markup.yml +6 -0
- data/lib/zen/plugin/markup/lib/markup/markup.rb +154 -0
- data/lib/zen/public/admin/css/forms.css +4 -0
- data/lib/zen/public/admin/css/general.css +15 -15
- data/lib/zen/public/admin/css/layout.css +10 -10
- data/lib/zen/public/admin/css/reset.css +123 -0
- data/lib/zen/public/admin/images/icons/accept.png +0 -0
- data/lib/zen/public/admin/images/icons/add.png +0 -0
- data/lib/zen/public/admin/images/icons/back.png +0 -0
- data/lib/zen/public/admin/images/icons/bold.png +0 -0
- data/lib/zen/public/admin/images/icons/close.png +0 -0
- data/lib/zen/public/admin/images/icons/delete.png +0 -0
- data/lib/zen/public/admin/images/icons/edit.png +0 -0
- data/lib/zen/public/admin/images/icons/error.png +0 -0
- data/lib/zen/public/admin/images/icons/help.png +0 -0
- data/lib/zen/public/admin/images/icons/info.png +0 -0
- data/lib/zen/public/admin/images/icons/italic.png +0 -0
- data/lib/zen/public/admin/images/icons/large/error.png +0 -0
- data/lib/zen/public/admin/images/icons/large/notice.png +0 -0
- data/lib/zen/public/admin/images/icons/large/success.png +0 -0
- data/lib/zen/public/admin/images/icons/link.png +0 -0
- data/lib/zen/public/admin/images/icons/logout.png +0 -0
- data/lib/zen/public/admin/images/icons/ol.png +0 -0
- data/lib/zen/public/admin/images/icons/pdf.png +0 -0
- data/lib/zen/public/admin/images/icons/ul.png +0 -0
- data/lib/zen/public/admin/images/icons/user.png +0 -0
- data/lib/zen/public/admin/images/icons/view.png +0 -0
- data/lib/zen/public/admin/js/mootools/core.js +384 -333
- data/lib/zen/public/admin/js/mootools/more.js +256 -231
- data/lib/zen/public/admin/js/vendor/{datepicker/Picker.Date.js → datepicker.js} +447 -0
- data/lib/zen/public/admin/js/vendor/yepnope.js +1 -0
- data/lib/zen/public/admin/js/zen/editor/base.js +8 -1
- data/lib/zen/public/admin/js/zen/init.js +89 -26
- data/lib/zen/public/favicon.ico +0 -0
- data/lib/zen/task.rb +7 -0
- data/lib/zen/task/build.rake +60 -0
- data/lib/zen/task/clean.rake +27 -0
- data/lib/zen/task/db.rake +111 -0
- data/lib/zen/task/package.rake +67 -0
- data/lib/zen/task/plugin.rake +24 -0
- data/lib/zen/task/proto.rake +95 -0
- data/lib/zen/task/theme.rake +68 -0
- data/lib/zen/theme.rb +28 -55
- data/lib/zen/theme/base.rb +64 -0
- data/lib/zen/validation.rb +149 -0
- data/lib/zen/version.rb +1 -1
- data/lib/zen/view/bottom.xhtml +6 -0
- data/lib/zen/view/main.xhtml +32 -0
- data/proto/app/Rakefile +12 -0
- data/proto/app/app.rb +6 -6
- data/proto/app/config/config.rb +7 -14
- data/proto/app/config/database.rb +0 -20
- data/proto/app/start.rb +0 -1
- data/proto/app/{vendor/themes → task}/.gitkeep +0 -0
- data/proto/app/vendor/theme/.gitkeep +0 -0
- data/proto/package/lib/package.rb +8 -17
- data/proto/package/lib/package/controller/controllers.rb +4 -4
- data/proto/package/lib/package/language/en/languages.yml +3 -3
- data/proto/package/lib/package/model/model.rb +1 -1
- metadata +73 -73
- data/lib/zen/bin/base.rb +0 -109
- data/lib/zen/helper/asset.rb +0 -106
- data/lib/zen/liquid/general.rb +0 -94
- data/lib/zen/liquid/redirect.rb +0 -70
- data/lib/zen/liquid/strip.rb +0 -60
- data/lib/zen/package/categories/lib/categories/liquid/categories.rb +0 -16
- data/lib/zen/package/comments/lib/comments/liquid/comment_form.rb +0 -127
- data/lib/zen/package/comments/lib/comments/liquid/comments.rb +0 -115
- data/lib/zen/package/menus/lib/menus/liquid/menus.rb +0 -152
- data/lib/zen/package/sections/lib/sections/liquid/section_entries.rb +0 -228
- data/lib/zen/package/sections/lib/sections/liquid/sections.rb +0 -77
- data/lib/zen/package/settings/lib/settings/liquid/setting.rb +0 -58
- data/lib/zen/package/users/lib/users/liquid/user.rb +0 -77
- data/lib/zen/package/users/lib/users/liquid/users.rb +0 -82
- data/lib/zen/plugin/markup.rb +0 -30
- data/lib/zen/public/admin/css/boilerplate.css +0 -176
- data/lib/zen/public/admin/images/general/noise.jpg +0 -0
- data/lib/zen/public/admin/js/vendor/datepicker/Picker.Attach.js +0 -137
- data/lib/zen/public/admin/js/vendor/datepicker/Picker.js +0 -291
- data/lib/zen/public/admin/js/vendor/datepicker/README.md +0 -325
- data/lib/zen/public/admin/js/vendor/datepicker/locale.js +0 -16
- data/lib/zen/strict_struct.rb +0 -36
- data/lib/zen/task/build.rb +0 -123
- data/lib/zen/task/clean.rb +0 -46
- data/lib/zen/task/db.rb +0 -130
- data/lib/zen/task/package.rb +0 -87
- data/lib/zen/task/proto.rb +0 -116
- data/lib/zen/task/theme.rb +0 -88
- data/proto/app/Thorfile +0 -4
data/lib/zen/helper/common.rb
CHANGED
@@ -148,9 +148,7 @@ module Ramaze
|
|
148
148
|
# @return [String]
|
149
149
|
#
|
150
150
|
def cycle(*args)
|
151
|
-
|
152
|
-
@@cycle_counter = 0
|
153
|
-
end
|
151
|
+
@@cycle_counter ||= 0
|
154
152
|
|
155
153
|
# Check the current counter and reset it if it matches the total amount of arguments
|
156
154
|
if @@cycle_counter >= args.count
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require __DIR__('../error/theme_error')
|
2
|
+
|
3
|
+
#:nodoc:
|
4
|
+
module Ramaze
|
5
|
+
#:nodoc:
|
6
|
+
module Helper
|
7
|
+
##
|
8
|
+
# Helper that provides a few methods that make certain tasks easier when creating
|
9
|
+
# themes and templates.
|
10
|
+
#
|
11
|
+
# @author Yorick Peterse
|
12
|
+
# @since 0.2.5
|
13
|
+
#
|
14
|
+
module Theme
|
15
|
+
|
16
|
+
##
|
17
|
+
# Renders a partial from the current theme's partial directory. The first argument
|
18
|
+
# is the name of the partial (without an extension) to render. The second argument
|
19
|
+
# is a hash with variables that should be made available to the partial.
|
20
|
+
#
|
21
|
+
# @example
|
22
|
+
# partial(:header) # => partials/header.xhtml
|
23
|
+
# partial(:header, :username => "YorickPeterse")
|
24
|
+
#
|
25
|
+
# @author Yorick Peterse
|
26
|
+
# @since 0.2.5
|
27
|
+
# @param [Symbol] file The name of the partial to render.
|
28
|
+
# @param [Hash] variables A hash with variables that should be made available for
|
29
|
+
# the partial.
|
30
|
+
#
|
31
|
+
def partial(file, variables = {})
|
32
|
+
theme = ::Zen::Theme[::Zen::Settings[:theme]]
|
33
|
+
|
34
|
+
if !theme.respond_to?(:partial_dir) or theme.partial_dir.nil?
|
35
|
+
raise(::Zen::ThemeError, "The theme #{theme.name} has no partial directory set.")
|
36
|
+
end
|
37
|
+
|
38
|
+
template = "#{theme.partial_dir}/#{file}.xhtml"
|
39
|
+
|
40
|
+
if !File.exist?(template)
|
41
|
+
raise(::Zen::ThemeError, "The template #{template} doesn't exist.")
|
42
|
+
end
|
43
|
+
|
44
|
+
# All done captain!
|
45
|
+
render_file(template, variables)
|
46
|
+
end
|
47
|
+
|
48
|
+
##
|
49
|
+
# Renders the 404 template for the current theme (clearing the current buffer) and
|
50
|
+
# sets the HTTP response code to 404. Optionally you can pass a set of variables to
|
51
|
+
# the 404 template by setting this method's first argument to a hash.
|
52
|
+
#
|
53
|
+
# @example
|
54
|
+
# show_404
|
55
|
+
# show_404(:uri => @request_uri)
|
56
|
+
#
|
57
|
+
# @author Yorick Peterse
|
58
|
+
# @since 0.2.5
|
59
|
+
# @param [Hash] variables Hash with variables to pass to the 404 template.
|
60
|
+
#
|
61
|
+
def show_404(variables = {})
|
62
|
+
theme = ::Zen::Theme[::Zen::Settings[:theme]]
|
63
|
+
template = "#{theme.template_dir}/404.xhtml"
|
64
|
+
|
65
|
+
# Render the template and replace the current buffer with it's output
|
66
|
+
template = render_file(template, variables)
|
67
|
+
|
68
|
+
respond(template, 404)
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
data/lib/zen/language.rb
CHANGED
@@ -54,7 +54,9 @@ module Zen
|
|
54
54
|
# ## Options
|
55
55
|
#
|
56
56
|
# * language: Small string that defines the current language (e.g. "en").
|
57
|
-
# * paths: Array of paths to look for a language
|
57
|
+
# * paths: Array of paths to look for a language directory. Note that this should be
|
58
|
+
# the parent directory of the directory called "language", not the actual directory
|
59
|
+
# itself.
|
58
60
|
#
|
59
61
|
# @author Yorick Peterse
|
60
62
|
# @since 0.2
|
@@ -62,13 +64,17 @@ module Zen
|
|
62
64
|
module Language
|
63
65
|
include Ramaze::Optioned
|
64
66
|
|
67
|
+
##
|
68
|
+
# Hash containing all loaded translation files.
|
69
|
+
#
|
70
|
+
# @author Yorick Peterse
|
71
|
+
# @since 0.2.5
|
72
|
+
#
|
73
|
+
Registered = {}
|
74
|
+
|
65
75
|
options.dsl do
|
66
76
|
o 'Small string that defines the current language (e.g. "en").', :language, 'en'
|
67
|
-
o 'Array of paths to look for
|
68
|
-
end
|
69
|
-
|
70
|
-
class << self
|
71
|
-
attr_reader :translations
|
77
|
+
o 'Array of paths to look for the language files' , :paths , []
|
72
78
|
end
|
73
79
|
|
74
80
|
##
|
@@ -83,10 +89,9 @@ module Zen
|
|
83
89
|
# @param [String] lang_name The name of the language file to load.
|
84
90
|
#
|
85
91
|
def self.load(lang_name)
|
86
|
-
|
87
|
-
@translations[self.options.language.to_s] ||= {}
|
92
|
+
Registered[self.options.language.to_s] ||= {}
|
88
93
|
|
89
|
-
if
|
94
|
+
if Registered[self.options.language.to_s][lang_name.to_s]
|
90
95
|
return
|
91
96
|
end
|
92
97
|
|
@@ -101,8 +106,8 @@ module Zen
|
|
101
106
|
# would result in {'person.age' => 18}.
|
102
107
|
translation = self.to_dotted_hash({lang_name.to_s => translation})
|
103
108
|
|
104
|
-
|
105
|
-
|
109
|
+
Registered[self.options.language.to_s] ||= {}
|
110
|
+
Registered[self.options.language.to_s].merge!(translation)
|
106
111
|
|
107
112
|
# Prevents the exception from being raised
|
108
113
|
return
|
@@ -112,52 +117,6 @@ module Zen
|
|
112
117
|
raise(Zen::LanguageError, "No language file could be found for \"#{lang_name}\"")
|
113
118
|
end
|
114
119
|
|
115
|
-
##
|
116
|
-
# Method for retrieving the correct language item based on the given string.
|
117
|
-
# If you want to retrieve sub-items you can separate each level with a dot:
|
118
|
-
#
|
119
|
-
# lang('tutorial.main.sub')
|
120
|
-
#
|
121
|
-
# This would require our YAML file to look something like the following:
|
122
|
-
#
|
123
|
-
# ---
|
124
|
-
# main:
|
125
|
-
# sub: "Something!"
|
126
|
-
#
|
127
|
-
# It's important to remember that your key should always include the name of the
|
128
|
-
# language file since once a file is loaded it will be kept in memory to reduce
|
129
|
-
# disk usage.
|
130
|
-
#
|
131
|
-
# @example
|
132
|
-
# lang('username')
|
133
|
-
#
|
134
|
-
# @author Yorick Peterse
|
135
|
-
# @since 0.2
|
136
|
-
# @param [String] key The language key to select.
|
137
|
-
# @return [Mixed]
|
138
|
-
#
|
139
|
-
def lang(key)
|
140
|
-
lang = ::Zen::Language.options.language.to_s
|
141
|
-
groups = []
|
142
|
-
translations = ::Zen::Language.translations
|
143
|
-
|
144
|
-
if !translations or !translations.key?(lang)
|
145
|
-
raise(
|
146
|
-
Zen::LanguageError,
|
147
|
-
"No translation files have been added for the language code \"#{lang}\""
|
148
|
-
)
|
149
|
-
end
|
150
|
-
|
151
|
-
if translations[lang][key]
|
152
|
-
return translations[lang][key]
|
153
|
-
end
|
154
|
-
|
155
|
-
raise(
|
156
|
-
Zen::LanguageError,
|
157
|
-
"The specified language item \"#{key}\" does not exist"
|
158
|
-
)
|
159
|
-
end
|
160
|
-
|
161
120
|
private
|
162
121
|
|
163
122
|
##
|
@@ -218,5 +177,55 @@ module Zen
|
|
218
177
|
|
219
178
|
return target
|
220
179
|
end
|
180
|
+
|
181
|
+
#:nodoc:
|
182
|
+
module SingletonMethods
|
183
|
+
##
|
184
|
+
# Method for retrieving the correct language item based on the given string.
|
185
|
+
# If you want to retrieve sub-items you can separate each level with a dot:
|
186
|
+
#
|
187
|
+
# lang('tutorial.main.sub')
|
188
|
+
#
|
189
|
+
# This would require our YAML file to look something like the following:
|
190
|
+
#
|
191
|
+
# ---
|
192
|
+
# main:
|
193
|
+
# sub: "Something!"
|
194
|
+
#
|
195
|
+
# It's important to remember that your key should always include the name of the
|
196
|
+
# language file since once a file is loaded it will be kept in memory to reduce
|
197
|
+
# disk usage.
|
198
|
+
#
|
199
|
+
# @example
|
200
|
+
# lang('username')
|
201
|
+
#
|
202
|
+
# @author Yorick Peterse
|
203
|
+
# @since 0.2
|
204
|
+
# @param [String] key The language key to select.
|
205
|
+
# @return [Mixed]
|
206
|
+
#
|
207
|
+
def lang(key)
|
208
|
+
lang = ::Zen::Language.options.language.to_s
|
209
|
+
groups = []
|
210
|
+
translations = ::Zen::Language::Registered
|
211
|
+
|
212
|
+
if !translations or !translations.key?(lang)
|
213
|
+
raise(
|
214
|
+
Zen::LanguageError,
|
215
|
+
"No translation files have been added for the language code \"#{lang}\""
|
216
|
+
)
|
217
|
+
end
|
218
|
+
|
219
|
+
if translations[lang][key]
|
220
|
+
return translations[lang][key]
|
221
|
+
end
|
222
|
+
|
223
|
+
raise(
|
224
|
+
Zen::LanguageError,
|
225
|
+
"The specified language item \"#{key}\" does not exist"
|
226
|
+
)
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
221
230
|
end
|
222
231
|
end
|
data/lib/zen/layout/admin.xhtml
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
<!DOCTYPE html>
|
2
|
-
<html lang="#{
|
2
|
+
<html lang="#{::Zen::Settings[:language]}">
|
3
3
|
<head>
|
4
4
|
<meta charset="utf-8" />
|
5
5
|
|
6
6
|
<!-- Load all stylesheets -->
|
7
|
-
|
7
|
+
#{::Zen::Asset.build(:stylesheet)}
|
8
8
|
|
9
9
|
<title>#{@page_title}</title>
|
10
10
|
</head>
|
@@ -17,10 +17,7 @@
|
|
17
17
|
doesn't have the required permissions for the extension that created it.
|
18
18
|
-->
|
19
19
|
<nav id="main_nav" class="grid_12">
|
20
|
-
#{
|
21
|
-
perms = extension_permissions
|
22
|
-
Zen::Package.build_menu("left", perms[0], perms[1])
|
23
|
-
}
|
20
|
+
#{Zen::Package.build_menu("left", extension_permissions)}
|
24
21
|
|
25
22
|
<ul class="right clearfix">
|
26
23
|
<li>
|
@@ -43,47 +40,7 @@
|
|
43
40
|
</header>
|
44
41
|
</div>
|
45
42
|
|
46
|
-
|
47
|
-
|
48
|
-
are no silly sidebars.
|
49
|
-
-->
|
50
|
-
<div id="container" class="container">
|
51
|
-
<div id="content" class="grid_12">
|
52
|
-
#{@content}
|
53
|
-
</div>
|
54
|
-
</div>
|
55
|
-
|
56
|
-
<footer id="main_footer" class="container">
|
57
|
-
<div class="grid_12">
|
58
|
-
<p>#{lang('zen_general.labels.zen_version') % Zen::Version}</p>
|
59
|
-
<ul class="clearfix">
|
60
|
-
<li>
|
61
|
-
<a href="http://zen-cms.com/">
|
62
|
-
#{lang('zen_general.labels.zen_website')}
|
63
|
-
</a>
|
64
|
-
</li>
|
65
|
-
<li>
|
66
|
-
<a href="http://zen-cms.com/documentation">
|
67
|
-
#{lang('zen_general.labels.zen_docs')}
|
68
|
-
</a>
|
69
|
-
</li>
|
70
|
-
<li>
|
71
|
-
<a href="https://github.com/zen-cms/">
|
72
|
-
#{lang('zen_general.labels.zen_github')}
|
73
|
-
</a>
|
74
|
-
</li>
|
75
|
-
</ul>
|
76
|
-
</div>
|
77
|
-
</footer>
|
78
|
-
|
79
|
-
<script src="/admin/js/mootools/core.js"></script>
|
80
|
-
<script src="/admin/js/mootools/more.js"></script>
|
81
|
-
|
82
|
-
<script>
|
83
|
-
Zen = {};
|
84
|
-
Zen.Flash = #{flash.combined.to_json};
|
85
|
-
</script>
|
86
|
-
|
87
|
-
#{build_js}
|
43
|
+
#{render_file(__DIR__('../view/main.xhtml'))}
|
44
|
+
#{render_file(__DIR__('../view/bottom.xhtml'))}
|
88
45
|
</body>
|
89
46
|
</html>
|
data/lib/zen/layout/login.xhtml
CHANGED
@@ -1,56 +1,16 @@
|
|
1
1
|
<!DOCTYPE html>
|
2
|
-
<html lang="#{
|
2
|
+
<html lang="#{::Zen::Settings[:language]}">
|
3
3
|
<head>
|
4
4
|
<meta charset="utf-8" />
|
5
5
|
|
6
6
|
<!-- Load all stylesheets -->
|
7
|
-
#{
|
7
|
+
#{::Zen::Asset.build(:stylesheet)}
|
8
8
|
|
9
9
|
<title>#{@page_title}</title>
|
10
10
|
</head>
|
11
11
|
|
12
12
|
<body id="login">
|
13
|
-
|
14
|
-
|
15
|
-
are no silly sidebars.
|
16
|
-
-->
|
17
|
-
<div id="container" class="container">
|
18
|
-
<div id="content" class="grid_12">
|
19
|
-
#{@content}
|
20
|
-
</div>
|
21
|
-
</div>
|
22
|
-
|
23
|
-
<footer id="main_footer" class="container">
|
24
|
-
<div class="grid_12">
|
25
|
-
<p>#{lang('zen_general.labels.zen_version') % Zen::Version}</p>
|
26
|
-
<ul class="clearfix">
|
27
|
-
<li>
|
28
|
-
<a href="http://zen-cms.com/">
|
29
|
-
#{lang('zen_general.labels.zen_website')}
|
30
|
-
</a>
|
31
|
-
</li>
|
32
|
-
<li>
|
33
|
-
<a href="http://zen-cms.com/documentation">
|
34
|
-
#{lang('zen_general.labels.zen_docs')}
|
35
|
-
</a>
|
36
|
-
</li>
|
37
|
-
<li>
|
38
|
-
<a href="https://github.com/zen-cms/">
|
39
|
-
#{lang('zen_general.labels.zen_github')}
|
40
|
-
</a>
|
41
|
-
</li>
|
42
|
-
</ul>
|
43
|
-
</div>
|
44
|
-
</footer>
|
45
|
-
|
46
|
-
<script src="/admin/js/mootools/core.js"></script>
|
47
|
-
<script src="/admin/js/mootools/more.js"></script>
|
48
|
-
|
49
|
-
<script>
|
50
|
-
Zen = {};
|
51
|
-
Zen.Flash = #{flash.combined.to_json};
|
52
|
-
</script>
|
53
|
-
|
54
|
-
#{build_js}
|
13
|
+
#{render_file(__DIR__('../view/main.xhtml'))}
|
14
|
+
#{render_file(__DIR__('../view/bottom.xhtml'))}
|
55
15
|
</body>
|
56
16
|
</html>
|
data/lib/zen/model/methods.rb
CHANGED
@@ -9,7 +9,7 @@ module Sequel
|
|
9
9
|
# elements using the BlueForm helper.
|
10
10
|
#
|
11
11
|
# @example
|
12
|
-
# Sections::
|
12
|
+
# Sections::Model::Section.pk_hash(:name) # => {1 => 'Blog', 2 => 'General'}
|
13
13
|
#
|
14
14
|
# @author Yorick Peterse
|
15
15
|
# @param [Symbol] column The name of the optional column to select.
|
data/lib/zen/model/settings.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
include Zen::Language
|
2
|
-
|
3
1
|
Zen::Language.load('zen_models')
|
4
2
|
|
5
3
|
# When passing a hash to update() or create() we'll ignore any keys that don't belong
|
@@ -10,7 +8,6 @@ Sequel::Model.strict_param_setting = false
|
|
10
8
|
# Load all the required plugins
|
11
9
|
Sequel::Model.plugin :validation_helpers
|
12
10
|
Sequel::Model.plugin :association_pks
|
13
|
-
Sequel::Model.plugin :schema
|
14
11
|
|
15
12
|
Sequel::Plugins::ValidationHelpers::DEFAULT_OPTIONS.merge!(
|
16
13
|
{
|
data/lib/zen/package.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'ramaze/gestalt'
|
2
|
-
require __DIR__('helper/acl')
|
3
|
-
require __DIR__('liquid/controller_behavior')
|
4
2
|
require __DIR__('error/package_error')
|
3
|
+
require __DIR__('package/base')
|
5
4
|
|
6
5
|
#:nodoc:
|
7
6
|
module Zen
|
@@ -20,16 +19,29 @@ module Zen
|
|
20
19
|
#
|
21
20
|
# When using this block you're required to set the following attributes:
|
22
21
|
#
|
23
|
-
# * name: the name of the package
|
24
|
-
# * author: the name of the person who made the package
|
25
|
-
# * about: a small description of the package
|
26
|
-
# * url: the URL to the package's website
|
27
|
-
# *
|
28
|
-
# extensions and com.AUTHOR.themes.NAME for themes.
|
29
|
-
# * directory: the root directory of the package, set this using __DIR__('path')
|
22
|
+
# * name: the name of the package in lowercased letters and/or numbers.
|
23
|
+
# * author: the name of the person who made the package.
|
24
|
+
# * about: a small description of the package.
|
25
|
+
# * url: the URL to the package's website.
|
26
|
+
# * directory: the root directory of the package, set this using __DIR__('path').
|
30
27
|
#
|
31
28
|
# Optionally you can also specify the attribute "menu" (more on that later).
|
32
29
|
#
|
30
|
+
# ## ACL
|
31
|
+
#
|
32
|
+
# Packages allow developers to register controllers for the ACL system that ships with
|
33
|
+
# Zen. Doing this means a user can set controller specific rules in the backend without
|
34
|
+
# having to write any code. In order to register a set of controllers you'll need to
|
35
|
+
# set the "controllers" attribute in the package block to a hash. The keys of this hash
|
36
|
+
# should be a human readable name of the controller and the values the full namespace
|
37
|
+
# of the controller as either a string or a constants:
|
38
|
+
#
|
39
|
+
# Zen::Package.add do |pkg|
|
40
|
+
# pkg.controllers = {
|
41
|
+
# 'Test Controller' => Test::Controller::TestController
|
42
|
+
# }
|
43
|
+
# end
|
44
|
+
#
|
33
45
|
# ## Menu Items
|
34
46
|
#
|
35
47
|
# The package system easily allows modules to add navigation/sub-navigation elements
|
@@ -60,41 +72,43 @@ module Zen
|
|
60
72
|
#
|
61
73
|
# If your package uses it's own database tables it's best to use migrations as these make
|
62
74
|
# it very easy to install/uninstall the extension. Migrations should be put in the root
|
63
|
-
# directory of your extension. For example, if your extension is in "foobar" the
|
64
|
-
# should be located in "foobar/migrations", the lib directory in "foobar/lib",
|
75
|
+
# directory of your extension. For example, if your extension is in "foobar" the
|
76
|
+
# migrations should be located in "foobar/migrations", the lib directory in "foobar/lib",
|
77
|
+
# etc.
|
65
78
|
#
|
66
79
|
# Migrations can be executed using the Thor task "package:migrate" or "db:migrate",
|
67
80
|
# the latter will install all packages while the first one will only install the
|
68
81
|
# specified packages. For more information on these tasks execute the following command:
|
69
82
|
#
|
70
|
-
# $
|
71
|
-
#
|
72
|
-
# ## Identifiers
|
73
|
-
#
|
74
|
-
# Package identifiers should always have the following format:
|
75
|
-
#
|
76
|
-
# com.VENDOR.NAME
|
77
|
-
#
|
78
|
-
# For example:
|
79
|
-
#
|
80
|
-
# com.zen.sections
|
83
|
+
# $ rake -T
|
81
84
|
#
|
82
85
|
# @author Yorick Peterse
|
83
86
|
# @since 0.1
|
84
|
-
# @attr_reader [Array] packages Array containing the instances of all packages.
|
85
87
|
#
|
86
88
|
module Package
|
87
|
-
class << self
|
88
|
-
attr_reader :packages
|
89
|
-
end
|
90
|
-
|
91
89
|
##
|
92
|
-
#
|
93
|
-
#
|
94
|
-
#
|
90
|
+
# Hash containing all the registered packages. The keys of this hash are the names
|
91
|
+
# of all packages and the values the instances of Zen::Package::Base.
|
92
|
+
#
|
93
|
+
# @author Yorick Peterse
|
94
|
+
# @since 0.2.5
|
95
|
+
#
|
96
|
+
Registered = {}
|
97
|
+
|
98
|
+
##
|
99
|
+
# Array containing all controllers of all packages.
|
100
|
+
#
|
101
|
+
# @author Yorick Peterse
|
102
|
+
# @since 0.2.5
|
103
|
+
#
|
104
|
+
Controllers = []
|
105
|
+
|
106
|
+
##
|
107
|
+
# Adds a new package along with all it's details such as the name, author, version
|
108
|
+
# and so on. Extensions can be added using a simple block as following:
|
95
109
|
#
|
96
110
|
# Zen::Package.add do |ext|
|
97
|
-
# ext.name = "
|
111
|
+
# ext.name = "name"
|
98
112
|
# ext.author = "Author"
|
99
113
|
# end
|
100
114
|
#
|
@@ -105,7 +119,6 @@ module Zen
|
|
105
119
|
# * version
|
106
120
|
# * about
|
107
121
|
# * url
|
108
|
-
# * identifier
|
109
122
|
# * directory
|
110
123
|
#
|
111
124
|
# You can also set "migration_dir" to a directory with all migrations. By default
|
@@ -116,17 +129,13 @@ module Zen
|
|
116
129
|
# @yield [package] Object containing all setters and getters for each package.
|
117
130
|
#
|
118
131
|
def self.add
|
119
|
-
package = Zen::
|
120
|
-
:name, :author, :about, :url, :identifier, :directory, :menu, :migration_dir
|
121
|
-
).new
|
122
|
-
|
123
|
-
required = [:name, :author, :about, :identifier, :directory]
|
132
|
+
package = Zen::Package::Base.new
|
124
133
|
|
125
134
|
yield package
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
135
|
+
|
136
|
+
# Validate the package
|
137
|
+
package.validate
|
138
|
+
package.name = package.name.to_sym
|
130
139
|
|
131
140
|
# Update the root but prevent duplicates
|
132
141
|
if !Ramaze.options.roots.include?(package.directory)
|
@@ -138,31 +147,37 @@ module Zen
|
|
138
147
|
Zen::Language.options.paths.push(package.directory)
|
139
148
|
end
|
140
149
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
end
|
150
|
+
package.controllers.each do |name, controller|
|
151
|
+
controller = controller.to_s
|
152
|
+
|
153
|
+
if !Controllers.include?(controller)
|
154
|
+
Controllers.push(controller)
|
147
155
|
end
|
148
156
|
end
|
149
157
|
|
150
|
-
|
151
|
-
@packages[package.identifier.to_s] = package
|
158
|
+
Registered[package.name.to_sym] = package
|
152
159
|
end
|
153
|
-
|
160
|
+
|
154
161
|
##
|
155
|
-
#
|
156
|
-
# given extension identifier.
|
162
|
+
# Retrieves the package for the given name.
|
157
163
|
#
|
158
164
|
# @author Yorick Peterse
|
159
|
-
# @
|
160
|
-
# @return [Object]
|
165
|
+
# @since 0.1
|
161
166
|
#
|
162
|
-
def self.[](
|
163
|
-
|
167
|
+
def self.[](name)
|
168
|
+
name = name.to_sym
|
169
|
+
|
170
|
+
if Registered.empty?
|
171
|
+
raise(PackageError, "No packages have been added yet.")
|
172
|
+
end
|
173
|
+
|
174
|
+
if !Registered.key?(name)
|
175
|
+
raise(PackageError, "The package \"#{name}\" doesn't exist.")
|
176
|
+
end
|
177
|
+
|
178
|
+
return Registered[name]
|
164
179
|
end
|
165
|
-
|
180
|
+
|
166
181
|
##
|
167
182
|
# Builds a navigation menu for all installed extensions.
|
168
183
|
# Extensions can have an infinite amount of sub-navigation
|
@@ -170,32 +185,21 @@ module Zen
|
|
170
185
|
# of which each list item can contain N sub items.
|
171
186
|
#
|
172
187
|
# @author Yorick Peterse
|
173
|
-
# @param [String]
|
174
|
-
# @param [Hash]
|
175
|
-
# Ramaze::Helper::ACL
|
176
|
-
# @param [Boolean] all When set to true all elements will be displayed opposed to
|
177
|
-
# only those the user is allowed to see.
|
188
|
+
# @param [String] css_class A string of CSS classes to apply to the main UL element.
|
189
|
+
# @param [Hash] permissions Hash containing the permissions as returned by
|
190
|
+
# Ramaze::Helper::ACL.extension_permissions
|
178
191
|
# @since 0.1
|
179
192
|
#
|
180
|
-
def self.build_menu(css_class = '', permissions = {}
|
181
|
-
@g
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
# Build a list of all allowed extensions
|
186
|
-
permissions.each do |ident, rules|
|
187
|
-
if rules.include?(:read)
|
188
|
-
identifiers.push(ident)
|
189
|
-
end
|
190
|
-
end
|
193
|
+
def self.build_menu(css_class = '', permissions = {})
|
194
|
+
@g = Ramaze::Gestalt.new
|
195
|
+
@permissions = permissions
|
196
|
+
menu_items = []
|
191
197
|
|
192
|
-
|
198
|
+
Registered.each do |name, pkg|
|
193
199
|
# Got a menu for us?
|
194
|
-
if !
|
195
|
-
|
196
|
-
|
197
|
-
menu_items.push(m)
|
198
|
-
end
|
200
|
+
if !pkg.menu.nil?
|
201
|
+
pkg.menu.each do |m|
|
202
|
+
menu_items.push(m)
|
199
203
|
end
|
200
204
|
end
|
201
205
|
end
|
@@ -226,12 +230,26 @@ module Zen
|
|
226
230
|
# @param [Hash] menu Hash containing the navigation items (url, title, etc)
|
227
231
|
# @since 0.1
|
228
232
|
#
|
229
|
-
def self.nav_list
|
233
|
+
def self.nav_list(menu)
|
234
|
+
if menu[:url][0] != '/'
|
235
|
+
menu[:url] = '/' + menu[:url]
|
236
|
+
end
|
237
|
+
|
238
|
+
# Get the controller for the current item
|
239
|
+
controller = Ramaze::AppMap.at('/').url_map.at(menu[:url]).to_s
|
240
|
+
read_access = @permissions[controller].include?(:read)
|
241
|
+
|
242
|
+
# Ignore the menu item alltogether
|
243
|
+
if !read_access and !menu.key?(:children)
|
244
|
+
return
|
245
|
+
end
|
246
|
+
|
230
247
|
@g.li do
|
231
|
-
|
232
|
-
|
248
|
+
# Easy way of disabling an item and not fucking up the menu
|
249
|
+
if !read_access
|
250
|
+
menu[:url] = '#'
|
233
251
|
end
|
234
|
-
|
252
|
+
|
235
253
|
@g.a :href => menu[:url], :title => menu[:title] do
|
236
254
|
menu[:title]
|
237
255
|
end
|