comfortable_mexican_loveseat 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +36 -0
- data/Rakefile +34 -0
- data/app/controllers/comfy/admin/cms/base_controller.rb +63 -0
- data/app/controllers/comfy/admin/cms/layouts_controller.rb +71 -0
- data/app/controllers/comfy/cms/content_controller.rb +88 -0
- data/app/helpers/comfy/cms_helper.rb +104 -0
- data/app/models/comfy/cms/snippet.rb +45 -0
- data/app/views/comfy/admin/cms/files/_form.html.haml +23 -0
- data/app/views/comfy/admin/cms/files/index.html.haml +35 -0
- data/app/views/comfy/cms/content/render_sitemap.xml.builder +36 -0
- data/app/views/layouts/comfy/admin/cms/_flash.html.haml +4 -0
- data/lib/comfortable_mexican_loveseat.rb +14 -0
- data/lib/comfortable_mexican_loveseat/engine.rb +9 -0
- data/test/comfortable_mexican_loveseat_test.rb +7 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +29 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +26 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +41 -0
- data/test/dummy/config/environments/production.rb +79 -0
- data/test/dummy/config/environments/test.rb +42 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +56 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/test_helper.rb +19 -0
- metadata +187 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: e6f9def9b413b9a46c941db32fee174e5284edfe
|
|
4
|
+
data.tar.gz: 22d877a65a24d2dd07aa795b8c65d30d47877d23
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: e018cf29b977e5c94d2f47d46cc9ca0df06f1fce4148fd589586f0a8c8d37530cf8bc8369f9e924ce55a8ef3adc0e7f3c7e45d8fd2c398daaf444dc5f1101d8b
|
|
7
|
+
data.tar.gz: d05dc937df154ecbaaa7029472f7c465fb530d0d3494b87dd17efb4475a4b61e024bfe97552e483cfe5fe65b5282af3b55d8e2e3c830d4754d6b1eabf9756638
|
data/MIT-LICENSE
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Copyright 2015 Adam Bahlke
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
4
|
+
a copy of this software and associated documentation files (the
|
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
9
|
+
the following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be
|
|
12
|
+
included in all copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
= ComfortableMexicanLoveseat
|
|
2
|
+
|
|
3
|
+
The Comfortable Mexican Loveseat is an expansion pack to the Comfortable Mexican Sofa. It currently contains minor modifications to the <tt>snippet.rb</tt> and <tt>base_controller.rb</tt> files, improved sitemap functionality, and SEO-enhancing modifications.
|
|
4
|
+
|
|
5
|
+
The Loveseat references a fixed version of the CMS (currently 1.12.8) and latest releases are pulled in occasionally.
|
|
6
|
+
|
|
7
|
+
== SEO Features
|
|
8
|
+
|
|
9
|
+
=== Custom Sitemaps
|
|
10
|
+
|
|
11
|
+
Building on the Sofa's sitemap functionality, the Loveseat lets you add Rails model show pages and custom routes to the sitemap.
|
|
12
|
+
|
|
13
|
+
To use it, please copy and customize the demo initializer located in <tt>templates/comfortable_mexican_loveseat.rb</tt> and in your <tt>routes.rb</tt> file make sure you have this line:
|
|
14
|
+
|
|
15
|
+
comfy_route :cms, :path => '/', :sitemap => true
|
|
16
|
+
|
|
17
|
+
Then replace your <tt>robots.txt</tt> file with the one in the templates folder.
|
|
18
|
+
|
|
19
|
+
=== URL Redirection
|
|
20
|
+
|
|
21
|
+
By default when using the Loveseat, all trailing slash URLs ('myapp.com/example/') are redirected to a non-trailing slash URL.
|
|
22
|
+
|
|
23
|
+
=== Page Meta Tags
|
|
24
|
+
|
|
25
|
+
By default when you create an application, it comes with meta description; page title; no-index; index; and canonical link fields that can be filled in on a per-page basis. To display these tags, add this to your <tt>application.html.erb</tt>:
|
|
26
|
+
|
|
27
|
+
<title><%= comfy_page_title %></title>
|
|
28
|
+
<%= comfy_seo_tags %>
|
|
29
|
+
|
|
30
|
+
=== File Upload helper text
|
|
31
|
+
|
|
32
|
+
The Loveseat provides some helpful hints to admins when they're uploading images (choose an SEO-friendly name, add an alt-tag), which you can add to your locale files.
|
|
33
|
+
|
|
34
|
+
images_need_seo_friendly_names
|
|
35
|
+
files_alt_tag
|
|
36
|
+
|
data/Rakefile
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
begin
|
|
2
|
+
require 'bundler/setup'
|
|
3
|
+
rescue LoadError
|
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
require 'rdoc/task'
|
|
8
|
+
|
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
|
11
|
+
rdoc.title = 'ComfortableMexicanLoveseat'
|
|
12
|
+
rdoc.options << '--line-numbers'
|
|
13
|
+
rdoc.rdoc_files.include('README.rdoc')
|
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
Bundler::GemHelper.install_tasks
|
|
23
|
+
|
|
24
|
+
require 'rake/testtask'
|
|
25
|
+
|
|
26
|
+
Rake::TestTask.new(:test) do |t|
|
|
27
|
+
t.libs << 'lib'
|
|
28
|
+
t.libs << 'test'
|
|
29
|
+
t.pattern = 'test/**/*_test.rb'
|
|
30
|
+
t.verbose = false
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
task default: :test
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
class Comfy::Admin::Cms::BaseController < ComfortableMexicanSofa.config.base_controller.to_s.constantize
|
|
2
|
+
|
|
3
|
+
include Comfy::Paginate
|
|
4
|
+
|
|
5
|
+
# Authentication module must have `authenticate` method
|
|
6
|
+
include ComfortableMexicanSofa.config.admin_auth.to_s.constantize
|
|
7
|
+
|
|
8
|
+
# Authorization module must have `authorize` method
|
|
9
|
+
include ComfortableMexicanSofa.config.admin_authorization.to_s.constantize
|
|
10
|
+
|
|
11
|
+
protect_from_forgery
|
|
12
|
+
|
|
13
|
+
before_action :authenticate,
|
|
14
|
+
:load_admin_site,
|
|
15
|
+
:set_locale,
|
|
16
|
+
:load_fixtures,
|
|
17
|
+
:except => :jump
|
|
18
|
+
|
|
19
|
+
layout 'comfy/admin/cms'
|
|
20
|
+
|
|
21
|
+
if ComfortableMexicanSofa.config.admin_cache_sweeper.present?
|
|
22
|
+
cache_sweeper *ComfortableMexicanSofa.config.admin_cache_sweeper
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def jump
|
|
26
|
+
path = ComfortableMexicanSofa.config.admin_route_redirect
|
|
27
|
+
return redirect_to(path) unless path.blank?
|
|
28
|
+
load_admin_site
|
|
29
|
+
redirect_to comfy_admin_cms_site_pages_path(@site) if @site
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
protected
|
|
33
|
+
|
|
34
|
+
def load_admin_site
|
|
35
|
+
if @site = ::Comfy::Cms::Site.find_by_id(params[:site_id] || session[:site_id]) || ::Comfy::Cms::Site.first
|
|
36
|
+
session[:site_id] = @site.id
|
|
37
|
+
else
|
|
38
|
+
I18n.locale = ComfortableMexicanSofa.config.admin_locale || I18n.default_locale
|
|
39
|
+
flash[:danger] = I18n.t('comfy.admin.cms.base.site_not_found')
|
|
40
|
+
return redirect_to(new_comfy_admin_cms_site_path)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def set_locale
|
|
45
|
+
super
|
|
46
|
+
rescue
|
|
47
|
+
I18n.locale = cms_locale
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def cms_locale
|
|
51
|
+
ComfortableMexicanSofa.config.admin_locale || (@site && @site.locale)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def load_fixtures
|
|
55
|
+
return unless ComfortableMexicanSofa.config.enable_fixtures
|
|
56
|
+
|
|
57
|
+
controllers = %w(layouts pages snippets files).collect{|c| 'comfy/admin/cms/' + c}
|
|
58
|
+
if controllers.member?(params[:controller]) && params[:action] == 'index'
|
|
59
|
+
ComfortableMexicanSofa::Fixture::Importer.new(@site.identifier).import!
|
|
60
|
+
flash.now[:danger] = I18n.t('comfy.admin.cms.base.fixtures_enabled')
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
class Comfy::Admin::Cms::LayoutsController < Comfy::Admin::Cms::BaseController
|
|
2
|
+
|
|
3
|
+
before_action :build_layout, :only => [:new, :create]
|
|
4
|
+
before_action :load_layout, :only => [:edit, :update, :destroy]
|
|
5
|
+
before_action :authorize
|
|
6
|
+
|
|
7
|
+
def index
|
|
8
|
+
return redirect_to :action => :new if @site.layouts.count == 0
|
|
9
|
+
@layouts = @site.layouts.roots
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def new
|
|
13
|
+
render
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def edit
|
|
17
|
+
render
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def create
|
|
21
|
+
@layout.save!
|
|
22
|
+
flash[:success] = I18n.t('comfy.admin.cms.layouts.created')
|
|
23
|
+
redirect_to :action => :edit, :id => @layout
|
|
24
|
+
rescue ActiveRecord::RecordInvalid
|
|
25
|
+
flash.now[:danger] = I18n.t('comfy.admin.cms.layouts.creation_failure')
|
|
26
|
+
render :action => :new
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def update
|
|
30
|
+
@layout.update_attributes!(layout_params)
|
|
31
|
+
flash[:success] = I18n.t('comfy.admin.cms.layouts.updated')
|
|
32
|
+
redirect_to :action => :edit, :id => @layout
|
|
33
|
+
rescue ActiveRecord::RecordInvalid
|
|
34
|
+
flash.now[:danger] = I18n.t('comfy.admin.cms.layouts.update_failure')
|
|
35
|
+
render :action => :edit
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def destroy
|
|
39
|
+
@layout.destroy
|
|
40
|
+
flash[:success] = I18n.t('comfy.admin.cms.layouts.deleted')
|
|
41
|
+
redirect_to :action => :index
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def reorder
|
|
45
|
+
(params[:comfy_cms_layout] || []).each_with_index do |id, index|
|
|
46
|
+
::Comfy::Cms::Layout.where(:id => id).update_all(:position => index)
|
|
47
|
+
end
|
|
48
|
+
render :nothing => true
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
protected
|
|
52
|
+
|
|
53
|
+
def build_layout
|
|
54
|
+
@layout = @site.layouts.new(layout_params)
|
|
55
|
+
@layout.parent ||= ::Comfy::Cms::Layout.find_by_id(params[:parent_id])
|
|
56
|
+
@layout.app_layout ||= @layout.parent.try(:app_layout)
|
|
57
|
+
@layout.content ||= "{{ cms:field:seo.old_page_url:string }}\n{{ cms:field:seo.meta_description:string }}\n{{ cms:field:seo.page_title:string }}\n{{ cms:field:seo.canonical_href:string }}\n{{ cms:field:seo.meta_index:string }}\n{{ cms:field:seo.meta_noindex:string }}\n{{ cms:page:content:rich_text }}"
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def load_layout
|
|
61
|
+
@layout = @site.layouts.find(params[:id])
|
|
62
|
+
rescue ActiveRecord::RecordNotFound
|
|
63
|
+
flash[:danger] = I18n.t('comfy.admin.cms.layouts.not_found')
|
|
64
|
+
redirect_to :action => :index
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def layout_params
|
|
68
|
+
params.fetch(:layout, {}).permit!
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
class Comfy::Cms::ContentController < Comfy::Cms::BaseController
|
|
2
|
+
|
|
3
|
+
# Authentication module must have `authenticate` method
|
|
4
|
+
include ComfortableMexicanSofa.config.public_auth.to_s.constantize
|
|
5
|
+
|
|
6
|
+
before_action :load_fixtures
|
|
7
|
+
before_action :load_cms_page,
|
|
8
|
+
:authenticate,
|
|
9
|
+
:only => :show
|
|
10
|
+
|
|
11
|
+
rescue_from ActiveRecord::RecordNotFound, :with => :page_not_found
|
|
12
|
+
|
|
13
|
+
def show
|
|
14
|
+
|
|
15
|
+
if @cms_page.target_page.present?
|
|
16
|
+
redirect_to @cms_page.target_page.url(:relative)
|
|
17
|
+
else
|
|
18
|
+
respond_to do |format|
|
|
19
|
+
format.html { render_page }
|
|
20
|
+
format.json { render :json => @cms_page }
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def render_sitemap
|
|
26
|
+
render
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
protected
|
|
30
|
+
|
|
31
|
+
def render_page(status = 200)
|
|
32
|
+
if @cms_layout = @cms_page.layout
|
|
33
|
+
app_layout = (@cms_layout.app_layout.blank? || request.xhr?) ? false : @cms_layout.app_layout
|
|
34
|
+
render :inline => @cms_page.content_cache,
|
|
35
|
+
:layout => app_layout,
|
|
36
|
+
:status => status,
|
|
37
|
+
:content_type => mime_type
|
|
38
|
+
else
|
|
39
|
+
render :text => I18n.t('comfy.cms.content.layout_not_found'), :status => 404
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# it's possible to control mimetype of a page by creating a `mime_type` field
|
|
44
|
+
def mime_type
|
|
45
|
+
mime_block = @cms_page.blocks.find_by_identifier(:mime_type)
|
|
46
|
+
mime_block && mime_block.content || 'text/html'
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def load_fixtures
|
|
50
|
+
return unless ComfortableMexicanSofa.config.enable_fixtures
|
|
51
|
+
ComfortableMexicanSofa::Fixture::Importer.new(@cms_site.identifier).import!
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def load_cms_page
|
|
55
|
+
|
|
56
|
+
page = @cms_site.pages.published.find_by_full_path("/#{params[:cms_path]}")
|
|
57
|
+
|
|
58
|
+
if page.present?
|
|
59
|
+
@cms_page = page
|
|
60
|
+
else
|
|
61
|
+
old_page = Comfy::Cms::Block.where(identifier: "seo.old_page_url", content: params[:cms_path].to_s).pluck(:content, :blockable_id, :blockable_type).first
|
|
62
|
+
|
|
63
|
+
if old_page.present?
|
|
64
|
+
if old_page.last == "Comfy::Cms::Page"
|
|
65
|
+
new_page = Comfy::Cms::Page.find_by(id: old_page.second)
|
|
66
|
+
|
|
67
|
+
if new_page.present?
|
|
68
|
+
redirect_to new_page.url(:relative), status: 301
|
|
69
|
+
|
|
70
|
+
return
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
page_not_found
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def page_not_found
|
|
80
|
+
@cms_page = @cms_site.pages.published.find_by_full_path!('/404')
|
|
81
|
+
|
|
82
|
+
respond_to do |format|
|
|
83
|
+
format.html { render_page(404) }
|
|
84
|
+
end
|
|
85
|
+
rescue ActiveRecord::RecordNotFound
|
|
86
|
+
raise ActionController::RoutingError.new("Page Not Found at: \"#{params[:cms_path]}\"")
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
module Comfy::CmsHelper
|
|
2
|
+
|
|
3
|
+
def comfy_seo_tags
|
|
4
|
+
tags = []
|
|
5
|
+
tags << tag('meta', name: 'description', content: cms_block_content('seo.meta_description')) if cms_block_content('seo.meta_description').present?
|
|
6
|
+
tags << tag('meta', name: 'robots', content: cms_block_content('seo.meta_index')) if cms_block_content('seo.meta_index').present?
|
|
7
|
+
tags << tag('meta', name: 'robots', content: cms_block_content('seo.meta_noindex')) if cms_block_content('seo.meta_noindex').present?
|
|
8
|
+
tags << tag('link', rel: 'canonical', href: cms_block_content('seo.canonical_href')) if cms_block_content('seo.canonical_href').present?
|
|
9
|
+
|
|
10
|
+
return tags.join("\n").html_safe
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def comfy_page_title
|
|
14
|
+
cms_block_content('seo.page_title')
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def flash_css_class(type)
|
|
18
|
+
case type.to_sym
|
|
19
|
+
when :notice, :success then 'alert-success'
|
|
20
|
+
when :alert, :failure then 'alert-danger'
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Wrapper around ComfortableMexicanSofa::FormBuilder
|
|
25
|
+
def comfy_form_for(record, options = {}, &proc)
|
|
26
|
+
options[:builder] = ComfortableMexicanSofa::FormBuilder
|
|
27
|
+
options[:layout] ||= :horizontal
|
|
28
|
+
bootstrap_form_for(record, options, &proc)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Injects some content somewhere inside cms admin area
|
|
32
|
+
def cms_hook(name, options = {})
|
|
33
|
+
ComfortableMexicanSofa::ViewHooks.render(name, self, options)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Content of a snippet. Examples:
|
|
37
|
+
# cms_snippet_content(:my_snippet)
|
|
38
|
+
# <%= cms_snippet_content(:my_snippet) do %>
|
|
39
|
+
# Default content can go here.
|
|
40
|
+
# <% end %>
|
|
41
|
+
def cms_snippet_content(identifier, cms_site = @cms_site, &block)
|
|
42
|
+
unless cms_site
|
|
43
|
+
host, path = request.host_with_port.downcase, request.fullpath if respond_to?(:request) && request
|
|
44
|
+
cms_site = Comfy::Cms::Site.find_site(host, path)
|
|
45
|
+
end
|
|
46
|
+
return '' unless cms_site
|
|
47
|
+
|
|
48
|
+
snippet = cms_site.snippets.find_by_identifier(identifier)
|
|
49
|
+
|
|
50
|
+
if !snippet && block_given?
|
|
51
|
+
snippet = cms_site.snippets.create(
|
|
52
|
+
:identifier => identifier,
|
|
53
|
+
:label => identifier.to_s.titleize,
|
|
54
|
+
:content => capture(&block)
|
|
55
|
+
)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
snippet ? snippet.content : ''
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Same as cms_snippet_content but cms tags will be expanded
|
|
62
|
+
def cms_snippet_render(identifier, cms_site = @cms_site, &block)
|
|
63
|
+
return '' unless cms_site
|
|
64
|
+
content = cms_snippet_content(identifier, cms_site, &block)
|
|
65
|
+
render :inline => ComfortableMexicanSofa::Tag.process_content(
|
|
66
|
+
cms_site.pages.build, ComfortableMexicanSofa::Tag.sanitize_irb(content)
|
|
67
|
+
)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Content of a page block. This is how you get content from page:field
|
|
71
|
+
# Example:
|
|
72
|
+
# cms_block_content(:left_column, CmsPage.first)
|
|
73
|
+
# cms_block_content(:left_column) # if @cms_page is present
|
|
74
|
+
def cms_block_content(identifier, blockable = @cms_page)
|
|
75
|
+
tag = blockable && (block = blockable.blocks.find_by_identifier(identifier)) && block.tag
|
|
76
|
+
return '' unless tag
|
|
77
|
+
tag.content
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# For those times when we need to render content that shouldn't be renderable
|
|
81
|
+
# Example: {{cms:field}} tags
|
|
82
|
+
def cms_block_content_render(identifier, blockable = @cms_page)
|
|
83
|
+
tag = blockable && (block = blockable.blocks.find_by_identifier(identifier)) && block.tag
|
|
84
|
+
return '' unless tag
|
|
85
|
+
render :inline => ComfortableMexicanSofa::Tag.process_content(blockable, tag.content)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Same as cms_block_content but with cms tags expanded
|
|
89
|
+
def cms_block_render(identifier, blockable = @cms_page)
|
|
90
|
+
tag = blockable && (block = blockable.blocks.find_by_identifier(identifier)) && block.tag
|
|
91
|
+
return '' unless tag
|
|
92
|
+
render :inline => ComfortableMexicanSofa::Tag.process_content(blockable, tag.render)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Wrapper to deal with Kaminari vs WillPaginate
|
|
96
|
+
def comfy_paginate(collection)
|
|
97
|
+
return unless collection
|
|
98
|
+
if defined?(WillPaginate)
|
|
99
|
+
will_paginate collection
|
|
100
|
+
elsif defined?(Kaminari)
|
|
101
|
+
paginate collection, :theme => 'comfy'
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
class Comfy::Cms::Snippet < ActiveRecord::Base
|
|
2
|
+
self.table_name = 'comfy_cms_snippets'
|
|
3
|
+
|
|
4
|
+
cms_is_categorized
|
|
5
|
+
cms_is_mirrored
|
|
6
|
+
cms_has_revisions_for :content
|
|
7
|
+
|
|
8
|
+
# -- Relationships --------------------------------------------------------
|
|
9
|
+
belongs_to :site
|
|
10
|
+
|
|
11
|
+
# -- Callbacks ------------------------------------------------------------
|
|
12
|
+
before_validation :assign_label
|
|
13
|
+
before_create :assign_position
|
|
14
|
+
after_save :clear_page_content_cache
|
|
15
|
+
after_destroy :clear_page_content_cache
|
|
16
|
+
|
|
17
|
+
# -- Validations ----------------------------------------------------------
|
|
18
|
+
validates :site_id,
|
|
19
|
+
:presence => true
|
|
20
|
+
validates :label,
|
|
21
|
+
:presence => true
|
|
22
|
+
validates :identifier,
|
|
23
|
+
:presence => true,
|
|
24
|
+
:uniqueness => { :scope => :site_id },
|
|
25
|
+
:format => { :with => /\A\w[\/a-z0-9_-]*\z/i }
|
|
26
|
+
|
|
27
|
+
# -- Scopes ---------------------------------------------------------------
|
|
28
|
+
default_scope -> { order('comfy_cms_snippets.position') }
|
|
29
|
+
|
|
30
|
+
protected
|
|
31
|
+
|
|
32
|
+
def assign_label
|
|
33
|
+
self.label = self.label.blank?? self.identifier.try(:titleize) : self.label
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def clear_page_content_cache
|
|
37
|
+
Comfy::Cms::Page.where(:id => site.pages.pluck(:id)).update_all(:content_cache => nil)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def assign_position
|
|
41
|
+
max = self.site.snippets.maximum(:position)
|
|
42
|
+
self.position = max ? max + 1 : 0
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|