alchemy_cms 4.3.2 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +92 -0
  3. data/.gitignore +1 -0
  4. data/CHANGELOG.md +59 -2
  5. data/Gemfile +6 -5
  6. data/README.md +7 -6
  7. data/alchemy_cms.gemspec +4 -2
  8. data/app/assets/config/alchemy_manifest.js +15 -0
  9. data/app/assets/javascripts/alchemy/admin.js +1 -0
  10. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +1 -13
  11. data/app/assets/javascripts/alchemy/alchemy.i18n.js.coffee +1 -1
  12. data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +84 -87
  13. data/app/assets/javascripts/alchemy/alchemy.preview.js.coffee +0 -4
  14. data/app/assets/javascripts/alchemy/alchemy.sitemap.js.coffee +1 -1
  15. data/app/assets/javascripts/alchemy/alchemy.tinymce.js.coffee +2 -2
  16. data/app/assets/javascripts/alchemy/page_select.js +41 -0
  17. data/app/assets/javascripts/alchemy/templates/index.js +1 -0
  18. data/app/assets/javascripts/alchemy/templates/page.hbs +9 -0
  19. data/app/assets/stylesheets/alchemy/_mixins.scss +11 -1
  20. data/app/assets/stylesheets/alchemy/admin.scss +3 -0
  21. data/app/assets/stylesheets/alchemy/elements.scss +1 -0
  22. data/app/assets/stylesheets/alchemy/forms.scss +6 -5
  23. data/app/assets/stylesheets/alchemy/labels.scss +6 -0
  24. data/app/assets/stylesheets/alchemy/nodes.scss +154 -0
  25. data/app/assets/stylesheets/alchemy/page-select.scss +30 -0
  26. data/app/assets/stylesheets/alchemy/selects.scss +39 -22
  27. data/app/assets/stylesheets/alchemy/sitemap.scss +0 -33
  28. data/app/assets/stylesheets/alchemy/tags.scss +0 -3
  29. data/app/controllers/alchemy/admin/base_controller.rb +1 -0
  30. data/app/controllers/alchemy/admin/elements_controller.rb +24 -11
  31. data/app/controllers/alchemy/admin/languages_controller.rb +5 -0
  32. data/app/controllers/alchemy/admin/nodes_controller.rb +43 -0
  33. data/app/controllers/alchemy/admin/pages_controller.rb +1 -21
  34. data/app/controllers/alchemy/admin/resources_controller.rb +1 -1
  35. data/app/controllers/alchemy/admin/tags_controller.rb +1 -2
  36. data/app/controllers/alchemy/api/contents_controller.rb +17 -2
  37. data/app/controllers/alchemy/api/elements_controller.rb +26 -1
  38. data/app/controllers/alchemy/api/pages_controller.rb +78 -7
  39. data/app/controllers/alchemy/messages_controller.rb +23 -8
  40. data/app/helpers/alchemy/admin/contents_helper.rb +1 -1
  41. data/app/helpers/alchemy/admin/elements_helper.rb +6 -0
  42. data/app/helpers/alchemy/admin/essences_helper.rb +23 -4
  43. data/app/helpers/alchemy/elements_block_helper.rb +11 -3
  44. data/app/helpers/alchemy/elements_helper.rb +3 -3
  45. data/app/helpers/alchemy/essences_helper.rb +36 -9
  46. data/app/helpers/alchemy/pages_helper.rb +29 -0
  47. data/app/models/alchemy/content.rb +1 -1
  48. data/app/models/alchemy/element.rb +20 -8
  49. data/app/models/alchemy/element/element_contents.rb +6 -4
  50. data/app/models/alchemy/element/presenters.rb +2 -2
  51. data/app/models/alchemy/essence_page.rb +29 -0
  52. data/app/models/alchemy/essence_picture.rb +8 -3
  53. data/app/models/alchemy/language.rb +10 -2
  54. data/app/models/alchemy/node.rb +48 -0
  55. data/app/models/alchemy/page.rb +74 -3
  56. data/app/models/alchemy/page/page_elements.rb +12 -4
  57. data/app/models/alchemy/page/page_natures.rb +6 -0
  58. data/app/models/alchemy/page/page_scopes.rb +1 -1
  59. data/app/models/alchemy/picture.rb +5 -1
  60. data/app/models/concerns/alchemy/content_touching.rb +1 -1
  61. data/app/serializers/alchemy/element_serializer.rb +7 -1
  62. data/app/serializers/alchemy/page_serializer.rb +0 -4
  63. data/app/views/alchemy/_menubar.html.erb +1 -1
  64. data/app/views/alchemy/admin/elements/_element.html.erb +18 -2
  65. data/app/views/alchemy/admin/leave.html.erb +1 -1
  66. data/app/views/alchemy/admin/nodes/_form.html.erb +39 -0
  67. data/app/views/alchemy/admin/nodes/_node.html.erb +87 -0
  68. data/app/views/alchemy/admin/nodes/edit.html.erb +1 -0
  69. data/app/views/alchemy/admin/nodes/index.html.erb +58 -0
  70. data/app/views/alchemy/admin/nodes/new.html.erb +1 -0
  71. data/app/views/alchemy/admin/pages/_anchor_link.html.erb +22 -0
  72. data/app/views/alchemy/admin/pages/_form.html.erb +1 -1
  73. data/app/views/alchemy/admin/pages/_internal_link.html.erb +7 -11
  74. data/app/views/alchemy/admin/pages/_menu_fields.html.erb +33 -0
  75. data/app/views/alchemy/admin/pages/_sitemap.html.erb +0 -7
  76. data/app/views/alchemy/admin/pages/link.html.erb +4 -0
  77. data/app/views/alchemy/admin/partials/_language_tree_select.html.erb +7 -3
  78. data/app/views/alchemy/admin/partials/_routes.html.erb +3 -3
  79. data/app/views/alchemy/essences/_essence_boolean_view.html.erb +1 -0
  80. data/app/views/alchemy/essences/_essence_date_view.html.erb +1 -0
  81. data/app/views/alchemy/essences/_essence_file_view.html.erb +1 -0
  82. data/app/views/alchemy/essences/_essence_html_view.html.erb +1 -0
  83. data/app/views/alchemy/essences/_essence_link_view.html.erb +1 -0
  84. data/app/views/alchemy/essences/_essence_page_editor.html.erb +23 -0
  85. data/app/views/alchemy/essences/_essence_page_view.html.erb +5 -0
  86. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +2 -0
  87. data/app/views/alchemy/essences/_essence_picture_view.html.erb +1 -0
  88. data/app/views/alchemy/essences/_essence_richtext_view.html.erb +1 -0
  89. data/app/views/alchemy/essences/_essence_select_editor.html.erb +1 -0
  90. data/app/views/alchemy/essences/_essence_select_view.html.erb +1 -0
  91. data/app/views/alchemy/essences/_essence_text_editor.html.erb +3 -0
  92. data/app/views/alchemy/essences/_essence_text_view.html.erb +1 -0
  93. data/config/alchemy/modules.yml +13 -4
  94. data/config/initializers/assets.rb +1 -13
  95. data/config/locales/alchemy.en.yml +27 -9
  96. data/config/routes.rb +11 -3
  97. data/db/migrate/20191016073858_create_alchemy_essence_pages.rb +8 -0
  98. data/db/migrate/20191029212236_create_alchemy_nodes.rb +24 -0
  99. data/lib/alchemy/admin/locale.rb +1 -1
  100. data/lib/alchemy/auth_accessors.rb +8 -2
  101. data/lib/alchemy/cache_digests/template_tracker.rb +8 -5
  102. data/lib/alchemy/elements_finder.rb +17 -14
  103. data/lib/alchemy/engine.rb +4 -0
  104. data/lib/alchemy/essence.rb +40 -2
  105. data/lib/alchemy/permissions.rb +2 -0
  106. data/lib/alchemy/tasks/tidy.rb +1 -1
  107. data/lib/alchemy/test_support/essence_shared_examples.rb +25 -8
  108. data/lib/alchemy/test_support/factories/essence_page_factory.rb +10 -0
  109. data/lib/alchemy/test_support/factories/essence_picture_factory.rb +5 -0
  110. data/lib/alchemy/test_support/factories/node_factory.rb +21 -0
  111. data/lib/alchemy/version.rb +1 -1
  112. data/lib/rails/generators/alchemy/elements/elements_generator.rb +0 -1
  113. data/lib/rails/generators/alchemy/elements/templates/view.html.erb +3 -3
  114. data/lib/rails/generators/alchemy/elements/templates/view.html.haml +3 -3
  115. data/lib/rails/generators/alchemy/elements/templates/view.html.slim +3 -3
  116. data/lib/rails/generators/alchemy/install/files/{_article_view.html.erb → _article.html.erb} +2 -2
  117. data/lib/rails/generators/alchemy/install/files/application.html.erb +13 -10
  118. data/lib/rails/generators/alchemy/install/install_generator.rb +2 -11
  119. data/lib/rails/generators/alchemy/menus/menus_generator.rb +24 -0
  120. data/lib/rails/generators/alchemy/menus/templates/node.html.erb +19 -0
  121. data/lib/rails/generators/alchemy/menus/templates/node.html.haml +16 -0
  122. data/lib/rails/generators/alchemy/menus/templates/node.html.slim +16 -0
  123. data/lib/rails/generators/alchemy/menus/templates/wrapper.html.erb +8 -0
  124. data/lib/rails/generators/alchemy/menus/templates/wrapper.html.haml +6 -0
  125. data/lib/rails/generators/alchemy/menus/templates/wrapper.html.slim +6 -0
  126. data/lib/rails/generators/alchemy/views/views_generator.rb +1 -1
  127. data/lib/tasks/alchemy/convert.rake +60 -0
  128. metadata +79 -20
  129. data/.rspec +0 -1
  130. data/.travis.yml +0 -28
  131. data/app/models/alchemy/page/page_users.rb +0 -60
  132. data/app/views/alchemy/admin/elements/list.html.erb +0 -16
  133. data/app/views/alchemy/admin/pages/_page_for_links.html.erb +0 -53
  134. data/lib/rails/generators/alchemy/elements/templates/editor.html.erb +0 -9
  135. data/lib/rails/generators/alchemy/elements/templates/editor.html.haml +0 -8
  136. data/lib/rails/generators/alchemy/elements/templates/editor.html.slim +0 -8
  137. data/lib/rails/generators/alchemy/install/files/_article_editor.html.erb +0 -5
  138. data/lib/rails/generators/alchemy/install/files/alchemy.de.yml +0 -31
  139. data/lib/rails/generators/alchemy/install/files/alchemy.es.yml +0 -31
