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