alchemy_cms 2.1.12 → 2.2.rc1
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +1 -1
- data/Gemfile +20 -16
- data/README.md +11 -7
- data/alchemy_cms.gemspec +31 -29
- data/app/assets/javascripts/alchemy/alchemy.base.js +234 -233
- data/app/assets/javascripts/alchemy/alchemy.buttons.js +26 -26
- data/app/assets/javascripts/alchemy/alchemy.datepicker.js +32 -32
- data/app/assets/javascripts/alchemy/alchemy.dirty.js +78 -78
- data/app/assets/javascripts/alchemy/alchemy.dragndrop.js +103 -103
- data/app/assets/javascripts/alchemy/alchemy.element_editor_selector.js +84 -84
- data/app/assets/javascripts/alchemy/alchemy.elements_window.js +88 -88
- data/app/assets/javascripts/alchemy/alchemy.file_progress.js +92 -0
- data/app/assets/javascripts/alchemy/alchemy.growler.js +23 -23
- data/app/assets/javascripts/alchemy/alchemy.html5.js +23 -0
- data/app/assets/javascripts/alchemy/alchemy.image_cropper.js +53 -52
- data/app/assets/javascripts/alchemy/alchemy.jquery_loader.js +33 -30
- data/app/assets/javascripts/alchemy/alchemy.js +2 -0
- data/app/assets/javascripts/alchemy/alchemy.js_extensions.js +14 -14
- data/app/assets/javascripts/alchemy/alchemy.link_overlay.js.coffee +181 -0
- data/app/assets/javascripts/alchemy/alchemy.menubar.js +48 -48
- data/app/assets/javascripts/alchemy/alchemy.page_sorter.js +39 -39
- data/app/assets/javascripts/alchemy/alchemy.preview.js +81 -83
- data/app/assets/javascripts/alchemy/alchemy.preview_window.js +86 -86
- data/app/assets/javascripts/alchemy/alchemy.routes.js.erb +23 -23
- data/app/assets/javascripts/alchemy/alchemy.swf_upload.js +208 -353
- data/app/assets/javascripts/alchemy/alchemy.uploader.js +279 -0
- data/app/assets/javascripts/alchemy/alchemy.windows.js +268 -268
- data/app/assets/javascripts/tiny_mce/plugins/alchemy_link/editor_plugin.js +42 -42
- data/app/assets/stylesheets/alchemy/_defaults.scss +89 -89
- data/app/assets/stylesheets/alchemy/base.css.scss +790 -804
- data/app/assets/stylesheets/alchemy/buttons.css.scss +263 -264
- data/app/assets/stylesheets/alchemy/dashboard.css.scss +66 -66
- data/app/assets/stylesheets/alchemy/elements.css.scss +575 -564
- data/app/assets/stylesheets/alchemy/flash.css.scss +45 -45
- data/app/assets/stylesheets/alchemy/frame.css.scss +262 -262
- data/app/assets/stylesheets/alchemy/icons.css.scss +86 -86
- data/app/assets/stylesheets/alchemy/jquery-ui.alchemy.css.scss +706 -707
- data/app/assets/stylesheets/alchemy/jquery.Jcrop.css.scss +46 -27
- data/app/assets/stylesheets/alchemy/jquery.sb.css.scss +107 -107
- data/app/assets/stylesheets/alchemy/login.css.scss +40 -38
- data/app/assets/stylesheets/alchemy/menubar.css.scss +84 -82
- data/app/assets/stylesheets/alchemy/modules.css.scss +9 -9
- data/app/assets/stylesheets/alchemy/pagination.css.scss +49 -49
- data/app/assets/stylesheets/alchemy/print.css +7 -7
- data/app/assets/stylesheets/alchemy/sitemap.css.scss +185 -154
- data/app/assets/stylesheets/alchemy/standard_set.css +205 -206
- data/app/assets/stylesheets/alchemy/tables.css.scss +94 -60
- data/app/assets/stylesheets/alchemy/tinymce_content.css.scss +34 -34
- data/app/assets/stylesheets/alchemy/tinymce_dialog.css.scss +177 -177
- data/app/assets/stylesheets/alchemy/upload.css.scss +68 -45
- data/app/assets/stylesheets/tiny_mce/plugins/inlinepopups/skins/alchemy/window.css.scss +222 -221
- data/app/controllers/alchemy/admin/attachments_controller.rb +100 -100
- data/app/controllers/alchemy/admin/base_controller.rb +116 -116
- data/app/controllers/alchemy/admin/clipboard_controller.rb +44 -44
- data/app/controllers/alchemy/admin/contents_controller.rb +55 -55
- data/app/controllers/alchemy/admin/dashboard_controller.rb +12 -11
- data/app/controllers/alchemy/admin/elements_controller.rb +109 -109
- data/app/controllers/alchemy/admin/essence_audios_controller.rb +8 -8
- data/app/controllers/alchemy/admin/essence_files_controller.rb +20 -20
- data/app/controllers/alchemy/admin/essence_flashes_controller.rb +8 -8
- data/app/controllers/alchemy/admin/essence_pictures_controller.rb +81 -81
- data/app/controllers/alchemy/admin/essence_videos_controller.rb +8 -8
- data/app/controllers/alchemy/admin/languages_controller.rb +16 -4
- data/app/controllers/alchemy/admin/layoutpages_controller.rb +9 -9
- data/app/controllers/alchemy/admin/pages_controller.rb +249 -248
- data/app/controllers/alchemy/admin/pictures_controller.rb +105 -105
- data/app/controllers/alchemy/admin/resources_controller.rb +111 -166
- data/app/controllers/alchemy/admin/trash_controller.rb +18 -18
- data/app/controllers/alchemy/admin/users_controller.rb +69 -69
- data/app/controllers/alchemy/attachments_controller.rb +27 -27
- data/app/controllers/alchemy/base_controller.rb +159 -155
- data/app/controllers/alchemy/elements_controller.rb +16 -16
- data/app/controllers/alchemy/messages_controller.rb +59 -59
- data/app/controllers/alchemy/pages_controller.rb +194 -198
- data/app/controllers/alchemy/pictures_controller.rb +57 -57
- data/app/controllers/alchemy/user_sessions_controller.rb +70 -70
- data/app/helpers/alchemy/admin/attachments_helper.rb +7 -7
- data/app/helpers/alchemy/admin/base_helper.rb +425 -425
- data/app/helpers/alchemy/admin/contents_helper.rb +72 -72
- data/app/helpers/alchemy/admin/elements_helper.rb +108 -107
- data/app/helpers/alchemy/admin/essences_helper.rb +108 -108
- data/app/helpers/alchemy/admin/pages_helper.rb +42 -42
- data/app/helpers/alchemy/admin/pictures_helper.rb +26 -26
- data/app/helpers/alchemy/base_helper.rb +90 -90
- data/app/helpers/alchemy/elements_helper.rb +167 -168
- data/app/helpers/alchemy/essences_helper.rb +133 -133
- data/app/helpers/alchemy/pages_helper.rb +515 -526
- data/app/helpers/alchemy/pictures_helper.rb +19 -0
- data/app/mailers/alchemy/messages.rb +13 -13
- data/app/mailers/alchemy/notifications.rb +19 -19
- data/app/models/alchemy.rb +3 -3
- data/app/models/alchemy/attachment.rb +52 -78
- data/app/models/alchemy/cell.rb +48 -48
- data/app/models/alchemy/content.rb +196 -196
- data/app/models/alchemy/element.rb +500 -490
- data/app/models/alchemy/essence_audio.rb +7 -7
- data/app/models/alchemy/essence_date.rb +10 -10
- data/app/models/alchemy/essence_file.rb +7 -7
- data/app/models/alchemy/essence_flash.rb +6 -6
- data/app/models/alchemy/essence_html.rb +9 -9
- data/app/models/alchemy/essence_picture.rb +17 -17
- data/app/models/alchemy/essence_richtext.rb +53 -53
- data/app/models/alchemy/essence_text.rb +21 -21
- data/app/models/alchemy/essence_video.rb +7 -7
- data/app/models/alchemy/folded_page.rb +3 -3
- data/app/models/alchemy/language.rb +91 -91
- data/app/models/alchemy/language/code.rb +14 -14
- data/app/models/alchemy/message.rb +48 -45
- data/app/models/alchemy/page.rb +555 -558
- data/app/models/alchemy/picture.rb +100 -99
- data/app/models/alchemy/user.rb +76 -74
- data/app/models/alchemy/user_session.rb +8 -8
- data/app/sweepers/alchemy/content_sweeper.rb +15 -15
- data/app/sweepers/alchemy/pages_sweeper.rb +50 -50
- data/app/sweepers/alchemy/pictures_sweeper.rb +14 -14
- data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +23 -23
- data/app/views/alchemy/admin/attachments/_attachment.html.erb +56 -56
- data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +15 -15
- data/app/views/alchemy/admin/attachments/_files_list.html.erb +16 -16
- data/app/views/alchemy/admin/attachments/create.js.erb +2 -2
- data/app/views/alchemy/admin/attachments/destroy.js.erb +3 -3
- data/app/views/alchemy/admin/attachments/edit.html.erb +10 -10
- data/app/views/alchemy/admin/attachments/index.html.erb +14 -14
- data/app/views/alchemy/admin/attachments/new.html.erb +9 -9
- data/app/views/alchemy/admin/clipboard/index.html.erb +21 -21
- data/app/views/alchemy/admin/clipboard/insert.js.erb +5 -5
- data/app/views/alchemy/admin/contents/_missing.html.erb +1 -1
- data/app/views/alchemy/admin/contents/create.js.erb +33 -33
- data/app/views/alchemy/admin/contents/destroy.js.erb +5 -5
- data/app/views/alchemy/admin/contents/new.html.erb +13 -13
- data/app/views/alchemy/admin/contents/order.js.erb +2 -2
- data/app/views/alchemy/admin/dashboard/index.html.erb +96 -92
- data/app/views/alchemy/admin/elements/_add_content.html.erb +12 -12
- data/app/views/alchemy/admin/elements/_element.html.erb +3 -3
- data/app/views/alchemy/admin/elements/_new_element_form.html.erb +28 -28
- data/app/views/alchemy/admin/elements/_picture_editor.html.erb +21 -21
- data/app/views/alchemy/admin/elements/create.js.erb +32 -32
- data/app/views/alchemy/admin/elements/index.html.erb +2 -2
- data/app/views/alchemy/admin/elements/new.html.erb +31 -31
- data/app/views/alchemy/admin/elements/order.js.erb +3 -3
- data/app/views/alchemy/admin/elements/trash.js.erb +13 -13
- data/app/views/alchemy/admin/elements/update.js.erb +6 -6
- data/app/views/alchemy/admin/essence_files/assign.js.erb +6 -6
- data/app/views/alchemy/admin/essence_pictures/crop.html.erb +32 -32
- data/app/views/alchemy/admin/essence_pictures/destroy.js.erb +1 -1
- data/app/views/alchemy/admin/essence_pictures/edit.html.erb +1 -1
- data/app/views/alchemy/admin/essence_pictures/update.js.erb +11 -11
- data/app/views/alchemy/admin/languages/_form.html.erb +51 -45
- data/app/views/alchemy/admin/languages/_language.html.erb +45 -45
- data/app/views/alchemy/admin/languages/_table.html.erb +25 -25
- data/app/views/alchemy/admin/layoutpages/index.html.erb +35 -35
- data/app/views/alchemy/admin/pages/_create_language_form.html.erb +42 -42
- data/app/views/alchemy/admin/pages/_external_link.html.erb +1 -1
- data/app/views/alchemy/admin/pages/_new_page_form.html.erb +27 -27
- data/app/views/alchemy/admin/pages/_page.html.erb +112 -112
- data/app/views/alchemy/admin/pages/_sitemap.html.erb +1 -1
- data/app/views/alchemy/admin/pages/configure.html.erb +71 -69
- data/app/views/alchemy/admin/pages/configure_external.html.erb +38 -38
- data/app/views/alchemy/admin/pages/destroy.js.erb +10 -10
- data/app/views/alchemy/admin/pages/edit.html.erb +165 -165
- data/app/views/alchemy/admin/pages/fold.js.erb +2 -2
- data/app/views/alchemy/admin/pages/index.html.erb +66 -66
- data/app/views/alchemy/admin/pages/locked.html.erb +1 -1
- data/app/views/alchemy/admin/pages/new.html.erb +40 -40
- data/app/views/alchemy/admin/pages/sort.js.erb +4 -4
- data/app/views/alchemy/admin/pages/unlock.js.erb +6 -6
- data/app/views/alchemy/admin/pages/update.js.erb +19 -19
- data/app/views/alchemy/admin/partials/_flash.html.erb +2 -2
- data/app/views/alchemy/admin/partials/_flash_notices.html.erb +1 -1
- data/app/views/alchemy/admin/partials/_flash_upload.html.erb +38 -0
- data/app/views/alchemy/admin/partials/_language_tree_select.html.erb +15 -15
- data/app/views/alchemy/admin/partials/_main_navigation_entry.html.erb +8 -8
- data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +35 -35
- data/app/views/alchemy/admin/partials/_search_form.html.erb +14 -14
- data/app/views/alchemy/admin/partials/_sub_navigation_tab.html.erb +6 -6
- data/app/views/alchemy/admin/partials/_upload_form.html.erb +56 -118
- data/app/views/alchemy/admin/pictures/_archive_overlay.html.erb +11 -11
- data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +71 -71
- data/app/views/alchemy/admin/pictures/_picture.html.erb +32 -32
- data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +26 -26
- data/app/views/alchemy/admin/pictures/_pictures_list.html.erb +6 -6
- data/app/views/alchemy/admin/pictures/create.js.erb +7 -7
- data/app/views/alchemy/admin/pictures/index.html.erb +67 -67
- data/app/views/alchemy/admin/pictures/show_in_window.html.erb +5 -4
- data/app/views/alchemy/admin/resources/_form.html.erb +25 -19
- data/app/views/alchemy/admin/resources/_resource.html.erb +37 -36
- data/app/views/alchemy/admin/resources/_table.html.erb +17 -17
- data/app/views/alchemy/admin/resources/destroy.js.erb +1 -1
- data/app/views/alchemy/admin/resources/index.html.erb +14 -14
- data/app/views/alchemy/admin/trash/index.html.erb +20 -20
- data/app/views/alchemy/admin/users/_table.html.erb +52 -52
- data/app/views/alchemy/admin/users/_user.html.erb +35 -36
- data/app/views/alchemy/admin/users/index.html.erb +26 -27
- data/app/views/alchemy/base/error_notice.html.erb +2 -2
- data/app/views/alchemy/base/update.js.erb +1 -1
- data/app/views/alchemy/elements/_contactform_view.html.erb +76 -76
- data/app/views/alchemy/elements/_download_view.html.erb +1 -1
- data/app/views/alchemy/elements/_editor_not_found.html.erb +3 -3
- data/app/views/alchemy/elements/_searchresult_view.html.erb +2 -2
- data/app/views/alchemy/elements/_sitemap_editor.html.erb +1 -1
- data/app/views/alchemy/essences/_essence_audio_view.html.erb +13 -13
- data/app/views/alchemy/essences/_essence_date_editor.html.erb +10 -10
- data/app/views/alchemy/essences/_essence_file_editor.html.erb +62 -62
- data/app/views/alchemy/essences/_essence_file_view.html.erb +8 -8
- data/app/views/alchemy/essences/_essence_flash_view.html.erb +19 -19
- data/app/views/alchemy/essences/_essence_html_editor.html.erb +6 -6
- data/app/views/alchemy/essences/_essence_picture_editor.html.erb +73 -73
- data/app/views/alchemy/essences/_essence_picture_view.html.erb +34 -34
- data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +7 -7
- data/app/views/alchemy/essences/_essence_text_editor.html.erb +8 -8
- data/app/views/alchemy/navigation/_image_link.html.erb +12 -12
- data/app/views/alchemy/navigation/_link.html.erb +13 -13
- data/app/views/alchemy/navigation/_renderer.html.erb +17 -17
- data/app/views/alchemy/page_layouts/_layout_footer.html.erb +1 -1
- data/app/views/alchemy/page_layouts/_layout_header.html.erb +1 -1
- data/app/views/alchemy/pages/show.rss.builder +14 -14
- data/app/views/alchemy/search/_result.html.erb +7 -7
- data/app/views/alchemy/user_sessions/leave.html.erb +9 -9
- data/app/views/alchemy/user_sessions/login.html.erb +39 -39
- data/app/views/alchemy/user_sessions/logout.html.erb +1 -1
- data/app/views/layouts/alchemy/admin.html.erb +81 -81
- data/app/views/layouts/alchemy/login.html.erb +36 -36
- data/app/views/layouts/alchemy/pages.html.erb +48 -27
- data/bin/alchemy +136 -134
- data/config/alchemy/config.yml +13 -9
- data/config/locales/alchemy.de.yml +24 -30
- data/config/locales/alchemy.en.yml +11 -28
- data/config/routes.rb +146 -146
- data/db/migrate/20100607193638_create_essence_pictures.rb +3 -3
- data/db/migrate/20101109150312_alter_pages_visible_column_default.rb +1 -1
- data/db/migrate/20101109151812_create_languages.rb +3 -3
- data/db/migrate/20110115123343_remove_css_class_default_from_essence_pictures.rb +3 -3
- data/db/migrate/20110224105120_change_pages_visible_default.rb +3 -3
- data/db/migrate/20110228182659_remove_default_page_layout_from_pages.rb +2 -2
- data/db/migrate/20110414163140_remove_display_name_from_elements.rb +3 -3
- data/db/migrate/20110511100516_rename_essence_texts_title_to_link_title.rb +2 -2
- data/db/migrate/20110529130500_add_cell_id_to_elements.rb +3 -3
- data/db/migrate/20110530102804_change_pages_page_layout_column.rb +3 -3
- data/db/migrate/20110711142057_change_open_link_in_new_window_to_link_target.rb +1 -1
- data/db/migrate/20111116125112_namespace_alchemy_models.rb +21 -21
- data/lib/alchemy/auth_engine.rb +5 -5
- data/lib/alchemy/capistrano.rb +64 -64
- data/lib/alchemy/config.rb +47 -44
- data/lib/alchemy/engine.rb +41 -41
- data/lib/alchemy/essence.rb +50 -51
- data/lib/alchemy/i18n.rb +48 -48
- data/lib/alchemy/modules.rb +30 -30
- data/lib/alchemy/mount_point.rb +6 -6
- data/lib/alchemy/page_layout.rb +94 -93
- data/lib/alchemy/resource.rb +82 -0
- data/lib/alchemy/resources_helper.rb +56 -0
- data/lib/alchemy/scoped_pagination_url_helper.rb +8 -8
- data/lib/alchemy/seeder.rb +88 -88
- data/lib/alchemy/tinymce.rb +49 -49
- data/lib/alchemy/upgrader.rb +103 -103
- data/lib/alchemy/version.rb +1 -1
- data/lib/alchemy_cms.rb +26 -27
- data/lib/extensions/action_view.rb +1 -1
- data/lib/extensions/array.rb +3 -3
- data/lib/extensions/hash.rb +3 -3
- data/lib/middleware/flash_session_cookie.rb +1 -1
- data/lib/rails/generators/alchemy/deploy_script/deploy_script_generator.rb +24 -24
- data/lib/rails/generators/alchemy/elements/elements_generator.rb +7 -7
- data/lib/rails/generators/alchemy/elements/templates/view.html.erb +17 -17
- data/lib/rails/generators/alchemy/page_layouts/page_layouts_generator.rb +6 -6
- data/lib/rails/generators/alchemy/plugin/templates/authorization_rules.rb +8 -8
- data/lib/rails/generators/alchemy/scaffold/files/pages.html.erb +7 -7
- data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +36 -36
- data/lib/rails/templates/alchemy.rb +1 -1
- data/lib/tasks/ferret.rake +2 -2
- data/lib/tasks/fleximage.rake +32 -32
- data/lib/tasks/install.rake +12 -12
- data/lib/tasks/upgrade.rake +4 -4
- data/spec/controllers/admin/clipboard_controller_spec.rb +43 -43
- data/spec/controllers/admin/contents_controller_spec.rb +22 -22
- data/spec/controllers/admin/elements_controller_spec.rb +13 -13
- data/spec/controllers/admin/languages_controller_spec.rb +31 -0
- data/spec/controllers/admin/pages_controller_spec.rb +10 -41
- data/spec/controllers/admin/resources_controller_spec.rb +19 -0
- data/spec/controllers/admin/trash_controller_spec.rb +11 -11
- data/spec/controllers/base_controller_spec.rb +46 -46
- data/spec/controllers/pages_controller_spec.rb +102 -92
- data/spec/dummy/app/controllers/admin/events_controller.rb +3 -0
- data/spec/dummy/app/controllers/errors_controller.rb +5 -0
- data/spec/dummy/app/models/event.rb +3 -0
- data/spec/dummy/config.ru +1 -1
- data/spec/dummy/config/application.rb +3 -0
- data/spec/dummy/config/authorization_rules.rb +7 -0
- data/spec/dummy/config/environments/development.rb +8 -1
- data/spec/dummy/config/environments/production.rb +1 -1
- data/spec/dummy/config/environments/test.rb +5 -2
- data/spec/dummy/config/routes.rb +9 -1
- data/spec/dummy/db/schema.rb +47 -35
- data/spec/dummy/public/404.html +19 -7
- data/spec/dummy/public/404.html.bak +26 -0
- data/spec/dummy/public/422.html +19 -7
- data/spec/dummy/public/500.html +19 -7
- data/spec/dummy/script/rails +2 -2
- data/spec/factories.rb +76 -76
- data/spec/helpers/admin/base_helper_spec.rb +21 -21
- data/spec/helpers/admin/contents_helper_spec.rb +14 -14
- data/spec/helpers/admin/elements_helper_spec.rb +40 -40
- data/spec/helpers/admin/essences_helper_spec.rb +7 -7
- data/spec/helpers/elements_helper_spec.rb +154 -154
- data/spec/helpers/essences_helper_spec.rb +10 -10
- data/spec/helpers/pages_helper_spec.rb +369 -372
- data/spec/helpers/pictures_helper_spec.rb +14 -0
- data/spec/helpers/url_helpers_spec.rb +29 -34
- data/spec/integration/admin/pages_controller_spec.rb +50 -50
- data/spec/integration/admin/resources_integration_spec.rb +100 -0
- data/spec/integration/navigation_spec.rb +1 -1
- data/spec/integration/pages_controller_spec.rb +205 -207
- data/spec/integration/security_spec.rb +47 -47
- data/spec/javascripts/alchemy/link_overlay_spec.js.coffee +42 -0
- data/spec/javascripts/alchemy_integration_spec.coffee +12 -0
- data/spec/javascripts/fixtures/select.html +3 -0
- data/spec/javascripts/helpers/.gitkeep +0 -0
- data/spec/javascripts/helpers/jasmine-jquery-1.3.1.js +289 -0
- data/spec/javascripts/helpers/mock-ajax.js +207 -0
- data/spec/javascripts/helpers/test_responses/test_responses.js +1 -0
- data/spec/javascripts/spec.css +3 -0
- data/spec/javascripts/spec.js +2 -0
- data/spec/libraries/resource_spec.rb +122 -0
- data/spec/libraries/resources_helper_spec.rb +105 -0
- data/spec/models/content_spec.rb +67 -67
- data/spec/models/element_spec.rb +133 -133
- data/spec/models/essence_picture_spec.rb +5 -5
- data/spec/models/essence_richtext_spec.rb +4 -4
- data/spec/models/language_spec.rb +89 -89
- data/spec/models/page_spec.rb +436 -506
- data/spec/models/picture_spec.rb +34 -34
- data/spec/models/user_spec.rb +2 -2
- data/spec/page_layout_spec.rb +24 -20
- data/spec/routing_spec.rb +253 -253
- data/spec/spec_helper.rb +51 -50
- data/spec/support/alchemy/controller_hacks.rb +25 -25
- data/spec/support/alchemy/specs_helpers.rb +25 -25
- data/spec/support/integration_spec_helper.rb +24 -0
- data/vendor/assets/javascripts/jquery_plugins/jquery.html5uploader.js +271 -0
- data/vendor/assets/javascripts/jquery_plugins/jquery.in-place-edit.js +86 -85
- data/vendor/assets/javascripts/jquery_plugins/jquery.ui.nestedSortable.js +380 -377
- data/vendor/assets/javascripts/jquery_plugins/jquery.ui.tabspaging.js +285 -279
- data/vendor/assets/javascripts/swfupload/SWFObject License.txt +3 -3
- data/vendor/assets/javascripts/swfupload/swfupload.cookies.js +47 -47
- data/vendor/assets/javascripts/swfupload/swfupload.js +612 -612
- data/vendor/assets/javascripts/swfupload/swfupload.queue.js +93 -93
- data/vendor/assets/javascripts/swfupload/swfupload.speed.js +337 -337
- data/vendor/assets/javascripts/swfupload/swfupload.swfobject.js +706 -102
- data/vendor/assets/javascripts/tiny_mce/license.txt +6 -6
- data/vendor/assets/javascripts/tiny_mce/plugins/fullscreen/fullscreen.htm +97 -97
- data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/template.htm +386 -376
- data/vendor/assets/javascripts/tiny_mce/plugins/paste/js/pastetext.js +30 -30
- data/vendor/assets/javascripts/tiny_mce/plugins/paste/js/pasteword.js +45 -45
- data/vendor/assets/javascripts/tiny_mce/plugins/paste/pastetext.htm +20 -17
- data/vendor/assets/javascripts/tiny_mce/plugins/paste/pasteword.htm +12 -12
- data/vendor/assets/javascripts/tiny_mce/plugins/table/cell.htm +183 -173
- data/vendor/assets/javascripts/tiny_mce/plugins/table/css/cell.css +4 -4
- data/vendor/assets/javascripts/tiny_mce/plugins/table/css/row.css +7 -7
- data/vendor/assets/javascripts/tiny_mce/plugins/table/css/table.css +3 -3
- data/vendor/assets/javascripts/tiny_mce/plugins/table/js/cell.js +282 -280
- data/vendor/assets/javascripts/tiny_mce/plugins/table/js/merge_cells.js +15 -15
- data/vendor/assets/javascripts/tiny_mce/plugins/table/js/row.js +204 -204
- data/vendor/assets/javascripts/tiny_mce/plugins/table/js/table.js +435 -435
- data/vendor/assets/javascripts/tiny_mce/plugins/table/merge_cells.htm +24 -22
- data/vendor/assets/javascripts/tiny_mce/plugins/table/row.htm +144 -136
- data/vendor/assets/javascripts/tiny_mce/plugins/table/table.htm +184 -168
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/about.htm +62 -46
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/anchor.htm +17 -16
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/charmap.htm +56 -47
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/color_picker.htm +67 -54
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/editor_template.js +852 -1
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/image.htm +79 -69
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/about.js +48 -48
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/anchor.js +28 -28
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/charmap.js +317 -317
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/color_picker.js +248 -246
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/image.js +246 -246
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/link.js +146 -146
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/source_editor.js +31 -31
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/de.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/de_dlg.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/en.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/en_dlg.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/link.htm +53 -46
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/shortcuts.htm +57 -45
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/content.css +182 -47
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/dialog.css +399 -92
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/ui.css +891 -187
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/content.css +102 -24
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css +377 -78
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css +452 -77
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/content.css +167 -45
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css +399 -92
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui.css +890 -190
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +33 -7
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +15 -4
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/source_editor.htm +18 -15
- data/vendor/assets/javascripts/tiny_mce/utils/editable_selects.js +46 -46
- data/vendor/assets/javascripts/tiny_mce/utils/form_utils.js +124 -124
- data/vendor/assets/javascripts/tiny_mce/utils/mctabs.js +112 -112
- data/vendor/assets/javascripts/tiny_mce/utils/validate.js +213 -213
- metadata +102 -115
- data/app/assets/javascripts/alchemy/alchemy.link_overlay.js +0 -216
- data/lib/tasks/routes.rake +0 -29
- data/spec/integration/admin/resources_spec.rb +0 -19
@@ -1,142 +1,142 @@
|
|
1
1
|
module Alchemy
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
3
|
+
# This helper contains methods to render the +essence+ from an +Element+ +Content+.
|
4
|
+
#
|
5
|
+
# Essences have two kinds of partials. An +editor+ and a +view+ partial.
|
6
|
+
#
|
7
|
+
# They both resist in +'app/views/alchemy/essences'+
|
8
|
+
#
|
9
|
+
# The partials are suffixed with the type of part.
|
10
|
+
#
|
11
|
+
# == Example:
|
12
|
+
#
|
13
|
+
# For an EssenceText
|
14
|
+
#
|
15
|
+
# The view partial is:
|
16
|
+
#
|
17
|
+
# +_essence_text_view.html.erb+
|
18
|
+
#
|
19
|
+
# The editor partial is:
|
20
|
+
#
|
21
|
+
# +_essence_text_editor.html.erb+
|
22
|
+
#
|
23
|
+
# == Usage:
|
24
|
+
#
|
25
|
+
# For front end web development you should mostly use the +render_essence_view_by_name+ helper.
|
26
|
+
#
|
27
|
+
# And the +render_essence_editor_by_name+ helper for Alchemy backend views.
|
28
|
+
#
|
29
|
+
module EssencesHelper
|
30
30
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
31
|
+
# Renders the +Essence+ view partial from +Element+ by name.
|
32
|
+
#
|
33
|
+
# Pass the name of the +Content+ from +Element+ as second argument.
|
34
|
+
#
|
35
|
+
# == Example:
|
36
|
+
#
|
37
|
+
# This renders the +Content+ named "intro" from element.
|
38
|
+
#
|
39
|
+
# <%= render_essence_view_by_name(element, "intro") %>
|
40
|
+
#
|
41
|
+
def render_essence_view_by_name(element, name, options = {}, html_options = {})
|
42
|
+
if element.blank?
|
43
|
+
warning('Element is nil')
|
44
|
+
return ""
|
45
|
+
end
|
46
|
+
content = element.content_by_name(name)
|
47
|
+
render_essence(content, :view, {:for_view => options}, html_options)
|
48
|
+
end
|
49
49
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
50
|
+
# Renders the +Essence+ view partial from given +Element+ and +Essence+ type.
|
51
|
+
#
|
52
|
+
# Pass the type of +Essence+ you want to render from +element+ as second argument.
|
53
|
+
#
|
54
|
+
# By default the first essence gets rendered. You may pass a different position value as third argument.
|
55
|
+
#
|
56
|
+
# == Example:
|
57
|
+
#
|
58
|
+
# This renders the first +Content+ with type of +EssencePicture+ from element.
|
59
|
+
#
|
60
|
+
# <%= render_essence_view_by_type(element, "EssencePicture", 1, {:image_size => "120x80", :crop => true}) %>
|
61
|
+
#
|
62
|
+
def render_essence_view_by_type(element, type, position = 1, options = {}, html_options = {})
|
63
|
+
if element.blank?
|
64
|
+
warning('Element is nil')
|
65
|
+
return ""
|
66
|
+
end
|
67
|
+
if position == 1
|
68
|
+
content = element.content_by_type(type)
|
69
|
+
else
|
70
|
+
content = element.contents.find_by_essence_type_and_position(Alchemy::Content.normalize_essence_type(type), position)
|
71
|
+
end
|
72
|
+
render_essence_view(content, options, html_options)
|
73
|
+
end
|
74
74
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
75
|
+
# Renders the +Essence+ view partial from +Element+ by position.
|
76
|
+
#
|
77
|
+
# Pass the position of the +Content+ inside the Element as second argument.
|
78
|
+
#
|
79
|
+
# == Example:
|
80
|
+
#
|
81
|
+
# This renders the second +Content+ from element.
|
82
|
+
#
|
83
|
+
# <%= render_essence_view_by_type(element, 2) %>
|
84
|
+
#
|
85
|
+
def render_essence_view_by_position(element, position, options = {}, html_options = {})
|
86
|
+
if element.blank?
|
87
|
+
warning('Element is nil')
|
88
|
+
return ""
|
89
|
+
end
|
90
|
+
content = element.contents.find_by_position(position)
|
91
|
+
render_essence_view(content, options, html_options)
|
92
|
+
end
|
93
93
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
94
|
+
# Renders the +Esssence+ partial for given +Content+.
|
95
|
+
#
|
96
|
+
# The helper renders the view partial as default.
|
97
|
+
#
|
98
|
+
# Pass +:editor+ as second argument to render the editor partial
|
99
|
+
#
|
100
|
+
# == Options:
|
101
|
+
#
|
102
|
+
# You can pass a options Hash to each type of essence partial as third argument.
|
103
|
+
#
|
104
|
+
# This Hash is available as +options+ local variable.
|
105
|
+
#
|
106
|
+
# :for_view => {}
|
107
|
+
# :for_editor => {}
|
108
|
+
#
|
109
|
+
def render_essence(content, part = :view, options = {}, html_options = {})
|
110
|
+
if content.nil?
|
111
|
+
return part == :view ? "" : warning('Content is nil', t("content_not_found"))
|
112
|
+
elsif content.essence.nil?
|
113
|
+
return part == :view ? "" : warning('Essence is nil', t("content_essence_not_found"))
|
114
|
+
end
|
115
|
+
render(
|
116
|
+
:partial => "alchemy/essences/#{content.essence_partial_name}_#{part.to_s}",
|
117
|
+
:locals => {
|
118
|
+
:content => content,
|
119
|
+
:options => options["for_#{part}".to_sym],
|
120
|
+
:html_options => html_options
|
121
|
+
}
|
122
|
+
)
|
123
|
+
end
|
124
124
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
125
|
+
# Renders the +Esssence+ view partial for given +Content+.
|
126
|
+
#
|
127
|
+
# == Options:
|
128
|
+
#
|
129
|
+
# :image_size => "111x93" # Used by EssencePicture to render the image via RMagick to that size. [Default nil]
|
130
|
+
# :date_format => "Am %d. %m. %Y, um %H:%Mh" # Espacially for EssenceDate. See Rubys Date.strftime for date formatting options. [Default nil]
|
131
|
+
# :caption => true # Pass Boolean to enable/disable the EssencePicture.caption. [Default true]
|
132
|
+
# :blank_value => "Not found" # Pass a String that gets rendered if the content.essence is blank. [Default nil]
|
133
|
+
#
|
134
|
+
def render_essence_view(content, options = {}, html_options = {})
|
135
|
+
defaults = {
|
136
|
+
:caption => true
|
137
|
+
}
|
138
|
+
render_essence(content, :view, {:for_view => options}, html_options)
|
139
|
+
end
|
140
140
|
|
141
|
-
|
141
|
+
end
|
142
142
|
end
|
@@ -1,554 +1,543 @@
|
|
1
1
|
module Alchemy
|
2
|
-
|
2
|
+
module PagesHelper
|
3
3
|
|
4
|
-
|
5
|
-
|
4
|
+
include Alchemy::BaseHelper
|
5
|
+
include Alchemy::ElementsHelper
|
6
|
+
include Alchemy::PicturesHelper
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
def render_classes(classes=[])
|
9
|
+
s = classes.uniq.delete_if { |x| x.blank? }.join(" ")
|
10
|
+
s.blank? ? "" : "class='#{s}'"
|
11
|
+
end
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
def picture_essence_caption(content)
|
14
|
+
return "" if content.nil?
|
15
|
+
return "" if content.essence.nil?
|
16
|
+
content.essence.caption
|
17
|
+
end
|
17
18
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
alias_method :language_switches, :language_switcher
|
19
|
+
# == Helper for rendering language switches
|
20
|
+
#
|
21
|
+
# Renders links to all public language root pages
|
22
|
+
#
|
23
|
+
# === Options:
|
24
|
+
#
|
25
|
+
# :linkname => :name,
|
26
|
+
# :spacer => "",
|
27
|
+
# :link_to_public_child => configuration(:redirect_to_public_child),
|
28
|
+
# :link_to_page_with_layout => nil,
|
29
|
+
# :show_title => true,
|
30
|
+
# :reverse => false,
|
31
|
+
# :as_select_box => false,
|
32
|
+
# :show_flags => false
|
33
|
+
#
|
34
|
+
def language_switcher(options={})
|
35
|
+
default_options = {
|
36
|
+
:linkname => :name,
|
37
|
+
:spacer => "",
|
38
|
+
:link_to_public_child => configuration(:redirect_to_public_child),
|
39
|
+
:link_to_page_with_layout => nil,
|
40
|
+
:show_title => true,
|
41
|
+
:reverse => false,
|
42
|
+
:as_select_box => false,
|
43
|
+
:show_flags => false
|
44
|
+
}
|
45
|
+
options = default_options.merge(options)
|
46
|
+
if multi_language?
|
47
|
+
language_links = []
|
48
|
+
pages = (options[:link_to_public_child] == true) ? Page.language_roots : Page.public_language_roots
|
49
|
+
return nil if (pages.blank? || pages.length == 1)
|
50
|
+
pages.each_with_index do |page, i|
|
51
|
+
if (options[:link_to_page_with_layout] != nil)
|
52
|
+
page_found_by_layout = Page.where(:page_layout => options[:link_to_page_with_layout].to_s, :language_id => page.language_id)
|
53
|
+
end
|
54
|
+
page = page_found_by_layout || page
|
55
|
+
page = (options[:link_to_public_child] ? (page.first_public_child.blank? ? nil : page.first_public_child) : nil) if !page.public?
|
56
|
+
if !page.blank?
|
57
|
+
active = session[:language_id] == page.language.id
|
58
|
+
linkname = page.language.label(options[:linkname])
|
59
|
+
if options[:as_select_box]
|
60
|
+
language_links << [linkname, show_page_url(:urlname => page.urlname, :lang => page.language.code)]
|
61
|
+
else
|
62
|
+
language_links << link_to(
|
63
|
+
"#{content_tag(:span, '', :class => "flag") if options[:show_flags]}#{ content_tag(:span, linkname)}".html_safe,
|
64
|
+
alchemy.show_page_path(:urlname => page.urlname, :lang => page.language.code),
|
65
|
+
:class => "#{(active ? 'active ' : nil)}#{page.language.code} #{(i == 0) ? 'first' : (i==pages.length-1) ? 'last' : nil}",
|
66
|
+
:title => options[:show_title] ? Alchemy::I18n.t("alchemy.language_links.#{page.language.code}.title", :default => page.language.name) : nil
|
67
|
+
)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
# when last iteration and we have just one language_link,
|
71
|
+
# we dont need to render it.
|
72
|
+
if (i==pages.length-1) && language_links.length == 1
|
73
|
+
return nil
|
74
|
+
end
|
75
|
+
end
|
76
|
+
return nil if language_links.empty? || language_links.length == 1
|
77
|
+
language_links.reverse! if options[:reverse]
|
78
|
+
if options[:as_select_box]
|
79
|
+
return select_tag(
|
80
|
+
'language',
|
81
|
+
options_for_select(
|
82
|
+
language_links,
|
83
|
+
show_page_url(:urlname => @page.urlname, :lang => @page.language.code)
|
84
|
+
),
|
85
|
+
:onchange => "window.location=this.value"
|
86
|
+
)
|
87
|
+
else
|
88
|
+
raw(language_links.join(options[:spacer]))
|
89
|
+
end
|
90
|
+
else
|
91
|
+
nil
|
92
|
+
end
|
93
|
+
end
|
94
94
|
|
95
|
-
|
96
|
-
def render_page_layout(options={})
|
97
|
-
default_options = {
|
98
|
-
:render_format => "html"
|
99
|
-
}
|
100
|
-
options = default_options.merge(options)
|
101
|
-
render :partial => "alchemy/page_layouts/#{@page.page_layout.downcase}.#{options[:render_format]}.erb"
|
102
|
-
rescue ActionView::MissingTemplate
|
103
|
-
warning("PageLayout: '#{@page.page_layout}' not found. Rendering standard page_layout.")
|
104
|
-
render :partial => "alchemy/page_layouts/standard"
|
105
|
-
end
|
95
|
+
alias_method :language_switches, :language_switcher
|
106
96
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
97
|
+
# Renders the layout from @page.page_layout. File resists in /app/views/page_layouts/_LAYOUT-NAME.html.erb
|
98
|
+
def render_page_layout(options={})
|
99
|
+
render :partial => "alchemy/page_layouts/#{@page.page_layout.downcase}"
|
100
|
+
rescue ActionView::MissingTemplate
|
101
|
+
warning("PageLayout: '#{@page.page_layout}' not found. Rendering standard page_layout.")
|
102
|
+
render :partial => "alchemy/page_layouts/standard"
|
103
|
+
end
|
114
104
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
# <ul class="navigation_level_1">
|
123
|
-
# <li class="first home"><a href="/home" class="active" title="Homepage" lang="en" data-page-id="1">Homepage</a></li>
|
124
|
-
# <li class="contact"><a href="/contact" title="Contact" lang="en" data-page-id="2">Contact</a></li>
|
125
|
-
# <li class="last imprint"><a href="/imprint" title="Imprint" lang="en" data-page-id="3">Imprint</a></li>
|
126
|
-
# </ul>
|
127
|
-
#
|
128
|
-
# As you can see: Everything you need.
|
129
|
-
#
|
130
|
-
# Not pleased with the way Alchemy produces the navigation structure?
|
131
|
-
# Then feel free to overwrite the partials (_renderer.html.erb and _link.html.erb) found in +views/navigation/+ or pass different partials via the options +:navigation_partial+ and +:navigation_link_partial+.
|
132
|
-
#
|
133
|
-
# === The options are:
|
134
|
-
#
|
135
|
-
# :submenu => false # Do you want a nested <ul> <li> structure for the deeper levels of your navigation, or not? Used to display the subnavigation within the mainnaviagtion. E.g. for dropdown menues.
|
136
|
-
# :all_sub_menues => false # Renders the whole page tree.
|
137
|
-
# :from_page => @root_page # Do you want to render a navigation from a different page then the current page? Then pass an Page instance or a Alchemy::PageLayout name as string.
|
138
|
-
# :spacer => "" # Yeah even a spacer for the entries can be passed. Simple string, or even a complex html structure. E.g: "<span class='spacer'>|</spacer>". Only your imagination is the limit. And the W3C of course :)
|
139
|
-
# :navigation_partial => "navigation/renderer" # Pass a different partial to be taken for the navigation rendering. CAUTION: Only for the advanced Alchemy webdevelopers. The standard partial takes care of nearly everything. But maybe you are an adventures one ^_^
|
140
|
-
# :navigation_link_partial => "navigation/link" # Alchemy places an <a> html link in <li> tags. The tag automatically has an active css class if necessary. So styling is everything. But maybe you don't want this. So feel free to make you own partial and pass the filename here.
|
141
|
-
# :show_nonactive => false # Commonly Alchemy only displays the submenu of the active page (if :submenu => true). If you want to display all child pages then pass true (together with :submenu => true of course). E.g. for the popular css-driven dropdownmenues these days.
|
142
|
-
# :show_title => true # For our beloved SEOs :). Appends a title attribute to all links and places the page.title content into it.
|
143
|
-
# :restricted_only => nil # Render only restricted pages.
|
144
|
-
# :show_title => true # Show a title on navigation links. Title attribute from page.
|
145
|
-
# :reverse => false # Reverse the navigation
|
146
|
-
# :reverse_children => false # Reverse the nested children
|
147
|
-
#
|
148
|
-
def render_navigation(options = {})
|
149
|
-
default_options = {
|
150
|
-
:submenu => false,
|
151
|
-
:all_sub_menues => false,
|
152
|
-
:from_page => @root_page || Page.language_root_for(session[:language_id]),
|
153
|
-
:spacer => "",
|
154
|
-
:navigation_partial => "alchemy/navigation/renderer",
|
155
|
-
:navigation_link_partial => "alchemy/navigation/link",
|
156
|
-
:show_nonactive => false,
|
157
|
-
:restricted_only => nil,
|
158
|
-
:show_title => true,
|
159
|
-
:reverse => false,
|
160
|
-
:reverse_children => false
|
161
|
-
}
|
162
|
-
options = default_options.merge(options)
|
163
|
-
if options[:from_page].is_a?(String)
|
164
|
-
page = Page.find_by_page_layout_and_language_id(options[:from_page], session[:language_id])
|
165
|
-
else
|
166
|
-
page = options[:from_page]
|
167
|
-
end
|
168
|
-
if page.blank?
|
169
|
-
warning("No Page found for #{options[:from_page]}")
|
170
|
-
return ""
|
171
|
-
end
|
172
|
-
conditions = {
|
173
|
-
:parent_id => page.id,
|
174
|
-
:restricted => options[:restricted_only] || false,
|
175
|
-
:visible => true
|
176
|
-
}
|
177
|
-
if options[:restricted_only].nil?
|
178
|
-
conditions.delete(:restricted)
|
179
|
-
end
|
180
|
-
pages = Page.where(conditions).order("lft ASC")
|
181
|
-
if options[:reverse]
|
182
|
-
pages.reverse!
|
183
|
-
end
|
184
|
-
render :partial => options[:navigation_partial], :locals => {:options => options, :pages => pages}
|
185
|
-
end
|
105
|
+
def sitename_from_header_page
|
106
|
+
header_page = Page.find_by_page_layout_and_layoutpage('layout_header', true)
|
107
|
+
return "" if header_page.nil?
|
108
|
+
page_title = header_page.elements.find_by_name('sitename')
|
109
|
+
return "" if page_title.nil?
|
110
|
+
page_title.ingredient('name')
|
111
|
+
end
|
186
112
|
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
113
|
+
# Renders the navigation.
|
114
|
+
#
|
115
|
+
# It produces a html <ul><li></li></ul> structure with all necessary classes and ids so you can produce every navigation the web uses today.
|
116
|
+
# I.E. dropdown-navigations, simple mainnavigations or even complex nested ones.
|
117
|
+
#
|
118
|
+
# === En detail:
|
119
|
+
#
|
120
|
+
# <ul class="navigation_level_1">
|
121
|
+
# <li class="first home"><a href="/home" class="active" title="Homepage" lang="en" data-page-id="1">Homepage</a></li>
|
122
|
+
# <li class="contact"><a href="/contact" title="Contact" lang="en" data-page-id="2">Contact</a></li>
|
123
|
+
# <li class="last imprint"><a href="/imprint" title="Imprint" lang="en" data-page-id="3">Imprint</a></li>
|
124
|
+
# </ul>
|
125
|
+
#
|
126
|
+
# As you can see: Everything you need.
|
127
|
+
#
|
128
|
+
# Not pleased with the way Alchemy produces the navigation structure?
|
129
|
+
# Then feel free to overwrite the partials (_renderer.html.erb and _link.html.erb) found in +views/navigation/+ or pass different partials via the options +:navigation_partial+ and +:navigation_link_partial+.
|
130
|
+
#
|
131
|
+
# === The options are:
|
132
|
+
#
|
133
|
+
# :submenu => false # Do you want a nested <ul> <li> structure for the deeper levels of your navigation, or not? Used to display the subnavigation within the mainnaviagtion. E.g. for dropdown menues.
|
134
|
+
# :all_sub_menues => false # Renders the whole page tree.
|
135
|
+
# :from_page => @root_page # Do you want to render a navigation from a different page then the current page? Then pass an Page instance or a Alchemy::PageLayout name as string.
|
136
|
+
# :spacer => "" # Yeah even a spacer for the entries can be passed. Simple string, or even a complex html structure. E.g: "<span class='spacer'>|</spacer>". Only your imagination is the limit. And the W3C of course :)
|
137
|
+
# :navigation_partial => "navigation/renderer" # Pass a different partial to be taken for the navigation rendering. CAUTION: Only for the advanced Alchemy webdevelopers. The standard partial takes care of nearly everything. But maybe you are an adventures one ^_^
|
138
|
+
# :navigation_link_partial => "navigation/link" # Alchemy places an <a> html link in <li> tags. The tag automatically has an active css class if necessary. So styling is everything. But maybe you don't want this. So feel free to make you own partial and pass the filename here.
|
139
|
+
# :show_nonactive => false # Commonly Alchemy only displays the submenu of the active page (if :submenu => true). If you want to display all child pages then pass true (together with :submenu => true of course). E.g. for the popular css-driven dropdownmenues these days.
|
140
|
+
# :show_title => true # For our beloved SEOs :). Appends a title attribute to all links and places the page.title content into it.
|
141
|
+
# :restricted_only => nil # Render only restricted pages.
|
142
|
+
# :show_title => true # Show a title on navigation links. Title attribute from page.
|
143
|
+
# :reverse => false # Reverse the navigation
|
144
|
+
# :reverse_children => false # Reverse the nested children
|
145
|
+
#
|
146
|
+
def render_navigation(options = {})
|
147
|
+
default_options = {
|
148
|
+
:submenu => false,
|
149
|
+
:all_sub_menues => false,
|
150
|
+
:from_page => @root_page || Page.language_root_for(session[:language_id]),
|
151
|
+
:spacer => "",
|
152
|
+
:navigation_partial => "alchemy/navigation/renderer",
|
153
|
+
:navigation_link_partial => "alchemy/navigation/link",
|
154
|
+
:show_nonactive => false,
|
155
|
+
:restricted_only => nil,
|
156
|
+
:show_title => true,
|
157
|
+
:reverse => false,
|
158
|
+
:reverse_children => false
|
159
|
+
}
|
160
|
+
options = default_options.merge(options)
|
161
|
+
if options[:from_page].is_a?(String)
|
162
|
+
page = Page.find_by_page_layout_and_language_id(options[:from_page], session[:language_id])
|
163
|
+
else
|
164
|
+
page = options[:from_page]
|
165
|
+
end
|
166
|
+
if page.blank?
|
167
|
+
warning("No Page found for #{options[:from_page]}")
|
168
|
+
return ""
|
169
|
+
end
|
170
|
+
conditions = {
|
171
|
+
:parent_id => page.id,
|
172
|
+
:restricted => options[:restricted_only] || false,
|
173
|
+
:visible => true
|
174
|
+
}
|
175
|
+
if options[:restricted_only].nil?
|
176
|
+
conditions.delete(:restricted)
|
177
|
+
end
|
178
|
+
pages = Page.where(conditions).order("lft ASC")
|
179
|
+
if options[:reverse]
|
180
|
+
pages.reverse!
|
181
|
+
end
|
182
|
+
render :partial => options[:navigation_partial], :locals => {:options => options, :pages => pages}
|
183
|
+
end
|
215
184
|
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
185
|
+
# Renders navigation the children and all siblings of the given page (standard is the current page).
|
186
|
+
#
|
187
|
+
# Use this helper if you want to render the subnavigation independent from the mainnavigation. I.E. to place it in a different area on your website.
|
188
|
+
#
|
189
|
+
# This helper passes all its options to the the render_navigation helper.
|
190
|
+
#
|
191
|
+
# === Options:
|
192
|
+
#
|
193
|
+
# :from_page => @page # The page to render the navigation from
|
194
|
+
# :submenu => true # Shows the nested children
|
195
|
+
# :level => 2 # Normally there is no need to change the level parameter, just in a few special cases
|
196
|
+
#
|
197
|
+
def render_subnavigation(options = {})
|
198
|
+
default_options = {
|
199
|
+
:from_page => @page,
|
200
|
+
:submenu => true,
|
201
|
+
:level => 2
|
202
|
+
}
|
203
|
+
options = default_options.merge(options)
|
204
|
+
if !options[:from_page].nil?
|
205
|
+
while options[:from_page].level > options[:level] do
|
206
|
+
options[:from_page] = options[:from_page].parent
|
207
|
+
end
|
208
|
+
render_navigation(options)
|
209
|
+
else
|
210
|
+
return nil
|
211
|
+
end
|
212
|
+
end
|
221
213
|
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
214
|
+
# Returns true if page is in the active branch
|
215
|
+
def page_active?(page)
|
216
|
+
@breadcrumb ||= breadcrumb(@page)
|
217
|
+
@breadcrumb.include?(page)
|
218
|
+
end
|
227
219
|
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
bc.join(options[:seperator]).html_safe
|
285
|
-
end
|
220
|
+
# Returns page links in a breadcrumb beginning from root to current page.
|
221
|
+
#
|
222
|
+
# === Options:
|
223
|
+
#
|
224
|
+
# :seperator => %(<span class="seperator">></span>) # Maybe you don't want this seperator. Pass another one.
|
225
|
+
# :page => @page # Pass a different Page instead of the default (@page).
|
226
|
+
# :without => nil # Pass Pageobject or array of Pages that must not be displayed.
|
227
|
+
# :public_only => false # Pass boolean for displaying published pages only.
|
228
|
+
# :visible_only => true # Pass boolean for displaying (in navigation) visible pages only.
|
229
|
+
# :restricted_only => false # Pass boolean for displaying restricted pages only.
|
230
|
+
# :reverse => false # Pass boolean for displaying reversed breadcrumb.
|
231
|
+
#
|
232
|
+
def render_breadcrumb(options={})
|
233
|
+
default_options = {
|
234
|
+
:seperator => %(<span class="seperator">></span>),
|
235
|
+
:page => @page,
|
236
|
+
:without => nil,
|
237
|
+
:public_only => true,
|
238
|
+
:visible_only => true,
|
239
|
+
:restricted_only => false,
|
240
|
+
:reverse => false
|
241
|
+
}
|
242
|
+
options = default_options.merge(options)
|
243
|
+
pages = breadcrumb(options[:page])
|
244
|
+
pages.delete(Page.root)
|
245
|
+
unless options[:without].nil?
|
246
|
+
unless options[:without].class == Array
|
247
|
+
pages.delete(options[:without])
|
248
|
+
else
|
249
|
+
pages = pages - options[:without]
|
250
|
+
end
|
251
|
+
end
|
252
|
+
if options[:visible_only]
|
253
|
+
pages.reject! { |p| !p.visible? }
|
254
|
+
end
|
255
|
+
if options[:public_only]
|
256
|
+
pages.reject! { |p| !p.public? }
|
257
|
+
end
|
258
|
+
if options[:restricted_only]
|
259
|
+
pages.reject! { |p| !p.restricted? }
|
260
|
+
end
|
261
|
+
if options[:reverse]
|
262
|
+
pages.reverse!
|
263
|
+
end
|
264
|
+
bc = []
|
265
|
+
pages.each do |page|
|
266
|
+
css_class = page.name == @page.name ? "active" : nil
|
267
|
+
if page == pages.last
|
268
|
+
css_class = css_class.blank? ? "last" : [css_class, "last"].join(" ")
|
269
|
+
elsif page == pages.first
|
270
|
+
css_class = css_class.blank? ? "first" : [css_class, "first"].join(" ")
|
271
|
+
end
|
272
|
+
bc << link_to(h(page.name), show_alchemy_page_path(page), :class => css_class, :title => page.title)
|
273
|
+
end
|
274
|
+
bc.join(options[:seperator]).html_safe
|
275
|
+
end
|
286
276
|
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
277
|
+
# Returns current page title
|
278
|
+
#
|
279
|
+
# === Options:
|
280
|
+
#
|
281
|
+
# :prefix => "" # Prefix
|
282
|
+
# :seperator => "" # Seperating prefix and title
|
283
|
+
#
|
284
|
+
# === Webdevelopers
|
285
|
+
#
|
286
|
+
# Please use the render_meta_data() helper instead. There all important meta information gets rendered in one helper.
|
287
|
+
# So you dont have to worry about anything.
|
288
|
+
#
|
289
|
+
def render_page_title(options={})
|
290
|
+
return "" if @page.title.blank?
|
291
|
+
default_options = {
|
292
|
+
:prefix => "",
|
293
|
+
:seperator => ""
|
294
|
+
}
|
295
|
+
default_options.update(options)
|
296
|
+
[default_options[:prefix], @page.title].join(default_options[:seperator])
|
297
|
+
end
|
308
298
|
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
299
|
+
# Returns a complete html <title> tag for the <head> part of the html document.
|
300
|
+
#
|
301
|
+
# === Webdevelopers:
|
302
|
+
#
|
303
|
+
# Please use the render_meta_data() helper. There all important meta information gets rendered in one helper.
|
304
|
+
# So you dont have to worry about anything.
|
305
|
+
#
|
306
|
+
def render_title_tag(options={})
|
307
|
+
default_options = {
|
308
|
+
:prefix => "",
|
309
|
+
:seperator => "|"
|
310
|
+
}
|
311
|
+
options = default_options.merge(options)
|
312
|
+
title = render_page_title(options)
|
313
|
+
%(<title>#{title}</title>).html_safe
|
314
|
+
end
|
325
315
|
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
316
|
+
# Renders a html <meta> tag for :name => "" and :content => ""
|
317
|
+
#
|
318
|
+
# === Webdevelopers:
|
319
|
+
#
|
320
|
+
# Please use the render_meta_data() helper. There all important meta information gets rendered in one helper.
|
321
|
+
# So you dont have to worry about anything.
|
322
|
+
#
|
323
|
+
def render_meta_tag(options={})
|
324
|
+
default_options = {
|
325
|
+
:name => "",
|
326
|
+
:default_language => "de",
|
327
|
+
:content => ""
|
328
|
+
}
|
329
|
+
options = default_options.merge(options)
|
330
|
+
lang = (@page.language.blank? ? options[:default_language] : @page.language.code)
|
331
|
+
%(<meta name="#{options[:name]}" content="#{options[:content]}" lang="#{lang}">).html_safe
|
332
|
+
end
|
343
333
|
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
334
|
+
# This helper takes care of all important meta tags for your page.
|
335
|
+
#
|
336
|
+
# The meta data is been taken from the @page.title, @page.meta_description, @page.meta_keywords, @page.updated_at and @page.language database entries managed by the Alchemy user via the Alchemy cockpit.
|
337
|
+
#
|
338
|
+
# Assume that the user has entered following data into the Alchemy cockpit of the Page "home" and that the user wants that the searchengine (aka. google) robot should index the page and should follow all links on this page:
|
339
|
+
#
|
340
|
+
# Title = Homepage
|
341
|
+
# Description = Your page description
|
342
|
+
# Keywords: cms, ruby, rubyonrails, rails, software, development, html, javascript, ajax
|
343
|
+
#
|
344
|
+
# Then placing +render_meta_data(:title_prefix => "company", :title_seperator => "-")+ into the <head> part of the +pages.html.erb+ layout produces:
|
345
|
+
#
|
346
|
+
# <meta charset="UTF-8">
|
347
|
+
# <title>Company - #{@page.title}</title>
|
348
|
+
# <meta name="description" content="Your page description">
|
349
|
+
# <meta name="keywords" content="cms, ruby, rubyonrails, rails, software, development, html, javascript, ajax">
|
350
|
+
# <meta name="generator" content="Alchemy VERSION">
|
351
|
+
# <meta name="date" content="Tue Dec 16 10:21:26 +0100 2008">
|
352
|
+
# <meta name="robots" content="index, follow">
|
353
|
+
#
|
354
|
+
def render_meta_data options={}
|
355
|
+
if @page.blank?
|
356
|
+
warning("No Page found!")
|
357
|
+
return nil
|
358
|
+
end
|
359
|
+
default_options = {
|
360
|
+
:title_prefix => "",
|
361
|
+
:title_seperator => "|",
|
362
|
+
:default_lang => "de"
|
363
|
+
}
|
364
|
+
options = default_options.merge(options)
|
365
|
+
#render meta description of the root page from language if the current meta description is empty
|
366
|
+
if @page.meta_description.blank?
|
367
|
+
description = Page.find_by_language_root_and_public_and_language_id(true, true, session[:language_id]).meta_description rescue ""
|
368
|
+
else
|
369
|
+
description = @page.meta_description
|
370
|
+
end
|
371
|
+
#render meta keywords of the root page from language if the current meta keywords is empty
|
372
|
+
if @page.meta_keywords.blank?
|
373
|
+
keywords = Page.find_by_language_root_and_public_and_language_id(true, true, session[:language_id]).meta_keywords rescue ""
|
374
|
+
else
|
375
|
+
keywords = @page.meta_keywords
|
376
|
+
end
|
377
|
+
robot = "#{@page.robot_index? ? "" : "no"}index, #{@page.robot_follow? ? "" : "no"}follow"
|
378
|
+
meta_string = %(
|
379
|
+
<meta charset="UTF-8">
|
380
|
+
#{render_title_tag(:prefix => options[:title_prefix], :seperator => options[:title_seperator])}
|
381
|
+
#{render_meta_tag(:name => "description", :content => description)}
|
382
|
+
#{render_meta_tag(:name => "keywords", :content => keywords)}
|
383
|
+
<meta name="created" content="#{@page.updated_at}">
|
384
|
+
<meta name="robots" content="#{robot}">
|
385
|
+
)
|
386
|
+
if @page.contains_feed?
|
387
|
+
meta_string += %(
|
388
|
+
<link rel="alternate" type="application/rss+xml" title="RSS" href="#{show_alchemy_page_url(@page, :protocol => 'feed', :format => :rss)}">
|
389
|
+
)
|
390
|
+
end
|
391
|
+
return meta_string.html_safe
|
392
|
+
end
|
403
393
|
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
394
|
+
# This helper returns a path for use inside a link_to helper.
|
395
|
+
#
|
396
|
+
# You may pass a page_layout or an urlname.
|
397
|
+
# Any additional options are passed to the url_helper, so you can add arguments to your url.
|
398
|
+
#
|
399
|
+
# Example:
|
400
|
+
#
|
401
|
+
# <%= link_to '» order now', page_path_for(:page_layout => 'orderform', :product_id => element.id) %>
|
402
|
+
#
|
403
|
+
def page_path_for(options={})
|
404
|
+
return warning("No page_layout, or urlname given. I got #{options.inspect} ") if options[:page_layout].blank? && options[:urlname].blank?
|
405
|
+
if options[:urlname].blank?
|
406
|
+
page = Page.find_by_page_layout(options[:page_layout])
|
407
|
+
if page.blank?
|
408
|
+
warning("No page found for #{options.inspect} ")
|
409
|
+
return
|
410
|
+
end
|
411
|
+
urlname = page.urlname
|
412
|
+
else
|
413
|
+
urlname = options[:urlname]
|
414
|
+
end
|
415
|
+
alchemy.show_page_path({:urlname => urlname, :lang => multi_language? ? session[:language_code] : nil}.merge(options.except(:page_layout, :urlname, :lang)))
|
416
|
+
end
|
427
417
|
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
418
|
+
# Renders the partial for the cell with the given name of the current page.
|
419
|
+
# Cell partials are located in +app/views/cells/+ of your project.
|
420
|
+
#
|
421
|
+
# === Options are:
|
422
|
+
#
|
423
|
+
# :from_page => Alchemy::Page # Alchemy::Page object from which the elements are rendered from.
|
424
|
+
# :locals => Hash # Hash of variables that will be available in the partial. Example: {:user => var1, :product => var2}
|
425
|
+
#
|
426
|
+
def render_cell(name, options={})
|
427
|
+
default_options = {
|
428
|
+
:from_page => @page,
|
429
|
+
:locals => {}
|
430
|
+
}
|
431
|
+
options = default_options.merge(options)
|
432
|
+
cell = options[:from_page].cells.find_by_name(name)
|
433
|
+
return "" if cell.blank?
|
434
|
+
render :partial => "alchemy/cells/#{name}", :locals => {:cell => cell}.merge(options[:locals])
|
435
|
+
end
|
446
436
|
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
437
|
+
# Returns true or false if no elements are in the cell found by name.
|
438
|
+
def cell_empty?(name)
|
439
|
+
cell = @page.cells.find_by_name(name)
|
440
|
+
return true if cell.blank?
|
441
|
+
cell.elements.blank?
|
442
|
+
end
|
453
443
|
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
444
|
+
# Include this in your layout file to have element selection magic in the page edit preview window.
|
445
|
+
def alchemy_preview_mode_code
|
446
|
+
javascript_include_tag("alchemy/preview") if @preview_mode
|
447
|
+
end
|
458
448
|
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
449
|
+
# Renders the search form
|
450
|
+
def render_search_form(options={})
|
451
|
+
default_options = {
|
452
|
+
:page => @search_result_page,
|
453
|
+
:html5 => false,
|
454
|
+
:button_value => t("search"),
|
455
|
+
:button_class => nil
|
456
|
+
}
|
457
|
+
options = default_options.merge(options)
|
458
|
+
if options[:page].class.name != "Alchemy::Page"
|
459
|
+
warning("No page found for #{options[:page].inspect}")
|
460
|
+
return
|
461
|
+
end
|
462
|
+
form_tag(show_alchemy_page_path(options[:page]), :method => :get, :class => 'fulltext_search') do
|
463
|
+
if options[:html5]
|
464
|
+
search_field_tag(:query, params[:query])
|
465
|
+
else
|
466
|
+
text_field_tag(:query, params[:query]) + submit_tag(options[:button_value], :class => options[:button_class], :name => nil)
|
467
|
+
end
|
468
|
+
end
|
469
|
+
end
|
480
470
|
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
471
|
+
# Renders the search-results
|
472
|
+
def render_search_results(options={})
|
473
|
+
default_options = {
|
474
|
+
:partial => 'alchemy/search/result',
|
475
|
+
:show_language => true,
|
476
|
+
:show_result_count => true,
|
477
|
+
:show_heading => true
|
478
|
+
}
|
479
|
+
options = default_options.merge(options)
|
480
|
+
return content_tag :h2, t('search_result_page.no_results'), :class => 'no_search_results' if @search_results.blank?
|
481
|
+
results = ""
|
482
|
+
@search_results.each do |essence|
|
483
|
+
result = essence.highlight(
|
484
|
+
"*#{params[:query]}*", {
|
485
|
+
:field => (essence.class.name == "Alchemy::EssenceRichtext" ? :stripped_body : :body)
|
486
|
+
})
|
487
|
+
results << render(:partial => options[:partial], :locals => {:result => result, :options => options, :page => essence.page}) if essence.page
|
488
|
+
end
|
489
|
+
output = ""
|
490
|
+
output << content_tag(:h1, t("search_result_page.result_heading", :query => h(params[:query])), :class => 'search_results_heading') if options[:show_heading]
|
491
|
+
output << content_tag(:h2, t("search_result_page.result_count", :count => @search_results.length), :class => 'search_result_count') if options[:show_result_count]
|
492
|
+
output << content_tag(:ul, results.html_safe, :class => 'search_result_list')
|
493
|
+
content_tag :div, :class => 'search_results' do
|
494
|
+
output.html_safe
|
495
|
+
end
|
496
|
+
end
|
507
497
|
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
end
|
498
|
+
# Returns the correct params-hash for passing to show_page_path
|
499
|
+
def show_page_path_params(page, optional_params={})
|
500
|
+
url_params = {:level1 => nil, :level2 => nil, :level3 => nil, :urlname => page.urlname}
|
501
|
+
url_params.update(optional_params)
|
502
|
+
url_params.update(params_for_nested_url(page)) if configuration(:url_nesting)
|
503
|
+
return multi_language? ? url_params.update(:lang => page.language_code) : url_params
|
504
|
+
end
|
516
505
|
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
506
|
+
#
|
507
|
+
def show_alchemy_page_path(page, optional_params={})
|
508
|
+
alchemy.show_page_path(show_page_path_params(page, optional_params))
|
509
|
+
end
|
521
510
|
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
511
|
+
#
|
512
|
+
def show_alchemy_page_url(page, optional_params={})
|
513
|
+
alchemy.show_page_url(show_page_path_params(page, optional_params))
|
514
|
+
end
|
526
515
|
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
516
|
+
# Renders a menubar for logged in users that are visiting a page.
|
517
|
+
def alchemy_menu_bar
|
518
|
+
return if @preview_mode
|
519
|
+
if permitted_to?(:edit, :alchemy_admin_pages)
|
520
|
+
menu_bar_string = ""
|
521
|
+
menu_bar_string += stylesheet_link_tag("alchemy/menubar")
|
522
|
+
menu_bar_string += javascript_include_tag('alchemy/menubar')
|
523
|
+
menu_bar_string += <<-STR
|
524
|
+
<script type="text/javascript">
|
525
|
+
try {
|
526
|
+
Alchemy.loadAlchemyMenuBar({
|
527
|
+
page_id: #{@page.id},
|
528
|
+
route: '#{Alchemy.mount_point}',
|
529
|
+
locale: '#{current_user.language}'
|
530
|
+
});
|
531
|
+
} catch(e) {
|
532
|
+
if(console){console.log(e)}
|
533
|
+
}
|
534
|
+
</script>
|
535
|
+
STR
|
536
|
+
menu_bar_string.html_safe
|
537
|
+
else
|
538
|
+
nil
|
539
|
+
end
|
540
|
+
end
|
552
541
|
|
553
|
-
|
542
|
+
end
|
554
543
|
end
|