@@ -47,30 +47,6 @@
47
47
  text-overflow: ellipsis;
48
48
  }
49
49
 
50
- #page_selector_container {
51
- height: 230px;
52
- background-color: $light-gray;
53
- margin-bottom: 4px;
54
- border-width: $form-field-border-width;
55
- border-style: $form-field-border-style;
56
- border-color: $form-field-border-color;
57
- overflow: auto;
58
- padding: 4px 0 0 4px;
59
- border-radius: $default-border-radius;
60
-
61
- .sitemap_pagename_link:hover {
62
- text-decoration: none;
63
-
64
- &:after {
65
- display: none;
66
- }
67
- }
68
-
69
- .sitemap_right_tools {
70
- width: 24px;
71
- }
72
- }
73
-
74
50
  .sitemap_line_spacer {
75
51
  float: left;
76
52
  width: 20px;
@@ -177,11 +153,6 @@
177
153
  li {
178
154
  padding-left: 0;
179
155
 
180
- .selected_page {
181
- background-color: $linked-color;
182
- color: $dark-gray;
183
- }
184
-
185
156
  li {
186
157
  padding-left: $sitemap-line-height;
187
158
  padding-right: 0;
@@ -245,7 +216,3 @@
245
216
  .page_icon { cursor: default }
246
217
  }
247
218
  }
248
-
249
- .elements_from_page_selector {
250
- width: 100%;
251
- }
@@ -71,9 +71,6 @@
71
71
  $margin: $default-margin/2 0,
72
72
  $padding: $default-padding 2*$default-padding $default-padding
73
73
  );
