Versions Compared
Key
- This line was added.
- This line was removed.
- Formatting was changed.
Description
Status | ||||||
---|---|---|---|---|---|---|
|
A Landing Page has a customizable layout with multiple zones where you can place predefined blocks with content.
By default eZ Enterprise comes with a number of preset Landing Page blocks. You can, however, add custom blocks to your configuration.
Solution
Block configuration
In the Demo installation the layout configuration is stored in ezstudio-demo-bundle/Resources/config/default_layouts.yml
:
Code Block | ||||
---|---|---|---|---|
| ||||
blocks: gallery: views: gallery: template: eZStudioDemoBundle:blocks:gallery.html.twig name: Default Gallery Block template keyword: views: keyword: template: eZStudioDemoBundle:blocks:keyword.html.twig name: Default Keyword Block template rss: views: rss: template: eZStudioDemoBundle:blocks:rss.html.twig name: Default RSS Block template tag: views: tag: template: eZStudioDemoBundle:blocks:tag.html.twig name: Default Tag Block template |
Creating a new block
Creating a class for the block
The class for the block must implement the BlockType
interface:
Code Block |
---|
EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Model\BlockType |
Most methods are implemented in a universal way by using the AbstractBlockType
abstract class:
Code Block |
---|
EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Model\AbstractBlockType |
If your block does not have specific attributes or a structure, you can extend the AbstractBlockType
class, which contains simple generic converters designated for the block attributes.
For example:
Code Block | ||
---|---|---|
| ||
<?php namespace AcmeDemoBundle\Block; use EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Model\AbstractBlockType; /** * RSS block * Renders feed from a given URL. */ class RSSBlock extends AbstractBlockType { // Class body } |
Describing a class definition
A block must have a definition set using two classes:
BlockAttributeDefinition
The BlockAttributeDefinition
class defines the attributes of a block:
Attribute | Type | Definition |
---|---|---|
$id | string | block attribute ID |
$name | string | block attribute name |
$type | string | block attribute type, available options are:
|
$regex | string | block attribute regex used for validation |
$regexErrorMessage | string | message displayed when regex does not match |
$required | bool | TRUE if attribute is required |
$inline | bool | indicates whether block attribute input should be rendered inline in a form |
$values | array | array of chosen values |
$options | array | array of available options |
BlockDefinition
The BlockDefinition
class describes a block:
Attribute | Type | Definition | Note |
---|---|---|---|
$type | string | block type | |
$name | string | block name | |
$category | string | block category | |
$thumbnail | string | path to block thumbnail image | |
$templates | array | array of available paths of templates | Retrieved from the config file (default_layouts.yml) |
$attributes | array | array of block attributes (objects of BlockAttributeDefinition class) |
When extending AbstractBlockType
you must implement at least 3 methods:
Expand | |||||
---|---|---|---|---|---|
| |||||
This method must return an Example of a Gallery block:
|
Expand | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||
This method returns an array of parameters to be displayed in rendered view of block. You can access them directly in a block template (e. g. via twig
Example of the
|
Expand | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||
This method validates the input fields for a block. You can specify your own conditions to throw the This
For example:
|
Note |
---|
When the class is created make sure it is added to a container. |
Adding the class to the container
The services.yml file must contain info about your block class.
Note |
---|
The description of your class must contain a tag which provides:
|
For example:
Code Block |
---|
acme.landing_page.block.rss: # service id class: AcmeDemoBundle\FieldType\LandingPage\Model\Block\RSSBlock # block's class with namespace tags: # service definition must contain tag with - { name: landing_page_field_type.block_type, alias: rss} # "landing_page_field_type.block_type" name and block name as an alias |
Custom editing UI
If you want to add a custom editing UI to your new block, you need to provide the code for the custom popup UI in Javascript (see the code for eZS.ScheduleBlockView or eZS.TagBlockView for examples).
Once it is ready, create a plugin for eZS.LandingPageCreatorView
that makes a use of the addBlock
public method from eZS.LandingPageCreatorView
, see the example below:
Code Block |
---|
YUI.add('ezs-addcustomblockplugin', function (Y) { 'use strict'; var namespace = 'Any.Namespace.Of.Your.Choice', Y.namespace(namespace); NS = Y[namespace]; NS.Plugin.AddCustomBlock = Y.Base.create('addCustomBlockPlugin', Y.Plugin.Base, [], { initializer: function () { this.get('host').addBlock('custom', NS.CustomBlockView); }, }, { NS: 'dashboardPlugin' }); Y.eZ.PluginRegistry.registerPlugin( NS.Plugin.AddCustomBlock, ['landingPageCreatorView'] ); }); |
Info | ||
---|---|---|
| ||
The ability to configure different templates (views) for one Landing Page block is upcoming. See EZS-1008 to follow its progress. |
Example
Block Class
Code Block | ||||
---|---|---|---|---|
| ||||
<?php /** * @copyright Copyright (C) eZ Systems AS. All rights reserved. * @license For full copyright and license information view LICENSE file distributed with this source code. */ namespace EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Model\Block; use EzSystems\LandingPageFieldTypeBundle\Exception\InvalidBlockAttributeException; use EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Definition\BlockDefinition; use EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Definition\BlockAttributeDefinition; use EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Model\AbstractBlockType; use EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Model\BlockType; use EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Model\BlockValue; /** * Tag block * Renders simple HTML. */ class TagBlock extends AbstractBlockType implements BlockType { /** * Returns array of parameters required to render block template. * * @param array $blockValue Block value attributes * * @return array Template parameters */ public function getTemplateParameters(BlockValue $blockValue) { return ['block' => $blockValue]; } /** * Creates BlockDefinition object for block type. * * @return \EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Definition\BlockDefinition */ public function createBlockDefinition() { return new BlockDefinition( 'tag', 'Tag Block', 'default', 'bundles/ezsystemslandingpagefieldtype/images/thumbnails/tag.svg', [], [ new BlockAttributeDefinition( 'content', 'Content', 'text', '/[^\\s]/', 'Provide html code' ), ] ); } /** * Checks if block's attributes are valid. * * @param array $attributes * * @throws \EzSystems\LandingPageFieldTypeBundle\Exception\InvalidBlockAttributeException */ public function checkAttributesStructure(array $attributes) { if (!isset($attributes['content'])) { throw new InvalidBlockAttributeException('Tag', 'content', 'Content must be set.'); } } } |
Tip | ||||||||
---|---|---|---|---|---|---|---|---|
If you want to make sure that your block is only available in the Element menu in a specific situation, you can use override the
|
service.yml configuration
Code Block | ||||
---|---|---|---|---|
| ||||
ezpublish.landing_page.block.tag: class: EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Model\Block\TagBlock tags: - { name: landing_page_field_type.block_type, alias: tag } |
Block template
{{ block.attributes.content|raw }}