class Block < ActiveRecord::Base
# to be able to generate HTML
include ActionView::Helpers::UrlHelper
include ActionView::Helpers::TagHelper
# Block-specific stuff
include BlockHelper
acts_as_list :scope => :box
belongs_to :box
acts_as_having_settings
named_scope :enabled, :conditions => { :enabled => true }
# Determines whether a given block must be visible. Optionally a
# context must be specified. context must be a hash, and
# may contain the following keys:
#
# * :article: the article being viewed currently
def visible?(context = nil)
if settings[:visible] == false || display == 'never'
return false
end
if context && context[:article] && display == 'home_page_only'
return context[:article] == owner.home_page
end
true
end
# The condition for displaying a block. It can assume the following values:
#
# * 'always': the block is always displayed
# * 'never': the block is hidden (it does not appear for visitors)
# * 'home_page_only' the block is displayed only when viewing the
# homepage of its owner.
def display
if settings[:visible] == false
'never'
else
settings[:display] || 'always'
end
end
# Sets the value attribute.
def display=(value)
settings[:display] = value
# clear the old setting
settings[:visible] = nil
end
# returns the description of the block, used when the user sees a list of
# blocks to choose one to include in the design.
#
# Must be redefined in subclasses to match the description of each block
# type.
def self.description
'(dummy)'
end
# Returns the content to be used for this block.
#
# This method can return several types of objects:
#
# * String: if the string starts with http:// or https://, then it is assumed to be address of an IFRAME. Otherwise it's is used as regular HTML.
# * Hash: the hash is used to build an URL that is used as the address for a IFRAME.
# * Proc: the Proc is evaluated in the scope of BoxesHelper. The
# block can then use render, link_to, etc.
#
# The method can also return nil, which means "no content".
#
# See BoxesHelper#extract_block_content for implementation details.
def content
"This is block number %d" % self.id
end
# A footer to be appended to the end of the block. Returns nil.
#
# Override in your subclasses. You can return the same types supported by
# #content.
def footer
nil
end
# Is this block editable? (Default to false)
def editable?
true
end
# must always return false, except on MainBlock clas.
def main?
false
end
def owner
box ? box.owner : nil
end
def default_title
''
end
def title
if self[:title].blank?
self.default_title
else
self[:title]
end
end
def view_title
title
end
def cacheable?
true
end
def cache_keys
"block-id-#{id}"
end
def timeout
4.hours
end
end