Oct 03 2015
Oct 03

A quick note for core contributors regarding Drupal 8 issue tags related to the upcoming release candidate phase:

rc deadline issue tag Issues that are not critical but can only be committed before the first release candidate is released (e.g., issues that change translatable strings or APIs). If they're not finished by the time the release candidate is ready, they must either be postponed to Drupal 8.1.0 or Drupal 9. rc target issue tag Rare! Issues that are not critical but can committed during the release candidate phase (for example, documentation changes, certain coding standards improvements, or other issues at committer discretion). Issues with this tag must have committer approval (so check with a committer before adding it).

More information on Drupal 8 release phase issue tags.

Oct 03 2015
Oct 03

On Friday, 2nd Oct 2015, we organized the first virtual media sprint. Four sprinters showed up and worked on D8 media issues.

First a bit of background

Examiner.com logo

At Examiner.com we get an entire day to spend (along with contributions that we do as part of our regular work) on community contributions every other week. We call it "Drupal day" and we love it! It is our way of saying "Thank you!" to the community. We understand that we wouldn't be as successful as we are without incredible efforts that are invested in Drupal and other free software projects we use.

We are currently working on a very cool D8 project where we heavily use modules from media ecosystem. I might write another post solely about that in the near future. My companies' need for solid media handling solution aligns very nicely with my personal interest in the same field. As a result of that I spend most of my Drupal days on improving media ecosystem and thinking about it. Having a day to focus on things that excite you is great, but what if there would be more people joining?

This is when idea for virtual sprint was born. I published the event on our group and invited everyone to join me.


On the actual date three other sprinters joined me:

How to contribute?

