more defined rendering flow
Oleg
committed Aug 24, 2010
commit 100ee99db40dd082b25d7437257f0537995e098c
Showing 14
changed files with
118 additions
and 91 deletions
app/models/cms_block.rb
+24
-0
| @@ | @@ -0,0 +1,24 @@ |
| + | class CmsBlock < ActiveRecord::Base |
| + | |
| + | # -- Relationships -------------------------------------------------------- |
| + | belongs_to :cms_page |
| + | |
| + | # -- Validations ---------------------------------------------------------- |
| + | validates :label, |
| + | :presence => true, |
| + | :uniqueness => true |
| + | |
| + | # -- Class Methods -------------------------------------------------------- |
| + | def self.initialize_subclass_content_blocks(content = '') |
| + | # todo |
| + | end |
| + | |
| + | # method called by the subclasses |
| + | def self.initialize_content_blocks(content = '') |
| + | content.scan(regex_tag_signature).flatten.collect do |label| |
| + | # todo, grab from db if exist |
| + | self.new(:label => label) |
| + | end |
| + | end |
| + | |
| + | end |
app/models/cms_page.rb
+10
-1
| @@ | @@ -1,7 +1,16 @@ |
| class CmsPage < ActiveRecord::Base | |
| + | # -- Relationships -------------------------------------------------------- |
| belongs_to :cms_layout | |
| + | has_many :cms_blocks, :dependent => :destroy |
| - | has_many :page_contents, :dependent => :destroy |
| + | # -- Instance Methods ----------------------------------------------------- |
| + | def content |
| + | content = cms_layout.content.dup |
| + | cms_blocks.each do |block| |
| + | content.gsub!(block.regex_tag_signature, block.render) |
| + | end |
| + | content |
| + | end |
| end | |
app/models/cms_page_content.rb
+0
-13
| @@ | @@ -1,13 +0,0 @@ |
| - | class CmsPageContent < ActiveRecord::Base |
| - | |
| - | belongs_to :cms_page |
| - | |
| - | # -- Class Methods -------------------------------------------------------- |
| - | # method called by the subclasses |
| - | def self.initialize_content_objects(content = '') |
| - | content.scan(regex_tag_signature).flatten.collect do |label| |
| - | self.new(:label => label) |
| - | end |
| - | end |
| - | |
| - | end |
app/models/cms_page_text.rb
+25
-0
| @@ | @@ -0,0 +1,25 @@ |
| + | class CmsPageText < CmsBlock |
| + | |
| + | # -- Class Methods -------------------------------------------------------- |
| + | # will match tags with this format: |
| + | # <cms:page:label:text /> |
| + | # <cms:page:label /> |
| + | def self.regex_tag_signature(label = nil) |
| + | label ||= /\w+/ |
| + | /<\s*?cms:page:(#{label}):?(?:text)?\s*?\/?>/ |
| + | end |
| + | |
| + | # -- Instance Methods ----------------------------------------------------- |
| + | def regex_tag_signature |
| + | self.class.regex_tag_signature(label) |
| + | end |
| + | |
| + | def content |
| + | read_attribute(:content_text) |
| + | end |
| + | |
| + | def render |
| + | content |
| + | end |
| + | |
| + | end |
| \ No newline at end of file | |
app/models/cms_page_text_content.rb
+0
-17
| @@ | @@ -1,17 +0,0 @@ |
| - | class CmsPageTextContent < CmsPageContent |
| - | |
| - | # -- Class Methods -------------------------------------------------------- |
| - | # will match tags with this format: |
| - | # <cms:page:label:text /> |
| - | # <cms:page:label /> |
| - | def self.regex_tag_signature(label = nil) |
| - | label ||= /\w+/ |
| - | /<\s*?cms:page:(#{label}):?(?:text)?\s*?\/?>/ |
| - | end |
| - | |
| - | # -- Instance Methods ----------------------------------------------------- |
| - | def regex_tag_signature |
| - | self.class.regex_tag_signature(label) |
| - | end |
| - | |
| - | end |
| \ No newline at end of file | |
migrate/01_create_cms.rb b/db/migrate/01_create_cms.rb
+4
-3
| @@ | @@ -14,12 +14,13 @@ class CreateCms < ActiveRecord::Migration |
| t.string :label | |
| t.string :slug | |
| t.string :full_path | |
| + | t.text :content |
| t.timestamps | |
| end | |
| add_index :cms_pages, :full_path | |
| - | # -- Page Content -------------------------------------------------------- |
| - | create_table :cms_page_contents do |t| |
| + | # -- Page Blocks -------------------------------------------------------- |
| + | create_table :cms_blocks do |t| |
| t.string :type | |
| t.integer :cms_page_id | |
| t.string :label | |
| @@ | @@ -28,7 +29,7 @@ class CreateCms < ActiveRecord::Migration |
| t.integer :content_integer | |
| t.timestamps | |
| end | |
| - | add_index :cms_page_contents, [:cms_page_id, :type, :label] |
| + | add_index :cms_blocks, [:cms_page_id, :type, :label] |
| # -- Snippets ----------------------------------------------------------- | |
| create_table :cms_snippets do |t| | |
test/fixtures/cms_blocks.yml
+7
-0
| @@ | @@ -0,0 +1,7 @@ |
| + | default: &page_content |
| + | cms_page: default |
| + | type: CmsPageText |
| + | label: content |
| + | content_text: Text Content |
| + | content_string: |
| + | content_integer: |
test/fixtures/cms_layouts.yml
+1
-7
| @@ | @@ -1,10 +1,4 @@ |
| default: &layout | |
| label: Default Layout | |
| content: |- | |
| - | <html> |
| - | <cms:page:header/> |
| - | <div class='content'> |
| - | <cms:page:content> |
| - | </div> |
| - | <cms:page:footer> |
| - | </html> |
| + | <cms:page:content> |
test/fixtures/cms_page_contents.yml
+0
-7
| @@ | @@ -1,7 +0,0 @@ |
| - | default: &page_content |
| - | cms_page: default |
| - | type: CmsPageTextContent |
| - | label: content |
| - | content_text: Text Content |
| - | content_string: |
| - | content_integer: |
test/unit/cms_block_test.rb
+9
-0
| @@ | @@ -0,0 +1,9 @@ |
| + | require File.dirname(__FILE__) + '/../test_helper' |
| + | |
| + | class CmsBlockTest < ActiveSupport::TestCase |
| + | |
| + | def test_something |
| + | flunk |
| + | end |
| + | |
| + | end |
test/unit/cms_page_content_test.rb
+0
-9
| @@ | @@ -1,9 +0,0 @@ |
| - | require File.dirname(__FILE__) + '/../test_helper' |
| - | |
| - | class CmsPageContentTest < ActiveSupport::TestCase |
| - | |
| - | def test_something |
| - | flunk |
| - | end |
| - | |
| - | end |
test/unit/cms_page_test.rb
+3
-2
| @@ | @@ -2,8 +2,9 @@ require File.dirname(__FILE__) + '/../test_helper' |
| class CmsPageTest < ActiveSupport::TestCase | |
| - | def test_something |
| - | flunk |
| + | def test_render |
| + | page = cms_pages(:default) |
| + | assert_equal 'Text Content', page.content |
| end | |
| end | |
test/unit/cms_page_text_content_test.rb
+0
-32
| @@ | @@ -1,32 +0,0 @@ |
| - | require File.dirname(__FILE__) + '/../test_helper' |
| - | |
| - | class CmsPageTextContentTest < ActiveSupport::TestCase |
| - | |
| - | def test_regex_tag_signature |
| - | %w( |
| - | <cms:page:content:text/> |
| - | <cms:page:content/> |
| - | <cms:page:content> |
| - | <cms:page:content:text> |
| - | ).each do |tag| |
| - | assert_match CmsPageTextContent.regex_tag_signature, tag |
| - | assert_match CmsPageTextContent.regex_tag_signature('content'), tag |
| - | assert_match cms_page_contents(:default).regex_tag_signature, tag |
| - | end |
| - | |
| - | assert_no_match CmsPageTextContent.regex_tag_signature, '<cms:page:header:string>' |
| - | assert_no_match CmsPageTextContent.regex_tag_signature('something'), '<cms:page:header:text/>' |
| - | assert_no_match CmsPageTextContent.regex_tag_signature, '<cms_page:header>' |
| - | end |
| - | |
| - | def test_initialization_of_content_objects |
| - | content = cms_layouts(:default).content |
| - | objects = CmsPageTextContent.initialize_content_objects(content) |
| - | assert_equal 3, objects.size |
| - | objects.each do |object| |
| - | assert_equal CmsPageTextContent, object.class |
| - | assert_not_nil object.label |
| - | end |
| - | end |
| - | |
| - | end |
test/unit/cms_page_text_test.rb
+35
-0
| @@ | @@ -0,0 +1,35 @@ |
| + | require File.dirname(__FILE__) + '/../test_helper' |
| + | |
| + | class CmsPageTextTest < ActiveSupport::TestCase |
| + | |
| + | def test_regex_tag_signature |
| + | %w( |
| + | <cms:page:content:text/> |
| + | <cms:page:content/> |
| + | <cms:page:content> |
| + | <cms:page:content:text> |
| + | ).each do |tag| |
| + | assert_match CmsPageText.regex_tag_signature, tag |
| + | assert_match CmsPageText.regex_tag_signature('content'), tag |
| + | assert_match cms_blocks(:default).regex_tag_signature, tag |
| + | end |
| + | |
| + | assert_no_match CmsPageText.regex_tag_signature, '<cms:page:header:string>' |
| + | assert_no_match CmsPageText.regex_tag_signature('something'), '<cms:page:header:text/>' |
| + | assert_no_match CmsPageText.regex_tag_signature, '<cms_page:header>' |
| + | end |
| + | |
| + | def test_initialization_of_content_objects |
| + | content = cms_layouts(:default).content |
| + | block = CmsPageText.initialize_content_blocks(content).first |
| + | assert_equal CmsPageText, block.class |
| + | end |
| + | |
| + | def test_method_content |
| + | block = cms_blocks(:default) |
| + | assert_equal CmsPageText, block.class |
| + | assert_equal block.read_attribute(:content_text), block.content |
| + | assert_equal block.content, block.render |
| + | end |
| + | |
| + | end |