Update: Please note that this is an old post and that the official version of Pattern Lab now works with Drupal templates.
In the solutions described in this post I have tried to use the existing extension mechanisms built into Pattern Lab as much as possible, and not to introduce any dependencies to Drupal core. The end result is that Pattern Lab can be used on its own with just the Twig templates, CSS and other assets from a Drupal theme.
Drupal Twig StarterKit
Drupal templates use custom Twig filters, functions and tags. Support for these Twig extensions can be added to Twig PatternEngine via a custom StarterKit. Drupal's extensions can be replaced with simple alternative versions that have no Drupal dependencies.
Data Transform Plugin
The Attribute
object is used extensively in Drupal theme templates. Drupal templates also use variables that contain HTML rendered from other templates. However, currently Pattern Lab only supports plain string data from JSON files.
Pattern Lab plugins can listen to events and hook into the build process. A plugin can be used to process the JSON string data before patterns are rendered.
Data Transform Plugin is a plugin that can transform data into something expected by Drupal theme templates. Drupal Attribute
objects and rendered templates can be added using special syntax in Pattern Lab's JSON data files.
Data Transform Plugin also has a function to join strings, which can be very useful. The plugin is PatternEngine agnostic and can be used with Mustache templates as well.
Patches to Pattern Lab Core
Change link
to patternLink
link
is a custom function used in some Drupal theme templates. Unfortunately it is also a reserved key in Pattern Lab, used for the pattern linking feature. It seems to be used only internally though, so a small patch that changes link
to patternLink
will hopefully not cause any problems. The patch does not change the syntax used in patterns.
Patches to Twig PatternEngine
Extend templates from the _patterns
directory
The current version of Twig PatternEngine's template loader does not support extending templates from the _patterns
directory. All that is required to support this feature used by some Drupal theme templates is to add a few lines of code. This solution admittedly does seem to go against Twig PatternEngine's design, but it does do what we want...
Add auto-escape support
The contents of Twig variables are HTML auto-escaped by default, so we need to add support for disabling autoescaping to Twig PatternEngine.
Pass pattern specific data to included patterns
An issue with the current version of Twig PatternEngine is that pattern specific data is not passed to included patterns. Included patterns do get the data from the parent pattern, but not the pattern specific data which needs to be used with Drupal theme templates.
One solution inspired by a great blog post by Matthias Noback is to use a Node Visitor and a wrapper class to add the data in the template compilation phase. This solution seems to do what we want with string data, but will convert Attribute
objects to strings.
Special handling for Attribute
objects could be added to the PatternDataIncludeNode
class, but this would introduce Drupal specific code to Twig PatternEngine. For now the Twig include
tag cannot be used with this solution if an Attribute
object is manipulated in the included template. A workaround is to add the template as a variable using the include feature of Data Transform Plugin.
That's all, Folks!
That was all that was required to create Shila theme, which was introduced in my previous post.
Comments
Hi, is there a similar…
Hi, is there a similar pattern lab version for Drupal 7?
Thanks
Colin
Hi Colin, I do not know of a…
Hi Colin, I do not know of a solution where the same template files can be shared between Pattern Lab and Drupal 7. The problem is that Pattern Lab uses Mustache or Twig templates and Drupal 7 uses PHPTemplate.
You can still integrate Pattern Lab and a Drupal 7 theme using a similar approach, the only difference being that a separate set of Mustache or Twig templates has to be created and kept in sync with Drupal 7 templates.
Hi there,…
Hi there, there is this Pattern Lab for Gesso Drupal theme a link. I don't know if this is a good deal, but now I'm trying to use it and integrate Pattern Lab in my Drupal 7 project. I will write a feedback about it asap.
hi aleskip and thanks for…
hi aleskip and thanks for your solution, i would like to know how to add a partial twice. for example we have block--system-menu-block.html.twig with a json file with the same name and a menu.html.twig and his json file.
then if I want to show two menus I have to replicate all these files and so on for every menu ?? what is the way to acomplish this?
thank for help
Hi Ensk…
Hi Ensk
If you want to include a pattern twice with different data you can use Twig variables. I have added an example to the
organisms-list
pattern and its JSON data.In very simple cases it is also possible to use an
include
statement with thewith
keyword in the Twig template to pass the different data. However, at the moment this will not work if anAttribute
object is manipulated in the included pattern template.Hi aleskip…
Hi aleskip thanks for the response but i can't understand how to take your example and use it with system--block-menu-block to display various menu in patternlab
Hi Ensk, I have updated the…
Hi Ensk, I have updated the StarterKit with some menu block changes and a new second level menu example.
Hi aleskip, now understand a…
Hi aleskip, now understand a bit more all the power of data transform plugin .thank you ;)
Great to hear! Hope you find…
Great to hear! Hope you will find it useful! :)