Anyone is invited to contribute also outside of official sprints. We tag all our issues with "D8Media", which helps us maintain list of all issues we need to work on. We also maintain a list of issues suitable for new contributors. You can find us on IRC (#drupal-media @ Freenode) and a lot of Drupal events (BADCamp and Drupal camp Vienna in the nearest future).

In order to get an idea about the focus of individual modules we also invite you to check module-specific roadmap planning meta-issues:

We will be adding more of those soon. 

Will there be more?

We'd certainly like to organize more virtual (and non-virtual) sprints in the future if we'll see interest from the community/sprinters. Do you think there should be more events like this? Would you like to join us next time? Let us know in the comments section below. You can also follow our group as we publish all events and other updates there.

Oct 02 2015
Oct 02

By Nick Savov 02 October 2015

How to Install a Drupal Module

Too often we assume that some things are plainly obvious. However, for a brand new user to Drupal, knowing the best practices for Drupal site creation is a must.

This video tutorial will cover the basics of installing a new module in Drupal 7.

How to find and install New Drupal 7 Modules

More advanced module installation

Later down the road, as you gain more experience, Drush will make it even easier using the command line.

About the author

Nick is the Director of Support at OSTraining and you can find him in almost every area of the site, from answering support requests and account questions to creating tutorials and software.

Oct 02 2015
Oct 02

Drupal 8 Contributor chartEveryone’s excited for Drupal 8 to come out. Now that we’re flirting with 0 critical bugs, we wanted to give a shout out to everyone who has put their hard work and love into building Drupal 8. We’re almost to the finish line, and everyone deserves hugs and high-fives for all their amazing work.

We’re looking forward to the announcement of a Drupal 8 release candidate as soon as October 7, and we’re working hard to put together materials that everyone can use to shout from the rooftops that Drupal 8 is in its final stage of development. We’ve still got a lot of work ahead of us, but the Drupal Association feels that now is a good time for our community to pause, take a deep breath, give each other pats on the back, and look at what the future holds.

Our communications plan

We’ve fielded a lot of interest in spreading the word about the Drupal 8 release candidate and the eventual release of Drupal 8. We’ve got a plan that we’re excited about, and we’re hoping for help from the community. The more we can all create content about the specific features in Drupal 8, the better! We’d also love to share content made by our community that speaks to different audiences — for example, why Drupal 8 is the best platform for government or university websites. Over the next few weeks, we hope to add our community’s amazing content to the Drupal 8 landing page.

Here are a few other ways you can help:

  • Planning on hosting a release party? Share the details and we'll help spread the word about your event.
  • Are you already building sites with Drupal 8? Share a link in social media and tag it #madewithdrupal8. You can also add it to the list on groups.drupal.org.
  • If you have demos, white papers, blog posts, or some other materials that talk about the virtues of D8, share it on social media and tag it #drupal8rc.

We couldn’t be more excited for Drupal 8. We’re in the last leg now of huge effort and we should all be tremendously proud of ourselves. Big thanks especially to our amazing Core Maintainers and all of our wonderful contributors who have worked hard on the project.

Drupal 8 artwork by Paul Johnson (pdjohnson) and CTI Digital

Oct 02 2015
Oct 02

The Simple XML Sitemap module was originally created by gbyte as a temporary replacement for the non-functioning Drupal 8 XML Sitemamp Module. After putting some more work into it however, we decided to use it for some of our projects, as it is very lightweight and simple to use.

It does not have many of the advanced features of the heavy XML Sitemap module, so it may not be the right solutions to all use cases.

Here is the description from the module page:

Every page needs an automatic xml sitemap generator, however Drupal 8 sites are out of luck right now, as the D8 version of xmlsitemap is completely broken. I thought me trying to help patching xmlsitemap would only add to the confusion (many attempts are being made), so I took the opportunity and created this module as a temporary solution for my D8 projects.

This is more of an educational D8 exercise than anything else and I advise anyone reading this to help fixing xmlsitemap instead.

Having said that, this module works for me, as it generates multilingual sitemaps from nodes and custom links. Here is a sample of the xml markup it generates.

There is a partial UI integrated, you can adjust sitemap settings (inclusion and priority) for node types on their edit pages. If you need to add links to content from other entity types or custom links, you will have to adjust the simplesitemap.settings.yml file and reinstall the module.

Caution: As of now this module generates sitemaps on the fly so should not be used for larger sites with thousands of nodes!.

Update: Module now integrates pseudo caching and should be fine for large sites.

The module is stable and functional, however it may remain in a sandbox for some time because of this issue.

Feel free to grab the module from its sandbox, or download the zip from here.

More on Drupal 8 SEO and if it is the right time to start creating paid projects with it can be found in the article What to keep in mind when creating Drupal 8 Projects - for developers.

Oct 02 2015
Oct 02

I've mentored a number of students in 2013, 2014 and 2015 for Debian and Ganglia and most of the companies I've worked with have run internships and graduate programs from time to time. GSoC 2015 has just finished and with all the excitement, many students are already asking what they can do to prepare and be selected for Outreachy or GSoC in 2016.

My own observation is that the more time the organization has to get to know the student, the more confident they can be selecting that student. Furthermore, the more time that the student has spent getting to know the free software community, the more easily they can complete GSoC.

Here I present a list of things that students can do to maximize their chance of selection and career opportunities at the same time. These tips are useful for people applying for GSoC itself and related programs such as GNOME's Outreachy or graduate placements in companies.


There is no guarantee that Google will run the program again in 2016 or any future year until the Google announcement.

There is no guarantee that any organization or mentor (including myself) will be involved until the official list of organizations is published by Google.

Do not follow the advice of web sites that invite you to send pizza or anything else of value to prospective mentors.

Following the steps in this page doesn't guarantee selection. That said, people who do follow these steps are much more likely to be considered and interviewed than somebody who hasn't done any of the things in this list.

Understand what free software really is

You may hear terms like free software and open source software used interchangeably.

They don't mean exactly the same thing and many people use the term free software for the wrong things. Not all projects declaring themselves to be "free" or "open source" meet the definition of free software. Those that don't, usually as a result of deficiencies in their licenses, are fundamentally incompatible with the majority of software that does use genuinely free licenses.

Google Summer of Code is about both writing and publishing your code and it is also about community. It is fundamental that you know the basics of licensing and how to choose a free license that empowers the community to collaborate on your code well after GSoC has finished.

Please review the definition of free software early on and come back and review it from time to time. The The GNU Project / Free Software Foundation have excellent resources to help you understand what a free software license is and how it works to maximize community collaboration.

Don't look for shortcuts

There is no shortcut to GSoC selection and there is no shortcut to GSoC completion.

The student stipend (USD $5,500 in 2014) is not paid to students unless they complete a minimum amount of valid code. This means that even if a student did find some shortcut to selection, it is unlikely they would be paid without completing meaningful work.

If you are the right candidate for GSoC, you will not need a shortcut anyway. Are you the sort of person who can't leave a coding problem until you really feel it is fixed, even if you keep going all night? Have you ever woken up in the night with a dream about writing code still in your head? Do you become irritated by tedious or repetitive tasks and often think of ways to write code to eliminate such tasks? Does your family get cross with you because you take your laptop to Christmas dinner or some other significant occasion and start coding? If some of these statements summarize the way you think or feel you are probably a natural fit for GSoC.

An opportunity money can't buy

The GSoC stipend will not make you rich. It is intended to make sure you have enough money to survive through the summer and focus on your project. Professional developers make this much money in a week in leading business centers like New York, London and Singapore. When you get to that stage in 3-5 years, you will not even be thinking about exactly how much you made during internships.

GSoC gives you an edge over other internships because it involves publicly promoting your work. Many companies still try to hide the potential of their best recruits for fear they will be poached or that they will be able to demand higher salaries. Everything you complete in GSoC is intended to be published and you get full credit for it. Imagine a young musician getting the opportunity to perform on the main stage at a rock festival. This is how the free software community works. It is a meritocracy and there is nobody to hold you back.

Having a portfolio of free software that you have created or collaborated on and a wide network of professional contacts that you develop before, during and after GSoC will continue to pay you back for years to come. While other graduates are being screened through group interviews and testing days run by employers, people with a track record in a free software project often find they go straight to the final interview round.

Register your domain name and make a permanent email address

Free software is all about community and collaboration. Register your own domain name as this will become a focal point for your work and for people to get to know you as you become part of the community.

This is sound advice for anybody working in IT, not just programmers. It gives the impression that you are confident and have a long term interest in a technology career.

Choosing the provider: as a minimum, you want a provider that offers DNS management, static web site hosting, email forwarding and XMPP services all linked to your domain. You do not need to choose the provider that is linked to your internet connection at home and that is often not the best choice anyway. The XMPP foundation maintains a list of providers known to support XMPP.

Create an email address within your domain name. The most basic domain hosting providers will let you forward the email address to a webmail or university email account of your choice. Configure your webmail to send replies using your personalized email address in the From header.

Update your ~/.gitconfig file to use your personalized email address in your Git commits.

Create a web site and blog

Start writing a blog. Host it using your domain name.

Some people blog every day, other people just blog once every two or three months.

Create links from your web site to your other profiles, such as a Github profile page. This helps reinforce the pages/profiles that are genuinely related to you and avoid confusion with the pages of other developers.

Many mentors are keen to see their students writing a weekly report on a blog during GSoC so starting a blog now gives you a head start. Mentors look at blogs during the selection process to try and gain insight into which topics a student is most suitable for.

Create a profile on Github

Github is one of the most widely used software development web sites. Github makes it quick and easy for you to publish your work and collaborate on the work of other people. Create an account today and get in the habbit of forking other projects, improving them, committing your changes and pushing the work back into your Github account.

Github will quickly build a profile of your commits and this allows mentors to see and understand your interests and your strengths.

In your Github profile, add a link to your web site/blog and make sure the email address you are using for Git commits (in the ~/.gitconfig file) is based on your personal domain.

Start using PGP

Pretty Good Privacy (PGP) is the industry standard in protecting your identity online. All serious free software projects use PGP to sign tags in Git, to sign official emails and to sign official release files.

The most common way to start using PGP is with the GnuPG (GNU Privacy Guard) utility. It is installed by the package manager on most Linux systems.

When you create your own PGP key, use the email address involving your domain name. This is the most permanent and stable solution.

Print your key fingerprint using the gpg-key2ps command, it is in the signing-party package on most Linux systems. Keep copies of the fingerprint slips with you.

This is what my own PGP fingerprint slip looks like. You can also print the key fingerprint on a business card for a more professional look.

Using PGP, it is recommend that you sign any important messages you send but you do not have to encrypt the messages you send, especially if some of the people you send messages to (like family and friends) do not yet have the PGP software to decrypt them.

If using the Thunderbird (Icedove) email client from Mozilla, you can easily send signed messages and validate the messages you receive using the Enigmail plugin.

Get your PGP key signed

Once you have a PGP key, you will need to find other developers to sign it. For people I mentor personally in GSoC, I'm keen to see that you try and find another Debian Developer in your area to sign your key as early as possible.

Free software events

Try and find all the free software events in your area in the months between now and the end of the next Google Summer of Code season. Aim to attend at least two of them before GSoC.

Look closely at the schedules and find out about the individual speakers, the companies and the free software projects that are participating. For events that span more than one day, find out about the dinners, pub nights and other social parts of the event.

Try and identify people who will attend the event who have been GSoC mentors or who intend to be. Contact them before the event, if you are keen to work on something in their domain they may be able to make time to discuss it with you in person.

Take your PGP fingerprint slips. Even if you don't participate in a formal key-signing party at the event, you will still find some developers to sign your PGP key individually. You must take a photo ID document (such as your passport) for the other developer to check the name on your fingerprint but you do not give them a copy of the ID document.

Events come in all shapes and sizes. FOSDEM is an example of one of the bigger events in Europe, linux.conf.au is a similarly large event in Australia. There are many, many more local events such as the Debian UK mini-DebConf in Cambridge, November 2015. Many events are either free or free for students but please check carefully if there is a requirement to register before attending.

On your blog, discuss which events you are attending and which sessions interest you. Write a blog during or after the event too, including photos.

Quantcast generously hosted the Ganglia community meeting in San Francisco, October 2013. We had a wild time in their offices with mini-scooters, burgers, beers and the Ganglia book. That's me on the pink mini-scooter and Bernard Li, one of the other Ganglia GSoC 2014 admins is on the right.

Install Linux

GSoC is fundamentally about free software. Linux is to free software what a tree is to the forest. Using Linux every day on your personal computer dramatically increases your ability to interact with the free software community and increases the number of potential GSoC projects that you can participate in.

This is not to say that people using Mac OS or Windows are unwelcome. I have worked with some great developers who were not Linux users. Linux gives you an edge though and the best time to gain that edge is now, while you are a student and well before you apply for GSoC.

If you must run Windows for some applications used in your course, it will run just fine in a virtual machine using Virtual Box, a free software solution for desktop virtualization. Use Linux as the primary operating system.

Here are links to download ISO DVD (and CD) images for some of the main Linux distributions:

If you are nervous about getting started with Linux, install it on a spare PC or in a virtual machine before you install it on your main PC or laptop. Linux is much less demanding on the hardware than Windows so you can easily run it on a machine that is 5-10 years old. Having just 4GB of RAM and 20GB of hard disk is usually more than enough for a basic graphical desktop environment although having better hardware makes it faster.

Your experiences installing and running Linux, especially if it requires some special effort to make it work with some of your hardware, make interesting topics for your blog.

Decide which technologies you know best

Personally, I have mentored students working with C, C++, Java, Python and JavaScript/HTML5.

In a GSoC program, you will typically do most of your work in just one of these languages.

From the outset, decide which language you will focus on and do everything you can to improve your competence with that language. For example, if you have already used Java in most of your course, plan on using Java in GSoC and make sure you read Effective Java (2nd Edition) by Joshua Bloch.

Decide which themes appeal to you

Find a topic that has long-term appeal for you. Maybe the topic relates to your course or maybe you already know what type of company you would like to work in.

Here is a list of some topics and some of the relevant software projects:

  • System administration, servers and networking: consider projects involving monitoring, automation, packaging. Ganglia is a great community to get involved with and you will encounter the Ganglia software in many large companies and academic/research networks. Contributing to a Linux distribution like Debian or Fedora packaging is another great way to get into system administration.
  • Desktop and user interface: consider projects involving window managers and desktop tools or adding to the user interface of just about any other software.
  • Big data and data science: this can apply to just about any other theme. For example, data science techniques are frequently used now to improve system administration.
  • Business and accounting: consider accounting, CRM and ERP software.
  • Finance and trading: consider projects like R, market data software like OpenMAMA and connectivity software (Apache Camel)
  • Real-time communication (RTC), VoIP, webcam and chat: look at the JSCommunicator or the Jitsi project
  • Web (JavaScript, HTML5): look at the JSCommunicator

Before the GSoC application process begins, you should aim to learn as much as possible about the theme you prefer and also gain practical experience using the software relating to that theme. For example, if you are attracted to the business and accounting theme, install the PostBooks suite and get to know it. Maybe you know somebody who runs a small business: help them to upgrade to PostBooks and use it to prepare some reports.

Make something

Make some small project, less than two week's work, to demonstrate your skills. It is important to make something that somebody will use for a practical purpose, this will help you gain experience communicating with other users through Github.

For an example, see the servlet Juliana Louback created for fixing phone numbers in December 2013. It has since been used as part of the Lumicall web site and Juliana was selected for a GSoC 2014 project with Debian.

There is no better way to demonstrate to a prospective mentor that you are ready for GSoC than by completing and publishing some small project like this yourself. If you don't have any immediate project ideas, many developers will also be able to give you tips on small projects like this that you can attempt, just come and ask us on one of the mailing lists.

Ideally, the project will be something that you would use anyway even if you do not end up participating in GSoC. Such projects are the most motivating and rewarding and usually end up becoming an example of your best work. To continue the example of somebody with a preference for business and accounting software, a small project you might create is a plugin or extension for PostBooks.

Getting to know prospective mentors

Many web sites provide useful information about the developers who contribute to free software projects. Some of these developers may be willing to be a GSoC mentor.

For example, look through some of the following:

  • Planet / Blog aggregation sites: these sites all have links to the blogs of many developers. They are useful sources of information about events and also finding out who works on what.
  • Developer profile pages. Many projects publish a page about each developer and the packages, modules or other components he/she is responsible for. Look through these lists for areas of mutual interest.
  • Developer github profiles. Github makes it easy to see what projects a developer has contributed to. To see many of my own projects, browse through the history at my own Github profile

Getting on the mentor's shortlist

Once you have identified projects that are interesting to you and developers who work on those projects, it is important to get yourself on the developer's shortlist.

Basically, the shortlist is a list of all students who the developer believes can complete the project. If I feel that a student is unlikely to complete a project or if I don't have enough information to judge a student's probability of success, that student will not be on my shortlist.

If I don't have any student on my shortlist, then a project will not go ahead at all. If there are multiple students on the shortlist, then I will be looking more closely at each of them to try and work out who is the best match.

One way to get a developer's attention is to look at bug reports they have created. Github makes it easy to see complaints or bug reports they have made about their own projects or other projects they depend on. Another way to do this is to search through their code for strings like FIXME and TODO. Projects with standalone bug trackers like the Debian bug tracker also provide an easy way to search for bug reports that a specific person has created or commented on.

Once you find some relevant bug reports, email the developer. Ask if anybody else is working on those issues. Try and start with an issue that is particularly easy and where the solution is interesting for you. This will help you learn to compile and test the program before you try to fix any more complicated bugs. It may even be something you can work on as part of your academic program.

Find successful projects from the previous year

Contact organizations and ask them which GSoC projects were most successful. In many organizations, you can find the past students' project plans and their final reports published on the web. Read through the plans submitted by the students who were chosen. Then read through the final reports by the same students and see how they compare to the original plans.

Start building your project proposal now

Don't wait for the application period to begin. Start writing a project proposal now.

When writing a proposal, it is important to include several things:

  • Think big: what is the goal at the end of the project? Does your work help the greater good in some way, such as increasing the market share of Linux on the desktop?
  • Details: what are specific challenges? What tools will you use?
  • Time management: what will you do each week? Are there weeks where you will not work on GSoC due to vacation or other events? These things are permitted but they must be in your plan if you know them in advance. If an accident or death in the family cut a week out of your GSoC project, which work would you skip and would your project still be useful without that? Having two weeks of flexible time in your plan makes it more resilient against interruptions.
  • Communication: are you on mailing lists, IRC and XMPP chat? Will you make a weekly report on your blog?
  • Users: who will benefit from your work?
  • Testing: who will test and validate your work throughout the project? Ideally, this should involve more than just the mentor.

If your project plan is good enough, could you put it on Kickstarter or another crowdfunding site? This is a good test of whether or not a project is going to be supported by a GSoC mentor.

Learn about packaging and distributing software

Packaging is a vital part of the free software lifecycle. It is very easy to upload a project to Github but it takes more effort to have it become an official package in systems like Debian, Fedora and Ubuntu.

Packaging and the communities around Linux distributions help you reach out to users of your software and get valuable feedback and new contributors. This boosts the impact of your work.

To start with, you may want to help the maintainer of an existing package. Debian packaging teams are existing communities that work in a team and welcome new contributors. The Debian Mentors initiative is another great starting place. In the Fedora world, the place to start may be in one of the Special Interest Groups (SIGs).

Think from the mentor's perspective

After the application deadline, mentors have just 2 or 3 weeks to choose the students. This is actually not a lot of time to be certain if a particular student is capable of completing a project. If the student has a published history of free software activity, the mentor feels a lot more confident about choosing the student.

Some mentors have more than one good student while other mentors receive no applications from capable students. In this situation, it is very common for mentors to send each other details of students who may be suitable. Once again, if a student has a good Github profile and a blog, it is much easier for mentors to try and match that student with another project.

GSoC logo generic


Getting into the world of software engineering is much like joining any other profession or even joining a new hobby or sporting activity. If you run, you probably have various types of shoe and a running watch and you may even spend a couple of nights at the track each week. If you enjoy playing a musical instrument, you probably have a collection of sheet music, accessories for your instrument and you may even aspire to build a recording studio in your garage (or you probably know somebody else who already did that).

The things listed on this page will not just help you walk the walk and talk the talk of a software developer, they will put you on a track to being one of the leaders. If you look over the profiles of other software developers on the Internet, you will find they are doing most of the things on this page already. Even if you are not selected for GSoC at all or decide not to apply, working through the steps on this page will help you clarify your own ideas about your career and help you make new friends in the software engineering community.

Oct 02 2015
Oct 02

cTools is one of those critical Drupal 7 modules many others depend on. It provides a lot of APIs and functionality that makes life easier when developing modules. Views and Panels are just two examples of such powerhouses that depend on it.

cTools makes available different kinds of functionality. Object caching, configuration exportability, form wizards, dialogs and plugins are but a few. A lot of the credit you would normally attribute to Views or Panels is actually owed to cTools.

Drupal logo

In this article, we are going to take a look at cTools plugins, especially how we can create our very own. After a brief introduction, we will immediately go hands on with a custom module that will use the cTools plugins to make defining Drupal blocks nicer (more in tune to how we define them in Drupal 8).


cTools plugins in Drupal 7 (conceptually not so dissimilar to the plugin system in Drupal 8) are meant for easily defining reusable bits of functionality. That is to say, for the ability to define isolated business logic that is used in some context. The goal is to set up that context and plugin type once, and allow other modules to then define plugins that can be used in that context automatically.

If you’ve been developing Drupal sites for more than a year you’ve probably encountered cTools plugins in one shape or form. I think the first plugin type we usually deal with is the content_type plugin which allows us to create our own custom panel panes that display dynamic content. And that is awesome. Some of the others you may have encountered in the same realm of Panels are probably context and access (visibility rules). Maybe even relationships and arguments. These are all provided by cTools. Panels adds to this list by introducing layouts and styles that we normally use for creating Panels layouts and individual pane styles. These are I think the more common ones.

However, all of the above are to a certain extent a black box to many. All we know is that we need to define a hook to specify a directory and then provide an include file with some definition and logic code and the rest happens by magic. Going forward, I would like us to look into how a plugin type is defined so that if the case arises, we can create our own plugins to represent some reusable bits of functionality. To demonstrate this, we will create a module that turns the pesky hook system of defining custom Drupal blocks into a plugin based approach similar to what Drupal 8 is using.

The final code (+ a bit more) can be found in this repository if you want to follow along. And I do expect you are familiar with the steps necessary for defining custom Drupal blocks.

The block_plugin module

As I mentioned, I would like to illustrate the power of cTools plugins with a custom plugin type that makes defining Drupal 7 blocks saner. Instead of implementing the 2 main hooks (hook_block_info() and hook_block_view()) necessary to define a block, we’ll be able to have separate plugin files each responsible for all the logic related to their own block. No more switch cases and changing the hook implementation every time we need a new block. So how do we do this?

First, let’s create our block_plugin.info file to get started with our module:

name = Block Plugin
description = Using cTools plugins to define Drupal core blocks
core = 7.x
dependencies[] = ctools

Simple enough.

The plugin type

In order to define our news plugin type, inside the block_plugin.module file we need to implement hook_ctools_plugin_type() which is responsible for defining new plugin types cTools will recognize:

function block_plugin_ctools_plugin_type() {
  return array(
    'block' => array(
      'label' => 'Block',
      'use hooks' => FALSE,
      'process' => 'block_plugin_process_plugin'

In this hook we need to return an associative array of all the plugin type definitions we need keyed by the machine name of the plugin type name. Today we are only creating one called block. For more information on all the options available here, feel free to consult the plugins-creating.html help file within the cTools module. No use repeating all that information here.

The process key defines a function name that gets triggered every time cTools loads for us a plugin and is responsible for shaping or massaging the plugin data before we use it. It’s sort of a helper function that prepares the plugin for us each time so we don’t have to bother. So let’s see what we can do inside that function:

function block_plugin_process_plugin(&$plugin, $info) {
  // Add a block admin title
  if (!isset($plugin['admin title'])) {
    $exploded = explode('_', $plugin['name']);
    $name = '';
    foreach ($exploded as $part) {
      $name .= ucfirst($part) . ' ';
    $plugin['admin title'] = $name;

  // By default we also show a block title but this can be overwritten
  if (!isset($plugin['show title'])) {
    $plugin['show title'] = TRUE;

  // Add a block view function
  if (!isset($plugin['view'])) {
    $plugin['view'] = $plugin['module'] . '_' . $plugin['name'] . '_view';

  // Add a block form function
  if (!isset($plugin['configure'])) {
    $plugin['configure'] = $plugin['module'] . '_' . $plugin['name'] . '_configure';

  // Add a block save function
  if (!isset($plugin['save'])) {
    $plugin['save'] = $plugin['module'] . '_' . $plugin['name'] . '_save';

This callback receives the plugin array as a reference and some information about the plugin type. The task at hand is to either change or add data to the plugin dynamically. So what do we achieve above?

First, if the developer hasn’t defined an admin title for the block plugin, we generate one automatically based on the machine name of the plugin. This is so that we always have an admin title in the Drupal block interface.

Second, we choose to always display the title of the block so we mark the show title key of the plugin array as TRUE. When defining the block plugin, the developer has the option of setting this to FALSE in which case we won’t show a block title (subject).

Third, fourth and fifth, we generate a callback function for the block view, save and configure actions (if they haven’t already been set by the developer for a given plugin). These callbacks will be used when implementing hook_block_view(), hook_block_configure() and hook_block_save(), respectively. We won’t be covering the latter two in this article but feel free to check out the repository to see what these can look like.

And that’s pretty much all we need for defining our custom plugin type. We should, however, also implement hook_ctools_plugin_directory() which, as you may know, is responsible for telling cTools where a plugin of a certain type can be found in the current module:

function block_plugin_ctools_plugin_directory($module, $plugin) {
  if ($module == 'block_plugin' && in_array($plugin, array_keys(block_plugin_ctools_plugin_type())) ) {
    return 'plugins/' . $plugin;

This will need to be implemented also by any other module that wants to define block plugins.

Drupal blocks

Now that we have the plugin type, let’s write the code which turns any defined block plugin into a Drupal block. Will start with the hook_block_info() implementation:

function block_plugin_block_info() {
  $blocks = array();

  $plugins = block_plugin_get_all_plugins();
  foreach ($plugins as $plugin) {
    $blocks[DELTA_PREFIX . $plugin['name']] = array(
      'info' => $plugin['admin title'],

  return $blocks;

Here we load all of the plugins using a helper function and define the minimum required information for the block. Here you can add also more information but we are keeping it simple for brevity.

We know each plugin will have a machine name (the name of the include file basically) and an admin title because we generate one in the processing phase if one doesn’t exist. The DELTA_PREFIX is a simple constant in which we define the prefix we want for the block machine name because we need to reuse it and should be able to easily change it if we want to:

define('DELTA_PREFIX', 'block_plugin_');

Our helper function we saw earlier looks like this:

function block_plugin_get_all_plugins() {
  return ctools_get_plugins('block_plugin', 'block');

It’s a simple wrapper around the respective cTools function. And for that matter, we also have the following function responsible for loading a single plugin by its machine name:

function block_plugin_get_plugin($name) {
  return ctools_get_plugins('block_plugin', 'block', $name);

This is very similar to the one before.

In order to make our Drupal block definitions complete, we need to implement hook_block_view():

function block_plugin_block_view($delta = '') {
  $plugin = block_plugin_plugin_from_delta($delta);
  if (!$plugin) {

  $block = array();

  // Optional title
  if (isset($plugin['title']) && $plugin['show title'] !== FALSE) {
    $block['subject'] = $plugin['title'];

  // Block content
  $block['content'] = $plugin['view']($delta);

  return $block;

So what’s happening here?

First, we use another helper function to try to load a plugin based on the delta of the current block and do nothing if we are not dealing with a plugin block.

Second, we build the block. If the user specified a title key on the plugin and the show title key is not false, we set the subject of the block (its title basically) as the former’s value. As for the actual block content, we simply call the view callback defined in the plugin. And that’s it.

Let us quickly see also the helper function responsible for loading a plugin based on a block delta:

function block_plugin_plugin_from_delta($delta) {
  $prefix_length = strlen(DELTA_PREFIX);
  $name = substr($delta, $prefix_length);
  $plugin = block_plugin_get_plugin($name);
  return $plugin ? $plugin : FALSE;

Nothing complicated going on here.

Defining block plugins

Since we told cTools that it can find block plugins inside the plugins/block folder of our module, let’s go ahead and create that folder. In it, we can add our first block inside a file with the .inc extension, for example my_block.inc:


$plugin = array(
  'title' => t('This is my block'),

 * Returns a renderable array that represents the block content
function block_plugin_my_block_view($delta) {
  return array(
    '#type' => 'markup',
    '#markup' => 'Yo block!'

Like we do with all other plugins (content_type, context, etc), the plugin definition is in the form of an array inside a variable called $plugin. And for our case all we need at this point is a title (and not even that since without it the block simply won’t show a title).

Below it, we defined our callback function to display the block. The naming of this function is important. It matches the pattern we used for it during the processing phase (module_name_plugin_name_view). If we want to name it differently, all we have to do is reference the function name in the view key of the $plugin and it will use that one instead.

And that is basically it. We can now clear our caches and go to the Block administration screen where we can find our block and add it to a region. Showing that block on the page should trigger the view callback for that block plugin and render the contents.

More from this author


In this article we’ve talked a bit about cTools plugins and saw how we can define our own type of plugin. We used the latter for transforming the Drupal block system into a rudimentary plugin system. This can be extended further to allow also for the block related configuration hooks to be replaced by callbacks inside the plugin include file. Additionally, as mentioned earlier, you can also make sure all the data available in hook_block_info() can be defined inside the plugin. I leave these tasks up to you.

Oct 02 2015
Oct 02

Discover our new blog post related to QA testing
and optimizing your website's speed.
Everything can be improved! :)

Have a cup of coffee, take a bath, do some physical exercises... That’s what users wouldn’t like to do while a website is loading. According to statistics, people leave a website that loads longer than 3 seconds.

A snail, a turtle, a slowpoke... These are the most innocent things users may say about your low-speed website that you wouldn’t like to hear. Polite users won’t say anything but go to your competitors anyway.

User-unfriendly, not-worth-to-be-ranked-higher-than-the-100th-page... These complicated epithets belong to the “artificial intellect” — in other words, that’s what Google thinks about a snail-like website.

Don’t like the idea of it being YOUR website? Let’s see what your site “speedometer” shows: is your site ready for a run to success or just for snail races? In any case, keep calm. Everything can be improved! There are tools to test and optimize your website’s speed that will let you explore, find out the problematic areas and fix them to make your website “fly”! So let’s start the engines!

1. Google Page Speed Insights


Google Page Speed Insights - Website Speed Testing and Optimization Tools

Believe it or not, Google is not a heartless machine. It can be strict in its ranking preferences but it offers tools for improving your performance which is considered an important ranking factor. Google Page Speed Insights scans your website, tells you its load time, finds its weak points which make it slower, and offers suggestions on how to fix them. In less than a minute, you will get many useful instructions on how to make your website faster. The instructions are categorized by importance.



YAHOO’S YSLOW - Website Speed Testing and Optimization Tools

Yahoooo! Let’s go! Your website will run more quickly if you follow another famous search engine’s tips. YAHOO’S YSLOW assesses your website’s performance and loading speed on the basis of Yahoo’s own set of criteria which make it slower or faster for visitors. This easy-to-use speed testing anf optimization tool provides performance grades on these criteria, as well as advice on how to improve them. For the better picture, the information is presented in charts and graphs, and is graded by importance.

3. Page Scoring


Page Scoring - Website Speed Testing and Optimization Tools

Get rid of the things that slow you down! Here’s one of the simplest online tools for your website’s speed testing, Page Scoring. It scans your site and tells you how quickly it loads with all the HTML, CSS and Js files related to a user’s request. It also gives you links to all these files and shows exactly how much time is “eaten” by the loading of particular files and content. This is a great hint for you to be aware of your basic site performance capabilities starting with the web server response time and ending with the files list of page's elements that steal your page loading speed.

4. Pingdom


Pingdom - Website Speed Testing and Optimization Tools

This tool to test and optimize your website's speed and performance is not so easy for anyone, but very informative and rich in features. It examines your website’s overall requests number, loading time of all files as well as displays the useful data related to these files. It assesses your website’s overall performance, shows the detected problems and offers practical fixing solutions. Both the errors and the solutions are graded by their importance. The data is presented in a visual chart for your convenience.

5. GTmetrix


Web Page Test - Website Speed Testing and Optimization Tools

GTmetrix speed testing and optimization tool provides users with a handy grading system. Besides evaluating PageSpeed and YSlow score, this online service also gives in-depth grades to each point in its checklist accordingly. Collecting all the necessary data related to the server request, it displays its problem-fixing and speed-enhancing recommendations together with the corresponding URLs which is very convenient. It also has a feature of recording a video with the test results and tracking a history of previous checks.

6. Web Page Test


If you use the Web Page Test tool, lots of important details related to the loading of every your website’s object can be presented in waterfall charts and followed with convenient screenshots. You will get your performance grades and a checklist of fixing recommendations in the order of importance. One of cool features of Web Page Test speed testing and optimization tool is that you can select the countries in which you want to check your website’s performance.

7. Monitis


Monitis - Website Speed Testing and Optimization Tools

Check out a simple but effective tool to measure your website’s performance. Within just one minute, it scans all website’s elements involved in the response to the request and shows you the response time of every element. A nice advantage of Monitis is that it checks your website’s speed from 3 different geographical regions at once, so you can get the idea of its average loading speed across the globe.

We hope these speed testing and optimization tools will be useful for your website. Gain speed, hold tight...enjoy your flight! ;)

Oct 02 2015
Oct 02

In my first post about mydumper I explained why developers would want to use it (it's fast!), and how to build it for MacOS. Since that post, there's been some positive developments. First, as pointed out by Max Bube in the comments, the latest stable version of mydumper (0.6.2) now builds cleanly on MacOS 10.9 and later. Secondly, there is a pull request in for a Homebrew formula, so I'm hoping that soon installation via brew will be a snap again for Mac users.


Integration with Drush

In this post I will describe how to extend drush to be able to dump and restore database using mydumper and myloader.

As a Drupal developer, you're no doubt familiar with using drush to make backups of your site databases.


drush sql-dump > ./mydb-dump.sql


The beauty of drush is that it handles all of the ugly details of the database connections and remote credentials, by looking up a given site's configuration from settings.php and drush "rc" files.

Our goal is to enable drush to use mydumper rather than the standard mysql utilities in commands such as sql-dump. We're going to set this up for Drush version 7.0.

We need to address the following differences between the standard MySQL tools and mydumper.

  1. Mydumper creates a directory containing the backup, while mysqldump generates a single dumpfile.
  2. Mydumper has no direct provisions for skipping tables in its dump.
  3. Mydumper requires RELOAD privileges on the DB server.
  4. Mydumper seems to have no way to generate a schema-only dump.

Additionally, the names and presentations of command line arguments differ between the two tools sets.



The latest version of this code is available in my fork on GitHub (on this branch). Please fork this and give it a try. I'm looking forward to hearing about your experiences. I hope to be submitting this as a pull request against the official repo once I've finished tweaking and writing some more tests.

To deal with the issues we've identified we will need to override the dumpCmd()dumpFile(), and dump() methods in the Sql drivers. We'll also implement new loadCmd() and load() methods to support loading backups via myloader.

Let's consider the permissions issue first. In order to create backups, mydumper needs RELOAD privileges on the mysql server. This is a global (not per-table) privilege, unlike most other privileges. So, at the mysql CLI (or via your favourite GUI), create a user mydumper (@localhost) on the mysql server, and give it global RELOAD privileges, as well as the usual Drupal mysql DB privileges. Give it a good password.

Now comes the interesting part. Most developers never have to look beyond the standard 'default' database target in their sites' settings.php files. This is a perfect application for creating an additional database target for your database. We're going to be accessing the same database, but using a different driver and a different user. In the following example, I've added the target 'backup'. This is identical to the default target, except for the database user (we use the mydumper user we just created) and the database driver, which we'll specify as 'mydumper'.



$databases['default'][' default'] = array(
  'driver' => 'mysql',
  'database' => 'dumpertest',
  'username' => 'dbuser',
  'password' => 'abc123',
  'host' => 'localhost',
  'prefix' => '',
  'collation' => 'utf8_general_ci',
  'pdo' => array(

$databases['default']['backup' ] = array(
  'driver' => 'mydumper',
  'database' => 'dumpertest',
  'username' => 'mydumper',
  'password' => '123xyz',
  'host' => 'localhost',
  'prefix' => '',
  'collation' => 'utf8_general_ci',
  'pdo' => array(


Where does this mydumper driver live? Well, we have to create it. While experimenting with this, I've used the drush installed by homebrew, and it provides version 7.0.0 by default. It gets installed in /usr/local/Cellar/drush/7.0.0 for me, and within this directory, libexec/lib/Drush/Sql/contains the SQL drivers.

Drush 7 has a beautiful, clean, object oriented design. Sqlmysql.php provides the class Sqlmysql which extends the base class SQL. Drush finds the appropriate classes from the drivers defined in the database targets in settings.php. So providing a class Sqlmydumper extending Sqlmysql in a fileSqlmydumper.php in the Sql drivers directory does what we need.

Our jumping off point is the drush_sql_dump command, which implements sql-dump. This can be found in libexec/commands/sql/sql. drush.inc.


 * Command callback. Outputs the entire Drupal database in SQL format using mysqldump or equivalent.
function drush_sql_dump() {
  $sql = drush_sql_get_class();
  return $sql->dump(drush_get_option(' result-file', FALSE));


We see that we need to implement dump(). Tweaking the definition from SqlBase.php, we arrive at the following. Note that the dumpFile() method takes care of generating a default dump directory if no filepath is specified. This takes care of the first issue in our list above.


   * Dump the database using mydumper and return the path to the resulting dump directory.
   * @param string|bool @file
   *   The path where the dump directory should be created. If TRUE, generate a path
   *   based on usual backup directory and current date.
  public function dump($output_dir = '') {
    $table_selection = $this->get_expanded_table_ selection();
    $output_dir = drush_escapeshellarg($this-> dumpFile($output_dir));

    $cmd = $this->dumpCmd($table_ selection, $output_dir);

    // Avoid the php memory of the $output array in drush_shell_exec().
    if (!$return = drush_op_system($cmd)) {
      if ($output_dir) {
        drush_log(dt('Database dump saved to !path', array('!path' => $output_dir)), 'success');
        drush_backend_set_result($ output_dir);
    else {
      return drush_set_error('DRUSH_SQL_ DUMP_FAIL', 'Database dump failed');


Most of the work goes on in dumpCmd(). We need to optionally take care of 'structure-only' tables. These can be specified in a drushrc.php file, as in this example:


 * List of tables whose *data* is skipped by the 'sql-dump' and 'sql-sync'
 * commands when the "--structure-tables-key= common" option is provided.
 * You may add specific tables to the existing array or add a new element.
$options['structure-tables'][' common'] = array(

We use mysqldump to generate a schema-only dump of these 'structure' tables. Also, we explicitly generate the list of tables to dump, excluding structure and 'skipped' tables.


  public function dumpCmd($table_selection, $output_dir = '') {
    $parens = FALSE;
    $skip_tables = $table_selection['skip'];
    $structure_tables = $table_selection['structure'];
    $tables = $table_selection['tables'];

    $skip_tables  = array_merge($structure_tables, $skip_tables);
    $data_only = drush_get_option('data-only');

    $exec = 'mydumper ';

    // Start building up arguments for the command
    // Silent operation.
    $extra = " --verbose 0 --build-empty-files ";

    $output_dir = drush_escapeshellarg($output_ dir);

    if (!empty($output_dir)) {
      $extra .=" --outputdir $output_dir ";

    // Mydumper can't read credentials from a file, yet
    $exec .= $this->creds(FALSE);

    if (drush_get_option('gzip')) {
      $extra .= ' --compress';
    if (isset($data_only)) {
      $extra .= ' --no-schemas';

    $exec .= $extra;

    if (!empty($tables)) {
      $exec .= ' --tables-list ' . implode(',', $tables);
    else {
      $parens = TRUE;
      $tables = array_diff(parent::listTables( ), $skip_tables);

      $exec .= ' --tables-list '. implode(',', $tables);

      // Output_dir is not empty in default case where this is called from dump().
      if (empty($output_dir)) {
        $output_dir = '.';

      // Run mysqldump and append output if we need some structure only tables.
      if (!empty($structure_tables)) {
        $only_db_name = str_replace('--database=', ' ', $this->creds());
        $extra = ' --no-autocommit --single-transaction --opt -Q';
        // NB: myloader is fussy about the files in $output_dir.
        // Hence schema_sql is ignored, but schema.sql causes a segfault.
        $exec .= " && mysqldump " . $only_db_name . " --no-data $extra " .
          implode(' ', $structure_tables) . " > $output_dir/schema_sql";
    return $parens ? "($exec)" : $exec;

Restoring (Loading) Databases

So far our integration has looked at the sql-dump command. What about sql-load? It turns out that there is no such drush command. I think this is partly because sql-cli does the job pretty well for mysql dump files. However, in the case of restoring with myloader, we need to be able to deal with the dump directories created by mydumper. So a symmetrical sql-load command makes sense. We've implemented this in the file sqlload.drush.inc. This relies on load() and associated methods from the SQLmydumper driver.

The main thing to take care of in loading a drush-generated dump directory is the optional 'structure-only' tables. We need to reverse the process used to create the schema_sql file and create the required empty tables from this schema file.

Next up:  I still need to improve the help and examples, add tests, decide how to pass additional parameters in to mydumper and myloader. It would be great to get this to work nicely with sql-sync.



Mydumper and myloader are great time-savers, but that's only the start of the fun. Having a one-file-per-table dump format can be useful for doing "database diffs", for versioning database-stored configuration, and other tasks. I hope that having these tools more conveniently available via drush will speed up and simplify your workflows and inspire some interesting experimentation. Happy Drupal Hacking!


Oct 02 2015
Oct 02
Rob Humphries's picture Oct 2nd 2015Project Manager

Building a website is a complicated process. I don’t want to downplay the importance of technical expertise, but for me the most difficult part of a website build is clearly and concisely capturing a client’s requirements. So much hinges on the hours we spend discussing business processes, sketching out UML diagrams and cataloguing every detail. However so often a lot of effort goes in and the resulting documents aren’t as clear as we would have hoped.

the most difficult part of a website build is clearly and concisely capturing a client’s requirements

So how do we improve on this situation? Acceptance criteria. To the uninitiated acceptance criteria are a bit like requirements. They seem to just state a single requirement for a change or fix. The difference is that requirements come in all shapes and sizes, acceptance criteria all look the same. In fact they even have a clearly defined format to help keep to a standard. They look like this:

“Given that… When... Then…”

You should read this as “Given that some precondition is satisfied, when an action or actions take place, then a testable result will occur”. This format lets you turn requirements in to unambiguous, testable, acceptance criteria, which helps developers know exactly what to build, testers know exactly what to test and most importantly helps the actual development go as smoothly as possible.

For example, a typical requirement might be:

we want single sign on between the website and our invoicing system

This could translate in to any number of acceptance criteria so it is important to be unambiguous about what is meant.

Given that I am a user in both the invoicing system and the website, when I visit the website and I am already logged in to the invoicing system, then I am automatically logged in to the website on the first page load

This is much clearer about what is needed. It is still not especially detailed, but it better highlights the additional information which is required, meaning it will be easier to write further acceptance criteria for that as well.

We like to introduce clients to acceptance criteria early on in the requirement gathering stage to let them know what we’re aiming for. It helps guide discussions when you are all internally trying to boil down requirements to these simple little maxims. We still go through all the same processes to uncover the requirements in the first place, the workshops, the diagrams and flowcharts, but then before we start development we review all of that documentation and produce a functional specification including all the acceptance criteria.

This process really ties the requirement gathering phase and development phase together. You can be the best business analyst in the world and have a lot of great techniques for discussing your clients requirements, but unless you can translate them into manageable, testable chunks it’s very tricky to know if you’re delivering what was asked for. That’s why for me this will always be the most important part of a project.

Martin White's picture

You may also like...

Responsive Design: Media Queries And How To Make Them More Friendly

In building responsive websites, whether Drupal or otherwise, we all need to harness the power of media queries. Here is a brief overview of media queries, breakpoints and the basics of the ‘Mobile First’ approach and also some simple tricks for making media queries more friendly, semantic and easier to remember and use with LESS and SASS variables.

Oct 02 2015
Oct 02

This was a question I got from a client. So I set to work on finding a solution to alert the team who needed to know when a page has changed.

TL;DR: CacheTags.

Drupal has an awesome caching layer. It makes use of cache tags, these tags can be invalidated when something changes. For example if this is a view called “frontpage”, it would output the cache tag “view:frontpage”. This view lists a bunch of nodes, each with their own cache tag, “node:1”, “node:2” etc. When node 2 is edited, it’s cache tag and the frontpage view cache tag would be invalidated.

Taking this into account if we want to know what pages have changed, we need to know what cache tags the page has, then what cache tags have been invalidated.

The client already has a crawler to check their sites, this can look at the X-Drupal-Cache-Tags header and capture the cache tags the page has. So all we need now is a way of telling the crawler what cache tags have been invalidated.

Welcome to the CacheTag Notify module. This has a simple settings page where an endpoint URL can be added. Then every time a cache tag is invalidated it gets POSTed to the endpoint as a JSON string. The crawler will then need to to lookup which pages are using the invalidated cache tags, then it knows which have changed.

The CacheTag Notify module works by adding CacheTagsInvalidator service. The invalidateTags method is passed an array of invalited tags, this is then POSTed to the endpoint url using Guzzle. Overall a very, very simple, but effective solution.

Please enable JavaScript to view the comments powered by Disqus.

blog comments powered by
Oct 01 2015
Oct 01

By Nick Savov 01 October 2015

How to Create Custom 404 and 403 Pages in Drupal

One of our users didn't like the generic "Access denied" message for restricted pages. So we created this tutorial for him.

This tutorial will show you go tot create custom error pages for 403 (Access Denied) and also 404 (Not Found) errors. 

Step #1. Create the new error pages

First, let's create the content that we'll use for the new error pages.

  • For example, go to Add content > Basic page.
  • Create your page as usual. In this example, I'm creating a 404 error page. You can also create a 403 error page. 
How to Create Custom 403 and 404 Pages in Drupal
  • We need to find the paths of our new error pages. You can look in the URL bar of your browser to find the paths:

Step #2. Add the custom pages to the Configuration

  • Go to Configuration > Site information:
  • Enter your new paths into the 403 and 404 error page boxes.
  • Click "Save configuration".

Step #3. Test

Finally, test to make sure they work.

That's all there is to it. Congrats! Drupal makes it easy to add the custom 403 and 404 pages.

About the author

Nick is the Director of Sites at OSTraining and you can find him in almost every area of the site, from answering support requests and account questions to creating tutorials and software.

Oct 01 2015
Oct 01

Last week’s DrupalCon was an outstanding event that saw over 2,000 people from the community come together in Barcelona to attend sessions, sprints, and socialise.

We sent 74 of our own team members to the conference (over a third of our group) and we asked them about their experiences to offer a vision of DrupalCon from Wunderkraut’s perspective. Here you will find out what happened, what you should catch up on, and what we recommend to prepare you for next year’s conference in Dublin.

Pre-Conference Opening - Sunday 20th September

Before the conference officially opened for registration, members of our team met with other community developers to get sprinting at Makers of Barcelona - a beautiful and quirky co-working space 25 minutes from the conference centre.

With D8 close and everyone keen to hear what the first days of the conference had to offer in the way of Drupal 8 news, everyone was in high spirits to collaborate and code face-to-face at the extended sprints.


Registration Day - Monday 21st September

Barcelona International Convention Centre opened its doors for attendees to register. Whilst contributors and coders headed to the Contribution Lounge, leaders of Drupal businesses came together at the Business Summit to share experiences, learn new things, and make acquaintances.

Exhibitors and organisers were also buzzing around the exhibitor hall to prepare their stands and catering areas for the evening’s opening reception, giving all attendees a great opportunity to network and discuss the days ahead.

Watch our roundup of Monday at DrupalCon:

DrupalCon Barcelona Monday from WunderTV on Vimeo.

Day 1 - Tuesday 22nd September

The day opened with Dries’ keynote which gave people a status update on Drupal 8’s release, an overview of the state of the CMS market, and an introduction to new techniques for contributing to Drupal. Overall this was well received and the first deadline of October 7th 2015 was set for D8’s Release Candidate.

Our team then went on to enjoy a variety of tracks and sessions throughout the day. Here’s what Wunderkraut recommends watching from the first day:

Highly recommended by our team

Cut the crap. Practical tips and real world examples for removing waste from your development process.

Recommended by our consultants

Caching at the Edge: CDNs for everyone

Drupal 8 media status update

Design to support strategic objectives (hosted by our own Roy Scholten)

Recommended by our back-end developers

Self-Managing Organizations: Teal is the new Orange

Drupal in 2020

Following a day full of fantastic sessions, the Wunderkraut team headed over to Barcelona’s beaches to have a WunderParty. This gave our international group a great opportunity to socialise and network with one another over good food and a few drinks, which our friends from the conference also attended.

Watch our roundup of Tuesday at DrupalCon

DrupalCon Barcelona Tuesday from WunderTV on Vimeo.

Day 2 - Wednesday 23rd September

The second day of the conference kicked off with an inspirational keynote by Nathalie Nahai on web psychology. This lead nicely into the second day of sessions, sprints and BoFs. Here is what our attendees recommend:

Recommended by our back-end developers

Defense in Depth: Lessons learned securing 100,000 Drupal Sites

Recommended by our consultants

Making Drupal fly - The fastest Drupal ever is here!

No therapist needed: clients, teams and no tears (hosted by our own Alice Richmond)

Recommended by our care team

How to print 200.000 Magazines Weekly, and Have Them Published on the Web and Mobile From a Single Drupal Site

Recommended by our operations team

Breaking Down Silos - How channel thinking limits companies and agencies in creating succesful sites and campaigns

Creating a collaborative agency culture that scales

Recommended by our front-end team

Next generation graphics: SVG

Trophy Winning Teams

What's your type?

In the evening a number of our team members headed into the “old town” area of Barcelona to enjoy the local tapas, sangria, and local culture. All of the local people were out and celebrating La Mercè Festival which involved fireworks, parties, and fun.

Watch our roundup of Wednesday at DrupalCon

Drupalcon Barcelona Wednesday from WunderTV on Vimeo.

Day 3 - Thursday 24th September

Thursday was the final day of sessions and by this point a lot of new information, local culture, and sangria had been consumed by conference attendees who stayed since the start. It was hard to find one of our bean bags free at the conference that didn’t have an attendee catching a nap on it!

The final day of sessions, however, was great and they were started by two excellent community keynotes by David Rozas and Mike Bell on mental health in the open source world and the phenomenon of contributing to a community. Both talks were received very well by our team and the community.

Here’s what else Wunderkraut recommends from the day:

Recommended by our back-end developers

Testing with Monkeys: Using Chaos for Better Code

Building the Front End with Angular.js

Recommended by our consultants

Visual Regression Testing

Making Drupal a better out-of-the-box product: Report on usability testing results and how we can make 8.1.x+ shine (joint hosted by our own Lewis Nyman)

All of the conference’s sessions ended with Holly Ross’ Closing Session that provided some cool community and conference stats, in addition to the location of next year’s Drupalcon - Ireland!

To celebrate a successful DrupalCon, most of the attendees headed down to the Trivia Night where they had an opportunity to win some fun prizes, including these sought after goodies:

Some @Wunderkraut beanbags are up 4 grabs. A lot of folk have their eye on this prize, even sans-beans. #DrupalCon pic.twitter.com/B5Bti8iyJi

— Andrew Macpherson (@MartianWebDev) September 24, 2015

Sprinting for Beginners and All - Friday 25th September

Friday was a day for first-time sprinters to meet the mentors and get started with contributing to Drupal. It began with a workshop on downloading the tools required to contribute and lead to people being assigned to different contribution tasks and issues, depending on their different skills.

Later on in the afternoon Angie Byron (webchick) committed a selection of contributions that newcomers made to Drupal 8 whilst they were at the conference and everyone celebrated the new additions together.

Extended Sprints - Saturday 26th - Sunday 27th September

The rest of the weekend was spent sprinting by contributors back at the creative co-working space, Makers of Barcelona. Overall, a nice way to finish of the week in beautiful Barcelona.

Tips for future DrupalCon Goers

With over 70 odd of our team attending this year’s DrupalCon we’d like to leave a few bits of advice for future participants who may be completely new to the conference to make their experiences as enjoyable as ours.

Marc Galang, Software Developer

“Attend the prenote! Also if you're joining the sprints make sure you have a running environment before you leave your country/office because sometimes the internet could be really slow that it takes A LOT of time to download stuff that is needed for the sprints.

Bert Boerland, Sales Manager

Sleep as much as you can upfront. You should also add the checkmark of being at the con in your Drupal.org profile.

Mikael Kundert, Software Developer

After you start to find sessions that aren’t that useful for you, move on to participate in BoFs and sprints!

Bernt Andreas Drange, Software Developer

Remember your business cards and cash for coffee!

Jenny Kannelsuo, Service Manager

Plan ahead and check the sessions beforehand.

Randal Whitmore, Marketing Assistant

Embrace as much as you can, especially if this is your first experience with the community. Communicating with people in person and getting to understand those behind Drupal is invaluable.

Oct 01 2015
Oct 01

Talking about UX design services becomes a new trend. While not so many people are certain who is a user and what is his or her experience, hundreds would like to contribute into the discussion about proper approaches to it. Let’s take a look on 5 the most widespread UX myths and their disproof.

1. Scrolling

How many people view it. If I develop a long page that requires a lot of scrolling, user will read only the top of information. He or she will not scroll down. Who, actually, scrolls down?

How it really is. Maybe, that statement was a crux ten years ago, but now people are in used to scrolling. Another thing is if they really like it, but actually this is the first action we perform at any website, even if it is without scrolling. Web developers design beautiful one page websites where everything is based on rolling a page - down, to the right or left and so on. Scrolling is a method, and it’s up to you how to use it.


  • Chartbeat: people pay 66% of their attention to the information outside the fond;
  • MOVR: 50% of mobile users scroll after 10 seconds on a website, and 90% after 14;
  • ClickTale: 76% pages are scrolled by a user, and 22% are scrolled until the bottom;
  • CX Partners: people scroll, if a page design encourages to do that;
  • Jared Spool: despite their words about dislike of scrolling, people will to perform it.

2. Aesthetics Vs. Usability

How many people view it. If a website looks well, it’s already usable // If a website is usable, it’s already aesthetic.

How it really is. Successful UX design is a combination of nice look and usability. You cannot neglect some component if you want to achieve a positive result.


  • Stanford University: 46,6% of users underline the impact of visual performance on their experience with a website;
  • Research “Do “Attractive Things Work Better”?”: nice things are more usable;
  • Oliver Reichenstein, Steve Jobs: design is about performing, not only about aesthetics;
  • “Emotional design” by Don Norman: good design is about functionality and aesthetics;
  • Peter Bilak: design is about effective and ineffective communication with a user.

3. Rule of 7 (+/-2) options

How many people view it. If I add more than 7 options to a website menu, it will be bad. Very bad. Very very bad.

How it really is. This prediction is based on George Miller’s theory, according to which an average person can keep no more than 7 items in a short-term memory. However, people do not have to memorize the buttons on your website - the aim is the functionality and attractiveness. The same is also related to the theory about three clicks to reach the information. Think about your user, not about the numbers.


  • George Miller: theory is related to unidimensional stimuli and immediate recall and has nothing in common with the ability to comprehend a text;
  • Human Factors International: top-level broad menus are more efficient;
  • Jakob Nielsen: short-term memory is significant, but it does not have to limit a website;
  • Edward Tufte: this conclusion is based on imaginary information: Miller did not limit the amount of information that has to be presented to the audience;
  • ClickZ: 7 might be a magic number, but not scientifically proved.

4. Rationality

How many people view it. People are rational. They come through my website and analyze the information in order to make meaningful choice.

How it really is. There for sure are some persons, who estimate everything and only after that act. However, mainly your user is lead by emotions and subconscious. He or she even choose the first option that captured the attention.


  • Anchoring effect: people are inclined to rely on the first piece of information they trust (“anchor”);
  • Power of free: people would prefer $10 Amazon certificate as a gift than buy $20 certificate for $7;
  • Framing, illustrated by famous full in half or empty in half glass: the description or initial idea determines the choice of people;
  • Placebo effect: if we believe in something, it helps us; if we trust a brand, we do not take care that there might be a better option;
  • Thinking in relative terms: according to the experiment, people would not walk to another shop where they can save $7 from $455 item. But they will perform that action if the item costs $18.

5. Stock photos

How many people view it. Nice stock images will heal my website. And actually it does not matter if they match the idea.

How it really is. Users love visual elements of a website, but they are frequently frustrated by typical stock photos and other graphic elements. Inappropriate images are the noise which they try to reduce.


  • UIE: ornamental graphics provide more harm than advantage;
  • Gerry McGovern: people distinguish marketing images and do not like them;
  • Jakob Nielsen: people are blind to the majority of things that look like an ad;
  • Laura Ruel from the University of Southern California: people are looking for a content, not decorations;
  • Joshua Brewer: imagery that transmits the wrong message is the most dangerous element.

Do you still believe in myths? OK, wait for our next articles. There are still many myth to refute. However, the main aim of every website is to meet the requirements of users and facilitate their online experience. Therefore, think about people, not about predictions or numbers.

Oct 01 2015
Oct 01

Some of the most interesting new modules I saw posted to drupal.org in September:

Views Advanced Routing

(for Drupal 8) Allows you to specify the routing configuration YAML for a Views page. Meaning, you can use custom access control callbacks, default parameters, etc. Sweet!

Commerce Responsive UI

Provides replacement interfaces for the parts of Drupal Commerce that are table dependent and non-mobile responsive by default. These include Responsive Cart, Responsive Checkout, and Responsive User Facing Orders.

Drupal 8 Contrib Porting Tracker

Not a module, but a centralized place for tracking the Drupal 8 porting status of contributed projects (modules, themes, distributions). The best place to find out that the Bad Judgement module is ready for D8!

Advanced Image Crop

This image field cropper lets the user do a different crop in each of the image styles configured by the admin. You better have some saavy users to comprehend this, but if you do, it looks awesome.

Webform Replay [sandbox]

Extends the Webform module by adding an option to “replay” selected webform values in situations where multiple webform submissions per user are allowed, and some of that information is likely to be repeated on each submission. By enabling webform replay for these fields, the user only needs to complete them for the initial webform submission, and on subsequent entries these fields will be pre-populated with the values from the previous submission.

Forbidden File Format

Flips the file field extension checking around so that you can allow all types of files except the extensions specified. So you could deny .js, .exe, .bat, and .com, but allow other types.

Tableau WDC [sandbox]

Tableau 9.1 includes a new Web Data Connector feature, which lets you build connections to data accessible over HTTP with JSON data and REST APIs. This module attempts to bridge the gap between Drupal and Tableau by adding a new views plugin (tableau_wdc) which renders content as a JSON with some extra meta information needed by Tableau. Once you have created your endpoints, you can add the tableau-wdc block to any page and it will automatically render a button for each data source together with all the necessary scripts to parse and prepare the data for import.

Nuke Drupal Frontend

Allows you to completely disable frontend HTML access to a Drupal site, for when you’re building a headless site, and you’re not using the Drupal-provided frontend.

Doubtfire [sandbox]

An alternative to the Masquerade module, with some useful UI additions.

Gmail Connector [sandbox]

Lets users view their Gmail inbox and messages in Drupal using the Gmail RESTful API.

Oct 01 2015
Oct 01

Yoast Drupal SEO Module: Tested and Reviewed

Yoast SEO is a household name in the WordPress community and as a premium drupal themes shop owner I was jealous of their favorite tool. Yoast SEO gained popularity because it didn't just make SEO finetuning possible in WP, it made it fun.  Important onpage SEO factors are pulled together in a container below the texteditor. Yoast SEO gives you feedback on basic metrics like keyword density and post length, but also more advanced feedback... It will tell you if you remembered to use your keywords in the meta description, and if the length of your page title is optimal for a nice click-through-rate in search results pages.

Yoast Drupal

I've been waiting a long time for Yoast to come to the Drupal ecosystem, and I'm excited it's finally here! I was also a little skeptical. I feared they might have done a straight port of all WP code to Drupal, ignoring gems in the Drupal ecosystem like the Metatag module. I was happy to see that my fellow Dutchies at Goalgorilla and Yoast have done a good job and built the module the Drupal way. Yoast Drupal SEO is interoperable with both the Metatag and XMLSitemap modules. 

There are also some new additions to the module, like a Flesch reading test metric that tells you if your text is easy to read. I think this is great because I have a natural tendency to get a little academic with my language. Instead of rewriting my text after proofreading I'm now made aware of my writing style while I'm writing.

First Experiences

After installing Yoast Drupal SEO it attached itself to all content types of my sandbox copy of the SooperThemes website. This was a little overkill because I don't need SEO feedback on support tickets, contact forms and archive pages. This is easily fixed by disabling Yoast Drupal SEO on  the relevant admin/structure/types/manage/page content type admin pages. 

The next problem was a bit more serious. I use CKEditor on all my sites and alltough the module does come with a CKEditor integration, this had to be the one component that was broken. I did some work on it and submitted a patch. Now the module is working great on blog posts and I'm using it to write the post you're reading right this moment.

Issues with Markup-heavy pages

While the module is now working for my blog posts I cannot say the same for my homepage. The homepage on this site is built with Bootstrap 3 and the Glazed theme drag and drop page builder. If you haven't seen this wondeful tool yet check out my Drupal themes homepage where you'll find a video demonstration. Yoast was reporting a word count of around 600 even though the text is only around 300 words. It looks like the module is counting HTML tags as words.

I verified this by creating a simple drag and drop page with the Glazed Drupal theme page builder: a section with a row and 3 columns with Lorem Ipsum. Upon saving the page, the Yoast Drupal SEO module made a bit of a mess by creating a meta description entry with the following contents:

<p>&lt;div id=&quot;b2&quot; class=&quot;az-element az-section  &quot; style=&quot;&quot; data-az-id=&quot;b2&quot; data-azb=&quot;az_section&quot;&gt;&lt;div class=&quot;az-ctnr container&quot; data-azcnt=&quot;true&quot;&gt;&lt;div class=&quot;az-element az-row row&quot; style=&quot;&quot; data-az-id=&quot;b3&quot; data-azb=&quot;az_row&quot; data-azat-device=&quot;sm&quot; data-azcnt=&quot;true&quot;&gt;&lt;div class=&quot;az-element az-ctnr az-column  col-sm-4&quot; style=&quot;&quot; data-az-id=&quot;b4&quot; data-azb=&quot;az_column&quot; data-azat-width=&quot;1/3&quot; data-azcnt=&quot; 

Limited support for fields

Currently the module only looks at body fields, which is a bit of a shame if you have a homepage with a bunch of peripheral content in blocks, or if you want Yoast to analyze your image fields. The problem is even more real for people using the paragraphs module. It would be neat if Yoast could be more clever with understanding HTML and complete webpages. After all, we're optimizing our content for Google and Google is definitely very advanced at parsing our pages.

Yoast Drupal SEO vs SEO Compliance Checker

I was previously using SEO Compliance checker to get similar SEO metrics on SooperThemes. SEO Compliance checker has similar goals but it's not as complete and refined as Yoast SEO.  Yoast Drupal SEO is a project in early development and obviously it has a bunch of issues, but it's the clear winner in usability. It surprised me with it's refinement and interoperability. For example, when creating a new blog post it shows a Google search preview snippet and it's prefilled with dummy text that reads "Please click here to alter your page meta title". When you click it you can enter you title/description right in the snippet preview. It will then add your text to the Metatags vertical tab. This is interoperability at its best.

Good Job

Now I'm finishing up this blog post and Yoast Drupal SEO is giving me the green light for "good job". The admin content overview however is still giving me the red light: There is still some work to do before this project is ready for integration in my premium drupal themes product line.

Oct 01 2015
Oct 01

The Problem

I have a theory.

My theory is that every single person / organization who is considering building a site on Drupal 8 has created some variation of the exact same spreadsheet. The spreadsheet tracks rows with information, such as which contributed projects the site needs, what URL those projects live at, who the maintainers are, what the project's current porting status is, etc.

To figure this out, you go to each of the respective project pages and look for an 8.x version. If that comes up empty, you attempt to search the issue queue for variations of "Drupal 8," "D8 port," etc. Worst-case, falling back to good ol' Google. Repeat every few weeks.

Man months have probably been spent on this duplication of effort so far.

To further build on that theory, I'm guessing that these spreadsheets do not always jive with current reality. Because you might have missed the update that contributor X gave on Twitter one time about her predicted module's release date. Or you might not have been sitting next to contributor Y at dinner during DrupalCon and found out that her module's actually being ported on GitHub or BitBucket, only being moved to Drupal.org when it's complete. Or you didn't get the chance to actually install the project yet to determine that even though this one has just a -dev release, it's actually quite stable, and even though that one has an beta release, it's changing APIs every 6 minutes. Or whatever.

The Solution

Enter the Drupal 8 Contrib Porting Tracker! This is a "meta" project that holds issues that represent the porting status of various projects, and allows us to work as a unified Drupal community to combine our collective observational super powers into one data set that can be used by anyone considering building on Drupal 8.

Screenshot of issue listing

How does it work?

Issues within the project move through an issue status workflow of:

(There are also a couple of special statuses that fall outside the general workflow.)

The goal is to get 100% of the projects in the list to "Fixed," as quickly as possible, to help enable widespread adoption of Drupal 8.

Each issue follows a standard template, which includes information such as who's porting the module, where to find the code, and what help is needed by the maintainers to expedite porting.

Project page for Drupal Commerce.

Why do we need this project?

Back when I first started at Acquia in May 2011, Drupal 7 had just recently come out and one of my first tasks was to facilitate a community-wide effort to get the big projects ported. This took the form of a standardized issue tag used in each of the projects' Drupal 7 tracking issues, and an external site to track status, which was more-or-less a public version of the Upgrade Status module with an opinionated list of projects.

However, this approach ran into a few problems:

  • Issue tags are easy to misspell/misplace, and require 'insider' knowledge to learn/remember the names.
  • Searching for the status of a module you cared about was difficult, because that status might be spread over multiple issues, or the module maintainer might not have gotten around to making a tracking issue yet.
  • Promoting an external, non-D.o site was difficult, as was performing those updates to the information that had to be done manually.

So I'm really excited about this project, since it eliminates all of these issues. It creates a single, canonical, searchable source for info, on Drupal.org in an "official" capacity, and with the ability to consistently track additional metadata such as estimated release timeline and how to help. I'm also excited that it enables people like project managers, folks at sprints without a lot of prior D8 experience, etc. to make meaningful contributions to Drupal 8.


The Drupal 8 Contrib Porting Tracker is a joint effort bootstrapped by many people before and during DrupalCon, including:

Kanban view of modules

So, bottom line, regardless if you're the module maintainer or not, "if you see something, say something" — please share whatever knowledge you have about various modules' porting status and/or places to help, so we can get all of these to green as quickly as possible, and Drupal 8 can achieve world domination! :D

Oct 01 2015
Oct 01

As we discussed a lot about translation in the previous posts Translation in Drupal 7 : How it works? and TRANSLATION in Drupal 7 : How to work with, let us discuss few points about how to do custom translation to our module and pot(.po) file handling for string translations. Before getting into the custom translation let us know few things about pot file handling. The pot (or) potx file which will be with extension .po. This pot(.po) file can manually be created or this can be generated with the help of the drupal module called Translation template extractor.

Let us see, how to generate the pot file for translation. First we need to enable the Translation Template Extractor module. Once the module is enabled, you will be seeing the “Extract” tab in the TRANSLATE INTERFACE section under REGIONAL AND LANGUAGE.


Now create a custom module and build all your required functionalities in the module and before enabling it, now go to the Extract Tab in Translation Interface, there you can find you module listed under Directory "sites/all/modules".


Now, select your module, then choose your best options for the pot file, then click extract. At once you click extract, you will be given a file named in a specified format like this “module_name.language_name.po”. For Instance, custom.es.po, custom.fr.po, custom.ta.po, etc. After getting this file, create a subdirectory in your module named “translations”, then move the extracted .po files to the directory.


When you open the pot files, you will be seeing the contents like this:


This shows the msgid which is the string to be translated and msgstr is the string for translation, once you extract the file with include translation option enabled, the possible translatable items with their respective msgid and msgstr will be given, whereas the unmatched items will be left null as like the first one in the above image. For this kind of left out items, we need to add our translatable strings manually.


After this, when you attempt to enable the custom module you developed you can see the translate pot files gets imported automatically.


Now we are done with the custom translation for the module. But you may think that if you add/modify some translation strings, still you can continue with the translation in either way

  • By using this command


The drush command calls the locale_system_update(...) which in turn import the files and updates the translation string for the module.

Oct 01 2015
Oct 01

I’ve recently been working on a jQuery plugin that uses a HTML5 video as the background for a page. An idea that perhaps owes far too much of it’s inception to splash pages, it was worth investigating; as a test for HTML5 video player development and because of it’s interesting use of the video element.

This blog explains about how to set up video background in drupal. There are many plugins available to create background video in drupal and I am going to discuss jQuery videobackground plugin. The plugin should work in any browser that supports HTML5 video.

First you have to download jquery-videobackground plugin from here and place it at theme's js folder, for ex: sites/themes/theme-name/js/jquery.videobackground.js

Next you have added the following jQuery code in your custom js file

$(document).ready(function() {
    $('body').prepend('<div class="video-background"></div>');
         videoSource: ,
         controlPosition: '#main',
         poster: 'sites/all/themes/midnight/video/shutter.png',
         loadedCallback: function() {

Here are two callbacks in the plugin, one when the video is preloading and one when the video has loaded. Callbacks allow you to write additional JavaScript that will be triggered by the plugin.

A callback should allow you to use the other buttons. It’ll look something like this:

   videoSource: ['video/big-buck-bunny.webm','video/big-buck-bunny.ogv','video/big-buck-bunny.m4v'],
   controlPosition: '#main',
   poster: ‘video/big-buck-bunny.jpg’,
   loadedCallback: function(){
   $('div').click(function(event) {
   if ($('.video-background video').get(0).paused) {
      $('.video-background video').get(0).play();
   else if ($('.video-background video').get(0).ended) {
      $('.video-background video').get(0).play();
   else {
      $('.video-background video').get(0).pause();

The code wrapped in loadedCallback is added on to the plugin and causes any div’s on the page to trigger the video to play or pause when clicked.
Plugin parameters:

    videoSource: Either an array of strings of video URL's or a two-dimensional array containing video URL's and type. No default.
    poster: The URL string of the image used for the video poster attribute. No default.
    autoplay: Video autoplay attribute boolean. Default is true.
    preload: Video prelod attribute string. Default is none.
    loop: Video loop attribute boolean. Default is false.
    controlPosition: Position of the video controls, will append the controls to choose DOM element. Default is null. If null will append controls to the element the video background has been applied to.
    controlText: An array of text options for the video control elements.
    resize: Boolean which will trigger the video background to resize to match the browser height. Set to false is video background is used on another element. Default is true.
    preloadHtml: If required, a user controlled HTML string can be injected in to the control area of the page while the video is preloading. It will be over written by the video controls when the video is ready to play.
    preloadCallback: Allows a function to be triggered when the video preload is initiated.
    loadedCallback: Allows a function to be triggered when the video is loaded.
    resizeTo: Allows the video background to resize to either the document or the window. Default is document.
    muted: Starts video muted. Default is falsey.

Oct 01 2015
Oct 01

Somehow we're nearly at the end of September. School is back in session and the summer "break" has ended. Daymuse's hometown of Richmond hosted more than a half million bike race spectators. Drupal's major event, Drupalcon, was a smashing success in Barcelona. Now we're looking forward to New Orleans next year. 

You may have noticed a long stretch since our last post on the Daymuse blog. Summer sent me gallivanting across Europe, turning the tables on my grandparents whom were my guides when I was younger. The rest of Daymuse had to pickup the slack and so we haven't written anything new around here recently. Traveling with limited hardware also let me put a lot of these tools to the test. If you're just getting back into the swing of things too, what better way to stretch your Drupal muscles with the latest and greatest tools for your work?

It doesn't matter if you're still in Drupal training or you're a Drupal expert: there's always new tools that can make your Drupal work faster, better, or cheaper. There's a lot of ground to cover here as this article originally surpassed 5,000 words rather quickly. Instead of a single monster post on Drupal tools, I'm going to break this up into a tutorial series of five posts over the coming days covering different subtopics:

  1. Drupal-specific Modules and Tools for Developers
  2. Web Services for Drupal Developers and Consultants
  3. Simple Web Apps for Drupal Developer Quality of Life
  4. Go-to Applications every Drupal Developer Needs
  5. The Cutting Mobile Edge: Do Drupal Development from Anywhere

Each new post in this Drupal Developer Toolkit tutorial series will highlight different day-to-day tasks a Drupal developer may run into and tools to help solve problems. Let's get right into Drupal-specific Modules and Tools for Developers today. Have your own idea to add? Take to Twitter!

Drupal Development Tools: Expand your Developer Toolkit

With the standout exception of Drush, the "tools" mentioned below are really Drupal modules. The reason I'm defining them as useful day-to-day tools is that they don't actually do anything on their own. They add no particular functionality to a Drupal implementation themselves. Instead they give you, the developer, a bit more of an overview and more reporting options. They're better thought of as extensions of the "Status Report" page. These are excellent tools to add to your Drupal developer toolkit.

Security Review Module

?Before we launch any new Drupal site, we run through this module's checklist. It will verify each condition is met and provide suggestions on how to solve unmet conditions. The module runs a gamut of tests, from file permission checks to .htaccess verifications.

It's important to consider that merely passing "all green" on this checklist doesn't mean the site is 100% safe. Instead, think of it as an excellent starting point. Once you've gone through the process on a few sites, you'll get into the habit of taking care of unmet conditions before you even run the test. That's a great habit to build.

SEO Checklist Module

Just like Security Review above, this module serves as a task list for making sure our work meets the basic needs of search engines and their understanding. Incidentally, strong search engine understanding correlates with accessibility on the web. Even if you don't care too much about search engine optimization (SEO) or page rankings, you should care about your user's ability to read and understand your website. This module doesn't have anything to do with page-level ranking improvement: it will not help you build backlinks, test keyword strength, or write well. That's still up to you and your content contributors.

Within the realm of Drupal, there's nothing that really compares to Wordpress' infamous Yoast SEO plugin which does focus on content-level optimization. Drupal does have a cobbling of modules (that are severely outdated and bloated) which attempt to replicate Yoast's functionality but fail. I see room for a module developer to carve out quite the user base for a new module!

Hacked! Module

You didn't modify Core, right? That's the cardinal rule. I'm going to assume you didn't modify Core.

Drupal Meme: Never Hack Core or Cat Dies

But, if you did, or you're afraid someone else with code access did, Hacked! can tell you. What you're more likely to run into is a modification to a module or theme. Often this is a module patch you applied in the past and then forgot about. That can be a real pain in the butt for a Drupal developer: which module was patched by whom to do what? Hopefully, you're tracking your patch files in your version control system. Running a test with this tool will identify which contributed modules have been modified and even diff the changes for you.

Hacked! helps you avoid upgrading a module and overwriting module changes via patches or modifications to cure a problem or solve an edge case issue. It's also an incredibly useful tool if you're new to a project or a client and want to verify the integrity of the Drupal codebase.

Drush command-line Utility for Drupal?

This is the do-everything swiss-army knife command-line utility of Drupal. I hesitated even including it here because it should be a given, but just in case: Drush, you need it. At the simplest level, Drush just gives you the ability to do nearly everything you can do in the Drupal GUI via the command-line. That may not sound like a big deal, and though it's a huge time saver simply by being command-line driven once it's in your workflow, the real power of Drush comes from bulk processing tasks. Want to run a database update across several sites at once? You can do that in one command and Drush will keep plodding along while you do something else. Want to sync the /files directory across multiple environments (dev, stage, prod)? One line.

Drush is the power user shell for Drupal workers. If you're not using Drush already, and you do something that even resembles Drupal development work, this tool carries the single biggest impact on this list for your life.

Honorable Mention: A Better Drupal Administration Experience

Drupal 7's administration experience out of the box has grown long in the tooth. That's alright because Drupal's community has created an incredibly powerful set of modules that combine to create a responsive, intuitive, and user friendly administration experience. I wanted to give an "honorable mention" to our post detailing how to put together such an experience.

In the next post for this series, we'll be tackling web services. These are especially important for small Drupal firms, consultants, or freelancers as they help makeup for low headcount and lack of business expertise. Summer has set and we're off to another exciting season of Drupal and web development on the Daymuse blog. Stay tuned.

Did you like this post and want to see more on Drupal tools? Share it!

Oct 01 2015
Oct 01

With only a few critical issues left in the Drupal 8 queue and D8 being surprisingly usable, many developers already use it in small projects to play with the technology and to challenge themselves.
I have to admit, I am no exception - the embracement of many PHP technologies and (finally!) the jump to the OOP paradigm makes me want to stop writing right now and code some more.

Which projects qualify for Drupal 8 today?

I would wait a few months before creating bigger D8 projects for my clients. The community has to play some catching up first and port modules, themes and write documentation. On top of that, apart from all the OOP technologies we love, there have been some new drupalisms introduced and not documented yet - this combined with the lack of contributed module solutions makes D8 development much more time consuming for paid projects in comparison to D7.

Small projects however are very doable.

First however, it may be necessary to upgrade the server, as D8 introduces relatively high PHP and SQL requirements. See the official requirements page.

With its translation capabilities, ckeditor and views in core, creating a simple portfolio or blog website with Drupal 8 may be even quicker than using its predecessor. The built in WYSIWYG even lets you upload files directly into it. A feature for which you had to install ocupload in the past.
On a side note, going through the list of modules, you may be negatively surprised by the fact that it is impossible to disable modules - this has been done by design, check out this page. The gray area where a module has its settings saved in the database but is still disabled, is gone.

Drupal 8 module creation

The small number of contributed modules will force you to create your own, even for small changes on the site. I cannot overstate how fulfilling it is to code Drupal modules and at the same time be able to (mostly) follow PHP best practices. The .module file feels almost like a thing from the past left there to accommodate some developers and site builders resisting change. It will include all the hook functions which will hopefully only call Drupal and custom class methods anyway. Those module class files is where the real action takes place!

Variables as means to store quick data have been replaced by the much more sophisticated configuration system. This move brings many advantages including data portability, an actual relation between the module and its data (no more abandoned variables after module deletion) and many more.

Finally Caching has become smart! Cached content is able to invalidate itself depending on several circumstances, including content changes. Setting cache tags for cached module data is very easy and efficient. This system makes the heavy Drupal technology appear fast on an interpreted language like PHP.

Heads up regarding the devel module: it installs fine, however dpm() runs out of memory and leads to a WSOD, regardless of the amount of memory set. The krumo() function is a working alternative.

Drupal 8 template creation

You will probably find that there is no real choice in templates and that creating a custom theme is a must. Creating sub themes in Drupal is a treat. TWIG for the markup, YAML for the config files, it all fits rather well together.

For most projects you will be creating a sub theme on top of the included 'classy' theme or another contrib base theme. Adding CSS and JS files and combining them to libraries in the .libraries.yml file provides a lot of flexibility more or less deprecating the D7 libraries module.

Overriding a base theme is really simple by adding specifically named templates, including and excluding(!) certain base theme libraries.

The state of Drupal 8 SEO and spam prevention modules

While Drupal 8 comes with a well balanced selection of  core modules, there is a couple of functionalities which will be added on top in most of your projects. These are spam prevention and SEO. Drupal 7 has a ton of modules for these purposes while Drupal 8... not so much.

In terms of spam prevention, for smaller to medium projects, I recommend the dev version Honeypot module. See How to use the Drupal 8 honeypot module efficiently. For big projects, captcha seems to be a good choice, however currently it has some major issues.

In terms of SEO, the metatag module is far from functional (do not bother to download the dev version, it is just some test code displaying a phone number field), but this is not tragic, the metatag module's impact on SEO has been declining a lot anyway.

The real problem has been the lack of an xml sitemap generator. Google loves sitemaps, but the Drupal 8 version of the xml sitemap module is broken. This is why gbyte created a sandbox module called Simple XML Sitmeap. It is stable and works well with the latest beta. It has not been promoted to a full project yet because of this issue. Feel free to download the sandbox or grab it from here.

Get ready to work around some issues

As mentioned, the documentation is really lacking, but we have to work with what we have. While everyone is focusing on the critical issues, do keep an eye on the other ones as well. From the top of my head I have experienced D8 issues like

  • css caching problems
  • language detection problems
  • self-resetting menu items
  • broken views contextual filters
  • incomplete entityQuery class
  • missing private file system image styles

... many of those still prevail until beta 15, which is supposed to be the second last beta release. I guess the only thing to do is contributing to the issue queues.

All in all though the experience has been rewarding and I strongly encourage everyone to start hacking with Drupal 8. I am looking forward to completing tons of D8 projects soon. I invite you to share your experience in the comment section.

Sep 30 2015
Sep 30

This month, we got to hold our public board meeting, well, in public. Mostly all together in Barcelona, we met in the middle of DrupalCon to share some updates with the board and community. As always, if you want to catch up on all the details, you can find everything you need to know about the meeting online, including minutes, materials, and a video recording. If you're just here for a summary view, read on!

Drupal 8 Accelerate is fully funded

Early in 2015 we set out to do something that we have never done before: raise $250,000 to get the next release of Drupal out the door. I am thrilled to share that we met that goal at DrupalCon Barcelona, with the last donation coming in from Exove just before Dries took the stage for his keynote. Drupal 8 Accelerate allowed the Drupal core maintainers to identify issues that needed immediate attention and pay contributors to make their time available. Additionally, community members were able to propose sprints and other initiatives to help crush D8 release blockers. We've made over 50 grants around the globe through the program, resolving hundreds of issues. We want to thank everyone in the community who donated and helped spread the word about the campaign, including our anchor donors, Acquia, Appnovation, Palantir.net, Phase2, Wunderkraut, PreviousNext, and Drupalize.me.

D8 release candidate communications plan

We all heard some very exciting news during the Barcelona #Driesnote. Unless we come across any major unexpected hiccups, we'll have a Drupal 8 release candidate ("RC") on October 7. At the Association, we're gearing up to work with the community to shout the RC news, and then the full release news, from the rooftops. We shared the plan at the public board meeting, and are asking the community for help in two specific areas. First, we need your help educating people about Drupal 8 features and how they can be used. We also need your help sharing how Drupal 8 will meet the needs of specific audiences. We'll be updating the Drupal 8 landing page over the next few weeks and want to fill it with all of your great work. Here's the kind of content we're looking for:

Here's how you can share in the D8 release fun:

  • Planning on hosting a release party? Share the details and we'll help spread the word about your event.
  • Are you already building sites with Drupal 8? Share a link in social media and tag it #madewithdrupal8. You can also add it to the list on groups.drupal.org.
  • If you have demos, white papers, blog posts, or some other materials that talk about the virtues of D8, share it on social media and tag it #drupal8rc.

2016 at-large board elections

Every year the Drupal commmunity nominates and elects one individual to serve a 2-year term on the Association board of directors. If you're interested in what the board does and why you might want to consider running, you can check out this blog post and presentation from last year. We'll be holding the next elections in the first three months of 2016, so we took some time in Barcelona to talk about the process. You can review the presentation from the meeting, and here are the key dates for the next election:

  • Nominations (February 1-19, 2016)
  • Meet the candidates (February 22 - March 4, 2016)
    • February 23 session at 7am Pacific
    • February 24 session at noon Pacific
    • February 25 session at 4pm Pacific
  • Voting (March 7-18)
  • Ratification and communication (March 25)

Cake for Angie

We also took a moment to thank long-time board member Angie Byron (webchick) for her service on the board. Angie's term ends in November, and she is stepping down from her board role to focus on making the Drupal 8 release as big as possible. One a personal note, I am so grateful for the opportunity to work with Angie so closely for so long. Her ability to be honest and kind at the same time is something that I have tried to learn from every time I interact with her. Thank you Angie for everything I have been able to learn from you.

Sep 30 2015
Sep 30

Part of my job is to get my hands dirty with technologies I stumble upon. I've decided to have a go at React. Well, one thing led to the other and it seems I went down the client side rabbit hole. I'd like to share with you my path - watch out though, it's a slippery slope.

"Hello World" in Elm

It all started with this Thinking Flux video which explains the problems Facebook faced in its front-end and the new application architecture they are now using.

Since the Flux concept was out, different libraries were written implementing it, but in my view it seems that Redux is the winner in terms of simplicity, popularity, docs and community. I really recommend going over it - at least the intro and basics. You might be tempted to actually learn a bit of React (tutorial) to follow the examples more easily.

Then I saw Redux was crediting Elm for some of its inspiration, so I decided to give it a quick look. I was immediately blown away by Elm. The syntax is weird (unless you know Haskell), it has a crazy learning curve, but a lot of it makes so much sense.

The following recording is a presentation I first gave internally for Gizra devs, then as a BoF in DrupalCon Barcelona, and finally recorded to share it with everyone.

[embedded content]

My goal is to get more people excited about Elm so the community and contributions grows. I feel it is now very much like Drupal about 10 years ago - a small community, far from being mainstream, but with a lot of potential.

Maybe if we'll draw from Drupal's experience in building and cultivating a community we'll be able to bring this awesome tool closer to the mainstream.

Sep 30 2015
Sep 30

The Drupal Association has partnered with Niswey, an India-based marketing firm, to provide marketing materials for DrupalCon Asia. Every few weeks, we'll be sharing the blogs and comic strips that our Niswey friends have created in anticipation of the convention.

Are you coming to DrupalCon Asia? If you live and breathe Drupal, this is an event you can't afford to miss! DrupalCon is a fantastic opportunity to gain new Drupal knowledge and skills, make important mentoring and business connections, and contribute to the project. Some of the biggest changes to Drupal come about because of conversations at DrupalCon, and the connections made at the Con are hugely important to many shops' continued success. If you're not going to DrupalCon, make sure you talk to your boss, because your competition is almost certainly going! We'll be sharing materials in the coming weeks on how to convince your boss to send you to DrupalCon Asia in Mumbai this February.

Sep 30 2015
Sep 30

Two weeks back, I was over at eBay when one of the product managers we work with interjected "I will be really sad if 3 years from now, you are still stuck in Drupal."

As a company, we do have plans and ambition of expanding to other technologies. But was such an extreme statement warranted? The first question that came to my mind is what's so wrong with Drupal? "It's so 20th century!" was his response. He continued "You guys should look into forward-looking technologies such as node.js." For me, technology is just a means to an end and in my experience, if a solution is fit to be developed in Drupal, it will take at least 2 to 3 times more time and money to be developed in node.js. So why not Drupal? His answer taught me a few things about business:

  • VP doesn't really know which technology is better. They have to demonstrate within eBay that their department did something cool with a technology that is hot. And node.js is hot right now.
  • It's much easier to find node.js developers who are willing to work on-site than drupal developers. So from long-term maintenance perspective, it makes sense to go with node.js.

He added that Drupal is going down in Google Trends. And sure enough, here is the graph. According to Google Trends, 2009 was the peak for interest in Drupal and then it has steadily gone down.

At this point of time, I was left wondering whether Drupal is indeed dying. As of now, I don't have an answer to it but here are some of my observations:

  • I am seeing more clients considering switching from Drupal to Wordpress than the other way around (although my observation here could be biased since we only deal with Drupal clients so we'll only know if they are thinking of switching from Drupal to Wordpress, not the other way around).
  • Some of you may argue that people are waiting for Drupal 8, but the Google Trends graph is showing down-trend since 2009 so it's way before Drupal 8.
  • It's possible that Drupal is becoming more of an enterprise CMS so a lot of small and medium sized businesses are not opting for it. This is probably true. Among large corporations, I have seen IT supporting Drupal way more than IT supporting Wordpress but again, I could be biased here because we work with Drupal only.
  • If Drupal is indeed dying, what will it be replaced with? Certainly not node.js. Is Wordpress good enough now?
  • Will Drupal 8 revive Drupal and make it hot again? I doubt it. Momentum is not in its favor.

I know that I am leaving this post in an ambiguous state because frankly, I don't have an answer myself. Let me know you thoughts by sharing them in comments below.

Sep 30 2015
Sep 30

Workbench moderation works by allowing you to keep a new revision of your content as a draft (or unpublished) while an older revision remains as your published version. Out of the box Drupal handles this beautifully, most of the time. However, once you start adding contributed and/or custom modules, things can start to get hairy.

For example, Path module will generate a new alias each time your node is saved (if you define one in your node’s settings). This is great when the latest revision is your published content, but when the latest revision is a draft, you’ll want the keep the old alias until you publish the draft.

We’re not the first to encounter this problem, and Workbench Path Revision comes to the rescue. It works by bypassing the Path settings when saving a node, and storing the data until you need it when you publish your draft.

I did run into an issue when trying to auto-generate an alias based on Pathauto’s pattern (Pathauto is a contrib module). Workbench Path Revision would always disable the “Generate automatic URL alias” option and never generate an alias. There is a patch in the works.

Where things really start to get complicated is when you want to use views. When you want to display content using views, you generally add a filter to only display published content in order to avoid visitors from seeing content that’s not quite ready yet. This works great. Unless your site uses the following setup…

Our scenario

Imagine a site where you use Panels to make a node’s page a little more configurable. You turn on Panels and create a page that displays your node as a panels page. You can now move around  your fields, maybe putting some on the left and others on the right (let your imagination go wild). Your node has an image field, and you turn to Views in order to display it as a slideshow. You add a “Content: Nid” contextual filter (also known as an argument) and configure it to use the “Content ID from URL” to link the view to your particular node. Finally you add this view to your panel page and create a beautiful piece of content with a stunning slideshow. Publish it, and presto! So far so good.

A week later your boss tells you that you need to change the slideshow, but he wants to approve the changes before your site’s visitors are allowed to see them. Since you have Workbench moderation enabled on the site, you simply create a new draft and update the images and save the draft. You look at the draft’s page… but nothing has changed! What’s going on?

Comparing the published version and the draft you don’t see a difference…

So what went wrong?

Your panels and views are oblivious to revisions at this point. They simply take the published revision and display it. So how can you fix it? This is how.


We will assume you site is a default Drupal site with the following additional modules enabled:

  • Chaos tools, Page manager, Views content panes
  • Panels
  • Views, Views UI
  • Workbench moderation

The following drush command will get you set up nice and quick:
drush en page_manager panels views_ui views_content workbench_moderation

Getting started

Let’s create a new view on your Drupal site to illustrate the problem:

  1. Go to /admin/structure/views/add to add a new view
  2. Give it a name, in this case “Simple view”
  3. Select: Show “Content” of type “Article”
  4. Deselect the “Create a page” checkbox
  5. Click on the “Continue & edit” button
  6. Click on the “+ Add” dropdown and select “Content pane”
  7. Add a “Contextual filter” of type “Content: Nid”
  8. Configure it to “Provide default value” of type “Content ID from URL”
  9. Apply (all displays)
  10. Save the view

We’ll now add this view to a panels page that overrides the default Article node view:

  1. Go to /admin/structure/pages/edit/node_view
  2. If your “Node template” page is not enabled, enable it
  3. Now “Add variant”
  4. Make sure “Variant type” is set to “Panel”
  5. Check the “Selection rules” and “Contexts” checkboxes
  6. Click on the “Create variant” button
  7. We are now setting our criteria: select “Node: type” and press the “Add” button
  8. Check the “Article” checkbox
  9. Click on the “Save” button
  10. Click on the “Continue” button
  11. We are now setting our contexts: our node’s context is already set, nothing to do here
  12. Click on the “Continue” button
  13. Choose your layout: we can keep the defaults
  14. Click on the “Continue” button
  15. Our default Panel settings are fine too
  16. Click on the “Continue” button
  17. Now let’s add our view to the panel: use the cog in the “Center” panel to “Add content”
  18. Select “View panes” on the left
  19. Select “View: Simple view” (the view pane we created above)
  20. Click on the “Finish” button
  21. We’ll add our a body field as well: use the cog in the “Center” panel to “Add content”
  22. Select “Node” on the left
  23. Select “Node body”
  24. Click on the “Finish” button
  25. Click on the “Create variant” button
  26. And finally click on the “Save” button

Our Article content type isn’t set up to work with revisions yet, so let’s change that:

  1. Go to /admin/structure/types/manage/article
  2. Under “Publishing options”:
    1. Uncheck “Published”
    2. Uncheck “Promoted to front page”
    3. Check “Create new revision”
    4. Check “Enable moderation of revisions”
    5. Make sure “Default moderation state” is set to “Draft”
  3. Click on the “Save content type” button

We’ll need some content to see what’s going on:

  1. Go to /node/add/article
  2. Give it a title: “Simple view test 1”
  3. Enter some body text: “This is a simple body.”
  4. Click on the “Save” button
  5. Click on the “Moderate” tab
  6. Set moderation state to “Published”
  7. Click on the “Apply” button
  8. Click on the “View published” tab to see your published content

At this point everything looks like it should.

Let’s create a new draft and change our content:

  1. Click on the “New draft” tab
  2. Change the title to “Simple view test 2”
  3. Change the body to “This was a simple body. Now it's a little more complex.”
  4. Click on the “Save” button

You’ll notice that the body text changed, as expected, but the page title and the title in our  view hasn’t.

The fix

To fix the panel’s page title

  1. Go to /admin/structure/pages/nojs/operation/node_view
  2. Click on “Content” on the left side underneath our Panel Variant
  3. For title enter “%node:title”
  4. Click on the “Update and save” button

The page’s node title now works correctly when switching between the published revision and the draft. Our view still ned to be fixed, though.

The problem is that our view is based on “Content”. We need to base it on “Content revision”, and so we can’t alter our existing view but need to create a new view.

  1. Go to /admin/structure/views/add to add a new view
  2. Give it a name, in this case “Revision view”
  3. Select: Show “Content revision” of type “Article”
  4. Deselect the “Create a page” checkbox
  5. Click on the “Continue & edit” button
  6. Click on the “+ Add” dropdown and select “Content pane”
  7. Add a “Contextual filter” of type “Content revision: Vid” (this will allow us to pass in the node’s revision ID instead of the node ID)
  8. Configure it to “Hide view” when no filter value is available; we’re going to pass in the value through the panel’s config pane since we can’t get it from the URL
  9. Apply (all displays)
  10. By default the view includes a “published” filter. We need to remove it in order to display the title for any revision, draft or published: Under “Filter criteria” click on “(Get the actual content from a content revision.) Content: Published (Yes)”
  11. Click on the “Remove” button
  12. Let’s also remove the revision date field so only the title remains: Under “Fields” click on “Content revision: Updated date (Updated date)”
  13. Click on the “Remove” button
  14. Under “Pane settings” click on the “Edit” link for “Argument input”
  15. Change “Content revision: Vid source” to “Input on pane config”
  16. Click on the “Apply” button
  17. Save the view

Now that we’re using a new view, we’ll have to replace it on our panels page:

  1. Go to /admin/structure/pages/nojs/operation/node_view
  2. Click on “Content” on the left side underneath our Panel Variant
  3. Use the cog in the “Center” panel to “Add content”
  4. Select “View panes” on the left
  5. Select “View: Revision view” (the new view pane we just created above)
  6. For “Content revision: Vid” enter “%node:vid”; this will pass along the node’s revision ID to the view
  7. Click on the “Finish” button
  8. Drag and move the newly added pane “View: Revision view” to just below our “View: Simple view”
  9. Click on the cog inside the old “View: Simple view” and select “Remove”
  10. Confirm that you wish to “Remove this pane”
  11. Click on the “Update and save” button

When you now look at the published version and the draft version of your Article node, all content displays correctly. Congratulations, you have fixed your site!

Sep 30 2015
Sep 30


2015-10-01 (All day) America/New_York


The next (and hopefully final!) beta release for Drupal 8 will be beta 16! (Read more about beta releases.) The beta is scheduled for Thursday, October 1, 2015. To ensure a reliable release window for the beta, there will be a Drupal 8 commit freeze from 00:00 to 23:30 UTC on September 30 (later on today).

Beta 16 will include a couple of important changes, including the removal of the ! placeholder from t(), and the moving of vendor code from /core/vendor into /vendor.

Sep 30 2015
Sep 30

The Webform module is a powerful ally when you need complex forms. In this video I talk briefly about when you can use Webform, what different components that ships with the module and also a little about the functionality the the module offers when is comes to sending emails and showing the information added to the webform.

Sep 30 2015
Sep 30

This is part two of the series “Headless Drupal & Node.js”, for part one, click here. In this blog I will give you a 'Hello Node' introduction. 

About Node.js

Node.js uses complex techniques and can therefore be confusing to work with. It is therefore not suitable for the novice web developer.

A key technology is that Node.js can perform Javascript on the server. It is using the V8 engine to do so, but then on a server (Google Chrome is also using this). So this way you can perform Javascript on a server as a replacement for f.e. PHP. Node.js adds a few unique features to it:

Event driven

Node.js is just like client-side Javascript: waiting for an ‘event’ and then reacting to it. It is an ‘asynchronous event driven framework’, inspired on techniques as Ruby's Event Machine or Python's Twisted. What is the benefit of that on a server? In this way Node.js can handle many events simultaneously: a request from a client, a database query or a file transfer.


Node.js does this with ‘non-blocking’ techniques: it does not wait for a desired response, so it doesn’t block. This is different than a traditional server that is waiting for a request of a client, and until that request is fully handled, it will block that traditional server for all other requests. When a request generates a heavy database then the entire server will block, also for all other clients.

Two way connections

Node.js does not wait, it exceeds in processing ‘two way connections’: Node.js is for example not waiting for a response of the database after a query. But returns to action as soon as the database returns information.

Node.js's power

This makes Node.js great to use for real-time applications. Because of its non-blocking architecture, Node.js can handle many connections simultaneously. So it can be used for high performance server-client applications, for example a website with a huge amount of traffic with many logged in visitors. But is great to be used for:

  • Data pushing to a client.
  • Data exchange between clients, for example chats, multiplayer games & real-time data streaming.


Node.js is among others used by Walmart and Paypal.

Challenges Node.js

  • It is not possible to use traditional servers (f.e. Apache), so a good hoster will be more difficult to find.
  • Knowledge of Advanced Javascript is required.
  • The Node.js core is compact, you will need additional modules and customization for desired functions. You will need to learn what you can use best and how.
  • Node.js is primarily not designed for building websites, we therefore need additional libraries. In this case we have chosen for Express JS.
  • Quite a lot of development installs are needed: Node.js itself, Express JS, additional modules, Git.
  • When you have little experience on a new platform, you will not know the pitfalls. And every platform, including Node.js, has its pitfalls.

Introduction to implement Node.js

1. Locally installing Node.js

First check if it is already installed: enter 'node --version' in your terminal. If you get to see a version, then it is already installed:

If not, then visit https://nodejs.org, download and install it.

2. ‘Hello Node’

Usually these ‘hello world’ exercises are kind of lame, but for Node.js this exercise is immediately giving a proper introduction to the architecture and applied Javascripting.

2.1. Create a folder, for example on your desktop, ‘testnode’:

2.2. Add a file to that folder and give it for example the name ‘hellotest.js’.

2.3. Import modules

As indicated before, the Node.js core has a minimalistic setup. So in order to do something you will have to first import modules. This can be core modules or external modules (see also ‘npm’ further below).

First we need the ‘http’ module. Just like any other javascript library it will offer a number of methods and properties that can be used after the installation. You can import these as follows: add the following line to your file ‘hellotest.js’:

var http = require('http');

2.4 Create a server that gives a response

Then you can use the ‘createServer()’ method to create a server. You have to place it in a variable as follows:

var http = require('http'); // import module

var myServer = http.createServer(function(request, response) {
  response.writeHead(200, {"Content-Type" : "text/html"});
  response.write(" Hello Test Node");

myServer.listen(2000); // create server

We can place a custom function in createServer() that we define and work out ourselves, but we are using an ‘anonymous function’: a function without a name. This technique is also called a ‘callback’. When the function has finished its tasks, it will report the results to createServer(). Working with callbacks is a Javascript concept which is widely used in Node.js.

There are two parameters: ‘request’ & ‘response’. The server expects a request and will give a response with data to the client: a head (status code + type file) and the body (the html).

Finally we have to let the server listen to a particular port, in this case port 2000.

3. Implementing and testing

To test the application, open a terminal and browse to the folder ‘testnode’. Then enter ‘node hellotest.js’.

When you now open a browser and navigate to http://localhost:2000 you will get to see the response html.

When you apply changes to the response, you will have to restart the node server: interrupt the process in your terminal with ctr+c and restart it:

4. Modules - the Node Package Manager (NPM)

You can install and manage modules in Node.js via npm, you can find it at http://npmjs.org. Npm is also the command in your terminal, which allows you to manage modules. Just type ‘npm’. Instructions will then be shown in your terminal.


Information (author, version, module dependency, etc) about your project will be managed in the package.json file. You can generate it by performing the command ‘npm init’. After a series of questions, the package.json file will be created:

Npm modules can be used stand-alone, but also as a dependency of your Node.js project. When you want to install for example Grunt, type: “npm install grunt --save”. You will now see that relevant module files are placed and that Grunt will be added as a dependency to your package.json:

End of part 2

You can see that it’s relatively easy to make a simple Node.js application if you are familiar with Javascript. But the Node.js core methods are very brief. Of course you do not want to build a fully dynamic website with just this kind of request/response functions.

In the next part, I will elaborate on Express JS: a web framework for Node.js with many built-in tools to build a website. I will also show you how to implement dynamic data from the RESTful Drupal API to Node.js / ExpressJS.

So, stay tuned!

Sep 30 2015
Sep 30

If you are a reader of Webomelette.com you probably know it's been a while since any love has been given to this website. I decided recently to right this wrong and release a refreshed version. Lo and behold, the new version of Web Omelette!

I think it looks a bit fresher, crisper and should be a bit more performant as well. Additionally, I fixed some of the problems we had with copying code fragments by using the SyntaxHighlighter plugin for displaying code fences. This should also make them a bit more readable.

Moreover, you'll notice in the listing also external articles I've written for other websites. Feel free to check out those write-ups as well.

Please let me know if you encounter any bugs or issues with the website. I'd very much appreciate that.

Sep 30 2015
Sep 30

Drupal 8 has only 4 critical issues before getting released out of beta! Fingers crossed for a release this week!

The major issues that remain are: 

Taking into account the non-"href" attribute values and the SafeMarkup issues that have already been reviewed by the community, really that only leaves us with three issues. We are SO close, my friends!

At Freelock, we have already been working on some of our internal Drupal 8 sites and prepping them as great platforms for our clients. But, as all sites, those sites have to work with our clients' day-to-day operations, which we call DevOps.

Being involved with our clients, and as a project manager playing in Drupal CMS, I am always excited to hear about the new developments in our clients' operations and complimentary technology. So many times I have seen clients who are set on WordPress or another SAAS, just then to be blown away by the capabilities of Drupal. At Freelock, we still understand and advocate why a certain client should move over to a different CMS. Many times I have thought: You need a brochure site? WP is the brochure for you! 

We work with non-profits that need control/reporting with their donation systems, or clients who maintain county/national/international-wide websites that need full control over their systems. In these respects, they want something that they OWN, that they can TRUST, and a platform that always comes back as a trusted CMS. The security and dev community are always the reliable solution with Drupal, not to mention a fantastic framework that has taken years to develop.... Drupal is my top solution.

I can speak for me and all of our developers at Freelock, we are excited! We are so close to blasting open the dev world and expanding on the capabilities as a community. Countdown to D8! #2015PNWDrupalSummit

#Drupal #Freelock #8 #PNW #countdown

Sep 30 2015
Sep 30

The Drupal 7 translation system including the internationalization package is a heavy beast and while it mostly gets the job done, it is all but intuitive in use.

For high volume translations it is recommended to use the translation template extractor and translate the strings externally. For small corrections however, it is often much more convenient to use the translation interface (admin/config/regional/translate/translate).

Now that you've created that shiny module/template and made it translatable by passing all strings through the t() function, you may be wondering why your newly created string is not showing up in the translate interface.

To save you some trouble, here is a short list of things to check:

1. Include the project version number within the module/theme .info file.
Without the project version information, the translate interface will not register new translatable strings in your module/theme. Make sure to add version = 7.x-1.0 into the module/template .info file.

2. Run the string through the function in a non-standard language mode.
In order for the translation system to add your translatable string, the t() function must run at least once in a non-standard language. To achieve that, you will need to switch the language of the site to one you are going to translate into and then visit the page that displays the string.

3. Mind the case sensitive search filter.
Be accurate when using the translate interface filter - it does not forgive.

4. Flush caches in necessary.
Usually this is not needed, but maybe the new translatable string gets called on on a cached page or a cached view. With many layers of caching, better make sure and rule out all possible errors.

Let me know if anything is missing in this list.
Happy translating!

Sep 29 2015
Sep 29

With Drupal 8 on the horizon, now is a good time to start using it. The best way to learn the new version is to build something with it.

Over the next few weeks, I'll be publishing a series of tutorials teaching you how to create a blog in Drupal 8. The aim of the series is to help new comers, as well as experienced site builders, how to create a blog website using Drupal 8.

Throughout each tutorial, major changes between Drupal 7 and 8 will be highlighted. Even if you know Drupal 7, follow along and you'll learn what's new in Drupal 8.

In this first tutorial, you'll learn how to create a Blog content type and how to add custom fields. You'll also learn about the Taxonomy system by creating your own vocabulary to categorize blog posts.

Install Drupal

Before we begin, make sure you have installed Drupal 8 using the Standard installation profile. I won't go into details on installing it, but if you need to spin up a test site then check out simplytest.me. Just type in "Drupal core" into the project name field and select the latest Drupal 8 option from the drop-down list. Or click on this link.

Create Blog Content Type

When using the Standard installation profile, you'll get an Article content type. This content type is useful. It comes with an Image and Tags field. On a proper Drupal project you would use this content type for a blog section.

But to learn how they work, we'll need to create our own. So we'll create a Blog content type with the following fields:

  • Body
  • Image
  • Tags
  • Category

To save time we'll reuse the Image and Tags field which is already on the Article content type, but we'll need to create a Category field which will allow you to categorize blog posts.

1. Click on Structure in the toolbar, "Content types" and click "Add content type".

2. Enter in Blog into the Name field and enter "Used in the daily blog section." into the Description field.

Fig 1.0

3. Below the Description, you'll see a group of vertical tabs. Here you can configure content type settings like "Publishing options" and "Display options" and more. These options can be changed at anytime, so we'll leave them as they are for now.

Fig 1.1

When you're ready click on "Save and manage fields".

Adding Fields

Once you've created a content type, you'll be redirected to the "Manage fields" page where you can create new fields and edit existing ones.

When a new content type's created Drupal will add a Body field. This is default functionality, if you don't want to use the field simply delete it.

Fig 1.2

As mentioned earlier, the Blog content type will have four fields: Body, Image, Tags and Category.

The Body is already on the content type, but we'll need to add Image and Tags. The Standard installation profile already created these fields and attached them to the Article content type. Let's just save time and reuse these fields.

1. From the "Manage fields" page click on "Add field".

2. From the "Re-use an existing field" drop-down, select "Image: field_image" and click on "Save and continue".

Fig 1.3

3. Leave the field settings as is for now and click on "Save settings".

4. Now repeat the steps to add the Tags field. Click on "Add field", select "Entity reference: field_tags" from "Re-use an existing field" and click on "Save and continue".

Fig 1.4

In the "Reference type" field-set, check Tags and "Create referenced entities if they don't already exist" under Vocabularies and click on "Save settings".

Fig 1.5

New in Drupal 8

Fields can't be shared across entity types.

In Drupal 7 you could share fields across entity types. For example, a field could be used on an Article content type as well as a Tags vocabulary. In Drupal 8, fields can only be shared amongst bundles not entity types. So if you create an image field on the Article content type, it can only be shared with other content types. You couldn't attach it to a vocabulary or user entity.

For a more technical explanation on entities and fields, go to the link below:


Form Displays

You may have noticed that we didn't select or configure a widget. In Drupal 7, when you create a field you also selected a widget. Now in Drupal 8, you manage the widgets from the "Manage form display" page.

What's a widget? A widget is a form element used to enter data into a field. A text field, select box, checkboxes all of these are widgets.

Fig 1.6

You can choose a different widget by selecting one from the drop-down. You can also reorder them by dragging them up or down. To configure one click on the cogwheel, similar to how formatters are managed in Drupal 7 and still in Drupal 8.

Fig 1.7

For now, just reorder the fields to the top of the page.

1. On the "Manage form display" page, move the Image field below the Title and Tags below Image, then click on Save.

Fig 1.8

At this point, the Blog content type has a Body, Image and Tags field. The only one missing is the Category field. But before we can create it, we'll need to create a Category vocabulary.

Create Category Vocabulary

1. Click on Structure, Taxonomy and click on "Add vocabulary".

Fig 1.9

2. Enter "Category" as the Name and "Used to categorize blog posts." as the Description, then click on Save.

Fig 1.10

3. Enter in a few category items by clicking on "Add term". I entered in the following:

Fig 1.11

Now that the vocabulary has been created, let's jump back to the "Manage fields" page and create the Category field.

Create Category Field

1. Go to Structure, "Content types" and click on "Manage fields" on the Blog row. Then click on "Add field".

2. From the "Add a new field" drop-down, select "Taxonomy term". Enter Category into Name and click on "Save and continue".

Fig 1.12

3. On the "Fields settings" page, leave "Allowed number of values" limited to 1. We only want to allow a single category to be selected on a blog post. Then click on "Save field settings".

Fig 1.13

4. In the "Reference type" field-set, select Category under Vocabularies and click on "Save settings".

Fig 1.14

Configure Category Widget

We've added the field, now let's configure the widget like we did for the others.

1. Click on the "Manage form display" tab, move the field so it sits above the Body field. Then change the widget to "Select list". Scroll to the bottom then click on Save.

Fig 1.15

Configure Blog Formatters

We've spent all our time building out the fields and configuring the widgets. Now let's configure the field formatters. The "Manage display" page isn't that different in Drupal 8.

1. Click on the "Manage display" tab. All we'll really do is reorder the fields.

2. Move Links right to the bottom and move Image so it sits above the Body field. It should look like the image below:

Fig 1.16

Once you've reordered the fields, don't forget to click on Save at the bottom of the page.

Create Blog Post

Now go to Content, "Add content" and click on Blog. Fill out the form and click on "Save and publish".

Fig 1.17


The site building experience isn't drastically different than in Drupal 7. Which in a way is good. You won't have to learn any crazy new concepts. The UI in Drupal 8 for managing content types and fields has been streamlined and feels a lot nicer.

In the next tutorial, we'll look at adding comments to the Blog content type. (Published next week)

Sep 29 2015
Sep 29

By Steve Burge 29 September 2015

Use Adminimal for a Responsive Admin in Drupal 7

Do you want many of the benefits of the new Drupal 8 admin area, without actually needing to upgrade? Check out the Adminimal theme.

Adminimal provides a responsive admin area for Drupal 7 sites.

Adminimal also has several usability improvements. For example, Adminimal has colored buttons for common tasks like Submit, Preview and Delete to them easier to see. Adminimal also provides improved layouts for the Configuration, and Module screens. 

In this video, taken from our Better Drupal Administration class, Robert Ring introduces you to Adminimal:

About the author

Website http://ostraining.com

Steve is the founder of OSTraining. Originally from the UK, he now lives in Sarasota in the USA. He was a teacher for many years before starting OSTraining. Steve wrote the best-selling Drupal and Joomla books.

Sep 29 2015
Sep 29

29 Sep 2015

Generally the delay of any product or platform directly affects its eco-system and the businesses and revenues revolving around it. 

drupal 8

However, if it is a community driven open source platform (e.g. Drupal), there cannot be a single person who can be held responsible and accountable for the delay. In case of Drupal, the community has taken around 5 years in releasing version 8 (33% of its total existential life). Although there are significant new features and updates in this latest release, however, 5 years is a significantly long time for a release. In such times, what should the businesses do: they can either fold or diversify or innovate.

In the recently concluded DrupalCon Barcelona, there were two presentations showcasing what companies are doing differently. Many Drupal shops (companies offering professional services) are being affected by the delay in release of Drupal 8 (acknowledged by Dries Buytaert in his Keynote) as they are unable to cross-sell / up-sell more services.

This kind of environment is a prime candidate for consolidation or Innovation. Numerous Drupal shops have taken the route of Innovation and Disruption to sustain during down time and potentially scale once they cross the chasm. 

Following companies and many more are building tools and frameworks which will enable them with predictable revenue in near and long term:

With web and mobile content growing at a rapid pace there is no doubt about WebCMS market growing multi-folds. With features in Drupal 8, when it gets released, it is going to be widely adopted by Enterprises. Till that time, more companies will jump in to innovate and disrupt the WebCMS space.

There will be a huge spike after Drupal 8 release. 


Sep 29 2015
Sep 29

With interest in Drupal 8 heating up, a lot of people are wondering whether they should be using Drush or the Drupal Console as their command line tool of choice. Drush is the longstanding heavyweight champion, widely used and supported in hundreds of contrib modules. Drupal Console sports the modern Symfony Console component, that provides a new object-oriented interface for command line tools, exposing the power of the Symfony framework to script developers. Which is better for Drupal 8? (Disclaimer: I am a maintainer of Drush, but the answer may surprise you!)

The answer is that both tools are indispensable to Drupal 8 developers and site builders. The article An Introduction to Drush and the Drupal Console provides an extremely compelling illustration of this by walking the user through the process of installing Drupal 8 and writing a simple module using both tools working together.  A helpful overview on installing these tools is also provided for those new to command line tools, but experienced Drush users new to Drupal 8 should get a lot out of the brief module creation walk-through.

Drush and the Drupal Console together bring a lot of power and capability to Drupal 8 development. Mastering both of these tools will streamline site building, maintenance, and module development. Use them both together will yield the best results.

Topics Development, Drupal Planet, Drupal
Sep 29 2015
Sep 29

This year marks a particularly exciting BADCamp for us. On Friday, October 23, we’ll be leading two official half-day trainings on Salesforce and RedHen CRM!

We talk a lot about Salesforce and RedHen on our blog, which is inevitable given how much time we spend working with both. Given that the Drupal Salesforce Suite we wrote and maintain powers over 1,200 sites, we decided we should talk about it more! Lev Tsypin, Tauno Hogue, Greg Boggs and I will be your trainers for the day.

RedHen CRM: Exploring CRM Solutions That Extend Drupal

This half-day workshop will begin with a detailed review of the modules that make up the “RedHen CRM ecosystem.” We’ll then show you how to leverage RedHen for building advanced CRM-driven solutions. A hands-on training, we will help you configure and customize your own RedHen instance, and we will teach you best practices for building solutions on top of this module suite. We’ll cover tools in the RedHen ecosystem, including memberships, donations, campaigns, engagements, deduping contacts, and integrating RedHen with other Drupal standard bearers such as Views, Rules, Context, etc.

Integrating Drupal and Salesforce: The World’s Most Flexible CMS Meets the Most Powerful CRM

After lunch, the latter half of our workshop block will start with the basics of configuring mappings between Drupal entities and Salesforce objects and leveraging typical Drupal development workflows. Then we'll dive deeper into complex scenarios including managing large datasets, customizing behaviors as objects are synced, and managing errors.

If you’ve ever wanted to talk to us in person about our work, or how to better leverage these CRMs to meet yours or your client’s needs, now’s your chance. These trainings are FREE (it’s $20 to reserve a seat, but that $20 will be refunded) and space is limited, so register early!

Sep 29 2015
Sep 29

While I couldn’t make it to Drupalcon Barcelona last week, I insisted on giving a presentation somewhere. Forum One let me do it as a webinar: Planning and Building Salesforce Integration. There are some truly wonderful tools for integrating Salesforce with Drupal out there, but the tricky part is planning, documenting, and estimating the task.

My webinar presentation doesn’t cover the basics of Salesforce or Drupal. Rather, it is tailored for a certain (basic) level of knowledge about both systems: what they are, how to set them up, and the basic data models. It covers the toolset you need, its strengths and weaknesses, how to plan an integration, and what kind of amazing cool stuff you can do if you’re smart about it.

[embedded content]

Salesforce is an extremely powerful CRM platform, and that includes options for external integrations. There are two different APIs available, but basically all you need to do is wrap requests in an OAuth2 session, and query the Salesforce data with their own query language, SOQL.

That said, I would never send you off to go and write totally custom integration code. There’s already a fantastic suite of modules written for Drupal that provide this base functionality and more: the Salesforce Suite. The Suite is actually a set of 5 modules, providing an OAuth2 wrapper and SOQL query builder, two different ways to connect to Salesforce, an interface to map Salesforce objects to Drupal objects, and separate modules for both pushing data into Salesforce, and pulling data from it. It’s a pretty complete package, and it is an excellent base for even highly-customized integrations.

Out of the box, the Salesforce Suite also does an excellent job of direct, 1:1 mappings between Salesforce Objects and Drupal entities. It schedules and queues synchronizations well, and offers a lot of hooks to help with your custom development. When you’re planning your integration, you have to look out for “red flags” that will help you estimate:

  • Conceptual objects in Drupal that are actually made of two or more Entities, e.g., users with their profile2 objects.
  • Modules that don’t store their data in entities, e.g., the Webform module.
  • A wide variety of different types of fields. Many fields actually need some translation between Drupal and Salesforce, and you will have to provide that yourself.

Very often, custom code is the best way to augment the synchronization that you’ve built in the Drupal UI. The following are some of my favorite examples:

  • Salesforce stores country names in a non-ISO format. If you’re syncing to a Drupal location field, you will have to do a little bit of translating.
  • Salesforce booleans (checkboxes) are stored differently from Drupal booleans. Again, a little bit of translation is required.
  • Salesforce doesn’t have the same validation rules as Drupal, e.g., Salesforce Contacts are not required to have an email address, but Drupal users are.

All this by way of saying that custom code is almost always required for an integration to go smoothly. It doesn’t have to be complicated code, but it is there.

With all this in mind, I recommend planning your integration around use cases and user stories for both systems. We paint a picture of the people who will be using both the Drupal and Salesforce sides of this, and what information they want to have readily available. In most cases it boils down to a long list of objects and fields to integrate. You can use this list to estimate based on the number of different field types, number of 1:many object mappings, etc. You can also use it to consider large-scale architectural options, like the decision to install the Redhen Drupal CRM to map all your data into these entities, and then sync from there.

Another important question (brought up by a participant during the live broadcast) is whether to keep your data customizations in custom Salesforce fields, or in Drupal custom code. Salesforce allows you to create custom fields that are filled automatically according to rules that you configure. So that country name problem I mentioned above could be solved by syncing Drupal with a custom Salesforce field that translates the names for you. That saves you the trouble of coding in Drupal, which otherwise seems like it would be hard to maintain. As a general policy I prefer to keep “code-like” customizations in the site’s codebase, where I can then easily find them in case of a problem or change. It can save serious headaches down the road! For those of you who are more comfortable in Salesforce, however, the same reasoning might push you towards the opposite decision. You should take the route that seems the most maintainable to you, and not worry about what some guy on the Internet said in a blog post ????

The webinar also includes a quick walkthrough of a simple integration between Drupal and Salesforce, synchronizing users and contacts. We right away run into some of those very predictable problems that our estimation process was designed to root out, and we talk about how to solve them.

My favorite part of the presentation (if I do say so myself!) is the “blue sky” section near the end. Salesforce and Drupal are each incredibly powerful, flexible platforms on their own, and so I really enjoy coming up with cool ways to have them magnify each others’ power. Some fun ones:

  • If you include Salesforce data in Drupal user objects, you can do A/B testing in Drupal based on peoples’ engagement in other channels.
  • You can tag users in your analytics package based on their Salesforce profiles. Imagine a special analytics report of how your donors behave on the site, or simply people who opened the last newsletter, or whatever other user group you can imagine.
  • You can track user engagements from your website in Salesforce. For example, including a user’s comments on blog posts as a part of their Salesforce history.
  • If your site is a user community with points, referrals, and other rewards for interaction, those should definitely be reflected in Salesforce profiles.
  • (My #1 favorite) You can integrate information from social media, email blasts, human contact, and the website to provide little surprises and personalizations for users. Imagine a message like, “we saw you shared our blog post on Facebook – thanks!,” or, “have you checked out the newest version of our product yet?”

We had some great questions come up in the Q&A section, as well. We talked a bit about using machine learning (and Salesforce’s new Predictive Decisions feature) to drive website content decisions, and potential future areas for development in the Salesforce suite around the Salesforce metadata API. Cool stuff, but you’ll have to watch the video to get it.

The Salesforce suite offers an excellent foundation for building Salesforce integrations. As always though, the really exciting stuff is on the cutting edge of what the industry offers. To take advantage of that, you’ll need more than just a small custom module, and you’ll also need serious strategic and developer leadership. I’m looking forward to having that conversation with you soon!

Previous Post

Coding vs Clicking and Building Layouts from 7 to 8 – More Fun at DrupalCon Barcelona

Sep 29 2015
Sep 29

At DrupalCon I arranged for a 9 metre squared floor decal celebrating the top 1000 contributors to Drupal 8. So many of you asked for access to the original artwork, and many who could not be at the conference, so I have prepared this page so you can!

It was such a delight to witness so many Drupalists, with a great sense of pride, photographing theirs and friends names, sharing on social media. The larger a name is, the more they have contributed. But honestly if your name is there, bravo to you!

Below the tag cloud is clickable so you can reach each persons D.O account. There is also attached a PDF version so you can print it if you like.

I used DrupalCores.com for source data and Tagul.com to produce the artwork. I hope you enjoyed seeing it and look forward to seeing you at future Drupal events.

Sep 29 2015
Sep 29

DrupalCon is not only about sessions, though they are a big part of the conference. Up to 10 presentations at the same time ensure, that there is quality content for any audience. At the same time, many things happen alongside of the sessions.

Some of the side activities might be really familiar to anyone who has attended a Drupal event; some might be hidden gems that I would definitely recommend checking out.

Drupal is all about the people behind the great software we are using. Let's find out together what happens during DrupalCon.

Tour de Drupal Mountains

Before starting with the actual conference, we did the second Tour de Drupal. This time, we were a much smaller team. Christian and I started in Andorra, cycling over the Pas de la Casa over the French boarder and back to Puigcerda, Spain on Friday. The next day we took a train to Vic and biked over some nice hills and down to sea level located Blanes.

Tour de Drupal Beach

Finally, on Sunday, the Tour de Drupal crew was completed when Gaele joined us from his 2 weeks cycling trip, along with Martin, for the final lap from Blanes to Barcelona alongside the beautiful beaches.

Beach bar

The local Spanish community and other conference attendees welcomed the Tour de Drupal team.  At a beach bar next to the conference centre we got to see some nice fireworks from the city centre. Pictures from Tour de Drupal Barcelona 2015 are available here

Photographer Boris

We got to the conference on Monday, where community members where already working on fixing the last critical bugs for the upcoming Drupal 8 release during the extended sprints. There are always a few people taking pictures, including for example Paul Johnson. We were also glad to see Boris Baldinger, former Amazee Labs colleague, join us for DrupalCon as part of his new business as full-time photographer.

Community Kick-off

Mondays at DrupalCon are often underestimated as just a day of arrival, attending trainings, or participating in the business summit. But besides that, there is a room full of sprinters and there was also a community kick-off event happening. People interested in the inner workings of the Drupal community joined together to discuss internal topics like event organization and best practices - for example.

Sponsor stand

On the ground floor, companies were busy preparing their sponsor booths in the exhibit hall. We from Amazee Labs traditionally see DrupalCons as a big investment; we are sponsors, and put a lot of work into our booth. In this way we can both support the Drupal community by facilitating such an important event but also represent our brand across the community and provide visitors and employees a comfortable area to discuss business and hang out. 


The evenings and nights after DrupalCon are packed with social events where community members gather to chat, drink, or eat together in a more relaxed atmosphere.


Tuesday morning, just before the Keynote by Drupal founder Dries Buytaerd (aka "Driesnote"), Robert Douglass, Jeffrey "Jam" McGuire, and a team of creative community members present the "Prenote". Each DrupalCon, they come up with a great show explaining Drupal to newcomers and share regional fun facts about the hosting city or country. 

Keynote Interviews

After each keynote there is a moderated Q&A where Mike Anello asks questions collected via twitter, which provides a great way to discuss instant feedback from the audience on the presented topics. Check out the hashtags #driesnote, #DCNahai, #DCRozas, #DCBell for more info.

Group picture

Just after the first keynote, all conference attendees gather outside for a big group picture. This time, more than 2000 folks interested in Drupal joined in. That's Diana up there at the top, the DrupalCon production lead, strapped in a safety harness to get the shot!

Commits graphic

Drupal heavily relies on contributions by individuals who invest a lot of time into making the system better. Drupal 8 has an incredible amount of more than 3000 active contributors. In the sponsor hall, the Drupal8 Contributors Hall Of Fame, contributed by CTI Digital, visualized all the names as a floor graphic.


Tuesday evening, the local Drupal association threw a great party at the beach with live music allowing the diverse crowd to connect with each other in an open, outdoor environment. 


Alongside sessions and workshops, many interviews were held, capturing voices from influental community members about the current state of Drupal, and their experiences doing business and working with the community.


To compensate for heavy coding sessions and deep technical discussions, Drupalists also hang-out with each other and just have a good time at the beach, swimming or enjoining the ocean breeze.

Core conversation

While most of the sessions are related to technical topics, there is also another track that I find really interesting. In Core Conversations, we discuss how to improve our processes, what works well, and what needs to be fixed in order to work well together. On the above picture, you can see YesCT, kgoel, bfr, and alimac in their session Paid contribution: past, present, and future.


Drupal core development is a constantly evolving process. In the Drupal 8 release cycle, initiatives where introduced to allow breaking down the complexity of tasks into different areas. Now, with the Drupal 8 release coming up soon, Dries and the team of core committers took a chance to do a retrospective on what went well and what needs improvement: Drupal 8 retrospective with Dries.

Next DrupalCon

In the closing session, the next big DrupalCon events are announced. Besides Frontend United Ghent (May 27-28, 2016)Drupal Dev Days Milano (June 2016), DrupalCon Asia (Feb 18-21, 2016)DrupalCon New Orleans (May 09-13, 2016) and DrupalCon Dublin (September 26-30, 2016) were announced. In the above picture you can see the enhusiatic Indian community promoting their local event. 

Trivia Night

On Thursday evening, "Trivia Night" was on! A fun Irish-style pub quiz with questions on Drupal and picture puzzles. 

Trivia People

Conference attendees from various countries and continents celebrate the game together.


Friday is the official sprint day of DrupalCon. The entire day is dedicated on workshops that allow contributors to improve Drupal core and contributed modules. Our sucessful mentoring system ensures that new contributors are onboarded properly to Drupal's contribution systems and processes.


A great collaborative effort is being made to facilitate moving Drupal forward, while at the same time providing free training for anyone interested in learning new systems first-hand from the experts in Drupal.

There were three rooms full of contributors: one with a First-Time Sprinter Workshop, a second one hosting a Mentored Core Sprint and a third one where contributors work in a self-organized way on different initatives per table. As part of the #d8rules initiative, I led a sprint table for porting the Rules module to Drupal 8.

There is a lot going on during DrupalCon. Thanks to everyone for organizing and making DrupalCon such a multifaceted event!

More photos can be found on the Amazee Labs flickr account: