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)


159
160
161
162
163
# File 'app/models/alchemy/page/page_natures.rb', line 159

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.



119
120
121
# File 'app/models/alchemy/page/page_natures.rb', line 119

def cache_version
  last_modified_at&.to_s
end

#definitionObject

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



95
96
97
98
99
100
101
102
# File 'app/models/alchemy/page/page_natures.rb', line 95

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

#editor_rolesObject



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

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
# File 'app/models/alchemy/page/page_natures.rb', line 37

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

  folded_pages.where(user_id: user_id, folded: true).any?
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)


53
54
55
# File 'app/models/alchemy/page/page_natures.rb', line 53

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.



130
131
132
133
# File 'app/models/alchemy/page/page_natures.rb', line 130

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.



107
108
109
# File 'app/models/alchemy/page/page_natures.rb', line 107

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

#layout_partial_nameObject

Returns the name for the layout partial



113
114
115
# File 'app/models/alchemy/page/page_natures.rb', line 113

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)


64
65
66
# File 'app/models/alchemy/page/page_natures.rb', line 64

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.



70
71
72
73
74
75
76
# File 'app/models/alchemy/page/page_natures.rb', line 70

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)


82
83
84
# File 'app/models/alchemy/page/page_natures.rb', line 82

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)


90
91
92
# File 'app/models/alchemy/page/page_natures.rb', line 90

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