Here is a collection of SilverStripe modules and behavior enhancements developed by eNTiDi. For themes and appearance related stuff, visit the Themes section.

Every module has its own developer page so, if you want to submit bugs or feature requests, just jump to its section and submit a new issue.

Silverstripe ADG Go to the developer section

ADG web demo screenshot

A SilverStripe module that provides a web front-end to the adg-web.lua script included in the adg-lua project.

The newly implemented Adg page provides a form with piston data. On submission, adg-web.lua will be called with the data provided in the form and the result will be rendered on the same page. The drawing is available in two different sizes: the thumbnail (rendered in-line) and the detailed view (accessible via javascript with a click on the thumbnail).

The source repository is available also on GitHub.

Silverstripe AutoTOC Go to the developer section

This is basically a SilverStripe 3 module that extends the DataObject class by providing two additional tags:

  • $Autotoc: containing the table of contents dynamically created from the content of the current page. The tree is provided as a mixture of ArrayData and ArrayList, ready to be consumed by templates.
  • $AugmentedContent: similar to $Content but augmented with anchors (<a> elements with the id attribute but without href) that adds proper destination targets to the links in $Autotoc.
SilverStripe AutoTOC module screenshot

To see a live example of this module, you can browse the ADG canvas website: every table of contents is generated dynamically!

Autotoc format

The $Autotoc is a tree that can be represented with the following pseudo representation:

$Autotoc = ArrayData( $Children <- <CHILDREN> )
<CHILDREN> = ArrayList( <ITEM> )
<ITEM> = ArrayData( $Id, $Title [, $Children <- <CHILDREN> ] )

In a more SilverStripe template way, this can be seen as:


The and shows a way to represent the whole table of content tree in a recursive way. The format used is intentionally compatible with the Bootstrap navlist components, so it can be used and it will be properly handled by the Silverstrap theme.

Silverstripe Carousel Go to the developer section

silverstripe-carousel screenshot

This module requires sortablefile.

It implements a new page type (CarouselPage) that provides everything needed to manage a carousel of images. Differently from other carousels, this one does not have the concept of seats (or slots), so managing the images is much easier on the backend side.

You can do bulk uploads and reorder the images by dragging and dropping their thumbnails in a dedicated tab (Image list) inside the CMS. The same image can be shared among multiple carousels. This module adds also some field to the Settings tab, allowing the customization of some aspect of the carousel on a per page basis (e.g., width and height of the images and a flag to show or hide captions).

To improve file organization, if you upload your images from the carousel a specific folder is pre-selected (it it exists!) instead of the fallback one (Uploads). The folder name depends on the class hierarchy. If, for example, you inherit your HomePage type from CarouselPage, the code will look for any Home or Carousel folder (in this order) under your assets directory.

Silverstripe Contact Go to the developer section

This module provides a ContactPage type that can be used for handling typical contact pages.


  • work out of the box;
  • multilanguage ready;
  • able to handle privacy policy with a single checkbox for confirmation (the privacy junk is shared among all the page instances);
  • email destination and format customizable on a page instance base.


  • basic: only three hard-coded fields provided (Name, Email and Message) without possibility of customization.

Silverstripe FeedReader Go to the developer section

A module that implements a new page type (FeedReaderPage) that can access the data contained in an external RSS 2.0 or ATOM 1.0 feed. The feed format is automatically deduced from its content, that is if the //channel/item XPath expression resolves to a non-emtpy list it is considered an RSS2 feed, otherwise it is considered ATOM1, and the //feed/entry expression will be used instead.

The default template (templates/Layout/ is compatible with the silverstrap theme but can be easily overriden by redefining file in your own theme. Check the original one for an example on how to use this module from a template.

To provide access to the latest news, you can define a function similar to the following one in any of your controllers:

public function LatestNews() {
    $news = DataObject::get_one('FeedReaderPage');
    return $news ? $news->Items(1)->first() : null;

Then you can enhance that page with a template snippet similar to the following one:

<% with $LatestNews %>
<h2>Latest news</h2>
    <p>$Date.Date: $Summary</p>
    <a href="$Link">More ...</a>
<% end_with %>

Silverstripe Gallery Go to the developer section

silverstripe-gallery screenshot

This module implements the new GalleryPage type that can be used for handling a typical photo gallery.


  • work out of the box within the silverstrap ecosystem;
  • out of the box support for fotorama;
  • bulk uploads;
  • images reordering with drag and drop;
  • size of thumbnails and main slide customizable on a per page basis.

Silverstripe GtkDoc Go to the developer section

Sample view
of a typical silverstripe-gtkdoc use case

The silverstripe-gtkdoc module implements a new page type (Gtkdoc) that allows to import into the pages tree of a SilverStripe based website a reference manual generated by gtk-doc. The gtk-doc page is a typical page and can contain arbitrary text: the reference manual will be shown as a tree of (virtual) pages under it.

The only parameter required is the absolute path to a .devhelp2 file that identifies the gtk-doc reference manual to import. It must be specified into the CMS, under the content tab. The module expects all the html files to be in the same path, as usually done by a pristine gtk-doc installation.

The HTML code is picked up directly from the file system. The usual place where gtk-doc files reside is under /usr/share/gtk-doc/html/ (typical on GNU/Linux platforms) or /usr/local/share/gtk-doc/html/ (on BSD based systems). Those files are checked at every specific request and are updated when required. The updated HTML code is cached in the database under the GtkdocSection table.

For better results, a theme that supports menu with arbitrary nesting levels, such as silverstrap or silverstripe-treeish, is suggested.

This module is used quite heavily on our sites to document library APIs, such as in the ADG reference manual or the ntdisp library front-end.

Silverstripe ManPage Go to the developer section

The silverstripe-manpage module provides a new page type that imports a man page. The full path to a specific man page is required and must be specified in the CMS for every page.

The man page is converted with the "groff" command. The exact syntax is:

groff -Thtml -man PATH

where PATH is the required path. Everything needed to get the above command working must be installed.

The generated HTML is massaged again with string and DOM manipulation to have a decent integration with SilverStripe.

For better results, a theme that supports CSS specific for this module (such as silverstripe-treeish) is suggested.

Silverstripe News Go to the developer section

The silverstripe-news module implements two new page types for handling a typical basic news system: NewsHolder (the folder containing related news) and NewsPage (the page presenting a single news).

Every NewsHolder will have its own feed and by default it will render its children (supposedly all NewsPage instances) in a dl list.

This module strictly follows RFC 4287 (the Atom syndacation format) and it is fully integrated out of the box with the Silverstrap theme.

Silverstripe PicasaWeb Go to the developer section

Provides different ways to interface a SilverStripe based project to the PicasaWeb service using developer API v.2.

There are two kind of Picasaweb objects: photos and albums. They are identified by different links. An album is a Picasaweb link without a fragment identifier, such as A photo is a Picasaweb album link with a fragment identifier appended such as

The editing can be enhanced by including a dedicated shortcode. For example, render [picasa][/picasa] as an album you should include something such as the following line in your _config.php:

ShortcodeParser::get()->register('picasa', array('Picasaweb', 'shortcode'));

Another way to use this module is by augmenting a specific page type by overriding its onBeforeWrite() callback so that the user can just paste a Picasaweb link inside the HTML code. Be careful: in this case you cannot use the Picasaweb link in your templates otherwise the expansion will be called recursively.

Object::add_extension('Page', 'PicasawebExtension');

In this case, the expansion of the Picasaweb links happens before storing the HTML code in the database, avoiding further requests on page hits.

TODO: implement an Object::add_extension('SiteConfig', 'PicasawebConfig') for customizing via CMS the global Picasaweb environment, that is photo and/or album rendering activation and the default thumbnail or zoomed images.

Silverstripe Sponsor Go to the developer section

Manages a list of sponsors (name, logo, web site and description), providing a way for showing one of them on every page hit. Furthermore, the module takes care of keeping a bunch of stats for every sponsor, such as hits, last hit datetime, clicks and last click datetime.

The interaction between the SponsorPage and your Page must be explicitely coded. For example by adding this method to your controller:

public function Sponsor() {
    $page = self::get_one('SponsorPage');
    if (empty($page))
        return null;

    $sponsor = $page->Oldest();
    if (empty($sponsor))
        return null;

    return $sponsor;

you will be able to use $Sponsor inside your page templates. It will return the DataObject of the oldest hit or clicked sponsor of the first SponsorPage you defined (if any). The call to Oldest() is cached and it updates the stats of the returned sponsor.

Silverstripe Toggle-Paginator Go to the developer section

SilverStripe toggle-paginator module screenshot

A module that provides a GridField component for temporarily switching the pagination on or off.

This can be especially useful when used in conjunction with other modules, e.g. I am currently using it with gridfieldmultiselect to execute special actions on a filtered subset of records. Without this module I will be able to execute the execute the action only on the first page of this subset or I would need to disable pagination altogether.