Add the ability to extend sitemaps
Clarke Brunsdon
committed Jan 23, 2012
commit 75cd666903f1933332c84bf23cf8ac7567756c1e
Showing 5
changed files with
66 additions
and 1 deletions
app/views/cms_content/render_sitemap.xml.builder
+1
-0
| @@ | @@ -11,4 +11,5 @@ xml.urlset :xmlns => 'http://www.sitemaps.org/schemas/sitemap/0.9' do |
| xml.lastmod page.updated_at.strftime('%Y-%m-%d') | |
| end | |
| end | |
| + | ComfortableMexicanSofa::Sitemap.process(@cms_site, self, xml) |
| end | |
comfortable_mexican_sofa.rb b/lib/comfortable_mexican_sofa.rb
+2
-1
| @@ | @@ -13,6 +13,7 @@ end |
| 'comfortable_mexican_sofa/view_methods', | |
| 'comfortable_mexican_sofa/form_builder', | |
| 'comfortable_mexican_sofa/tag', | |
| + | 'comfortable_mexican_sofa/sitemap', |
| 'comfortable_mexican_sofa/fixtures', | |
| 'comfortable_mexican_sofa/extensions/rails', | |
| 'comfortable_mexican_sofa/extensions/acts_as_tree', | |
| @@ | @@ -58,4 +59,4 @@ module ComfortableMexicanSofa |
| end | |
| end | |
| - | end |
| \ No newline at end of file | |
| + | end |
comfortable_mexican_sofa/sitemap.rb b/lib/comfortable_mexican_sofa/sitemap.rb
+26
-0
| @@ | @@ -0,0 +1,26 @@ |
| + | module ComfortableMexicanSofa |
| + | class Sitemap |
| + | # we want our callback to include the cms_site and |
| + | # the view so we have whatever routes are available to us |
| + | # xml is an xml_builder which expects a sitemap url definition, e.g: |
| + | # xml.url do |
| + | # xml.loc view.url_for("http://example.org/example") |
| + | # xml.lastmod 2.days.ago.strftime('%Y-%m-%d') |
| + | # end |
| + | def self.process(cms_site, view, xml) |
| + | self.sitemap_extensions.each do |extension| |
| + | extension.call(cms_site, view, xml) |
| + | end |
| + | end |
| + | |
| + | def self.register_extension(callback) |
| + | self.sitemap_extensions.push(callback) |
| + | end |
| + | |
| + | private |
| + | # A list of registered sitemap extension methods |
| + | def self.sitemap_extensions |
| + | @@sitemap_extensions ||= [] |
| + | end |
| + | end |
| + | end |
test/functional/cms_content_controller_test.rb
+17
-0
| @@ | @@ -182,4 +182,21 @@ class CmsContentControllerTest < ActionController::TestCase |
| assert_match '<loc>http://test.host/en/child-page</loc>', response.body | |
| end | |
| + | class TestRenderException |
| + | def self.callback(cms_site, view, xml) |
| + | xml.url do |
| + | # make sure we have the view |
| + | xml.loc view.url_for("http://test.host/test_render") |
| + | xml.lastmod 2.days.ago.strftime('%Y-%m-%d') |
| + | end |
| + | end |
| + | end |
| + | |
| + | def test_rendering_sitemap_with_extensions |
| + | ComfortableMexicanSofa::Sitemap.register_extension(TestRenderException.method(:callback)) |
| + | get :render_sitemap, :format => :xml |
| + | assert_response :success |
| + | assert_match '<loc>http://test.host/test_render</loc>', response.body |
| + | end |
| + | |
| end | |
test/unit/sitemap_test.rb
+20
-0
| @@ | @@ -0,0 +1,20 @@ |
| + | require File.expand_path('../test_helper', File.dirname(__FILE__)) |
| + | |
| + | class SitemapTest < ActiveSupport::TestCase |
| + | class DummySitemapExtension |
| + | @@calls = 0 |
| + | def self.calls |
| + | @@calls |
| + | end |
| + | def self.callback(cms_site, xml) |
| + | @@calls = @@calls + 1 |
| + | end |
| + | end |
| + | |
| + | def test_should_get_registered_extensions |
| + | ComfortableMexicanSofa::Sitemap.register_extension(DummySitemapExtension.method(:callback)) |
| + | ComfortableMexicanSofa::Sitemap.process(cms_sites(:default), "xml") |
| + | assert_equal 1, DummySitemapExtension.calls |
| + | end |
| + | |
| + | end |