74
- display: inline-block;
75
- vertical-align: middle;
76
- color: $text-color;
77
74
  pointer-events: none;
78
75
  font-size: $small-font-size;
79
76
  }
@@ -138,6 +138,7 @@ module Alchemy
138
138
  (params[:options] || ActionController::Parameters.new).permit!
139
139
  end
140
140
  end
141
+ deprecate :options_from_params, deprecator: Alchemy::Deprecation
141
142
 
142
143
  # This method decides if we want to raise an exception or not.
143
144
  #
@@ -8,16 +8,8 @@ module Alchemy
8
8
 
9
9
  def index
10
10
  @page = Page.find(params[:page_id])
11
- @elements = @page.all_elements.not_nested.unfixed.not_trashed
12
- @fixed_elements = @page.all_elements.fixed.not_trashed
13
- end
14
-
15
- def list
16
- @page_id = params[:page_id]
17
- if @page_id.blank? && !params[:page_urlname].blank?
18
- @page_id = Language.current.pages.find_by(urlname: params[:page_urlname]).id
19
- end
20
- @elements = Element.published.where(page_id: @page_id)
11
+ @elements = @page.all_elements.not_nested.unfixed.not_trashed.includes(*element_includes)
12
+ @fixed_elements = @page.all_elements.fixed.not_trashed.includes(*element_includes)
21
13
  end
