Class: Refinery::Page

Inherits:
Core::BaseModel show all
Extended by:
FriendlyId
Defined in:
pages/app/models/refinery/page.rb

Defined Under Namespace

Classes: FriendlyIdOptions, FriendlyIdPath, Translation

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Core::BaseModel

#users_manager

Class Method Details

.by_slug(slug, conditions = {}) ⇒ Object

Finds pages by their slug. This method is necessary because pages are translated which means the slug attribute does not exist on the pages table thus requiring us to find the attribute on the translations table and then join to the pages table again to return the associated record.



113
114
115
# File 'pages/app/models/refinery/page.rb', line 113

def by_slug(slug, conditions = {})
  Pages::Finder.by_slug(slug, conditions)
end

.by_title(title) ⇒ Object

Finds pages by their title. This method is necessary because pages are translated which means the title attribute does not exist on the pages table thus requiring us to find the attribute on the translations table and then join to the pages table again to return the associated record.



105
106
107
# File 'pages/app/models/refinery/page.rb', line 105

def by_title(title)
  Pages::Finder.by_title(title)
end

.fast_menuObject

An optimised scope containing only live pages ordered for display in a menu.



126
127
128
# File 'pages/app/models/refinery/page.rb', line 126

def fast_menu
  live.in_menu.order(arel_table[:lft]).includes(:parent, :translations)
end

.find_by_path(path) ⇒ Object

Find page by path, checking for scoping rules



77
78
79
# File 'pages/app/models/refinery/page.rb', line 77

def find_by_path(path)
  Pages::Finder.by_path(path)
end

.find_by_path_or_id(path, id) ⇒ Object

Helps to resolve the situation where you have a path and an id and if the path is unfriendly then a different finder method is required than find_by_path.



84
85
86
# File 'pages/app/models/refinery/page.rb', line 84

def find_by_path_or_id(path, id)
  Pages::Finder.by_path_or_id(path, id)
end

.find_by_path_or_id!(path, id) ⇒ Object

Helps to resolve the situation where you have a path and an id and if the path is unfriendly then a different finder method is required than find_by_path.

raise ActiveRecord::RecordNotFound if not found.

Raises:

  • (ActiveRecord::RecordNotFound)


93
94
95
96
97
98
99
# File 'pages/app/models/refinery/page.rb', line 93

def find_by_path_or_id!(path, id)
  page = find_by_path_or_id(path, id)

  raise ActiveRecord::RecordNotFound unless page

  page
end

.in_menuObject

Shows all pages with :show_in_menu set to true, but it also rejects any page that has not been translated to the current locale. This works using a query against the translated content first and then using all of the page_ids we further filter against this model's table.



121
122
123
# File 'pages/app/models/refinery/page.rb', line 121

def in_menu
  where(:show_in_menu => true).with_globalize
end

.liveObject

Live pages are 'allowed' to be shown in the frontend of your website. By default, this is all pages that are not set as 'draft'.



72
73
74
# File 'pages/app/models/refinery/page.rb', line 72

def live
  where(:draft => false)
end

.per_page(dialog = false) ⇒ Object

Returns how many pages per page should there be when paginating pages



136
137
138
# File 'pages/app/models/refinery/page.rb', line 136

def per_page(dialog = false)
  dialog ? Pages.pages_per_dialog : Pages.pages_per_admin_index
end

.rebuild_with_slug_nullification!Object



140
141
142
143
# File 'pages/app/models/refinery/page.rb', line 140

def rebuild_with_slug_nullification!
  rebuild_without_slug_nullification!
  nullify_duplicate_slugs_under_the_same_parent!
end

.with_globalize(conditions = {}) ⇒ Object

Wrap up the logic of finding the pages based on the translations table.



131
132
133
# File 'pages/app/models/refinery/page.rb', line 131

def with_globalize(conditions = {})
  Pages::Finder.with_globalize(conditions)
end

Instance Method Details

#canonicalObject

The canonical page for this particular page. Consists of:

* The current locale's translated slug


167
168
169
# File 'pages/app/models/refinery/page.rb', line 167

def canonical
  Globalize.with_locale(::Refinery::I18n.current_frontend_locale) { url }
end

#canonical_slugObject

The canonical slug for this particular page. This is the slug for the current frontend locale.



173
174
175
# File 'pages/app/models/refinery/page.rb', line 173

def canonical_slug
  Globalize.with_locale(::Refinery::I18n.current_frontend_locale) { slug }
end

#content_for(part_slug) ⇒ Object

Accessor method to get a page part from a page. Example:

::Refinery::Page.first.content_for(:body)

Will return the body page part of the first page.



294
295
296
# File 'pages/app/models/refinery/page.rb', line 294

def content_for(part_slug)
  part_with_slug(part_slug).try(:body)
end

#content_for?(part_slug) ⇒ Boolean

Accessor method to test whether a page part exists and has content for this page. Example:

::Refinery::Page.first.content_for?(:body)

Will return true if the page has a body page part and it is not blank.

Returns:

  • (Boolean)


305
306
307
# File 'pages/app/models/refinery/page.rb', line 305

def content_for?(part_slug)
  content_for(part_slug).present?
end

#custom_slug_or_titleObject

Returns in cascading order: custom_slug or menu_title or title depending on which attribute is first found to be present for this page.



179
180
181
182
# File 'pages/app/models/refinery/page.rb', line 179

def custom_slug_or_title
  (Refinery::Pages.use_custom_slugs && custom_slug.presence) ||
    menu_title.presence || title.presence
end

#deletable?Boolean

Am I allowed to delete this page? If a link_url is set we don't want to break the link so we don't allow them to delete If deletable is set to false then we don't allow this page to be deleted. These are often Refinery system pages

