class Decidim::ContentBlockRegistry

This class acts as a registry for content blocks. Check the docs on the `ContentBlockManifest` class to learn how they work.

In order to register a content block, you can follow this example:

Decidim.content_blocks.register(:homepage, :global_stats) do |content_block|
  content_block.cell = "decidim/content_blocks/stats_block"
  content_block.public_name_key = "decidim.content_blocks.stats_block.name"
  content_block.settings_form_cell = "decidim/content_blocks/stats_block_settings_form"

  content_block.settings do |settings|
    settings.attribute :minimum_priority_level,
                       type: :integer
                       default: lambda { StatsRegistry::HIGH_PRIORITY }
  end
end

Content blocks can also register attached images. Here's an example of a content block with 4 attached images:

Decidim.content_blocks.register(:homepage, :carousel) do |content_block|
  content_block.cell = "decidim/content_blocks/carousel_block"
  content_block.public_name_key = "decidim.content_blocks.carousel_block.name"

  content_block.images = [
    {
      name: :image_1,
      uploader: "Decidim::ImageUploader"
    },
    {
      name: :image_2,
      uploader: "Decidim::ImageUploader"
    }
  ]
end

You will probably want to register your content blocks in an initializer in the `engine.rb` file of your module.

Public Instance Methods

all() click to toggle source
# File lib/decidim/content_block_registry.rb, line 75
def all
  content_blocks
end
for(scope) click to toggle source
# File lib/decidim/content_block_registry.rb, line 71
def for(scope)
  content_blocks[scope.to_s]
end
register(scope, name) { |content_block| ... } click to toggle source

Public: Registers a content block for the home page.

scope - a symbol or string representing the scope of the content block.

Will be persisted as a string.

name - a symbol representing the name of the content block &block - The content block definition.

Returns nothing. Raises an error if there's already a content block registered with that name.

# File lib/decidim/content_block_registry.rb, line 52
def register(scope, name)
  scope = scope.to_s
  block_exists = content_blocks[scope].any? { |content_block| content_block.name == name }

  if block_exists
    raise(
      ContentBlockAlreadyRegistered,
      "There's a content block already registered with the name `:#{name}` for the scope `:#{scope}, must be unique"
    )
  end

  content_block = ContentBlockManifest.new(name: name)

  yield(content_block)

  content_block.validate!
  content_blocks[scope].push(content_block)
end

Private Instance Methods

content_blocks() click to toggle source
# File lib/decidim/content_block_registry.rb, line 83
def content_blocks
  @content_blocks ||= Hash.new { |h, k| h[k] = [] }
end