22
14
 
23
15
  def new
@@ -61,7 +53,7 @@ module Alchemy
61
53
  def update
62
54
  if @element.update_contents(contents_params)
63
55
  @page = @element.page
64
- @element_validated = @element.update_attributes!(element_params)
56
+ @element_validated = @element.update(element_params)
65
57
  else
66
58
  @element_validated = false
67
59
  @notice = Alchemy.t('Validation failed')
@@ -104,6 +96,27 @@ module Alchemy
104
96
 
105
97
  private
106
98
 
99
+ def element_includes
100
+ [
101
+ {
102
+ contents: {
103
+ essence: :ingredient_association
104
+ }
105
+ },
106
+ :tags,
107
+ {
108
+ all_nested_elements: [
109
+ {
110
+ contents: {
111
+ essence: :ingredient_association
112
+ }
113
+ },
114
+ :tags
115
+ ]
116
+ }
117
+ ]
118
+ end
119
+
107
120
  def load_element
108
121
  @element = Element.find(params[:id])
109
122
  end
@@ -13,6 +13,11 @@ module Alchemy
13
13
  page_layout: Config.get(:default_language)['page_layout']
14
14
  )
15
15
  end
16
+
17
+ def switch
18
+ set_alchemy_language(params[:language_id])
19
+ do_redirect_to request.referer || alchemy.admin_dashboard_path
20
+ end
16
21
  end
17
22
  end
18
23
  end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Alchemy
4
+ module Admin
5
+ class NodesController < Admin::ResourcesController
6
+ def index
7
+ @root_nodes = Node.language_root_nodes
8
+ end
9
+
10
+ def new
11
+ @node = Node.new(
12
+ parent_id: params[:parent_id],
13
+ language: Language.current
14
+ )
15
+ end
16
+
17
+ def toggle
18
+ node = Node.find(params[:id])
19
+ node.update(folded: !node.folded)
20
+ if node.folded?
21
+ head :ok
22
+ else
23
+ render partial: 'node', collection: node.children.includes(:page, :children)
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def resource_params
30
+ params.require(:node).permit(
31
+ :parent_id,
32
+ :language_id,
33
+ :page_id,
34
+ :name,
35
+ :url,
36
+ :title,
37
+ :nofollow,
38
+ :external
39
+ )
40
+ end
41
+ end
42
+ end
43
+ end
@@ -26,7 +26,6 @@ module Alchemy
26
26
  def index
