Module: Alchemy::Element::ElementContents

Included in:
Alchemy::Element
Defined in:
app/models/alchemy/element/element_contents.rb

Overview

Methods concerning contents for elements

Instance Method Summary collapse

Instance Method Details

#content_by_name(name) ⇒ Object

Find first content from element by given name.


9
10
11
# File 'app/models/alchemy/element/element_contents.rb', line 9

def content_by_name(name)
  contents_by_name(name).first
end

#content_by_type(essence_type) ⇒ Object

Find first content from element by given essence type.


14
15
16
# File 'app/models/alchemy/element/element_contents.rb', line 14

def content_by_type(essence_type)
  contents_by_type(essence_type).first
end

#content_definition_for(content_name) ⇒ Object

Returns the definition for given content_name


104
105
106
107
108
109
110
111
# File 'app/models/alchemy/element/element_contents.rb', line 104

def content_definition_for(content_name)
  if content_definitions.blank?
    log_warning "Element #{name} is missing the content definition for #{content_name}"
    nil
  else
    content_definitions.detect { |d| d["name"] == content_name.to_s }
  end
end

#content_definitionsObject

Returns the array with the hashes for all element contents in the elements.yml file


97
98
99
100
101
# File 'app/models/alchemy/element/element_contents.rb', line 97

def content_definitions
  return nil if definition.blank?

  definition["contents"]
end

#content_for_rss_descriptionObject

Returns the content that is marked as rss description.

Mark a content as rss description in your elements.yml file:

- name: news
  contents:
  - name: body
    type: EssenceRichtext
    rss_description: true

92
93
94
# File 'app/models/alchemy/element/element_contents.rb', line 92

def content_for_rss_description
  content_for_rss_meta("description")
end

#content_for_rss_titleObject

Returns the content that is marked as rss title.

Mark a content as rss title in your elements.yml file:

- name: news
  contents:
  - name: headline
    type: EssenceText
    rss_title: true

78
79
80
# File 'app/models/alchemy/element/element_contents.rb', line 78

def content_for_rss_title
  content_for_rss_meta("title")
end

#contents_by_name(name) ⇒ Object Also known as: all_contents_by_name

All contents from element by given name.


19
20
21
# File 'app/models/alchemy/element/element_contents.rb', line 19

def contents_by_name(name)
  contents.select { |content| content.name == name.to_s }
end

#contents_by_type(essence_type) ⇒ Object Also known as: all_contents_by_type

All contents from element by given essence type.


26
27
28
29
30
# File 'app/models/alchemy/element/element_contents.rb', line 26

def contents_by_type(essence_type)
  contents.select do |content|
    content.essence_type == Content.normalize_essence_type(essence_type)
  end
end

#contents_with_errorsObject

All element contents where the essence validation has failed.


135
136
137
# File 'app/models/alchemy/element/element_contents.rb', line 135

def contents_with_errors
  contents.select(&:essence_validation_failed?)
end

#copy_contents_to(element) ⇒ Object

Copy current content's contents to given target element


62
63
64
65
66
# File 'app/models/alchemy/element/element_contents.rb', line 62

def copy_contents_to(element)
  contents.map do |content|
    Content.copy(content, element_id: element.id)
  end
end

#has_validations?Boolean

True, if any of the element's contents has essence validations defined.

Returns:

  • (Boolean)

130
131
132
# File 'app/models/alchemy/element/element_contents.rb', line 130

def has_validations?
  !contents.detect(&:has_validations?).blank?
end

#richtext_contents_idsObject

Returns an array of all EssenceRichtext contents ids from elements

This is used to re-initialize the TinyMCE editor in the element editor.


117
118
119
120
121
122
123
124
125
126
127
# File 'app/models/alchemy/element/element_contents.rb', line 117

def richtext_contents_ids
  # This is not very efficient SQL wise I know, but we need to iterate
  # recursivly through all descendent elements and I don't know how to do this
  # in pure SQL. Anyone with a better idea is welcome to submit a patch.
  ids = contents.select(&:has_tinymce?).collect(&:id)
  expanded_nested_elements = nested_elements.expanded
  if expanded_nested_elements.present?
    ids += expanded_nested_elements.collect(&:richtext_contents_ids)
  end
  ids.flatten
end

#update_contents(contents_attributes) ⇒ Boolean

Updates all related contents by calling update_essence on each of them.

Example

@element.update_contents(
  "1" => {ingredient: "Title"},
  "2" => {link: "https://google.com"}
)

Parameters:

  • contents_attributes (Hash)

    Hash of contents attributes. The keys has to be the #id of the content to update. The values a Hash of attribute names and values

Returns:

  • (Boolean)

    True if errors are blank or contents_attributes hash is nil


51
52
53
54
55
56
57
58
59
# File 'app/models/alchemy/element/element_contents.rb', line 51

def update_contents(contents_attributes)
  return true if contents_attributes.nil?

  contents.each do |content|
    content_hash = contents_attributes[content.id.to_s] || next
    content.update_essence(content_hash) || errors.add(:base, :essence_validation_failed)
  end
  errors.blank?
end