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
@@ -41,7 +41,7 @@
|
|
41
41
|
<td>
|
42
42
|
#{anchor_to(
|
43
43
|
field.name,
|
44
|
-
CustomFields::
|
44
|
+
CustomFields::Controller::CustomFields.r(:edit, @custom_field_group_id, field.id),
|
45
45
|
:title => field.name
|
46
46
|
)}
|
47
47
|
</td>
|
@@ -51,7 +51,7 @@
|
|
51
51
|
|
52
52
|
<td>#{field.slug}</td>
|
53
53
|
<td>#{lang("custom_fields.special.type_hash.#{field.type}")}</td>
|
54
|
-
<td>#{
|
54
|
+
<td>#{Zen::Plugin::Markup::Engines[field.format]}</td>
|
55
55
|
</tr>
|
56
56
|
<?r end ?>
|
57
57
|
</tbody>
|
@@ -68,7 +68,7 @@
|
|
68
68
|
<div class="button">
|
69
69
|
#{anchor_to(
|
70
70
|
lang('custom_fields.buttons.new'),
|
71
|
-
CustomFields::
|
71
|
+
CustomFields::Controller::CustomFields.r(:new, @custom_field_group_id)
|
72
72
|
)}
|
73
73
|
</div>
|
74
74
|
<?r end ?>
|
@@ -1,58 +1,40 @@
|
|
1
|
+
Ramaze::HelpersHelper.options.paths.push(__DIR__('menus'))
|
1
2
|
|
2
|
-
# Update the list of helper paths
|
3
|
-
Ramaze::HelpersHelper.options.paths << __DIR__('menus')
|
4
|
-
|
5
|
-
# Load all our models
|
6
3
|
require __DIR__('menus/model/menu')
|
7
4
|
require __DIR__('menus/model/menu_item')
|
8
|
-
|
9
|
-
# Load all controllers
|
10
5
|
require __DIR__('menus/controller/menus')
|
11
6
|
require __DIR__('menus/controller/menu_items')
|
7
|
+
require __DIR__('menus/plugin/menus')
|
12
8
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
Liquid::Template.register_tag('menus', Menus::Liquid::Menus)
|
9
|
+
Zen::Language.options.paths.push(__DIR__('menus'))
|
10
|
+
Zen::Language.load('menus')
|
11
|
+
Zen::Language.load('menu_items')
|
17
12
|
|
18
|
-
# Describe the package
|
19
13
|
Zen::Package.add do |p|
|
20
|
-
|
21
|
-
p.
|
22
|
-
|
23
|
-
|
24
|
-
p.author = 'Yorick Peterse'
|
25
|
-
|
26
|
-
# A URL to a page about the package
|
27
|
-
p.url = 'http://zen-cms.com/userguide/menus'
|
28
|
-
|
29
|
-
# Describe what your theme or extension does.
|
30
|
-
p.about = 'The Menus extension allows you to easily create navigation menus
|
14
|
+
p.name = 'menus'
|
15
|
+
p.author = 'Yorick Peterse'
|
16
|
+
p.url = 'http://zen-cms.com/userguide/menus'
|
17
|
+
p.about = 'The Menus extension allows you to easily create navigation menus
|
31
18
|
for the frontend.'
|
32
19
|
|
33
|
-
|
34
|
-
# An identifier is a unique string for your package in the following format:
|
35
|
-
#
|
36
|
-
# * com.AUTHOR.NAME for extensions
|
37
|
-
# * com.AUTHOR.themes.NAME for themes
|
38
|
-
#
|
39
|
-
# An example of this would be "com.zen.sections" or "com.zen.themes.zen_website".
|
40
|
-
#
|
41
|
-
p.identifier = 'com.zen.menus'
|
42
|
-
|
43
|
-
##
|
44
|
-
# Path to the directory containing the controllers, models, etc.
|
45
|
-
#
|
46
|
-
p.directory = __DIR__('menus')
|
47
|
-
|
48
|
-
##
|
49
|
-
# Path to the directory containing all migrations for this package.
|
50
|
-
#
|
20
|
+
p.directory = __DIR__('menus')
|
51
21
|
p.migration_dir = __DIR__('../migrations')
|
52
|
-
|
53
|
-
# Note that themes can not have menu items (they'll be ignored).
|
22
|
+
|
54
23
|
p.menu = [{
|
55
|
-
:title =>
|
24
|
+
:title => lang('menus.titles.index'),
|
56
25
|
:url => "/admin/menus"
|
57
26
|
}]
|
27
|
+
|
28
|
+
p.controllers = {
|
29
|
+
lang('menus.titles.index') => Menus::Controller::Menus,
|
30
|
+
lang('menu_items.titles.index') => Menus::Controller::MenuItems
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
Zen::Plugin.add do |p|
|
35
|
+
p.name = 'menus'
|
36
|
+
p.author = 'Yorick Peterse'
|
37
|
+
p.url = 'http://yorickpeterse.com/'
|
38
|
+
p.about = 'Plugin that can be used to display a navigation menu.'
|
39
|
+
p.plugin = Menus::Plugin::Menus
|
58
40
|
end
|
@@ -1,19 +1,18 @@
|
|
1
1
|
#:nodoc:
|
2
2
|
module Menus
|
3
3
|
#:nodoc:
|
4
|
-
module
|
4
|
+
module Controller
|
5
5
|
##
|
6
6
|
# Controller for managing individual navigation items that belong to a menu.
|
7
7
|
#
|
8
8
|
# @author Yorick Peterse
|
9
9
|
# @since 0.2a
|
10
10
|
#
|
11
|
-
class MenuItems < ::Zen::
|
12
|
-
include ::Menus::
|
11
|
+
class MenuItems < ::Zen::Controller::AdminController
|
12
|
+
include ::Menus::Model
|
13
13
|
|
14
|
-
map
|
15
|
-
|
16
|
-
helper :menu_item
|
14
|
+
map('/admin/menu-items')
|
15
|
+
helper(:menu_item)
|
17
16
|
|
18
17
|
before_all do
|
19
18
|
csrf_protection(:save, :delete) do
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#:nodoc:
|
2
2
|
module Menus
|
3
3
|
#:nodoc:
|
4
|
-
module
|
4
|
+
module Controller
|
5
5
|
##
|
6
6
|
# Controller for managing menu groups. Individual navigation items are managed using
|
7
7
|
# the menu items controller, simply named "menu_items".
|
@@ -9,11 +9,10 @@ module Menus
|
|
9
9
|
# @author Yorick Peterse
|
10
10
|
# @since 0.2a
|
11
11
|
#
|
12
|
-
class Menus < Zen::
|
13
|
-
include ::Menus::
|
12
|
+
class Menus < Zen::Controller::AdminController
|
13
|
+
include ::Menus::Model
|
14
14
|
|
15
|
-
map
|
16
|
-
trait :extension_identifier => 'com.zen.menus'
|
15
|
+
map('/admin/menus')
|
17
16
|
|
18
17
|
before_all do
|
19
18
|
csrf_protection(:save, :delete) do
|
@@ -154,6 +153,11 @@ module Menus
|
|
154
153
|
else
|
155
154
|
@menu = Menu.new
|
156
155
|
save_action = :new
|
156
|
+
|
157
|
+
# Delete the slug if it's empty
|
158
|
+
if post['slug'].empty?
|
159
|
+
post.delete('slug')
|
160
|
+
end
|
157
161
|
end
|
158
162
|
|
159
163
|
# Set our notifications
|
@@ -19,14 +19,14 @@ module Ramaze
|
|
19
19
|
# @param [Integer] menu_id The ID of the menu to validate.
|
20
20
|
#
|
21
21
|
def validate_menu(menu_id = nil)
|
22
|
-
if !menu_id or ::Menus::
|
22
|
+
if !menu_id or ::Menus::Model::Menu[menu_id].nil?
|
23
23
|
notification(
|
24
24
|
:error,
|
25
25
|
@menu_items_lang.titles[:index],
|
26
26
|
@menu_items_lang.errors[:invalid_menu]
|
27
27
|
)
|
28
28
|
|
29
|
-
redirect(::Menus::
|
29
|
+
redirect(::Menus::Controller::Menus.r(:index))
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
@@ -48,7 +48,7 @@ module Ramaze
|
|
48
48
|
# @return [Hash]
|
49
49
|
#
|
50
50
|
def menu_item_tree(menu_id)
|
51
|
-
menu_items = ::Menus::
|
51
|
+
menu_items = ::Menus::Model::MenuItem.filter(
|
52
52
|
:menu_id => menu_id,
|
53
53
|
:parent_id => nil
|
54
54
|
)
|
@@ -71,7 +71,7 @@ module Ramaze
|
|
71
71
|
#
|
72
72
|
# @author Yorick Peterse
|
73
73
|
# @since 0.2a
|
74
|
-
# @param [Menus::
|
74
|
+
# @param [Menus::Model::MenuItem] item A MenuItem instance
|
75
75
|
# @param [Integer] spaces The amount of unbreakable spaces to use.
|
76
76
|
#
|
77
77
|
def descendant_items(item, spaces)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#:nodoc:
|
2
2
|
module Menus
|
3
3
|
#:nodoc:
|
4
|
-
module
|
4
|
+
module Model
|
5
5
|
##
|
6
6
|
# Model used for managing groups of menu items. This model uses the following
|
7
7
|
# Sequel plugins:
|
@@ -15,7 +15,7 @@ module Menus
|
|
15
15
|
plugin :sluggable, :source => :name, :freeze => false
|
16
16
|
|
17
17
|
# Define our relations
|
18
|
-
one_to_many :menu_items, :class => "Menus::
|
18
|
+
one_to_many :menu_items, :class => "Menus::Model::MenuItem"
|
19
19
|
|
20
20
|
##
|
21
21
|
# Specifies all validates rules used when creating or updating a menu.
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#:nodoc:
|
2
2
|
module Menus
|
3
3
|
#:nodoc:
|
4
|
-
module
|
4
|
+
module Model
|
5
5
|
##
|
6
6
|
# Model used for managing individual menu items in a group.
|
7
7
|
# This model uses the following plugins:
|
@@ -14,6 +14,9 @@ module Menus
|
|
14
14
|
class MenuItem < Sequel::Model
|
15
15
|
plugin :tree, :order => :order
|
16
16
|
|
17
|
+
many_to_one :menu , :class => 'Menus::Model::Menu'
|
18
|
+
many_to_one :parent, :class => self
|
19
|
+
|
17
20
|
##
|
18
21
|
# Specifies all validation rules that will be used when creating or updating a
|
19
22
|
# menu item.
|
@@ -0,0 +1,152 @@
|
|
1
|
+
require 'ramaze/gestalt'
|
2
|
+
|
3
|
+
#:nodoc:
|
4
|
+
module Menus
|
5
|
+
#:nodoc:
|
6
|
+
module Plugin
|
7
|
+
##
|
8
|
+
# Plugin for displaying navigation menus. This plugin will take care of recursively
|
9
|
+
# displaying all sub items and various other tasks, you merely have to set a few
|
10
|
+
# options and then you can sit back and enjoy.
|
11
|
+
#
|
12
|
+
# ## Usage
|
13
|
+
#
|
14
|
+
# menu = plugin(:menus, :menu => 'userguide', :sub => true)
|
15
|
+
#
|
16
|
+
# Calling this plugin will result in a string with HTML being returned. If you were
|
17
|
+
# to use this plugin in an Etanni template you'd have to wrap the call in #{} in order
|
18
|
+
# to actually display the menu.
|
19
|
+
#
|
20
|
+
# For more information about all the available options see
|
21
|
+
# Menus::Plugin::Menus#initialize().
|
22
|
+
#
|
23
|
+
# @author Yorick Peterse
|
24
|
+
# @since 0.2.5
|
25
|
+
#
|
26
|
+
class Menus
|
27
|
+
include ::Zen::Plugin::Helper
|
28
|
+
include ::Menus::Model
|
29
|
+
|
30
|
+
##
|
31
|
+
# Creates a new instance of the plugin and saves the configuration options.
|
32
|
+
#
|
33
|
+
# @example
|
34
|
+
# plugin = Menus::Plugin::Menus.new(:limit => 10, :offset => 0, :sub => false)
|
35
|
+
#
|
36
|
+
# @author Yorick Peterse
|
37
|
+
# @since 0.2.5
|
38
|
+
# @param [Hash] options Hash with configuration options.
|
39
|
+
# @option options [Integer/Fixnum] :limit The maximum amount of root items to
|
40
|
+
# retrieve.
|
41
|
+
# @option options [Integer/Fixnum] :offset The row offset for all root elements.
|
42
|
+
# @option options [Fixnum/Integer/String] :menu The ID or slug of the menu for which
|
43
|
+
# to retrieve all menu items.
|
44
|
+
# @option options [Boolean] :sub When set to false sub items will be ignored. This
|
45
|
+
# option is set to true by default.
|
46
|
+
#
|
47
|
+
def initialize(options = {})
|
48
|
+
@options = {
|
49
|
+
:limit => 20,
|
50
|
+
:offset => 0,
|
51
|
+
:menu => nil,
|
52
|
+
:sub => true
|
53
|
+
}.merge(options)
|
54
|
+
|
55
|
+
validate_type(@options[:limit] , :limit , [Integer, Fixnum])
|
56
|
+
validate_type(@options[:offset], :offset, [Integer, Fixnum])
|
57
|
+
validate_type(@options[:menu] , :menu , [String, Integer, Fixnum])
|
58
|
+
end
|
59
|
+
|
60
|
+
##
|
61
|
+
# Renders the navigation menu based on the given configuration options.
|
62
|
+
#
|
63
|
+
# @author Yorick Peterse
|
64
|
+
# @since 0.2.5
|
65
|
+
# @return [String] The HTML for the navigation menu.
|
66
|
+
#
|
67
|
+
def call
|
68
|
+
# Retrieve the menu
|
69
|
+
if @options[:menu].class == String
|
70
|
+
menu = Menu[:slug => @options[:menu]]
|
71
|
+
else
|
72
|
+
menu = Menu[@options[:menu]]
|
73
|
+
end
|
74
|
+
|
75
|
+
return if !menu
|
76
|
+
|
77
|
+
# Get all menu items
|
78
|
+
menu_items = MenuItem.filter(:menu_id => menu.id, :parent_id => nil)
|
79
|
+
.limit(@options[:limit], @options[:offset])
|
80
|
+
.all
|
81
|
+
|
82
|
+
@g = Ramaze::Gestalt.new
|
83
|
+
attributes = {}
|
84
|
+
items_tree = {}
|
85
|
+
|
86
|
+
# Set the attributes for the main <ul> elements
|
87
|
+
if !menu.css_class.nil?
|
88
|
+
attributes[:class] = menu.css_class
|
89
|
+
end
|
90
|
+
|
91
|
+
if !menu.css_id.nil?
|
92
|
+
attributes[:id] = menu.css_id
|
93
|
+
end
|
94
|
+
|
95
|
+
# Time to build the HTML
|
96
|
+
@g.ul(attributes) do
|
97
|
+
menu_items.each do |item|
|
98
|
+
if item.parent_id.nil?
|
99
|
+
generate_item(item)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
return @g.to_s
|
105
|
+
end
|
106
|
+
|
107
|
+
private
|
108
|
+
|
109
|
+
##
|
110
|
+
# Generates the HTML for a single <li> element and all sub elements.
|
111
|
+
#
|
112
|
+
# @author Yorick Peterse
|
113
|
+
# @since 0.2.5
|
114
|
+
# @param [Object] item An instance of the MenuItem model as returned by Sequel.
|
115
|
+
#
|
116
|
+
def generate_item(item)
|
117
|
+
attributes = {}
|
118
|
+
|
119
|
+
if !item.css_class.nil?
|
120
|
+
attributes[:class] = item.css_class
|
121
|
+
end
|
122
|
+
|
123
|
+
if !item.css_id.nil?
|
124
|
+
attributes[:id] = item.css_id
|
125
|
+
end
|
126
|
+
|
127
|
+
# Get all child elements
|
128
|
+
children = item.children
|
129
|
+
|
130
|
+
# Render the <li> tag
|
131
|
+
@g.li(attributes) do
|
132
|
+
# Do we have a URL?
|
133
|
+
if !item.url.nil? and !item.url.empty?
|
134
|
+
@g.a(:href => item.url, :title => item.name) { item.name }
|
135
|
+
else
|
136
|
+
@g.span { item.name }
|
137
|
+
end
|
138
|
+
|
139
|
+
# Generate all the sub elements
|
140
|
+
if !children.empty? and @options[:sub] === true
|
141
|
+
@g.ul(:class => :children) do
|
142
|
+
children.each do |child|
|
143
|
+
generate_item(child)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
@@ -27,7 +27,7 @@ form_for(
|
|
27
27
|
|
28
28
|
# Generate the dropdown that contains all possible parent menu items
|
29
29
|
parent_items = {}
|
30
|
-
Menus::
|
30
|
+
Menus::Model::Menu[@menu_id.to_i].menu_items.each do |i|
|
31
31
|
if i.id != @menu_item.id
|
32
32
|
parent_items[i.id] = i.name
|
33
33
|
end
|
@@ -37,11 +37,11 @@
|
|
37
37
|
|
38
38
|
<td>#{item.id}</td>
|
39
39
|
|
40
|
-
<?r if user_authorized?([:
|
40
|
+
<?r if user_authorized?([:update]) ?>
|
41
41
|
<td>
|
42
42
|
#{anchor_to(
|
43
43
|
item.name,
|
44
|
-
Menus::
|
44
|
+
Menus::Controller::MenuItems.r(:edit, @menu_id, item.id)
|
45
45
|
)}
|
46
46
|
</td>
|
47
47
|
<?r else ?>
|
@@ -68,7 +68,7 @@
|
|
68
68
|
<div class="button">
|
69
69
|
#{anchor_to(
|
70
70
|
lang('menu_items.buttons.new'),
|
71
|
-
Menus::
|
71
|
+
Menus::Controller::MenuItems.r(:new, @menu_id)
|
72
72
|
)}
|
73
73
|
</div>
|
74
74
|
<?r end ?>
|
@@ -23,7 +23,7 @@
|
|
23
23
|
<th>#{lang('menus.labels.css_class')}</th>
|
24
24
|
<th>#{lang('menus.labels.css_id')}</th>
|
25
25
|
|
26
|
-
<?r if user_authorized?([:
|
26
|
+
<?r if user_authorized?([:read], true, 'Menus::Controller::MenuItems') ?>
|
27
27
|
<th></th>
|
28
28
|
<?r end ?>
|
29
29
|
</tr>
|
@@ -39,12 +39,12 @@
|
|
39
39
|
<?r end ?>
|
40
40
|
|
41
41
|
<td>#{menu.id}</td>
|
42
|
-
|
43
|
-
<?r if user_authorized?([:
|
42
|
+
|
43
|
+
<?r if user_authorized?([:update]) ?>
|
44
44
|
<td>
|
45
45
|
#{anchor_to(
|
46
46
|
menu.name,
|
47
|
-
Menus::
|
47
|
+
Menus::Controller::Menus.r(:edit, menu.id)
|
48
48
|
)}
|
49
49
|
</td>
|
50
50
|
<?r else ?>
|
@@ -55,11 +55,11 @@
|
|
55
55
|
<td>#{menu.css_class}</td>
|
56
56
|
<td>#{menu.css_id}</td>
|
57
57
|
|
58
|
-
<?r if user_authorized?([:
|
58
|
+
<?r if user_authorized?([:read], true, 'Menus::Controller::MenuItems') ?>
|
59
59
|
<td>
|
60
60
|
#{anchor_to(
|
61
61
|
lang('menus.labels.manage_items'),
|
62
|
-
Menus::
|
62
|
+
Menus::Controller::MenuItems.r(:index, menu.id)
|
63
63
|
)}
|
64
64
|
</td>
|
65
65
|
<?r end ?>
|
@@ -78,7 +78,7 @@
|
|
78
78
|
<div class="button">
|
79
79
|
#{anchor_to(
|
80
80
|
lang('menus.buttons.new'),
|
81
|
-
Menus::
|
81
|
+
Menus::Controller::Menus.r(:new)
|
82
82
|
)}
|
83
83
|
</div>
|
84
84
|
<?r end ?>
|