Module: Alchemy::ElementsHelper
- Includes:
- ElementsBlockHelper, UrlHelper
- Included in:
- PagesHelper
- Defined in:
- app/helpers/alchemy/elements_helper.rb
Overview
This helpers are useful to render elements from pages.
The most important helper for frontend developers is the #render_elements helper.
Instance Method Summary collapse
-
#element_dom_id(element) ⇒ Object
Returns a string for the id attribute of a html element for the given element.
-
#element_preview_code(element) ⇒ Object
Renders the HTML tag attributes required for preview mode.
-
#element_preview_code_attributes(element) ⇒ Object
Returns a hash containing the HTML tag attributes required for preview mode.
-
#element_tags(element, options = {}) ⇒ String
Returns the element’s tags information as a string.
-
#element_tags_attributes(element, options = {}) ⇒ Hash
Returns the element’s tags information as an attribute hash.
-
#render_element(element, options = {}, counter = 1) ⇒ Object
This helper renders a Element view partial.
-
#render_elements(options = {}) ⇒ Object
Renders elements from given page.
Methods included from ElementsBlockHelper
Methods included from UrlHelper
#download_alchemy_attachment_path, #download_alchemy_attachment_url, #full_url_for_element, #show_alchemy_page_path, #show_alchemy_page_url, #show_page_path_params
Instance Method Details
#element_dom_id(element) ⇒ Object
Returns a string for the id attribute of a html element for the given element
174 175 176 177 178 |
# File 'app/helpers/alchemy/elements_helper.rb', line 174 def element_dom_id(element) return "" if element.nil? "#{element.name}_#{element.id}".html_safe end |
#element_preview_code(element) ⇒ Object
Renders the HTML tag attributes required for preview mode.
181 182 183 |
# File 'app/helpers/alchemy/elements_helper.rb', line 181 def element_preview_code(element) tag_builder.(element_preview_code_attributes(element)) end |
#element_preview_code_attributes(element) ⇒ Object
Returns a hash containing the HTML tag attributes required for preview mode.
186 187 188 189 190 |
# File 'app/helpers/alchemy/elements_helper.rb', line 186 def element_preview_code_attributes(element) return {} unless element.present? && @preview_mode && element.page == @page { "data-alchemy-element" => element.id } end |
#element_tags(element, options = {}) ⇒ String
Returns the element’s tags information as a string. Parameters and options are equivalent to #element_tags_attributes.
200 201 202 |
# File 'app/helpers/alchemy/elements_helper.rb', line 200 def (element, = {}) tag_builder.((element, )) end |
#element_tags_attributes(element, options = {}) ⇒ Hash
Returns the element’s tags information as an attribute hash.
215 216 217 218 219 220 221 222 223 |
# File 'app/helpers/alchemy/elements_helper.rb', line 215 def (element, = {}) = { formatter: lambda { || .join(" ") }, }.merge() return {} if !element.taggable? || element.tag_list.blank? { "data-element-tags" => [:formatter].call(element.tag_list) } end |
#render_element(element, options = {}, counter = 1) ⇒ Object
If the view partial is not found alchemy/elements/_view_not_found.html.erb
gets rendered.
This helper renders a Alchemy::Element view partial.
A element view partial is the html snippet presented to the website visitor.
The partial is located in app/views/alchemy/elements
.
View partial naming
The partial has to be named after the name of the element as defined in the elements.yml
file.
Example
Given a headline element
# elements.yml
- name: headline
contents:
- name: text
type: EssenceText
Then your element view partial has to be named like:
app/views/alchemy/elements/_headline.html.{erb|haml|slim}
Element partials generator
You can use this handy generator to let Alchemy generate the partials for you:
$ rails generate alchemy:elements --skip
Usage
<%= render_element(Alchemy::Element.available.named(:headline).first) %>
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 |
# File 'app/helpers/alchemy/elements_helper.rb', line 151 def render_element(element, = {}, counter = 1) if element.nil? warning("Element is nil") render "alchemy/elements/view_not_found", {name: "nil"} return end element.store_page(@page) render element, { element: element, counter: counter, options: , }.merge(.delete(:locals) || {}) rescue ActionView::MissingTemplate => e warning(%( Element view partial not found for #{element.name}.\n #{e} )) render "alchemy/elements/view_not_found", name: element.name end |
#render_elements(options = {}) ⇒ Object
Renders elements from given page
Examples:
Render only certain elements:
<header>
<%= render_elements only: ['header', 'claim'] %>
</header>
<section id="content">
<%= render_elements except: ['header', 'claim'] %>
</section>
Render elements from global page:
<footer>
<%= render_elements from_page: 'footer' %>
</footer>
Fallback to elements from global page:
You can use the fallback option as an override for elements that are stored on another page. So you can take elements from a global page and only if the user adds an element on current page the local one gets rendered.
-
You have to pass the the name of the element the fallback is for as
for
key. -
You have to pass a
page_layout
name or Page from where the fallback elements is taken from asfrom
key. -
You can pass the name of element to fallback with as
with
key. This is optional (the element name from thefor
key is taken as default).
<%= render_elements(fallback: {
for: 'contact_teaser',
from: 'sidebar',
with: 'contact_teaser'
}) %>
Custom elements finder:
Having a custom element finder class:
class MyCustomNewsArchive
def elements(page:)
news_page.elements.named('news').order(created_at: :desc)
end
private
def news_page
Alchemy::Page.where(page_layout: 'news-archive')
end
end
In your view:
<div class="news-archive">
<%= render_elements finder: MyCustomNewsArchive.new %>
</div>
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'app/helpers/alchemy/elements_helper.rb', line 91 def render_elements( = {}) = { from_page: @page, render_format: "html", }.update() finder = [:finder] || Alchemy::ElementsFinder.new() elements = finder.elements(page: [:from_page]) buff = [] elements.each_with_index do |element, i| buff << render_element(element, , i + 1) end buff.join([:separator]).html_safe end |