refinerycms-pages 2.0.4 → 2.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/app/controllers/refinery/pages_controller.rb +5 -1
- data/app/helpers/refinery/admin/pages_helper.rb +12 -0
- data/app/models/refinery/page.rb +27 -23
- data/app/views/refinery/admin/pages/_form_advanced_options.html.erb +4 -10
- data/app/views/refinery/admin/pages/_page.html.erb +10 -12
- data/db/seeds.rb +7 -0
- data/lib/refinery/pages/engine.rb +5 -1
- data/spec/controllers/refinery/admin/pages_controller_spec.rb +17 -0
- data/spec/helpers/refinery/pages/admin/pages_helper_spec.rb +54 -0
- data/spec/models/refinery/page_spec.rb +36 -0
- data/spec/requests/refinery/admin/pages_spec.rb +1 -1
- metadata +9 -5
@@ -1,6 +1,6 @@
|
|
1
1
|
module Refinery
|
2
2
|
class PagesController < ::ApplicationController
|
3
|
-
before_filter :find_page, :except => [:preview]
|
3
|
+
before_filter :find_page, :set_canonical, :except => [:preview]
|
4
4
|
|
5
5
|
# Save whole Page after delivery
|
6
6
|
after_filter { |c| c.write_cache? }
|
@@ -94,6 +94,10 @@ module Refinery
|
|
94
94
|
render render_options if render_options.any?
|
95
95
|
end
|
96
96
|
|
97
|
+
def set_canonical
|
98
|
+
@canonical = refinery.url_for @page.canonical if @page.present?
|
99
|
+
end
|
100
|
+
|
97
101
|
def write_cache?
|
98
102
|
if Refinery::Pages.cache_pages_full
|
99
103
|
cache_page(response.body, File.join('', 'refinery', 'cache', 'pages', request.path.sub("//", "/")).to_s)
|
@@ -10,6 +10,18 @@ module Refinery
|
|
10
10
|
ActiveRecord::Associations::Preloader.new(pages, :translations).run
|
11
11
|
pages.map {|page| ["#{'-' * page.level} #{page.title}", page.id]}
|
12
12
|
end
|
13
|
+
|
14
|
+
def template_options(template_type, current_page)
|
15
|
+
return {} if current_page.send(template_type)
|
16
|
+
|
17
|
+
if current_page.parent_id?
|
18
|
+
# Use Parent Template by default.
|
19
|
+
{ :selected => current_page.parent.send(template_type) }
|
20
|
+
else
|
21
|
+
# Use Default Template (First in whitelist)
|
22
|
+
{ :selected => Refinery::Pages.send("#{template_type}_whitelist").first }
|
23
|
+
end
|
24
|
+
end
|
13
25
|
end
|
14
26
|
end
|
15
27
|
end
|
data/app/models/refinery/page.rb
CHANGED
@@ -26,7 +26,8 @@ module Refinery
|
|
26
26
|
:skip_to_first_child, :position, :show_in_menu, :draft,
|
27
27
|
:parts_attributes, :browser_title, :meta_description,
|
28
28
|
:parent_id, :menu_title, :created_at, :updated_at,
|
29
|
-
:page_id, :layout_template, :view_template, :custom_slug
|
29
|
+
:page_id, :layout_template, :view_template, :custom_slug,
|
30
|
+
:slug
|
30
31
|
|
31
32
|
attr_accessor :locale, :page_title, :page_menu_title # to hold temporarily
|
32
33
|
validates :title, :presence => true
|
@@ -173,7 +174,7 @@ module Refinery
|
|
173
174
|
|
174
175
|
# Returns how many pages per page should there be when paginating pages
|
175
176
|
def per_page(dialog = false)
|
176
|
-
dialog ? Pages.pages_per_dialog : Pages.
|
177
|
+
dialog ? Pages.pages_per_dialog : Pages.pages_per_admin_index
|
177
178
|
end
|
178
179
|
|
179
180
|
def expire_page_caching
|
@@ -186,18 +187,25 @@ module Refinery
|
|
186
187
|
return true # so that other callbacks process.
|
187
188
|
end
|
188
189
|
end
|
190
|
+
|
191
|
+
def rebuild_with_invalidate_cached_urls!
|
192
|
+
rebuild_without_invalidate_cached_urls!
|
193
|
+
find_each { |page| page.send :invalidate_cached_urls }
|
194
|
+
end
|
195
|
+
alias_method_chain :rebuild!, :invalidate_cached_urls
|
196
|
+
end
|
197
|
+
|
198
|
+
# The canonical page for this particular page.
|
199
|
+
# Consists of:
|
200
|
+
# * The default locale's translated slug
|
201
|
+
def canonical
|
202
|
+
Globalize.with_locale(::Refinery::I18n.default_frontend_locale){ url }
|
189
203
|
end
|
190
204
|
|
191
205
|
# Returns in cascading order: custom_slug or menu_title or title depending on
|
192
206
|
# which attribute is first found to be present for this page.
|
193
207
|
def custom_slug_or_title
|
194
|
-
|
195
|
-
custom_slug
|
196
|
-
elsif menu_title.present?
|
197
|
-
menu_title
|
198
|
-
else
|
199
|
-
title
|
200
|
-
end
|
208
|
+
custom_slug.presence || menu_title.presence || title
|
201
209
|
end
|
202
210
|
|
203
211
|
# Am I allowed to delete this page?
|
@@ -291,7 +299,7 @@ module Refinery
|
|
291
299
|
# For example, this might evaluate to /about for the "About" page.
|
292
300
|
def url_marketable
|
293
301
|
# :id => nil is important to prevent any other params[:id] from interfering with this route.
|
294
|
-
url_normal.merge
|
302
|
+
url_normal.merge :path => nested_url, :id => nil
|
295
303
|
end
|
296
304
|
|
297
305
|
# Returns a url suitable to be used in url_for in Rails (such as link_to).
|
@@ -302,26 +310,23 @@ module Refinery
|
|
302
310
|
|
303
311
|
# If the current locale is set to something other than the default locale
|
304
312
|
# then the :locale attribute will be set on the url hash, otherwise it won't be.
|
305
|
-
def with_locale_param(url_hash)
|
306
|
-
if self.class.different_frontend_locale?
|
307
|
-
|
308
|
-
end
|
313
|
+
def with_locale_param(url_hash, locale = nil)
|
314
|
+
locale ||= ::Refinery::I18n.current_frontend_locale if self.class.different_frontend_locale?
|
315
|
+
url_hash.update :locale => locale if locale
|
309
316
|
url_hash
|
310
317
|
end
|
311
318
|
|
319
|
+
def uncached_nested_url
|
320
|
+
[parent.try(:uncached_nested_url), to_param.to_s].compact.flatten
|
321
|
+
end
|
322
|
+
|
312
323
|
# Returns an array with all ancestors to_param, allow with its own
|
313
324
|
# Ex: with an About page and a Mission underneath,
|
314
325
|
# ::Refinery::Page.find('mission').nested_url would return:
|
315
326
|
#
|
316
327
|
# ['about', 'mission']
|
317
328
|
#
|
318
|
-
|
319
|
-
Rails.cache.fetch(url_cache_key) { uncached_nested_url }
|
320
|
-
end
|
321
|
-
|
322
|
-
def uncached_nested_url
|
323
|
-
[parent.try(:nested_url), to_param.to_s].compact.flatten
|
324
|
-
end
|
329
|
+
alias_method :nested_url, :uncached_nested_url
|
325
330
|
|
326
331
|
# Returns the string version of nested_url, i.e., the path that should be generated
|
327
332
|
# by the router
|
@@ -444,8 +449,7 @@ module Refinery
|
|
444
449
|
end
|
445
450
|
alias_method_chain :normalize_friendly_id, :marketable_urls
|
446
451
|
|
447
|
-
|
448
|
-
|
452
|
+
private
|
449
453
|
def invalidate_cached_urls
|
450
454
|
return true unless Refinery::Pages.marketable_urls
|
451
455
|
|
@@ -26,11 +26,8 @@
|
|
26
26
|
<%= f.label :layout_template, t('.layout_template') %>
|
27
27
|
<%= refinery_help_tag t('.layout_template_help') %>
|
28
28
|
</span>
|
29
|
-
|
30
|
-
|
31
|
-
<% else %>
|
32
|
-
<%= f.select(:layout_template, @valid_layout_templates) %>
|
33
|
-
<% end %>
|
29
|
+
<%= f.select :layout_template, @valid_layout_templates,
|
30
|
+
template_options(:layout_template, @page) %>
|
34
31
|
</div>
|
35
32
|
<% end %>
|
36
33
|
<% if Refinery::Pages.use_view_templates %>
|
@@ -39,11 +36,8 @@
|
|
39
36
|
<%= f.label :view_template, t('.view_template') %>
|
40
37
|
<%= refinery_help_tag t('.view_template_help') %>
|
41
38
|
</span>
|
42
|
-
|
43
|
-
|
44
|
-
<% else %>
|
45
|
-
<%= f.select(:view_template, @valid_view_templates.map{|t| [t.titleize, t]}) %>
|
46
|
-
<% end %>
|
39
|
+
<%= f.select :view_template, @valid_view_templates.map { |t| [t.titleize, t] },
|
40
|
+
template_options(:view_template, @page) %>
|
47
41
|
</div>
|
48
42
|
<% end %>
|
49
43
|
|
@@ -8,22 +8,20 @@
|
|
8
8
|
|
9
9
|
<span class='title <%= 'toggle' if page.children.present? %>'>
|
10
10
|
<%= page.title_with_meta.html_safe %>
|
11
|
-
<% if Refinery.i18n_enabled? and Refinery::I18n.frontend_locales.many? %>
|
12
|
-
<span class='preview'>
|
13
|
-
<% page.translations.each do |translation| %>
|
14
|
-
<% if translation.title.present? %>
|
15
|
-
<%= link_to refinery_icon_tag("flags/#{translation.locale}.png", :size => '16x11'),
|
16
|
-
refinery.edit_admin_page_path(page, :switch_locale => translation.locale),
|
17
|
-
:class => 'locale' %>
|
18
|
-
<% end %>
|
19
|
-
<% end %>
|
20
|
-
</span>
|
21
|
-
<% end %>
|
22
11
|
</span>
|
12
|
+
<% if Refinery.i18n_enabled? and Refinery::I18n.frontend_locales.many? %>
|
13
|
+
<span class='locales'>
|
14
|
+
<% page.translations.each do |translation| %>
|
15
|
+
<%= link_to refinery_icon_tag("flags/#{translation.locale}.png", :size => '16x11'),
|
16
|
+
refinery.edit_admin_page_path(page.nested_url, :switch_locale => translation.locale),
|
17
|
+
:class => 'locale' if translation.title.present? %>
|
18
|
+
<% end %>
|
19
|
+
</span>
|
20
|
+
<% end %>
|
23
21
|
|
24
22
|
<span class='actions'>
|
25
23
|
<%= link_to refinery_icon_tag('application_go.png'),
|
26
|
-
|
24
|
+
page.url,
|
27
25
|
:target => "_blank",
|
28
26
|
:title => t('.view_live_html') %>
|
29
27
|
<%= link_to refinery_icon_tag('page_add.png'),
|
data/db/seeds.rb
CHANGED
@@ -39,3 +39,10 @@ if Refinery::Page.by_title("About").empty?
|
|
39
39
|
:position => 1
|
40
40
|
})
|
41
41
|
end
|
42
|
+
|
43
|
+
(Refinery.i18n_enabled? ? Refinery::I18n.frontend_locales : [:en]).each do |lang|
|
44
|
+
I18n.locale = lang
|
45
|
+
Refinery::Page.find_by_title("Home").update_attributes(:slug => "home")
|
46
|
+
Refinery::Page.find_by_title("Page not found").update_attributes(:slug => "page-not-found")
|
47
|
+
Refinery::Page.find_by_title("About").update_attributes(:slug => "about")
|
48
|
+
end
|
@@ -24,7 +24,11 @@ module Refinery
|
|
24
24
|
plugin.name = 'refinery_pages'
|
25
25
|
plugin.version = %q{2.0.0}
|
26
26
|
plugin.menu_match = %r{refinery/page(_part|s_dialog)?s$}
|
27
|
-
plugin.activity = {
|
27
|
+
plugin.activity = {
|
28
|
+
:class_name => :'refinery/page',
|
29
|
+
:nested_with => [:uncached_nested_url],
|
30
|
+
:use_record_in_nesting => false
|
31
|
+
}
|
28
32
|
plugin.url = proc { Refinery::Core::Engine.routes.url_helpers.admin_pages_path }
|
29
33
|
end
|
30
34
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
module Refinery
|
4
|
+
module Admin
|
5
|
+
describe PagesController do
|
6
|
+
login_refinery_superuser
|
7
|
+
|
8
|
+
describe "#update_positions" do
|
9
|
+
it "calls .rebuild! on Refinery::Page" do
|
10
|
+
Refinery::Page.should_receive(:rebuild!).once
|
11
|
+
|
12
|
+
post :update_positions, :ul => []
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
module Refinery
|
4
|
+
module Admin
|
5
|
+
describe PagesHelper do
|
6
|
+
describe "#template_options" do
|
7
|
+
context "when page layout/view templte is set" do
|
8
|
+
it "returns empty hash" do
|
9
|
+
page = FactoryGirl.create(:page)
|
10
|
+
|
11
|
+
page.view_template = "rspec_template"
|
12
|
+
helper.template_options(:view_template, page).should eq({})
|
13
|
+
|
14
|
+
page.layout_template = "rspec_layout"
|
15
|
+
helper.template_options(:layout_template, page).should eq({})
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "when page layout/view template isn't set" do
|
20
|
+
context "when page has parent" do
|
21
|
+
it "returns option hash based on parent page" do
|
22
|
+
parent = FactoryGirl.create(:page, :view_template => "rspec_view",
|
23
|
+
:layout_template => "rspec_layout")
|
24
|
+
page = FactoryGirl.create(:page, :parent_id => parent.id)
|
25
|
+
|
26
|
+
expected_view = { :selected => parent.view_template }
|
27
|
+
helper.template_options(:view_template, page).should eq(expected_view)
|
28
|
+
|
29
|
+
expected_layout = { :selected => parent.layout_template }
|
30
|
+
helper.template_options(:layout_template, page).should eq(expected_layout)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context "when page doesn't have parent page" do
|
35
|
+
before do
|
36
|
+
Refinery::Pages.stub(:view_template_whitelist).and_return(%w(one two))
|
37
|
+
Refinery::Pages.stub(:layout_template_whitelist).and_return(%w(two one))
|
38
|
+
end
|
39
|
+
|
40
|
+
it "returns option hash with first item from configured whitelist" do
|
41
|
+
page = FactoryGirl.create(:page)
|
42
|
+
|
43
|
+
expected_view = { :selected => "one" }
|
44
|
+
helper.template_options(:view_template, page).should eq(expected_view)
|
45
|
+
|
46
|
+
expected_layout = { :selected => "two" }
|
47
|
+
helper.template_options(:layout_template, page).should eq(expected_layout)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# encoding: utf-8
|
1
2
|
require 'spec_helper'
|
2
3
|
|
3
4
|
module Refinery
|
@@ -103,6 +104,41 @@ module Refinery
|
|
103
104
|
end
|
104
105
|
end
|
105
106
|
|
107
|
+
describe '#canonical' do
|
108
|
+
before do
|
109
|
+
::Refinery::I18n.stub(:default_frontend_locale).and_return(:en)
|
110
|
+
::Refinery::I18n.stub(:frontend_locales).and_return([Refinery::I18n.default_frontend_locale, :ru])
|
111
|
+
::Refinery::I18n.stub(:current_frontend_locale).and_return(Refinery::I18n.default_frontend_locale)
|
112
|
+
|
113
|
+
page.save
|
114
|
+
end
|
115
|
+
let(:page_title) { 'team' }
|
116
|
+
let(:child_title) { 'about' }
|
117
|
+
let(:ru_page_title) { 'Новости' }
|
118
|
+
let!(:default_canonical) {
|
119
|
+
Globalize.with_locale(::Refinery::I18n.default_frontend_locale) {
|
120
|
+
page.canonical
|
121
|
+
}
|
122
|
+
}
|
123
|
+
|
124
|
+
specify 'page returns itself' do
|
125
|
+
page.canonical.should == page.url
|
126
|
+
end
|
127
|
+
|
128
|
+
specify 'default canonical matches page#canonical' do
|
129
|
+
default_canonical.should == page.canonical
|
130
|
+
end
|
131
|
+
|
132
|
+
specify 'translated page returns master page' do
|
133
|
+
Globalize.with_locale(:ru) do
|
134
|
+
page.title = ru_page_title
|
135
|
+
page.save
|
136
|
+
|
137
|
+
page.canonical.should == default_canonical
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
106
142
|
context 'custom slugs' do
|
107
143
|
let(:custom_page_slug) { 'custom-page-slug' }
|
108
144
|
let(:custom_child_slug) { 'custom-child-slug' }
|
@@ -132,7 +132,7 @@ module Refinery
|
|
132
132
|
page.body.should =~ /Add a new child page/
|
133
133
|
page.body.should =~ %r{/refinery/pages/new\?parent_id=}
|
134
134
|
page.body.should =~ /View this page live/
|
135
|
-
page.body.should =~ %r{/
|
135
|
+
page.body.should =~ %r{href="/my-first-page"}
|
136
136
|
|
137
137
|
Refinery::Page.count.should == 1
|
138
138
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: refinerycms-pages
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
requirements:
|
55
55
|
- - '='
|
56
56
|
- !ruby/object:Gem::Version
|
57
|
-
version: 2.0.
|
57
|
+
version: 2.0.5
|
58
58
|
type: :runtime
|
59
59
|
prerelease: false
|
60
60
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -62,7 +62,7 @@ dependencies:
|
|
62
62
|
requirements:
|
63
63
|
- - '='
|
64
64
|
- !ruby/object:Gem::Version
|
65
|
-
version: 2.0.
|
65
|
+
version: 2.0.5
|
66
66
|
- !ruby/object:Gem::Dependency
|
67
67
|
name: babosa
|
68
68
|
requirement: !ruby/object:Gem::Requirement
|
@@ -168,7 +168,9 @@ files:
|
|
168
168
|
- lib/refinerycms-pages.rb
|
169
169
|
- license.md
|
170
170
|
- refinerycms-pages.gemspec
|
171
|
+
- spec/controllers/refinery/admin/pages_controller_spec.rb
|
171
172
|
- spec/factories/pages.rb
|
173
|
+
- spec/helpers/refinery/pages/admin/pages_helper_spec.rb
|
172
174
|
- spec/helpers/refinery/pages/content_pages_helper_spec.rb
|
173
175
|
- spec/lib/generators/refinery/pages/pages_generator_spec.rb
|
174
176
|
- spec/lib/pages/content_page_presenter_spec.rb
|
@@ -195,7 +197,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
195
197
|
version: '0'
|
196
198
|
segments:
|
197
199
|
- 0
|
198
|
-
hash:
|
200
|
+
hash: -121281082121598221
|
199
201
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
200
202
|
none: false
|
201
203
|
requirements:
|
@@ -204,7 +206,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
204
206
|
version: '0'
|
205
207
|
segments:
|
206
208
|
- 0
|
207
|
-
hash:
|
209
|
+
hash: -121281082121598221
|
208
210
|
requirements: []
|
209
211
|
rubyforge_project: refinerycms
|
210
212
|
rubygems_version: 1.8.22
|
@@ -212,7 +214,9 @@ signing_key:
|
|
212
214
|
specification_version: 3
|
213
215
|
summary: Pages extension for Refinery CMS
|
214
216
|
test_files:
|
217
|
+
- spec/controllers/refinery/admin/pages_controller_spec.rb
|
215
218
|
- spec/factories/pages.rb
|
219
|
+
- spec/helpers/refinery/pages/admin/pages_helper_spec.rb
|
216
220
|
- spec/helpers/refinery/pages/content_pages_helper_spec.rb
|
217
221
|
- spec/lib/generators/refinery/pages/pages_generator_spec.rb
|
218
222
|
- spec/lib/pages/content_page_presenter_spec.rb
|