27
27
  authorize! :index, :alchemy_admin_pages
28
28
 
29
- @languages = Language.on_current_site
30
29
  if !@page_root
31
30
  @language = Language.current
32
31
  @languages_with_page_tree = Language.on_current_site.with_root_page
@@ -104,7 +103,7 @@ module Alchemy
104
103
  def update
105
104
  # stores old page_layout value, because unfurtunally rails @page.changes does not work here.
106
105
  @old_page_layout = @page.page_layout
107
- if @page.update_attributes(page_params)
106
+ if @page.update(page_params)
108
107
  @notice = Alchemy.t("Page saved", name: @page.name)
109
108
  @while_page_edit = request.referer.include?('edit')
110
109
 
@@ -140,12 +139,6 @@ module Alchemy
140
139
  end
141
140
 
142
141
  def link
143
- if configuration(:show_real_root)
144
- @page_root = Page.root
145
- else
146
- set_root_page
147
- end
148
- @content_id = params[:content_id]
149
142
  @attachments = Attachment.all.collect { |f|
150
143
  [f.name, download_attachment_path(id: f.id, name: f.urlname)]
151
144
  }
@@ -219,11 +212,6 @@ module Alchemy
219
212
  do_redirect_to admin_pages_path
220
213
  end
221
214
 
222
- def switch_language
223
- set_alchemy_language(params[:language_id])
224
- do_redirect_to redirect_path_for_switch_language
225
- end
226
-
227
215
  def flush
228
216
  Language.current.pages.flushables.update_all(published_at: Time.current)
229
217
  # We need to ensure, that also all layoutpages get the +published_at+ timestamp set,
@@ -341,14 +329,6 @@ module Alchemy
341
329
  end
342
330
  end
343
331
 
344
- def redirect_path_for_switch_language
345
- if request.referer && request.referer.include?('admin/layoutpages')
346
- admin_layoutpages_path
347
- else
348
- admin_pages_path
349
- end
350
- end
351
-
352
332
  def redirect_path_after_create_page
353
333
  if @page.redirects_to_external? || !@page.editable_by?(current_alchemy_user)
354
334
  admin_pages_path
@@ -68,7 +68,7 @@ module Alchemy
68
68
  end
69
69
 
70
70
  def update
