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