Commit f7c887983df69f0a733eb1fd1ba8097c1f28a444
1 parent
43535f4f
Exists in
master
and in
22 other branches
block: add support for custom display modes for blocks
Showing
2 changed files
with
46 additions
and
18 deletions
Show diff stats
app/models/block.rb
| @@ -23,30 +23,41 @@ class Block < ActiveRecord::Base | @@ -23,30 +23,41 @@ class Block < ActiveRecord::Base | ||
| 23 | # * <tt>:article</tt>: the article being viewed currently | 23 | # * <tt>:article</tt>: the article being viewed currently |
| 24 | # * <tt>:language</tt>: in which language the block will be displayed | 24 | # * <tt>:language</tt>: in which language the block will be displayed |
| 25 | def visible?(context = nil) | 25 | def visible?(context = nil) |
| 26 | - if display == 'never' | ||
| 27 | - return false | ||
| 28 | - end | 26 | + return false if display == 'never' |
| 27 | + | ||
| 29 | if context | 28 | if context |
| 30 | - if language != 'all' && language != context[:locale] | ||
| 31 | - return false | ||
| 32 | - end | ||
| 33 | - if display == 'home_page_only' | ||
| 34 | - if context[:article] | ||
| 35 | - return context[:article] == owner.home_page | ||
| 36 | - else | ||
| 37 | - return context[:request_path] == '/' | ||
| 38 | - end | ||
| 39 | - elsif display == 'except_home_page' | ||
| 40 | - if context[:article] | ||
| 41 | - return context[:article] != owner.home_page | ||
| 42 | - else | ||
| 43 | - return context[:request_path] != '/' + (owner.kind_of?(Profile) ? owner.identifier : '') | ||
| 44 | - end | 29 | + return false if language != 'all' && language != context[:locale] |
| 30 | + | ||
| 31 | + begin | ||
| 32 | + return self.send("display_#{display}", context) | ||
| 33 | + rescue NoMethodError => exception | ||
| 34 | + raise "Display '#{display}' is not a valid value." | ||
| 45 | end | 35 | end |
| 46 | end | 36 | end |
| 37 | + | ||
| 38 | + true | ||
| 39 | + end | ||
| 40 | + | ||
| 41 | + def display_always(context) | ||
| 47 | true | 42 | true |
| 48 | end | 43 | end |
| 49 | 44 | ||
| 45 | + def display_home_page_only(context) | ||
| 46 | + if context[:article] | ||
| 47 | + return context[:article] == owner.home_page | ||
| 48 | + else | ||
| 49 | + return context[:request_path] == '/' | ||
| 50 | + end | ||
| 51 | + end | ||
| 52 | + | ||
| 53 | + def display_except_home_page(context) | ||
| 54 | + if context[:article] | ||
| 55 | + return context[:article] != owner.home_page | ||
| 56 | + else | ||
| 57 | + return context[:request_path] != '/' + (owner.kind_of?(Profile) ? owner.identifier : '') | ||
| 58 | + end | ||
| 59 | + end | ||
| 60 | + | ||
| 50 | # The condition for displaying a block. It can assume the following values: | 61 | # The condition for displaying a block. It can assume the following values: |
| 51 | # | 62 | # |
| 52 | # * <tt>'always'</tt>: the block is always displayed | 63 | # * <tt>'always'</tt>: the block is always displayed |
test/unit/block_test.rb
| @@ -205,4 +205,21 @@ class BlockTest < ActiveSupport::TestCase | @@ -205,4 +205,21 @@ class BlockTest < ActiveSupport::TestCase | ||
| 205 | assert_not_equal block.created_at, duplicated.created_at | 205 | assert_not_equal block.created_at, duplicated.created_at |
| 206 | assert_not_equal block.updated_at, duplicated.updated_at | 206 | assert_not_equal block.updated_at, duplicated.updated_at |
| 207 | end | 207 | end |
| 208 | + | ||
| 209 | + should 'support custom display options for blocks visible' do | ||
| 210 | + class MyBlock < Block | ||
| 211 | + def display | ||
| 212 | + 'even_context' | ||
| 213 | + end | ||
| 214 | + | ||
| 215 | + def display_even_context(context) | ||
| 216 | + context % 2 == 0 | ||
| 217 | + end | ||
| 218 | + end | ||
| 219 | + | ||
| 220 | + block = MyBlock.new | ||
| 221 | + | ||
| 222 | + assert block.visible?(2) | ||
| 223 | + assert !block.visible?(3) | ||
| 224 | + end | ||
| 208 | end | 225 | end |