71
- resource_instance_variable.update_attributes(resource_params)
71
+ resource_instance_variable.update(resource_params)
72
72
  render_errors_or_redirect(
73
73
  resource_instance_variable,
74
74
  resources_path(resource_instance_variable.class, search_filter_params),
@@ -34,8 +34,7 @@ module Alchemy
34
34
  operation_text = Alchemy.t('Replaced Tag') % {old_tag: @tag.name, new_tag: @new_tag.name}
35
35
  @tag.destroy
36
36
  else
37
- @tag.update_attributes(tag_params)
38
- @tag.save
37
+ @tag.update(tag_params)
39
38
  operation_text = Alchemy.t(:successfully_updated_tag)
40
39
  end
41
40
  render_errors_or_redirect @tag, admin_tags_path, operation_text
@@ -16,6 +16,8 @@ module Alchemy
16
16
  if params[:element_id].present?
17
17
  @contents = @contents.where(element_id: params[:element_id])
18
18
  end
19
+ @contents = @contents.includes(*content_includes)
20
+
19
21
  render json: @contents, adapter: :json, root: 'contents'
20
22
  end
21
23
 
@@ -30,12 +32,25 @@ module Alchemy
30
32
  #
31
33
  def show
32
34
  if params[:id]
33
- @content = Content.find(params[:id])
35
+ @content = Content.where(id: params[:id]).includes(:essence).first
34
36
  elsif params[:element_id] && params[:name]
35
- @content = Content.find_by!(element_id: params[:element_id], name: params[:name])
37
+ @content = Content.where(
38
+ element_id: params[:element_id],
39
+ name: params[:name]
40
+ ).includes(*content_includes).first || raise(ActiveRecord::RecordNotFound)
36
41
  end
37
42
  authorize! :show, @content
38
43
  respond_with @content
39
44
  end
45
+
46
+ private
47
+
48
+ def content_includes
49
+ [
50
+ {
51
+ essence: :ingredient_association
52
+ }
53
+ ]
54
+ end
40
55
  end
41
56
  end
@@ -20,15 +20,40 @@ module Alchemy
20
20
  if params[:named].present?
21
21
  @elements = @elements.named(params[:named])
22
22
  end
23
+ @elements = @elements.includes(*element_includes)
24
+
23
25
  render json: @elements, adapter: :json, root: 'elements'
24
26
  end
25
27
 
26
28
  # Returns a json object for element
27
29
  #
28
30
  def show
29
- @element = Element.find(params[:id])
31
+ @element = Element.where(id: params[:id]).includes(*element_includes).first
30
32
  authorize! :show, @element
31
33
  respond_with @element
32
34
  end
35
+
36
+ private
37
+
38
+ def element_includes
39
+ [
40
+ {
41
+ nested_elements: [
42
+ {
43
+ contents: {
44
+ essence: :ingredient_association
45
+ }
46
+ },
47
+ :tags
48
+ ]
49
+ },
50
+ {
51
+ contents: {
52
+ essence: :ingredient_association
53
+ }
54
+ },
55
+ :tags
56
+ ]
57
+ end
33
58
  end
34
59
  end
@@ -13,10 +13,24 @@ module Alchemy
13
13
  else
14
14
  @pages = Page.accessible_by(current_ability, :index)
15
15
  end
16
+ @pages = @pages.includes(*page_includes)
16
17
  if params[:page_layout].present?
18
+ Alchemy::Deprecation.warn <<~WARN
19
+ Passing page_layout parameter to Alchemy::Api::PagesController#index is deprecated.
20
+ Please pass a Ransack search query instead:
21
+ q: {
22
+ page_layout_eq: '#{params[:page_layout]}'
23
+ }
24
+ WARN
17
25
  @pages = @pages.where(page_layout: params[:page_layout])
18
26
  end
19
- render json: @pages, adapter: :json, root: 'pages'
27
+ @pages = @pages.ransack(params[:q]).result
28
+
29
+ if params[:page]
30
+ @pages = @pages.page(params[:page]).per(params[:per_page])
31
+ end
32
+
33
+ render json: @pages, adapter: :json, root: 'pages', meta: meta_data
20
34
  end
21
35
 
22
36
  # Returns all pages as nested json object for tree views
@@ -47,12 +61,69 @@ module Alchemy
47
61
  private
48
62
 
49
63
  def load_page
50
- @page = Page.find_by(id: params[:id]) ||
51
- Language.current.pages.find_by(
52
- urlname: params[:urlname],
53
- language_code: params[:locale] || Language.current.code
54
- ) ||
55
- raise(ActiveRecord::RecordNotFound)
64
+ @page = load_page_by_id || load_page_by_urlname || raise(ActiveRecord::RecordNotFound)
65
+ end
66
+
67
+ def load_page_by_id
68
+ # The route param is called :urlname although it might be an integer
69
+ Page.where(id: params[:urlname]).includes(page_includes).first
70
+ end
71
+
72
+ def load_page_by_urlname
73
+ Language.current.pages.where(
74
+ urlname: params[:urlname],
75
+ language_code: params[:locale] || Language.current.code
76
+ ).includes(page_includes).first
77
+ end
78
+
79
+ def meta_data
80
+ {
81
+ total_count: total_count_value,
82
+ per_page: per_page_value,
83
+ page: page_value
84
+ }
85
+ end
86
+
87
+ def total_count_value
88
+ params[:page] ? @pages.total_count : @pages.size
89
+ end
90
+
91
+ def per_page_value
92
+ if params[:page]
93
+ (params[:per_page] || Kaminari.config.default_per_page).to_i
94
+ else
95
+ @pages.size
96
+ end
97
+ end
98
+
99
+ def page_value
100
+ params[:page] ? params[:page].to_i : nil
101
+ end
102
+
103
+ def page_includes
104
+ [
105
+ :tags,
106
+ {
107
+ elements: [
108
+ {
109
+ nested_elements: [
110
+ {
111
+ contents: {
112
+ essence: :ingredient_association
113
+ }
114
+ },
115
+ :tags
116
+ ]
117
+ },
118
+ {
119
+ contents: {
120
+ essence: :ingredient_association
121
+ }
122
+ },
123
+ :tags
124
+ ]
125
+ }
126
+ ]
56
127
  end
57
128
  end
58
129
  end
@@ -19,7 +19,7 @@ module Alchemy
19
19
  # - name: mail_from
20
20
  # type: EssenceText
21
21
  # - name: success_page
22
- # type: EssenceSelect
22
+ # type: EssencePage
23
23
  #
24
24
  # The fields +mail_to+, +mail_from+, +subject+ and +success_page+ are recommended.
25
25
  # The +Alchemy::MessagesController+ uses them to send your mails. So your customer has full controll of these values inside his contactform element.
@@ -32,14 +32,16 @@ module Alchemy
32
32
  # elements: [pageheading, heading, contactform]
33
33
  # autogenerate: [contactform]
34
34
  #
35
- # Disabling the page caching is stronlgy recommended!
35
+ # Disabling the page caching is strongly recommended!
36
36
  #
37
37
  # The editor view for your element should have this layout:
38
38
  #
39
- # <%= render_essence_editor_by_name(element, 'mail_from') %>
40
- # <%= render_essence_editor_by_name(element, 'mail_to') %>
41
- # <%= render_essence_editor_by_name(element, 'subject') %>
42
- # <%= page_selector(element, 'success_page', page_attribute: :urlname) %>
39
+ # <%= element_editor_for(element) do |el| %>
40
+ # <%= el.edit :mail_from %>
41
+ # <%= el.edit :mail_to %>
42
+ # <%= el.edit :subject %>
43
+ # <%= el.edit :success_page %>
44
+ # <% end %>
43
45
  #
44
46
  # Please have a look at the +alchemy/config/config.yml+ file for further Message settings.
45
47
  #
@@ -97,8 +99,8 @@ module Alchemy
97
99
 
98
100
  def redirect_to_success_page
99
101
  flash[:notice] = Alchemy.t(:success, scope: 'contactform.messages')
100
- if @element.ingredient(:success_page)
101
- urlname = @element.ingredient(:success_page)
102
+ if success_page
103
+ urlname = success_page_urlname
102
104
  elsif mailer_config['forward_to_page'] && mailer_config['mail_success_page']
103
105
  urlname = Page.find_by(urlname: mailer_config['mail_success_page']).urlname
104
106
  else
@@ -110,6 +112,19 @@ module Alchemy
110
112
  )
111
113
  end
112
114
 
115
+ def success_page
116
+ @_success_page ||= @element.ingredient(:success_page)
117
+ end
118
+
119
+ def success_page_urlname
120
+ case success_page
121
+ when Alchemy::Page
122
+ success_page.urlname
123
+ when String
124
+ success_page
125
+ end
126
+ end
127
+
113
128
  def get_page
114
129
  @page = Language.current.pages.find_by(page_layout: mailer_config['page_layout_name'])
115
130
  if @page.blank?