Module: Alchemy::Page::PageNatures

Extended by:
ActiveSupport::Concern
Included in:
Alchemy::Page
Defined in:
app/models/alchemy/page/page_natures.rb

Instance Method Summary collapse

Instance Method Details

#cache_page?Boolean

Returns true if the page cache control headers should be set.

Disable Alchemy’s page caching globally

# config/alchemy/config.yml
...
cache_pages: false

Disable caching on page layout level

# config/alchemy/page_layouts.yml
- name: contact
  cache: false

Note:

This only sets the cache control headers and skips rendering of the page body, if the cache is fresh. This does not disable the fragment caching in the views. So if you don’t want a page and it’s elements to be cached, then be sure to not use <% cache element %> in the views.

Returns:

  • (Boolean)


163
164
165
166
167
# File 'app/models/alchemy/page/page_natures.rb', line 163

def cache_page?
  return false if !public? || restricted?

  definition.cache != false && definition.searchresults != true
end

#cache_versionObject

Returns the version string that’s taken for Rails’ recycable cache key.



123
124
125
# File 'app/models/alchemy/page/page_natures.rb', line 123

def cache_version
  last_modified_at&.to_s
end

#definitionObject

Returns the self#page_layout definition from config/alchemy/page_layouts.yml file.



99
100
101
102
103
104
105
106
# File 'app/models/alchemy/page/page_natures.rb', line 99

def definition
  definition = PageDefinition.get(page_layout)
  if definition.nil?
    Logger.warn "Page definition for '#{page_layout}' not found. Please check page_layouts.yml file."
    return PageDefinition.new
  end
  definition
end

#editor_rolesObject



61
62
63
64
65
# File 'app/models/alchemy/page/page_natures.rb', line 61

def editor_roles
  return unless has_limited_editors?

  definition.editable_by
end

#expiration_timeObject

Cache-Control max-age duration in seconds.

You can set this via the ‘ALCHEMY_PAGE_CACHE_MAX_AGE` environment variable, in the `Alchemy.config.page_cache_max_age` configuration option, or in the pages definition in `config/alchemy/page_layouts.yml` file.

Defaults to 600 seconds.



23
24
25
26
27
28
29
30
31
# File 'app/models/alchemy/page/page_natures.rb', line 23

def expiration_time
  return 0 unless cache_page?

  if definition.cache.to_s.match?(/\d+/)
    definition.cache.to_i
  else
    Alchemy.config.page_cache.max_age
  end
end

#folded?(user_id) ⇒ Boolean

Returns:

  • (Boolean)


37
38
39
40
41
42
43
44
45
# File 'app/models/alchemy/page/page_natures.rb', line 37

def folded?(user_id)
  return unless Alchemy.config.user_class < ActiveRecord::Base

  if folded_pages.loaded?
    folded_pages.any? { |p| p.folded && p.user_id == user_id }
  else
    folded_pages.where(user_id: user_id, folded: true).any?
  end
end

#has_limited_editors?Boolean

Returns an Array of Alchemy roles which are able to edit this template

# config/alchemy/page_layouts.yml
- name: contact
  editable_by:
    - freelancer
    - admin

Returns:

  • (Boolean)


57
58
59
# File 'app/models/alchemy/page/page_natures.rb', line 57

def has_limited_editors?
  definition.editable_by.present?
end

#last_modified_atObject

Returns the timestamp that the page was last modified at, regardless of through publishing or editing page, or through a change of related objects through ingredients. Respects the public version not changing if editing a preview.

In preview mode, it will take the draft version’s updated_at timestamp. In public mode, it will take the public version’s updated_at timestamp.



134
135
136
137
# File 'app/models/alchemy/page/page_natures.rb', line 134

def last_modified_at
  relevant_page_version = (Current.preview_page == self) ? draft_version : public_version
  relevant_page_version&.updated_at
end

#layout_display_nameObject

Returns translated name of the pages page_layout value. Page layout names are defined inside the config/alchemy/page_layouts.yml file. Translate the name in your config/locales language yml file.



111
112
113
# File 'app/models/alchemy/page/page_natures.rb', line 111

def layout_display_name
  Alchemy.t(page_layout, scope: "page_layout_names")
end

#layout_partial_nameObject

Returns the name for the layout partial



117
118
119
# File 'app/models/alchemy/page/page_natures.rb', line 117

def layout_partial_name
  page_layout.parameterize.underscore
end

#locked?Boolean

True if page locked_at timestamp and locked_by id are set

Returns:

  • (Boolean)


68
69
70
# File 'app/models/alchemy/page/page_natures.rb', line 68

def locked?
  locked_by? && locked_at?
end

#public?Boolean

Determines if this page has a public version and this version is public.

Returns:

  • (Boolean)

See Also:



12
13
14
# File 'app/models/alchemy/page/page_natures.rb', line 12

def public?
  language.public? && !!public_version&.public?
end

#rootpage?Boolean

Returns:

  • (Boolean)


33
34
35
# File 'app/models/alchemy/page/page_natures.rb', line 33

def rootpage?
  !new_record? && parent_id.blank?
end

#statusObject

Returns a Hash describing the status of the Page.



74
75
76
77
78
79
80
# File 'app/models/alchemy/page/page_natures.rb', line 74

def status
  {
    public: public?,
    locked: locked?,
    restricted: restricted?
  }
end

#status_message(status_type) ⇒ Object

Returns the long translated status message for given status type.

Parameters:

  • status_type (Symbol)


86
87
88
# File 'app/models/alchemy/page/page_natures.rb', line 86

def status_message(status_type)
  Alchemy.t(status[status_type].to_s, scope: "page_states.#{status_type}")
end

#status_title(status_type) ⇒ Object

Returns the sort translated status title for given status type.

Parameters:

  • status_type (Symbol)


94
95
96
# File 'app/models/alchemy/page/page_natures.rb', line 94

def status_title(status_type)
  Alchemy.t(status[status_type].to_s, scope: "page_status_titles.#{status_type}")
end