Skip to main content

SimpleLayout provides block based content pages

Project description

Table of Contents


SimpleLayout provides an intuitive way of adding and arranging the different elements of a page such as paragraphs, images, files and links using drag-and-drop functionality. These elements are implemented as addable and easily arrangeable “blocks”. Because of the restricted dimensions of text, images and other content elements, the general result is content with a uniform look and feel throughout the site.


Plone 4.3.x


To have proper styles we recommend using plonetheme.blueberry.

Plone 5

Plone 5 is supported but without any default contenttypes.


  • Add the package to your buildout configuration (Plone 4.3.x with ContentTypes):
eggs +=
  • With mapblock:
eggs +=
    ftw.simplelayout[contenttypes, mapblock]
  • Or wihtout any extras (Plone 5 is supported):
eggs +=

Then you got several profile from wich you can choose from:

  • ftw.simplelayout lib profile - Just the basics without any ContentTypes. This profile is also available for Plone 5
  • ftw.simplelayout default profile - Installs Simplelayout with default ContentTypes and everything you need to create content the Simplelayout way.
  • ftw.simplelayout development profile - Installs non minified versions of simplelayout.js and simplelayout.css - for DEV environments. You need to install this profile on top of lib or the default profile
  • Overlays for manipulate blocks, such as adding, deleting and modifying.
  • Saving the current Simplelayout state.
  • Loading the configuration of a simplelayout page.
  • Reloading blocks with additional parameters, view, or data attributes.


First steps

It’s a good idea to install the default profile, which ships some basic contenttypes, such as ContentPage and TextBlock.

Simply add a new ContentPage instead of a Plone Document. A Toolbox appears on right, which allows you to create content on/in your ContentPage with Simplelayout.

By default you can choose between a 1 column, 2 Column or 4 Column layout. Simplelayout adds an empty 1 column layout for you by default, so you can directly start adding a Block.

Just drag the Block of your choice, for example a TextBlock, into the layout. Enter title, body text and/or an image. Then click save.

As you see, you never going to leave the ContentPage, all actions with Simplelayout are asynchronous. This means adding, deleting and editing always opens an overlay, where you can make the modifications.


Simplelayout ships by default with two content types. One folderish type, the ContentPage and one block type, the TextBlock.


The ContentPage is a simple folderish dexterity based contenttype, which does nearly nothing, but has the @@simplelayout-view view configured by default. It’s possible to add a ContentPage within a ContentPage


The TextBlock provides the following fields:

  • Title (Well, this will be the title of the block, rendered as h2).
  • Show title? (Decide if the title will be displayed or not).
  • Text
  • Image

Title, or Text, or the image is needed to successfully add a new block

The TextBlock configuration allows you to use this block to show text only or images only, or of course both. There’s no need of a single block for images and a single block for text.

Add TextBlock

Add TextBlock


  • The Teaser behavior is enabled by default on TextBlock. It allows you to add an internal or external link to the block.
  • The show_title behavior is disabled by default. It can be enabled to add a checkbox to the configuration of contentpages. With this checkbox, the title can be hidden.


ftw.simplelayout provides a Simplelayout Portlet which alows you to move Blocks into the right, or left column. You simply have to assign the portlet on a specific context, or type.

Example (How to assign the portlet by default to all Simplelayout ContentPages).


<?xml version="1.0"?>

Simplelayout your site

Yes it’s simple:

  • Add layouts by Drag’n’Drop
  • Add Blocks by Drag’n’Drop
  • Upload images directly by Drag’n’Drop [Comming soon]
  • Change representation of blocks directly on the Block itself
  • Responsive by default
  • Create multiple column pages with ease.
  • Uninstall profile



  1. Fork this repo
  2. Clone your fork
  3. Shell: ln -s development.cfg buidlout.cfg
  4. Shell: python
  5. Shell: bin/buildout

Run bin/test to test your changes.

Or start an instance by running bin/instance fg.

Create new Block