Returns:

  • (Boolean)


187
188
189
# File 'pages/app/models/refinery/page.rb', line 187

def deletable?
  deletable && link_url.blank? && menu_match.blank?
end

#destroyObject

Before destroying a page we check to see if it's a deletable page or not Refinery system pages are not deletable.



201
202
203
204
205
206
207
# File 'pages/app/models/refinery/page.rb', line 201

def destroy
  return super if deletable?

  puts_destroy_help

  false
end

#destroy!Object

If you want to destroy a page that is set to be not deletable this is the way to do it.



210
211
212
213
214
# File 'pages/app/models/refinery/page.rb', line 210

def destroy!
  self.update_attributes(:menu_match => nil, :link_url => nil, :deletable => true)

  self.destroy
end

#in_menu?Boolean

Return true if this page can be shown in the navigation. If it's a draft or is set to not show in the menu it will return false.

Returns:

  • (Boolean)


261
262
263
# File 'pages/app/models/refinery/page.rb', line 261

def in_menu?
  live? && show_in_menu?
end

#live?Boolean

Returns true if this page is “published”

Returns:

  • (Boolean)


255
256
257
# File 'pages/app/models/refinery/page.rb', line 255

def live?
  !draft?
end

#nested_pathObject

Returns the string version of nested_url, i.e., the path that should be generated by the router



250
251
252
# File 'pages/app/models/refinery/page.rb', line 250

def nested_path
  ['', nested_url].join('/')
end

#nested_urlObject Also known as: uncached_nested_url



230
231
232
233
234
235
236
237
238
# File 'pages/app/models/refinery/page.rb', line 230

def nested_url
  Globalize.with_locale(slug_locale) do
    if ::Refinery::Pages.scope_slug_by_parent && !root?
      self_and_ancestors.includes(:translations).map(&:to_param)
    else
      [to_param.to_s]
    end
  end
end

#normalize_friendly_id(slug_string) ⇒ Object

Protects generated slugs from title if they are in the list of reserved words This applies mostly to plugin-generated pages. This only kicks in when Refinery::Pages.marketable_urls is enabled. Also check for global scoping, and if enabled, allow slashes in slug.

Returns the sluggified string



334
335
336
# File 'pages/app/models/refinery/page.rb', line 334

def normalize_friendly_id(slug_string)
  FriendlyIdPath.normalize_friendly_id(slug_string)
end

#not_in_menu?Boolean

Returns:

  • (Boolean)


265
266
267
# File 'pages/app/models/refinery/page.rb', line 265

def not_in_menu?
  !in_menu?
end

#part_with_slug(part_slug) ⇒ Object

Accessor method to get a page part object from a page. Example:

::Refinery::Page.first.part_with_slug(:body)

Will return the Refinery::PagePart object with that slug using the first page.



315
316
317
318
319
320
321
# File 'pages/app/models/refinery/page.rb', line 315

def part_with_slug(part_slug)
  # self.parts is usually already eager loaded so we can now just grab
  # the first element matching the title we specified.
  self.parts.detect do |part|
    part.slug_matches?(part_slug)
  end
end

#part_with_title(part_title) ⇒ Object



323
324
325
326
# File 'pages/app/models/refinery/page.rb', line 323

def part_with_title(part_title)
  Refinery.deprecate("Refinery::Page#part_with_title", when: "3.1", replacement: "part_with_slug")
  part_with_slug(part_title.to_s.parameterize.underscore)
end

#path(path_separator: ' - ', ancestors_first: true) ⇒ Object

Returns the full path to this page. This automatically prints out this page title and all parent page titles. The result is joined by the path_separator argument.



219
220
221
222
223
224
# File 'pages/app/models/refinery/page.rb', line 219

def path(path_separator: ' - ', ancestors_first: true)
  return title if root?

  chain = ancestors_first ? self_and_ancestors : self_and_ancestors.reverse
  chain.map(&:title).join(path_separator)
end

#reposition_parts!Object

Repositions the child page_parts that belong to this page. This ensures that they are in the correct 0,1,2,3,4… etc order.



193
194
195
196
197
# File 'pages/app/models/refinery/page.rb', line 193

def reposition_parts!
  reload.parts.each_with_index do |part, index|
    part.update_columns position: index
  end
end

#should_generate_new_friendly_id?Boolean

If title changes tell friendly_id to regenerate slug when saving record

Returns:

  • (Boolean)


38
39
40
# File 'pages/app/models/refinery/page.rb', line 38

def should_generate_new_friendly_id?
  changes.keys.include?("title") || changes.keys.include?("custom_slug")
end

#shown_siblingsObject

Returns all visible sibling pages that can be rendered for the menu



270
271
272
# File 'pages/app/models/refinery/page.rb', line 270

def shown_siblings
  siblings.reject(&:not_in_menu?)
end

#to_refinery_menu_itemObject



274
275
276
277
278
279
280
281
282
283
284
285
286
# File 'pages/app/models/refinery/page.rb', line 274

def to_refinery_menu_item
  {
    :id => id,
    :lft => lft,
    :depth => depth,
    :menu_match => menu_match,
    :parent_id => parent_id,
    :rgt => rgt,
    :title => menu_title.presence || title.presence,
    :type => self.class.name,
    :url => url
  }
end

#translated_to_default_locale?Boolean

Returns:

  • (Boolean)


160
161
162
# File 'pages/app/models/refinery/page.rb', line 160

def translated_to_default_locale?
  persisted? && translations.any?{ |t| t.locale == Refinery::I18n.default_frontend_locale}
end

#urlObject



226
227
228
# File 'pages/app/models/refinery/page.rb', line 226

def url
  Pages::Url.build(self)
end