Make your content blockish, needs only two steps.

  1. The only difference between a block and other DX content types is the SimplelayoutBlockBehavior. You can simply add the Block behavior to your content by adding the following line to FTI:
<property name="behaviors">
    <element value="ftw.simplelayout.interfaces.ISimplelayoutBlock" />
  1. In order you block knows how to represent himself on a simplelayout page you need to register a block_view for your Block.

Register view with zcml:


Corresponding template:

<h2 tal:content="context/Title">Title of block</h2>

<!-- Assume you got a text field on your content -->
<div tal:replace="structure here/text/output | nothing" />

Well basically that’s it :-) You just created a new block!!

Directly edit items in a folderish block

For this purpose you can place a link in the rendered block. Assume you want to edit a file in a listing block: you need a link, which is pointing to ./sl-ajax-inner-edit-view, has the css class inneredit and a data attribute named uid containing the uid of the content.

<a href="./sl-ajax-inner-edit-view"
   tal:attributes="data-uid file_object/UID">EDIT</a>

After editing the content, the view automatically reloads the block.

Run custom JS code

Some Blocks need to run some JS code after rendering or for the widget itself while adding/editing. For this use case you can simply listen to the jquerytools overlay events.

Run JS after adding and editing a Block

This example has been taken from the MapBlock. It uses the onBeforeClose event of jquerytools Overlay to load the collectivegeo map.

  $(document).on('onBeforeClose', '.overlay', function(){
    if ($.fn.collectivegeo) {

Run JS after the overlay has been displayed

This example has been taken from the MapBlock. It uses the onLoad event of jquerytools Overlay to load the collectivegeo map in edit mode.

  $(document).on('onLoad', '.overlay', function(){
    if ($.fn.collectivegeo) {
      var maps = $('.widget-cgmap').filter(':visible');
      var map_widgets = $('.map-widget .widget-cgmap').filter(':visible');

More JS events

jQueryTools Overlay provides two more events:

  • onBeforeLoad
  • onClose

Check jQueryTools Overlay Documentation

Modify the Simplelayout configuration

The simplelayout JS lib can be modified by the data-sl-settings on the simplelayout container. Currently supported settings:

  • layouts
  • canChangeLayouts
  1. You’re able to modify those settings globally through the Simplelayout control panel. For example:
{"layouts": [1]}

All Simplelayout sites are configured to have only 1 column Layouts

  1. Using a ISimplelayoutContainerConfig Adapter, which adapts a context and request, which means you can have different settings for different Simplelayout enabled types.


from ftw.simplelayout.contenttypes.contents.interfaces import IContentPage
from ftw.simplelayout.interfaces import ISimplelayoutContainerConfig

class ContenPageConfigAdapter(object):

    def __init__(self, context, request):

    def __call__(self, settings):
        settings['layouts'] = [1]

    def default_page_layout():
        return None

               adapts=(IContentPage, Interface))

Note 1: The adapter gets called with the settings Dictionary, so you don’t have to return it.

Note 2: With the default_page_layout method you can also define default layouts, which are pre renderd on a empty page.

  1. Using the View itself, by overwrite the update_simplelayout_settings method.
from ftw.simplelayout.browser.simplelayout import SimplelayoutView

class CustomSimplelayoutView(SimplelayoutView):

    def update_simplelayout_settings(self, settings):
        settings['layouts'] = [1, 4]
  1. By default the canChangeLayouts option is injected by the Simplelayout provider. It checks if the current logged in user has the ftw.simplelayout: Change Layouts permission.

OpenGraph support

Simplelayouts provides a basic OpenGraph integration. You can disable (Simplelayout Settings - Control Panel) Opengraph for the plone root as you wish, because it’s enabled by default. On Simplelayout sites itself the OpenGraph meta tags can be controlled by the OpenGraph marker behavior.

Migration from ftw.contentpage

This package is the successor of ftw.contentpage. In order to migrate from ftw.contentpage types to ftw.simplelayout types, take a look at the preconfigured inplace migrators in the of ftw.simplelayout.

Client Library


Rebuilding the library (resources/ftw.simplelayout.js):

grunt dist

Watching for changes and rebuild the bundle automatically:

grunt dev

or the default task



Running all test:

npm test


grunt test

Running a specific test:

grunt test --grep="Name of your test"


Provide a toolbox instance for the simplelayout.

var toolbox = new Toolbox({
  layouts: [1, 2, 4],
  canChangeLayout: true, // Decides if toolbox get rendered
  blocks: [
    { title: "Textblock", contentType: "textblock", formUrl: "URL",
      actions: {
        edit: {
          description: "Edit this block",
          someCustomAttribute: "someCustomValue"
        move: {
          class: "move",
          description: "Move this block"
    { title: "Listingblock", contentType: "listingblock", formUrl: "URL" }
  layoutActions: {
    actions: {
      move: {
        class: "iconmove move",
        title: "Move this layout arround."
      delete: {
        class: "icondelete delete",
        title: "Delete this layout."
  labels: {
    labelColumnPostfix: "Column(s)" // Used for label in toolbox


key is required description
title   Title in the toolbox
description   Used for titleattribute
contentType Represents the type for each block
actions Describes the actions


key is required description
key Name for the action
class   Classattribute for the action
description   Used for title attribute
custom   Will be provided as data attribute


Use toolbox instance for initializing a simplelayout.

var simplelayout = new Simplelayout({toolbox: toolbox});


Use existing markup for deserializing the simplelayout state.

Provided HTML Structure

<div class="sl-simplelayout" id="slot1">
  <div class="sl-layout">
    <div class="sl-column">
      <div class="sl-block" data-type="textblock">
        <div class="sl-block-content"></div>
    <div class="sl-column">
      <div class="sl-block" data-type="textblock">
        <div class="sl-block-content"></div>
    <div class="sl-column">
      <div class="sl-block" data-type="textblock">
        <div class="sl-block-content">
          <p>I am a textblock</p>
    <div class="sl-column"></div>

Make sure that each datatype in the structure is covered in the toolbox.


Attach events using the singleton instance of eventEmitter.

var simplelayout = new Simplelayout({toolbox: toolbox});
simplelayout.on(eventType, callback);













DOM properties

Each block and layout is represented in the DOM through an ID.

Each DOM element provides the following properties:

  • object –> object representation in simplelayout
  • parent –> parent object representation in simplelayout
  • id –> generated UUID for this element
  • represents –> representer from origin (empty if object only exists local)

These properties can get extracted as a jQueryElement:

var block = $(".sl-block").first();
var blockObj =;


  • Update/Finish examples.
  • Update/Add images (animated gifs).
  • Improve Plone 5 support (probably with plone 5 contentttypes).
  • Archetypes block integration (for legacy packages).


1.19.0 (2017-11-01)

  • The browser does no longer jump to the top when opening an overlay. [Kevin Bieri]
  • Handle view names in unicode strings. [mbaechtold]
  • New Feature: Asymmetric layouts. [Kevin Bieri, mathias.leimgruber]
    • Introduced layout configurations (classes on layouts)
    • By default we have golden ratio-, 1-2-1-, 3-1, 1-1-2-layouts
    • This change introduces two now wrappers (div-tag), while render the simplelayout content. Please be aware that those new wrappers may break your CSS selectors.

1.18.5 (2017-07-25)

  • Handle view names in unicode strings. [mbaechtold]
  • Add anchor to new created blocks. [Kevin Bieri]
  • The galleryblock now renders a fallback image when the image to be displayed is truncated. [mbaechtold]
  • Make iframe fixes compatible with ftw.iframefix 2.0. [Kevin Bieri]
  • Use a static vocabulary for the sort options of the gallery block. [mbaechtold]
  • Install ftw.iframefix [Kevin Bieri]

1.18.4 (2017-06-15)

  • Add more sorting options (position in parent, id) to the gallery block. [mbaechtold]
  • Move print styles accidentally defined in plonetheme.blueberry. [Kevin Bieri]
  • Migration: Handle different simplelayout layouts. [lknoepfel]
  • Disable kss spinner. [Kevin Bieri]

1.18.3 (2017-04-06)

  • Fix ordering error on Plone site root. [jone]

1.18.2 (2017-03-30)

  • Fix UnboundLocalError in the simplelayout portlet. [mbaechtold]
  • Make anchor extraction more robust. [mbaechtold]
  • Remove unused “addable_block_types” method from simplelayout view. [jone]

1.18.1 (2017-03-23)

  • Fix copy/paste bug with p.a.referenceablebehavior. [jone]
  • Make sure is installed. [jone]

1.18.0 (2017-03-23)

  • Improve anchor extraction. [mbaechtold]
  • Synchronize simplelayout block order to Plone’s ordered container. [jone]
  • Improve support for hidden blocks introduced in 1.2.1. [mbaechtold]

1.17.2 (2017-03-07)

  • Make MapBlock addable on plone site per default [raphael-s]

1.17.1 (2017-02-28)

  • Include theme compatibility hint in readme. [Kevin Bieri]
  • Prevent plone ajax spinner from being shown. [Kevin Bieri]
  • Restore slot defaults when removing last layout. [jone]

1.17.0 (2017-01-26)

  • Conditionally display move action on toolbar on the layout [Kevin Bieri]

  • Include handlebars in distributed library. [Kevin Bieri]

  • Fix map block not showing the Google maps. [mbaechtold]

  • Use browserify as javascript bundler

    • Update tests using karma
    • Add support for ES6 using babeljs

    [Kevin Bieri]

1.16.0 (2017-01-23)

  • Extend the textblock with the “data-caption” attribute which can hold the caption rendered in the colorbox (requires “ftw.colorbox” 1.2.4). [mbaechtold]

1.15.1 (2017-01-17)

  • Do render the simplelayout portlet on non-simplelayout content types. [mbaechtold]

1.15.0 (2017-01-16)

  • TinyMCE: Disable “anchor”-Tab when creating a link. [jone]
  • TinyMCE: configure content page to contain anchors. [jone]
  • Change primary field of text block from “image” to “text” field in order to support anchors. [jone]
  • Implement a simplelayout renderer object. This allows us to render simplelayoutish structures without the simplelayout provider expression. Further it’s now possible to render only one layout of slot. [mathias.leimgruber]
  • Log traceback too when a block cannot be rendered. [jone]

1.14.0 (2017-01-04)

  • Move option to hide a block to a behavior so it can be used on other blocks too. [mbaechtold]
  • Move ftw.referencewidget dependency to contenttypes extras. [jone]
  • Drop plone.formwidget.contenttree dependency. [jone]

1.13.0 (2016-12-06)

  • Prevent gallery block from failing when it contains image objects having umlauts in their title. [mbaechtold]
  • Disable inline validation of the Plone forms in the overlay. [mbaechtold]
  • Hide toolbox on small devices. [Kevin Bieri]
  • Highlight active layout. [Kevin Bieri]
  • Fix toolbar zindex. [Kevin Bieri]
  • Fix layout delete button when block has been moved. [Kevin Bieri]

1.12.2 (2016-11-11)

  • Don’t allow all non-folderish types to be selectable as default page. Without this types like the TextBlock can be selected and would break the site. [lknoepfel]

1.12.1 (2016-11-01)

  • Enable mapblock.js for anonymous users. [mathias.leimgruber]

1.12.0 (2016-10-21)

  • Implement a inner_edit.json view, which allows us to edit an item in a folderish block. For example edit a file directly in a FilelistingBlock. This view works almost like the block edit view, the difference is, that the inner_edit.json view returns the rendered html of its parent (the Block). [mathias.leimgruber]

1.11.1 (2016-10-13)

  • Make youtube-videoblocks auto-resize to the max space available. [raphael-s]

  • Fix SCSS linting errors

    • This requires ftw.theming>=1.7.0

1.11.0 (2016-10-05)

  • Remove debugger statement :pig:. [Kevin Bieri]
  • Support Chameleon caching. [jone]

1.10.0 (2016-09-30)

  • Open external links in new tab on block creation. [Kevin Bieri]

1.9.0 (2016-09-26)

  • Drop support for standard plone theme (sunburst) [Kevin Bieri]
  • Extend inplace migrator to create listing blocks of and [jone]

1.8.3 (2016-09-16)

  • Use ftw.referencewidget instead of plone.formwidget.contenttree. [tschanzt]
  • Protect new show/hide title behavior. [mathias.leimgruber]

1.8.2 (2016-09-14)

  • Add field description for ‘Image alternative text’ and ‘Open image in overlay’. [raphael-s]
  • Fix Icon position. It is now postitioned to the image not the container. [tschanzt]
  • Add optional title to the video block (disabled by default). [mbaechtold]

1.8.1 (2016-09-06)

  • Add optional behavior to add a checkbox to show/hide the title of a contentpage. [raphael-s]

1.8.0 (2016-09-05)

  • Fix drop animation backgroundcolor [Kevin Bieri]
  • Make leadimages “has_image” and “get_scale” usable. [jone]
  • BugFix: Copyied event is called recursively. Check if the block is actually part of the current page. [mathias.leimgruber]
  • Fix image overlay in textblocks [Kevin Bieri]
  • Set permission for change layout, site admin & manager now have permission to change the layout. [raphael-s]
  • Implement inplace migrators for migration from ftw.contentpage. [jone]

1.7.4 (2016-08-16)

  • Display mapblock in 2/3 ratio. [mathias.leimgruber]
  • Implement a really hackish way to support IE11. Native c.geo implementation always implements the map api twice and has caching issues. [mathias.leimgruber]

1.7.3 (2016-08-12)

  • Fix 1.7.2 broken simplelayout.js build release. [mathias.leimgruber]

1.7.2 (2016-08-11)

  • Fix layout state, while moving layouts between containers. [mathias.leimgruber]
  • Disable iframe fix after stop/receving a layout. [mathias.leimgruber]
  • Move layouts like blocks. [mathias.leimgruber]
  • Fix moveing layouts between containers. The usability is still no the best. [mathias.leimgruber]
  • Add an icon to mark an colorbox image. [tschanzt]

1.7.1 (2016-08-05)

  • Fix word breaks in listingblock table. [Kevin Bieri]

1.7.0 (2016-08-05)

  • Implement new block coordinate behavior, which uses it’s own widget for JS compatibility (it handles the google map api integration). [mathias.leimgruber]
  • Fix toolbox label zindex [Kevin Bieri]
  • Add IE11 fix for InAndOutWidget Javascript. In IE11 it’s not possible to manipulate a select (multiple) after modifying the text of a option. [mathias.leimgruber]
  • Add uninstall profile for ftw.simplelayout.contenttypes. [elioschmutz]
  • Add uninstall profile for ftw.simplelayout.mapblock. [elioschmutz]

1.6.0 (2016-07-18)

  • Fix missing toolbar on videoblocks [Kevin Bieri]
  • Use zindex system from ftw.theming Fix iframeblock boundaries [Kevin Bieri]
  • Display default youtube player controls [Kevin Bieri]
  • Translate quickupload title in overlay for filelistings and galleryblocks. [elioschmutz]
  • Fix floating images on mobile view. [Kevin Bieri]
  • Make simplelayout events globally available. [raphael-s]
  • Add min-height to empty Simplelyout portlet. This fixes a issue, when it was no longer possible to re-add a layout after deleting the last one. [mathias.leimgruber]
  • Add sort-options to image gallery block. [raphael-s]

1.5.2 (2016-05-26)

  • Do not show spinner when loading toolbox. [jone]

1.5.1 (2016-05-26)

  • Fix IE11 issues on succeding edits with TinyMCE by foucusing first input field. [jone]

1.5.0 (2016-05-26)

  • Implement request tracker. [Kevin Bieri]
  • Block Views: Check for extisting viewname before setting the view_name value. [mathias.leimgruber]
  • Make getting the og:image url more robust by checking for the scale. [mathias.leimgruber]

1.4.2 (2016-05-25)

  • BugFix for IE11 VideoBlock: Prevent iframe from stopping event bubbling in IE [Kevin Bieri]

1.4.1 (2016-05-24)

  • Fix editing issues in IE 11. [jone]

1.4.0 (2016-05-24)

  • Add css class to simplelayout container if the user is permitted to edit the content. [Kevin Bieri]
  • Implement statekeeter to track DOM changes. [Kevin Bieri]

1.3.0 (2016-05-20)

  • Update z3c.form to 2.9.3. Fixes error when adding a filelisting-block in IE11. [Kevin Bieri]
  • Remove block bottom margin from textblocks containing only a title. [mathias.leimgruber]
  • Do not show empty block warning on textblock if there is only a title. [mathias.leimgruber]
  • GalleryBlock: Show 4 images in a row for 1 col, 2 in a row for 2 col and 1 a row for 4 col. [mathias.leimgruber]
  • Add min-height to SimplelayoutBlock empty columns. [mathias.leimgruber]
  • Fix mouse pointer position according to openlayers pointer. [mathias.leimgruber]
  • Add image caption field to textblock. [mathias.leimgruber]
  • Hide main scrollbar when overlay is opened. [jone]
  • Lead-Image: support all slots. [jone]
  • Lead-Image: support gallery blocks. [jone]
  • Remove “Review State” column from file listing block. It is usually not in use, since files has no workflow on simplelayout sites. [mathias.leimgruber]

1.2.1 (2016-04-14)

  • Reset default scale behavior for textblock images. [Kevin Bieri]
  • Some blocks can be hidden now. Users allowed to edit the block will see the block anyway. [mbaechtold]

1.2.0 (2016-03-30)

  • Match the image scaling dimensions on media breakpoints from ftw.theming. [Kevin Bieri]
  • Use crop scale for textblock images. [Kevin Bieri]
  • Make textblock images full with for medium screen. [Kevin Bieri]
  • Extend documentation with class diagram. [Kevin Bieri]

1.1.0 (2016-03-03)

  • Configure TinyMCE resource types. [jone]
  • Respect disable_border key in request and do not load simplelayout if present. [mathias.leimgruber]
  • Remove leadimage cache key. [jone]
  • Show hint on empty listing and galeryblock. [mathias.leimgruber]
  • Implement better image alt text for galleryblock and textblock. Improves Accessibility. [mathias.leimgruber]
  • Right column overlapps the toolbar, apply fixed z-index. [Kevin Bieri]
  • Move styling from client library to ftw.theming integration using base variables from ftw.theming. [Kevin Bieri]
  • Fix simplelayout dynamic scss resource, so it does not return invalid code if the selector is empty. [mathias.leimgruber]
  • Use default table listing for the listingblock styles. Also implement some sane default withs for columns. [mathias.leimgruber]
  • Add Simlelayout view as possible front page layout + addable types on the plone site. This change provides no upgrade step, since it may break the configuration. [mathias.leimgruber]

1.0a1 (2015-12-04)

  • Init Release

Release history Release notifications

History Node


History Node


History Node


History Node


History Node


History Node


This version
History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Filename, size & hash SHA256 hash help File type Python version Upload date
ftw.simplelayout-1.19.0.tar.gz (1.1 MB) Copy SHA256 hash SHA256 Source None Nov 1, 2017

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging CloudAMQP CloudAMQP RabbitMQ AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page