Feb 08 2019
Feb 08

This Episode's Guests

Karen Stevenson


Karen is one of Drupal's great pioneers, co-creating the Content Construction Kit (CCK) which has become Field UI, part of Drupal core.

Mateu Aguiló Bosch


Loves to be under the sun. Very passionate about programming.

Wes Ruvalcaba


Wes is a designer turned front-end dev with a strong eye for UX.

Putra Bonaccorsi


An expert in content management systems like Drupal, Putra Bonaccorsi creates dynamic, user friendly sites and applications.

Feb 08 2019
Feb 08

Innovation within Canadian healthcare continues to provide better care experiences for those using the system.  As the population ages and strains our facilities to care for those nearing their end-of-life, hospitals are looking at technological solutions to ease the burden on emergency rooms and give people access to accurate and timely healthcare.   Nextide partnered with uCarenet, a Toronto-based e-health company, to create an innovative health and wellness application to monitor the condition of palliative care patients for a major Canadian hospital.

The Requirements:

The hospital required an application that could gather critical patient data through forms, compile the results daily, report those results to the patient’s healthcare team and alert the team in the event the results warranted intervention.  The application had to be accessible to all participants, easy to use and mimic the existing paper-based data collection mechanism the palliative care team employed. The hospital staff required administrative logins to create users and monitor the entered data in a simple-to-use and uncluttered dashboard.  Doctors and nurses should be able to determine who has symptoms which require immediate attention, and be able to view the discrete data if required.

The Solution:

At Nextide, we look at Drupal as a platform to build applications and not purely as a feature-rich content management system for websites.  We were confident that Drupal was the right selection for the application. Through careful design, our team was able to create an interactive application that gathered patient data, compiled and weighted the results based on current and historical data, and send the palliative care team notifications when warranted.

First, the palliative care user’s experience:

User's view when ability to enter data is open or closed

The image above shows two versions of the palliative care user’s home page.  The left side is the home page when they are able to complete their daily forms.  On the right, if the user completed their forms within the last 24 hours, they’re locked out of completing a new set of forms until the 24 hour window has passed.

Once daily the palliative care users are able to fill in the three required forms.  An example of one of the forms is shown here:

Showing the Brief Pain Inventory Form

On any device the patient or caregiver has, patient data can recorded using Drupal to store all form data in custom entities.  Themed form buttons and select lists are presented in easy-to-use clickable human bodies, sliders and radio buttons.

Upon completion of the patient information forms, the results are compiled according to the hospital’s predefined requirements.  The three forms have at least 50 discrete data points in total. We take the data entered, compare it to the last three to five days of the patient’s data and determine trends within those fields which require an alert being triggered.  If a user is deemed to be “alerting”, we send a notification to the healthcare team and flag the user and the fields as alerting.

The Healthcare User’s Experience:

When a healthcare user enters the system, their homepage is comprised of a simple to use dashboard.  The dashboard presents the user with an easy-to-read listing of patients with their status plainly visible.

Healthcare Dashboard

The healthcare user is able to drill into any patient’s data, giving them a graphical breakdown of the historical patient data.  The nurse or doctor is able to see the trends in the patient data and is able to take appropriate action. Healthcare users are able to acknowledge the alerts, thereby clearing the status of the patient, and they’re able to silence alarms for any given patient so they do not receive alerts for 24, 48 or 72 hours.

Drilldown into stats

We generate on-the-fly graphs of patient data.  Healthcare professionals can also drill even further into each entity where they’re able to view each form’s entry and mute any alerting fields.

Alerts panel

Themed Drupal entities give the healthcare professional a quick breakdown of patient entered values.  If a field is alerting, it’s highlighted and gives the user the option to silence the alarm by clicking on the alerting symbol.  Users are able to scan back and forth through daily entries. The interface is easy to use, uncluttered and responsive in design.

The Outcomes:

The initial pilot phase of the project had between 15 and 20 patients entering data at any given time.  In the first 3 months of the pilot:

  • 105 critical alerts were generated by the system and sent to the patients’ circle of care.
  • 46 of the 105 critical alerting patients received follow-up intervention.
  • 7 patients who had not triggered an alert received telephone intervention after the healthcare staff noticed trends in their data.
  • Saved an estimated $62 000.  That’s right!  This single application over the course of three months saved over sixty-thousand dollars in unnecessary care in the Emergency Room!

Every time a patient receives proactive care, the likelihood that they require an Emergency Room visit is reduced, thereby reducing the load on the hospital.  When you consider the small pilot size and the number of interventions required, each intervention could have eliminated a potential Emergency Room visit. A resounding success!

When you look at Drupal as “just a content management system”, you lose sight of what it really is:  a platform to produce applications that matter. At Nextide, we have been focused on Drupal since 2009. Our experience in Drupal ensures that we utilize the most effective modules to construct sites and applications that are optimized for performance and functionality. We continue to leverage Drupal in many more ways than just content management.  Our core strengths are focused on the design and build of creative sites, and web based business applications, that mirror the way people think and work. We can custom create any business function or create the ideal work environment for people to perform at their best. The capability to deliver robust custom applications to our customers allows us to deliver solutions from healthcare, to HR, and everything in-between.

Need Help?

Do you have a Healthcare initiative we can help with?

Feb 08 2019
Feb 08

Web monetization service is a browser API which allow creation of (micro) payments between the reader (user agent) and the content provider (website).

This is one way of getting paid for valuable content.

Today Coil is providing web monetization service using Interledger protocol (ILP).

We have built a simple module to integrate coil monetization with Drupal website:

Simple settings to add payment pointer is demonstrated in this video:

Your browser does not support the video tag.

Feb 07 2019
Feb 07

This blog has been re-posted and edited with permission from Dries Buytaert's blog.

I'm frequently sent examples of how Drupal has changed the lives of developers, business owners and end users. Recently, I received a very different story of how Drupal had helped in a rescue operation that saved a man's life.

The Snowdonia Ultra Marathon website

In early 2018, Race Director Mike Jones was looking to build a new website for the Ultra-Trail Snowdonia ultra marathon. He reached out to a good friend and developer, Rob Edwards, to lead the development of the website.

A photo of a runner at the Ultra-trail Snowdonia ultramarathon

© Ultra-trail Snowdonia and No Limits Photography

Rob chose Drupal for its flexibility and extensibility. As an organization supported heavily by volunteers, open source also fit the Snowdonia team's belief in community.

The resulting website, https://apexrunning.co/, included a custom-built timing module. This module allowed volunteers to register each runner and their time at every aid stop.

A runner goes missing

Rob attended the first day of Ultra-Trail Snowdonia to ensure the website ran smoothly. He also monitored the runners at the end of the race to certify they were all accounted for.

Monitoring the system into the early hours of the morning, Rob noticed one runner, after successfully completing checkpoints one and two, hadn't passed through the third checkpoint.

A photo of a runner at the Ultra-trail Snowdonia ultramarathon

© Ultra-trail Snowdonia and No Limits Photography

Each runner carried a mobile phone with them for emergencies. Mike attempted to make contact with the runner via phone to ensure he was safe. However, this specific area was known for its poor signal and the connection was too weak to get through.

After some more time eagerly watching the live updates, it was clear the runner hadn't reached checkpoint four and more likely hadn't ever made it past checkpoint three. The Ogwen Mountain Rescue were called to action.

Due to the terrain and temperature, searching for the lost runner on foot would be too slow. Instead, the mountain rescue volunteers used a helicopter to scan the area and locate the runner.

How Drupal came to the rescue

The area covered by runners in an ultra marathon like this one is vast. The custom-built timing module helped rescuers narrow down the search area; they knew the runner passed the second checkpoint but never made it to the third.

After following the fluorescent orange markers in the area pinpointed by the Drupal website, the team quickly found the individual. He had fallen and become too injured to carry on. A mild case of hypothermia had set in. The runner was airlifted to the hospital for appropriate care. The good news: the runner survived.

Without Drupal, it might have taken much longer to notify anyone that a runner had gone missing, and there would have been no way to tell when he had dropped off.

NFC and GPS devices are now being explored for these ultra marathon runners to carry with them to provide location data as an extra safety precaution. The Drupal system will be used alongside these devices for more accurate time readings, and Rob is looking into an API to pull this additional data into the Drupal website.

Stories about Drupal having an impact on organizations and individuals, or even helping out in emergencies, drive my sense of purpose. Feel free to keep sending them my way!

Special thanks to Rob EdwardsPoppy Heap (CTI Digital) and Paul Johnson (CTI Digital) for their help with this blog post.

Feb 07 2019
Feb 07
  • Shefali
  • 07-02-2019

“It takes time to save time”, said Astrophysicist Joseph Hooton Taylor Jr. and how right he is! The good folks from Acquia have thoughtfully curated a package that can save businesses from tons of time spent in marketing and editorial efforts. Acquia Lightning is an open-source Drupal 8 distribution that was designed to enhance, fasten and simplify the process of creating powerful (and responsive!) digital experiences.

Drupal 8 gives developers and content authors full flexibility to shape their websites and applications that meets their vision. It is packed with thousands of powerful features that requires to be able to support a wide variety of content-rich applications. Acquia Lightning is a lean, ready-to-use starter-kit that encompasses just the tools needed to develop and manage your enterprise-grade digital experiences. Lightning is built specifically to empower your marketing and editorial teams to build better, easier and faster. Here are 5 reasons why choosing Acquia Lightning could be a great decision for your organization’s editorial and content teams.

1. Speed of Lightning

This aggressively competitive era calls for quick formulas that can produce epic digital experiences. Acquia Lightning enables organizations to develop new applications in Drupal 8 faster. According to Chris Stone, former Chief Product Officer at Acquia, “Lightning removes 20 percent of the time required for every new Drupal 8 development project.” With Acquia Lightning, Drupal developers can now empower business and non-technology savvy users with powerful tools to enable them build on their websites faster.

2. Drag This and Drop That

Lightning enables you to easily design and customize new website layouts yourself without a Drupal developer’s assistance. Content editors won’t need to use any code to design a layout. With the help of Panels, Lightning layouts lets you easily drag and drop content blocks (elements wherever you like! This powerful feature lets you create compelling User Experiences as you can visually design the layout of your website the way you want to. With just a few clicks (and zero code), you can – add rich text, media, content references, slideshows, Google Maps and just about everything you need to create an interactive and engaging website. Not just this, your Drupal developers can also create custom components which you can then use from your library.

3. Effortless Workflows

Having everything together, without rummaging through the place, makes life simpler and easier – don’t you think? Editorial workflows call for tons of significant activities like creating, editing, reviewing and publishing content. Acquia Lightning’s easy all-in-one-place workflow management system, lets you easily tackle the chaos. It provides you with an approval dashboard meant just for your editorial workflow. Here you can easily check the status of the content you are reviewing - change, delete or publish it at your convenience. The version tracker allows you to check for changes and updates between different revisions, giving you the freedom to revise, compare and revert your content. You can review them, pick the most appropriate version, schedule and publish the content, all in the dashboard.

4. Manage your Media

You cannot have an engaging website without leveraging the power of Media. Lightning offers an easy and effective approach to add, embed and manage your media like Videos, Audio files, Images, Social Media Widgets, Documents, Maps and DAM (Digital Asset Management). All added Media will be stored in a Media library, giving you easy and quick access to all your media. Using the CKEditor (rich text editor), you can attach or embed any media into any content type. Cropping and resizing your images is easy as pie.

With the power of Drupal 8, Acquia Lightning can give your business that edge over your competitors. Learn how and why..

tweet this With Acquia Lightning, designing interactive digital experiences is simply effortless.

5. Sneak Peek – Experience Preview

You’ve got to think like your customer if you want to sell better. And to provide great digital experiences, you should be able to see exactly what your customer is seeing. Acquia Lightning for Drupal 8 (upgrade now!) enables you to conduct a comprehensive preview at every stage so you view what you publish before it goes live.


Acquia Lightning Features

Right out-of-the-box, Acquia Lightning is a slick, lightweight, all-you-need Drupal 8 solution that will meet all your web initiatives’ demands. It is one of the best ways to jump-start your Drupal projects and can accelerate your time to market. Headless Lightning lets you create beautiful and effective decoupled web applications with ease. Security is almost synonymous with Drupal CMS and Acquia lightning conforms to security best practices. Lightning undergoes regular security audits and releases frequent patches to keep your website’s health in check. Acquia Lightning makes development on Drupal simpler, faster and more powerful.

Feb 07 2019
Feb 07

A while ago, we wrote a post on the history of the Druplicon. As we pointed out in this post, our beloved Drupal logo, the drop, went through quite a few iterations to arrive at the point where it is today, known by everyone in the community. On top of that, because of the same prolific community, various versions of the logo have been created for special occasions, such as new releases and events, and for different topics and regions.

So, in the 18 years since Drupal’s conception, the community has seen a wide range of different Druplicons. But, unlike for other Drupal-related material, such as modules, there did not exist a unified platform where one could get an overview of the Druplicon’s evolution and all its variations throughout the years.

Druplicon version Delta from 2013

The Official Origin Story 

Officially, this is what sparked the idea of druplicon.org for Vesna, one of our Drupal developers. She was impressed by the large number of Druplicons and wanted to create a website that would display all existing Druplicons in one place. 

In order to bring the Druplicon closer to the community, she decided to gather all the diverse versions of the Druplicon and turn their discovery into something fun and interactive. 

... And the Actual One

Well, the origin story above is not exactly untrue; there is more to it, though. Vesna actually revealed the whole story behind what drove her to create druplicon.org - and it’s super fascinating! 

At Drupal Developer Days Milan 2016 she caught a glimpse of someone wearing a T-shirt with what appeared to be a Druplicon in the style of Joan Miró i Ferrà, one of her favorite painters. She isn’t completely sure, but she thinks the logo was that of a Drupal-related event in Barcelona (Joan Miró was a Spanish painter, sculptor, and ceramicist born in Barcelona, so there’s the connection). 

Of course, it’s not always easy to approach someone you don’t know and just spark up a conversation. It’s totally understandable, then, that she didn’t go to him to find out about his shirt and ask him if she can take a photo of the Druplicon for Instagram - and it’s even more understandable that she immediately regretted not doing so! 

She went on to scour Google relentlessly, trying to find the lost Druplicon - but, sadly, to no avail. So, she decided to make a database of all existing Druplicons, with the hidden agenda of maybe eventually finding this mythical one.

Memory Game

Visitors to druplicon.org can thus easily explore the icons by different categories, get additional information about them, clearly see which are the newest ones and even play an interactive memory game with the icons.

Due to the abundance of different Druplicons, the game is not exactly an easy one - even when opting for the “easy” mode. Playing it regularly, however, will quickly improve your knowledge of existing Druplicons. 

And, since the game is designed to be educational as well as fun to play, it greatly helps with remembering which Drupal event or aspect of the larger community a specific icon is connected to. 

Whenever you discover a matching pair, you get information about the event or topic that the icon has been used for, together with the link to the event’s or the community’s page on drupal.org

So, attend Drupal events, memorize their logos, get to know the community, then play the game regularly and become a true Druplicon master! (Pro tip: tackling the harder levels on a big screen will make the game much easier).

Druplicon.org memory game example

Staying True to the Spirit of Drupal

There’s another very Drupal-esque aspect of the site - in the spirit of Drupal contribution, users that register to the platform get the opportunity to submit new Druplicons. Because, let’s face it - there are so many versions of Drupal’s logo that it would almost be megalomaniac to think that we caught them all. 

So, if you discover or think of any Druplicons we might have missed, you’re more than welcome to join druplicon.org and add them to the platform - especially if one of them is the elusive Joan Miró Druplicon!

The Power of the Community

Druplicon.org is thus a collective effort in the true sense of the word. Staying true to the all-encompassing nature of Drupal, it’s a site anyone can contribute to and thus connect with members of the Drupal community no matter where they hail from. 

And, fittingly, the site itself is of course built in Drupal 8; it was actually built by our freshly recruited developers as part of their onboarding project (if you want to know more about how we onboard our new developers, take a look at this post on our effective training program). 

Doing so, they got hands-on experience with both crucial aspects of Drupal: coding and giving back to the community. As such, druplicon.org is truly a site by and for the Drupal community, showcasing the power of said community. 

Call to Action

This, then, is the perfect opportunity to try to get the community involved in our search for the lost Druplicon. Remember how we mentioned before that (a major!) part of the motivation behind the creation of the site was finding the Joan Miró Druplicon?

Well, we know that the Druplicon is somewhere out there, just waiting to be discovered. So, now we’re calling on all of you, especially those who attended Drupal Developer Days Milan in 2016, to spread the word, explore druplicon.org and contribute with any missing Druplicons. Together, we can surely find the lost Druplicon and make Vesna happy!

Joan Miró i Ferrà: Zephyr Bird

(If anyone has any information on the icon, but doesn’t want to join the platform for any reason whatsoever, please give us a shout out - any info is helpful!)



Feb 07 2019
Feb 07

I'm frequently sent examples of how Drupal has changed the lives of developers, business owners and end users. Recently, I received a very different story of how Drupal had helped in a rescue operation that saved a man's life.

The Snowdonia Ultra Marathon website

In early 2018, Race Director Mike Jones was looking to build a new website for the Ultra-Trail Snowdonia ultra marathon. He reached out to a good friend and developer, Rob Edwards, to lead the development of the website.

A photo of a runner at the Ultra-trail Snowdonia ultramarathon© Ultra-trail Snowdonia and No Limits Photography

Rob chose Drupal for its flexibility and extensibility. As an organization supported heavily by volunteers, open source also fit the Snowdonia team's belief in community.

The resulting website, https://apexrunning.co/, included a custom-built timing module. This module allowed volunteers to register each runner and their time at every aid stop.

A runner goes missing

Rob attended the first day of Ultra-Trail Snowdonia to ensure the website ran smoothly. He also monitored the runners at the end of the race to certify they were all accounted for.

Monitoring the system into the early hours of the morning, Rob noticed one runner, after successfully completing checkpoints one and two, hadn't passed through the third checkpoint.

A photo of a runner at the Ultra-trail Snowdonia ultramarathon© Ultra-trail Snowdonia and No Limits Photography

Each runner carried a mobile phone with them for emergencies. Mike attempted to make contact with the runner via phone to ensure he was safe. However, this specific area was known for its poor signal and the connection was too weak to get through.

After some more time eagerly watching the live updates, it was clear the runner hadn't reached checkpoint four and more likely hadn't ever made it past checkpoint three. The Ogwen Mountain Rescue were called to action.

Due to the terrain and temperature, searching for the lost runner on foot would be too slow. Instead, the mountain rescue volunteers used a helicopter to scan the area and locate the runner.

How Drupal came to rescue

The area covered by runners in an ultra marathon like this one is vast. The custom-built timing module helped rescuers narrow down the search area; they knew the runner passed the second checkpoint but never made it to the third.

After following the fluorescent orange markers in the area pinpointed by the Drupal website, the team quickly found the individual. He had fallen and become too injured to carry on. A mild case of hypothermia had set in. The runner was airlifted to the hospital for appropriate care. The good news: the runner survived.

Without Drupal, it might have taken much longer to notify anyone that a runner had gone missing, and there would have been no way to tell when he had dropped off.

NFC and GPS devices are now being explored for these ultra marathon runners to carry with them to provide location data as an extra safety precaution. The Drupal system will be used alongside these devices for more accurate time readings, and Rob is looking into an API to pull this additional data into the Drupal website.

Stories about Drupal having an impact on organizations and individuals, or even helping out in emergencies, drive my sense of purpose. Feel free to keep sending them my way!

Special thanks to Rob Edwards, Poppy Heap (CTI Digital) and Paul Johnson (CTI Digital) for their help with this blog post.

February 06, 2019

2 min read time

Feb 06 2019
Feb 06

If you are a programmer looking to improve your professional craft, there are many resources toward which you will be tempted to turn. Books and classes on programming languages, design patterns, performance, testing, and algorithms are some obvious places to look. Many are worth your time and investment.

Despite the job of a programmer often being couched in technical terms, you will certainly be working for and with other people, so you might also seek to improve in other ways. Communication skills, both spoken and written, are obvious candidates for improvement. Creative thinking and learning how to ask proper questions are critical when honing requirements and rooting out bugs, and time can always be managed better. These are not easily placed in the silo of “software engineering,” but are inevitable requirements of the job. For these less-technical skills, you will also find a plethora of resources claiming to help you in your quest for improvement. And again, many are worthwhile.

For all of your attempts at improvement, however, you will be tempted to remain in the non-fiction section of your favorite bookstore. This would be a mistake. You should be spending some of your time immersed in good fiction. Why fiction? Why made-up stories about imaginary characters? How will that help you be better at your job? There are at least four ways.

Exercise your imagination

Programming is as much a creative endeavor as it is technical mastery, and creativity requires a functioning imagination. To quote Einstein:

Imagination is more important than knowledge. For knowledge is limited, whereas imagination embraces the entire world, stimulating progress, giving birth to evolution.

You can own a hammer, be really proficient with it, and even have years of experience using it, but it takes imagination to design a house and know when to use that hammer for that house. It takes imagination to get beyond your own limited viewpoint. This can make it easier to make connections and analogies between things that might not have seemed related which is a compelling definition of creativity itself.

Your imagination works like any muscle. Use it or lose it. And just like any other kind of training, it helps to have an experienced guide. Good authors of fiction are ready to be your personal trainers.

Understanding and empathy

The best writers can craft characters so real that they feel like flesh and blood, and many of those people can be similar to actual people you know. Great writers are, first and foremost, astute observers of life, and their insight into minds and motivations can become your insight. Good fiction can help you navigate real life.

One meta-study suggests that reading fiction, even just a single story, can help improve someone’s social awareness and reactions to other people. For any difficult situation or person you come across in your profession, there has probably been a writer that has explored that exact same dynamic. The external trappings and particulars will certainly be different, but the motivations and foibles will ring true.

In one example from Jane Austen’s Mansfield Park, Sir Thomas is a father who puts too much faith in the proper appearances, and after sternly talking to his son about an ill-advised scheme, the narrator of the books says, “He did not enter into any remonstrance with his other children: he was more willing to believe they felt their error than to run the risk of investigation.”

You have probably met a person like this. You might have dealt with a project manager like this who will limit communication rather than “run the risk of investigation". No news is good news. Austen has a lot to teach you about how one might maneuver around this type of personality. Or, you might be better equipped to recognize such tendencies in yourself and snuff them out before they cause trouble for yourself and others.

Remember, all software problems are really people problems at their core. Software is written by people, and the requirements are determined by other people. None of the people involved in this process are automatons. Sometimes, how one system interfaces with another has more to do with the relationship between two managers than any technical considerations.

Navigating people is just as much a part of a programmer’s job as navigating an IDE. Good fiction provides good landmarks.

Truth and relevance

This is related to the previous point but deserves its own section. Good fiction can tell the truth with imaginary facts. This is opposed to much of the news today, which can lie with the right facts, either by omitting some or through misinterpretation.

Plato, in his ideal republic, wanted to kick out all of the poets because, in his mind, they did nothing but tell lies. On the other hand, Philip Sidney, in his Defence of Poesy, said that poets lie the least. The latter is closer to the truth, even though it might betray a pessimistic view of humanity.

Jane Austen’s novels are some of the most insightful reflections on human nature. Shakespeare’s plays continue to last because they tap into something higher than “facts”. N.N. Taleb writes in his conversation on literature:

...Fiction is a certain packaging of the truth, or higher truths. Indeed I find that there is more truth in Proust, albeit it is officially fictional, than in the babbling analyses of the New York Times that give us the illusions of understanding what’s going on.

Homer, in The Iliad, gives us a powerful portrait of the pride of men reflected in the capriciousness of his gods. And, look at how he describes anger (from the Robert Fagles translation):

...bitter gall, sweeter than dripping streams of honey, that swarms in people's chests and blinds like smoke.

That is a description of anger that rings true and sticks. And maybe, just maybe, after you have witnessed example after vivid example of the phenomenon in The Iliad, you will be better equipped to stop your own anger from blinding you like smoke.

How many times will modern pundits get things wrong, or focus on things that won’t matter in another month? How many technical books will be outdated after two years? Homer will always be right and relevant.

You also get the benefit of aspirational truths. Who doesn’t want to be a faithful friend, like Samwise Gamgee, to help shoulder the heaviest burdens of those you love? Sam is a made up character. Literally does not exist in this mortal realm. Yet he is real. He is true.

Your acts of friendship might not save the world from unspeakable evil, but each one reaches for those lofty heights. Your acts of friendship are made a little bit nobler because you know that they do, in some way, push back the darkness.

Fictional truths give the world new depth to the reader. C.S. Lewis, in defending the idea of fairy tales, wrote:

He does not despise real woods because he has read of enchanted woods: the reading makes all real woods a little enchanted.

Likewise, to paraphrase G.K. Chesterton, fairy tales are more than true — not because they tell us dragons exist, but because they tell us dragons can be beaten.

The right words

One of the hardest problems in programming is naming things. For variables, functions, and classes, the right name can bring clarity to code like a brisk summer breeze, while the wrong name brings pain accompanied by the wailing and gnashing of teeth.

Sometimes, the difference between the right name and the wrong name is thin and small, but represents a vast distance, like the difference between “lightning” and “lightning bug,” or the difference between “right” and “write”.  

Do you know who else struggles with finding the right words? Great authors. And particularly, great poets. Samuel Taylor Coleridge once said:

Prose = words in their best order; — poetry = the best words in the best order. 

"The best words in the best order" could also be a definition of good, clean code. If you are a programmer, you are a freaking poet.

Well, maybe not, but this does mean that a subset of the fiction you read should be poetry, though any good fiction will help you increase your vocabulary. Poetry will just intensify the phenomenon. And when you increase your vocabulary, you increase your ability to think clearly and precisely.

While this still won’t necessarily make it easy to name things properly - even the best poets struggle and bleed over the page before they find what they are looking for - it might make it easier.

What to read

Notice the qualifier “good”. That’s important. There were over 200,000 new works of fiction published in 2015 alone. Life is too short to spend time reading bad books, especially when there are too many good ones to read for a single lifetime. I don’t mean to be a snob, just realistic.

Bad fiction will, at best, be a waste of your time. At worst, it can lie to you in ways that twist your expectations about reality by twisting what is good and beautiful. It can warp the lens through which you view life. The stories we tell ourselves and repeat about ourselves shape our consciousness, and so we want to tell ourselves good ones.

So how do you find good fiction? One heuristic is to let time be your filter. Read older stuff. Most of the stuff published today will not last and will not be the least bit relevant twenty years from now. But some of it will. Some will rise to the top and become part of the lasting legacy of our culture, shining brighter and brighter as the years pass by and scrub away the dross. But it's hard to know the jewels in advance, so let time do the work for you.

The other way is to listen to people you trust and get recommendations. In that spirit, here are some recommendations from myself and fellow Lullabots:

Feb 06 2019
Feb 06

by David Snopek on February 6, 2019 - 1:04pm

As you may know, Drupal 6 has reached End-of-Life (EOL) which means the Drupal Security Team is no longer doing Security Advisories or working on security patches for Drupal 6 core or contrib modules - but the Drupal 6 LTS vendors are and we're one of them!

Today, there is a Less Critical security release for the Public Download Count  module to fix an Open Redirect vulnerability.

Public Download Count keeps track of file download counts, even for public files.

The module did not verify that the links provided to the intermediate page were actually present in the Drupal site content.

See the security advisory for Drupal 7 for more information.

Here you can download the Drupal 6 patch or the full release.

If you have a Drupal 6 site using the Public Download Count module, we recommend you update immediately! We have already deployed the patch for all of our Drupal 6 Long-Term Support clients. :-)

If you'd like all your Drupal 6 modules to receive security updates and have the fixes deployed the same day they're released, please check out our D6LTS plans.

Note: if you use the myDropWizard module (totally free!), you'll be alerted to these and any future security updates, and will be able to use drush to install them (even though they won't necessarily have a release on Drupal.org).

Feb 06 2019
Feb 06

Register Now  

Drupal contribution events are opportunities to join existing initiative teams and further the Drupal project, our processes, Drupal.org, various themes and modules, and more. DrupalCon is a time when many in the Drupal community get together, sharing knowledge and furthering the platform in all possible ways. Community members are invited to participate in this opportunity to work together in person and build relationships we can take back to the digital sphere when we're not together. We particularly welcome participants from all experience levels, backgrounds, genders, races, sexual identities, religions, ages, abilities and other marginalized groups in our community to participate. The best Drupal experience for everyone is based on inclusion. Read more about the rewards of getting involved in contributing.

Mentors in action

You don’t need to be a developer to be contributor, or even have a laptop, because you can pair up with other contributors at the event. You also don’t need to commit to a specified amount of time to contribute; even an hour is okay. We encourage your participation on Friday, April 12; stop by and jump right in to take on an issue. After all, you’ll be emailed every time the issue is updated—showing the progress you helped achieve!

“By helping to improve the tools you use, you gain much better knowledge about them,” says Gábor Hojtsy, a 15-year Drupal enthusiast.

What if I'm new to Drupal and/or contributing, how can I join?

Those new to Drupal or to the Drupal core contribution tools and process have options:

If you’re new and looking to get assistance in order to participate, the best place to start is at one of the three First Time Contributor Workshops taking place on Monday, April 8 at 1:00 pm, Tuesday, April 9 at 1:00 pm, and Friday, April 12 at 9:00 am. Here you’ll have a guided introduction to the tools and processes used to collaborate. These workshops can help overcome any hurdles or hesitation.

The mentor booth will be live in the exhibit hall during the week to answer all your questions about mentoring and contributing. Likewise, on Friday we’ll have a welcome table staffed by mentors who can help you join a team based on your area of interest, such as documentation, marketing, etc.

Mentored vs. General Contribution

Mentored contribution helps you become more involved in the community while in turn aiding improvements in Drupal Core. Plenty of mentors will be available to help you get started; we aim to have no more than 4 contributors paired with a mentor. If you're not sure where to start contributing, or not even sure about the whole "sprint" thing, this is for you!

If you’re new to contribution, attend our First-time Contributor Workshop, where you’ll set up a tools package that includes IRC, Git, and a Drupal 8 development environment, enabling you to join in right away.

Contribute Today!

The Mentored Core Contribution Day has been held at DrupalCon since Sydney 2013 and at many local and regional Drupal events. It's a great opportunity to get started with plenty of support, making it easier to join in again remotely or move over to the General Contribution Room.

General Contribution is for those who have some previous experience working with the Drupal issue queue. You can join one of the many teams, including: documentation, migrate, media, front-end, layout, API-first, workflow—and more.

If you want to focus on a particular part of core or a community ("contrib") module that’s not listed on the signup sheet, just add it to the list. While many have chosen an established group to work with, there are typically many contributors who are open to working on any topic.

DrupalCon Seattle Schedule Breakdown

Mentors in action

Friday will be the biggest contribution day with hundreds of people present and different opportunities based on experience level. If you know the tools but still could use help picking issues and going through the process, the Mentored Contribution Room is for you. You’ll get started with in-person training and mentoring from friendly, experienced core contributors. If you've already started to work on core, come meet other contributors, hang out in person, and work on manageable tasks in the Drupal core queue (hint! You might be a mentor). Watch this for how a contribution event is planned and executed.

And remember: Contribution is a process. Drupal evolves by many single tasks, performed by thousands of people.

“Drupal can always be improved in all kinds of ways, whether that is accessibility testing, documentation, perfecting button colors and radiuses or finding and documenting bugs. All of those are great contributions.” -Gábor Hojtsy

Feb 06 2019
Feb 06

Mass.gov dev team releases open source project

Go to the profile of Moshe Weitzman

The Mass.gov development team is proud to release a new open source project, Drupal Test Traits (DTT). DTT enables you to run PHPUnit tests against your Drupal web site, without wiping your database after each test class. That is, you test with your usual content-filled database, not an empty one. We hope lots of Drupal sites will use DTT and contribute back their improvements. Thanks to PreviousNext and Phase2 for being early adopters.

Mass.gov is a large, content-centric site. Most of our tests click around and assert that content is laid out properly, the corresponding icons are showing, etc. In order to best verify this, we need the Mass.gov database; testing on an empty site won’t suffice. The traditional tool for testing a site using an existing database is Behat. So we used Behat for over a year and found it getting more and more awkward. Behat is great for facilitating conversations between business managers and developers. Those are useful conversations, but many organizations are like ours — we don’t write product specs in Gherkin. In fact, we don’t do anything in Gherkin beside Behat.

Meanwhile, the test framework inside Drupal core improved a lot in the last couple of years (mea culpa). Before Drupal Test Traits, this framework was impossible to use without wiping the site’s database after each test. DTT lets you keep your database and still test using the features of Drupal’s BrowserTestBase and friends. See DrupalTrait::setUp() for details (the bootstrap is inspired by Drush, a different open source project that I maintain).

Zakim Bridge at Night, North End Boston. Photo by David Fox.

Using DTT in a Test

  • Our test cases extend ExistingSiteBase, a convenience class from DTT that imports all the test traits. We will eventually create our own base class and import the traits there.
  • Notice calls to $this->createNode(). This convenience method wraps Drupal’s method of the same name. DTT deletes each created node during tearDown().
  • Note how we call Vocabulary::load(). This is an important point — the full Drupal and Mink APIs are available during a test. The abstraction of Behat is happily removed. Writing test classes more resembles writing module code.

More Features


  • See the DTT repo for details on how to install and run tests
  • Typically, one does not run tests against a live web site. Tests can fail and leave sites in a “dirty” state so it’s helpful to occasionally refresh to a pristine database.

If you have questions or comments about DTT, please comment below or submit issues/PRs in our repository.

More from Moshe: Our modern development environment at Mass.gov

Interested in a career in civic tech? Find job openings at Digital Services.
Follow us on Twitter | Collaborate with us on GitHub | Visit our site

Feb 06 2019
Feb 06

The backbone of every DrupalCon is the community of people who come together at the event, and in particular the involvement of community volunteers who collectively influence and shape the experiences of others in attendance. In short, Mentors!  

Mentors in DrupalCon

As DrupalCon Seattle continues to take shape, we are recruiting volunteers to serve as mentors during our Mentored Contribution Day. First and foremost, we ask that you complete your DrupalCon experience by planning to be in attendance at the Washington State Convention Center on Friday, April 12—the big day dedicated to contributing back to Drupal Core.

Mentors are needed to help new contributors feel welcome, set up their development environments, find tasks, and work on issues. We aim to have one mentor for every four contributors. You don’t need to be a programmer to serve as a mentor—we need all of you! Every DrupalCon, we have attendees from all skill levels, backgrounds, and all over the world come together to learn, share, and invest time to support the Drupal project and community. Having a diverse group of mentors and contributors gives everyone an opportunity to learn and share their knowledge and experience within a comfortable level and interest area. Mentors show how to look for information and serve as friendly resources for new contributors.

Mentors also ensure that participants start with a straightforward issue to understand the overall process of contribution. Contributors often work in pairs or on topic teams to find a solution together and understand how it fits into the bigger picture.

Mentors in action

Even for the most experienced developer, the Drupal issue queue can be daunting at first glance, especially if someone has never been involved in a full issue resolution lifecycle. Maintainers in the community can prepare the issues for clear assignment, and mentors then help new contributors become familiar with the issue process. There are many issues and work needing attention from designers, testers, reviewers, writers, project managers and others to advance. We will hold multiple mentor orientation sessions that will help prepare all mentors for working with new contributors in the issue queue and on the ground.

The core mentoring team at each DrupalCon includes a number of lead roles that are filled in advance in order to coordinate efforts prior to the event. A few of these roles are: Mentoring Lead Coordinator, First-Time Contribution Workshop Leads, Translators, Mentor Booth Lead, and Communications Lead. These roles are always open to having multiple leads, or deputy leads, so that the responsibility can shift as needed. For more, watch this video.

Core mentors facilitate new contributor workshops and mentored contribution time at every DrupalCon. Mentors identify novice issues in advance so that first-time contributors have the greatest chance of making contributions during the event. Detailed descriptions are listed in this article: Mentored Sprint Leads.

Planning-wise, it helps to know in advance who is available to participate. Mentors sign up on both the event website and a "Spreadsheet of Awesomeness" for detailing who is available to do what to keep the event running smoothly.

“I think a great balance is about three mentees to one mentor, and any sort of mentor is really helpful. It can just be onboarding people and getting them set up with the tools, or introducing them to how to navigate the issue queue, or going more in-depth on issues and walking through, step by step,” says Elli Ludwigson (ekl1773), a mentoring lead at multiple DrupalCons and Content Strategist at Open Strategy Partners.

How can you help? We’re glad you asked:

  • Mentor for a half day or whole day during the Mentored Contribution time on Friday, April 12 and/or during contribution time on Monday and Tuesday
  • Assist participants in the First-Time Contributor Workshop on Friday, April 12
  • Help triage novice issues before the Friday event
  • Welcome people at our Booth; answer inquiries relating to how anyone can contribute
  • Sponsor the mentor thank you dinner
  • Help with contribution logistics onsite: greet people, organize volunteers, help people choose the right contribution room for them, take photos, etc.

A Breakdown of the Time Involvement for Mentors

Each day involves contribution time, though not every mentor is busy mentoring every day of the conference. For DrupalCon Seattle, there will be first-time contribution workshops on Monday, Tuesday, and Friday to get new contributors set up with the toolkit (Drupal.org/tools).

Mentoring Community Conversation

Those signed up in advance will receive information via email before DrupalCon about all the events during the week. Typically, there are two mentor orientations and one novice issue triage session, covering many of the points in this guide to good mentoring. The mentor orientations are at two separate times during the week to accommodate the busy session and training schedule; mentors need only attend one but are welcome at both.

On Friday, mentors will gather bright and early to review exactly what the overarching plan is for the day, and any specific projects that can be tackled—not to mention a brief pep talk, and much thanks! For details in list form, see the Contribution Day Checklist.

And remember, mentoring is, first and foremost, fun!

“Coming to DrupalCon and really being involved and meeting all these new people is just completely worth it,” said Ludwigson.

So we ask that you sign up to mentor, and while you’re at it, add your name and preferred activities to the spreadsheet of awesomeness. Be sure to register for DrupalCon Seattle, and stay through Friday, April 12; discount conference hotel rates.

Feb 06 2019
Feb 06

API first, responsive Bartik, headless and decoupled Drupal, Layout Builder, React admin UI... Drupal's evolved tremendously over these 18 years! Yet: the emails that we send out via its otherwise robust email sending system aren't different from those we used to send a... decade ago. And customers expect rich experiences outside your Drupal website or app. While website administrators expect to be enabled to easily manage, via the admin UI, their email content templates. So: how do you send HTML emails in Drupal 8?

Without relying on external services, of course...

And who could blame customers for expecting 2019-specific user experiences? Experiences that HTML-enabled emails deliver through their great features.

Features that support Drupal editors' marketing efforts, as well:

  • traffic-driving hyperlinks; you get to link to your landing page right from the email
  • visually attractive custom design; emails that look just like some... microsites
  • all sorts of design details that reinforce your brand: buttons over cryptic links, responsive design, templated footers and headers
  • web fonts
  • QR codes 
  • hierarchical display of content, that enhances readability and draws attention to key pieces of content and links in your email
  • images and attachments
  • tracking for monitoring opens

And speaking of admin and/or editors, the questions they ask themselves are:

“How can I easily theme the emails to be sent out?”

“How can I change their content templates right from the admin UI?”

And these are the questions that I'll be answering to in this post.

Here are your current options at hand — 3 useful Drupal 8 modules — for easily crafting and sending out HTML emails that appeal and engage.

It does exactly what you'd expect:

It enables you to configure HTML emails from Drupal 8.

It's the Drupal 7 go-to option whenever you want to go from plain text emails to HTML-formatted ones. A module available for Drupal 8 in alpha version.

Furthermore, it integrates superbly with the Echo and the Mail MIME modules.

2. The Swift Mailer Module, The Best Way to Send HTML Emails in Drupal 8

Swift Mailer is the highly recommended method for configuring Drupal 8 to send out visually-arresting, HTML emails.

Since you can't (yet) send them right out of the box with Drupal...

The module stands out as the best option at hand with some heavy-weighing features:

  • it supports file attachments
  • it supports inline images, as well
  • it enables admins to send HTML (MIME) emails
  • … to send them out via an SMTP server, the PHP-provided mail sending functionality or via a locally installed MTA agent

Note: you even get to use this module in tandem with Commerce to send out your HTML-enabled emails. There's even an initiative underway for replacing Drupal's deprecated core mail system with the Swift Mailer library.

And now, here are the major configuration steps to take to... unleash and explore this module's capabilities:

  • first, set up the Swift Mailer message (/admin/config/swiftmailer/messages) settings to use HTML
  • next, configure the Swift Mailer transport settings (/admin/config/swiftmailer/transport) to your transport method of choice 
  • and finally, configure the core mail system settings to use this module for the formatter and the sender plugins

And if you're not yet 100% convinced that the Swift Mailer module is significantly superior to Drupal's default mail system, here are some more arguments:

  • it enables you to send... mixed emails: both plain text and HTML-enabled
  • it provides HTML content types
  • it supports various transport methods: Sendmail, PHP, SMTP (the current mail system supports but one method)
  • it enables you to integrate key services with Drupal —  like Mandrill, SendGrid —  right out of the box
  • it incorporates a pluggable system, allowing you to further extend its functionality

How about now? Are these strong enough arguments that Swit Mailer's the way to send HTML emails in Drupal 8?

Another option for configuring Drupal 8 to send out HTML emails is the PHPMailer module.

How does it perform compared to Swift Mailer?

  • It's not pluggable
  • it's not as easily customizable as Swift Mailer 
  • it's already embedded in the SMTP module (in fact, in Drupal 8 the default mail interface class is named “PHPMail” instead of DefaultMailSystem)

What features does it share with Swift Mailer?

  • it enables you to send out HTML-enabled emails with Drupal
  • it enables you to add attachments to your emails
  • it, too, enables you to send out mixed emails
  • it, too, supports external SMTP servers

Moreover, you can extend its core functionality by integrating it with the Mime Mail component module (currently in alpha 2 version for Drupal 8).

4. The Mime Mail Component Module

Briefly, just a few words about Mime Mail:

  • as already mentioned, it's a “component module”, that can be used for boosting other modules' functionality
  • it enables you to send out HTML emails with Drupal: your mail would then incorporate a mime-encoded HTML message body
  • it enables you to set up custom email templates: just go to your mimemail/theme directory, copy the mimemail-message.tpl.php file and paste it into your default theme's folder; this way, your email will take over your website's design style 
  • any embedded graphics gets Mime-encoded, as well, and added as an attachment to your HTML email
  • do some of your recipients prefer plain text over richly formatted HTML emails? Mime Mail enables you to switch your email content over to plain text to meet their specific preferences

The END!

Now that you know your options, it's time to step out from the (too) long era of rudimentary, plain emails sent out with Drupal.

... and into the era of richly formatted HTML emails, that will:

  • enrich your customers' experiences
  • enhance Drupal 8 site admins' experience
Feb 06 2019
Feb 06

Consider the following exchange:

Project Manager: “Hey Joe, next week we’d like you to add some new features to [client site].”

Me: “Sure thing! Where is it hosted?”

PM: “Ah, well… we’re not really sure. We’ve asked the client. The thing is, they haven’t been able to do any work on the site for the last couple of years, because someone built the site for them and then launched it without documentation, and with no support.”

Me: *Stunned Look*

PM: “Also, they don’t use any version control. So updates will have to be done via FTP.”

Me, reeling: “I… I don’t even think I have an FTP client on my computer.”

PM: “We believe in you.”

Worst Case Scenario

This is a worst-case support development scenario, one likely to bring with it uncertainty and fear. However, with a methodical approach, even the worst case can be turned to your advantage.

Getting started: Docs and detective work.

The very first thing to do when you have a new support project is to find the site documentation, or failing that, create a place for new docs. You are in the best position to document the site, because you don’t have any preconceived ideas about what to do - so document everything. Future engineers (and future you) will thank you.

Starting with the site and its hosting, you can reverse-engineer pretty much anything. You can even reverse-engineer the hosting if you need to, using Robtex! (Find the host, and ask the client to reach out to them for login info).

Once you have the hosting info, you can log in and establish the following: Are they running backups? Do they use a database, and is it backed up? Do they have any version control? Is there any sort of deployment process? Do they have a staging environment?

If the answer is ‘No’ to any of the above, then it’s usually pretty easy to add/enable. Once you have a ‘Yes’ for all of the above, update the documentation, password manager, etc. For example, even if they don’t use version control, there’s nothing stopping you from adding it to your local install, and pushing that code to a (now free!) private GitHub repo.

From there, you can add user accounts for yourself, and if it’s a CMS-based website such as WordPress or Drupal, log in and start investigating the code.

Figuring out the code - locally.

It’s always a good idea to do code investigations on a local installation - any tweaks and debug code can be spotted pre-deploy and removed. Make sure you document the process of getting a local installation up and running as well! Example: letting your co-workers know that they should run the WordPress-based wp-cli command wp search-replace client-site.com client-site.localhost on a newly imported database will save them hours of frustration, as well as preventing terrible accidents from happening (WordPress will quietly redirect you to the live site after logging in if you don’t change the site URLs in the local database. Oopsie!)

Once set up locally, you can start looking for theme-layer build tips. In the root of the project, look for Composer files, (which could indicate an automated build process). A README would also be a good thing to look for - these will often be the hidden documentation for a project.

You should also look for any taskrunner files, such as those used by Gulp or Grunt, or any other files that you wouldn’t expect to see in a clean install of the CMS.

Next, find the active theme. Usually, you can inspect the website and find paths to the theme from images (WordPress), or the favicon link in the header (Drupal).

Once you’ve located (and documented) the theme location, look in the theme for taskrunners, as well as any README files. If there’s are none to be found, look for a Sass or {less} directory. Gemfiles and Rakefiles will also give hints about the type front-end preprocessors in use, and what the scope of the preprocessor is. If it’s an older site, it might still use a Compass-based framework. If there’s no preprocessor, it might be using vanilla CSS!

Once all of that is done (and documented), you can actually start finding and working on code!

Where code?

Actually finding code can be tricky - say it’s a WordPress site, and you’ve been asked to add a menu to ‘campaign’ pages across the site. How to find the template quickly?

This is where a codebase searchable IDE is handy. Sites can have tens of thousands of files, and you want to be able to narrow your search. In the case of a WordPress template, you’d limit the search to the theme directory, preferably with a *.php file extension. From there, you can look at a campaign page and look for specific classes. In our case, hero-area campaign.


IDE Search Result

Don’t be a hero - use smart search

This site had over 100,000 files! A full search could have taken several minutes instead of the 1-2 seconds it took to search the 244 PHP files in the theme.

From here, you could simply get to work and add the menu, but it can be valuable to run a codesniffer against the template. The more it deviates from the coding standard for a particular CMS, the more likely your ‘correct’ code will run into issues. In addition, if the site is ever migrated to an automated deployment environment, it will fail builds that have coding standard filters.

You can also glean a lot about the mindset of the people who built the site - were they careful and clean in their coding style? Did they document/comment code? Did they make the same style errors over and over (like a lone developer would do) or is it random (like a team)?

You can also occasionally make fun discoveries:

Me: “OK, I installed the site locally and added the menu to the campaign template. I also noticed a coding error in the ‘related content’ section that was causing it to not display.”

PM: “Really? Do they have that on other content on the site?”

Me: “Yeah, every other content type has it. I suspect it was just an error that snuck in when someone was doing a search-and-replace on the code.”

PM: “So… how many pages did that impact?”

Me: “About 500 or so. It’s been that way for at least the last three years too.”

PM: *Stunned Look*

Get In Touch

Questions? Comments? We want to know! Drop us a line and let’s start talking.

Learn More Get In Touch
Feb 06 2019
Feb 06

We’re tired of companies being misinformed about Drupal’s capabilities. Time to clear the air.

Over the last several years, Acquia Drupal has quickly built inroads into enterprise clients that would traditionally gravitate towards either Sitecore and Adobe Experience Manager (AEM). This rapid growth has created a fair amount of out-of-date information that AEM proponents tend to lean on when advocating for the Adobe platform but the reasoning is not substantiated in many cases.

The top 15 misconceptions about Drupal:

#1: Drupal doesn’t offer an intuitive inline editing experience.

#2: Drupal cannot track several published versions of the same components for A/B tests.

#3: Assets are not revisioned and revertable.

#4: Drupal Workflows do not support annotations.

#5: Images cannot be reused in multiple components.

#6: Drupal cannot store assets in a hierarchy.

#7: You cannot compile Less files into CSS with Drupal.

#8: You cannot move a page in Drupal from one folder to another.

#9: Drupal does not support a collection of individual fields into a single multi-field type.

#10: Drupal can’t inherit page properties from parent pages.

#11: Digital asset management integration is not as seamless as it is in AEM.

#12: The marketing team can’t update page layouts without involving an engineer.

#13: Drupal is free… like a puppy.

#14: Drupal’s lack of support for multiple master database backends means Drupal can’t be made highly available (HA).

#15: PHP is inferior to Java.

#1: Drupal doesn’t offer an intuitive inline editing experience.

This claim was actually true about Drupal—until recently. One of AEM’s key differentiators is its slick editorial experience. Just take a look at this example page building interface, inline with all of the site content and design:

AEM page builder


Drupal has long lagged behind AEM’s superior page building editor and content experience. However, in the last year, Drupal has invested a tremendous amount of engineering hours to bring this experience to parity with AEM.

Drupal 8 has long had all the components necessary for a slick page-building experience—media handling, a block API, complex custom fields, entities, etc.—which the Layouts module, now part of Drupal 8 core, brings together into a cohesive and compelling user experience that is (at last) similar to AEM’s capabilities.

Drupal equivalent of AEM's page builder


By configuring and installing the right modules (extensions, plugins, etc.) you can achieve a seamless editorial page building experience, for the rare marketing teams that actually want to do more than just edit content and refine SEO attributes.

#2: Drupal cannot track several published versions of the same components for A/B tests.

AEM teams will often point to their platform’s ability to track multiple published versions of individual site components (widgets) in order to perform A/B tests.

While Drupal’s content and field module is flexible enough to support tracking two different published versions of even the most complex component or widget, support for this use case is not as well executed as AEM. However, from our perspective the larger issue is not about the capabilities, but whether a CMS is the right tool for an A/B test.

WordPress is the most popular content management system in the world. Back when it was first released, in 2003, if you wanted to add a lead generation form to your site, you built it in WordPress. Marketo, one of the leading marketing automation platforms, wasn’t founded until 2006. Fast forward a decade and now you have dozens (if not more) of third-party services for embedding a lead generation form in a WordPress site. Building a lead generation form into a CMS today is considered a bad practice because these third-party tools can invest tremendous amounts of engineering time on solving one problem, whereas the CMS has to spend limited engineering time solving many. A CMS simply can’t compete, and hasn’t, for years.

Over the last decade, third-party services have repeatedly become a better option than using engineering time to modify a CMS, and that’s finally happening for A/B testing as well. It’s true that AEM has better support for doing an A/B test in the CMS, but the broader question is, shouldn’t you be using one of the leading A/B testing tools—Google’s is free!—rather than doing it right in the CMS?

#3: Assets are not revisioned and revertable.

AEM has robust support for the revisioning of assets; every time an asset is changed by a content author, the previous version (or difference) is stored in the system so that a user can later revert to the original.

AEM teams often get confused by Drupal’s revision system, but rest assured that Drupal tracks every change to content and assets and allows users to see the history, compare the differences, and revert back as needed.

Revisions in Drupal


Revisions in Drupal


#4: Drupal Workflows do not support annotations.

Built into the core of AEM is a powerful workflow system, where you can define the creation lifecycle of a piece of content through an editorial experience and across a team. Not only does the AEM  system support a custom workflow of writing, editing, reviewing, approving, and publishing, it also allows users to annotate custom messages that describe an overall change to the content. You may have heard this described as a change log.

This is an area where Drupal’s module ecosystem causes a fragmented documentation situation—where a certain feature is supported, but only when additional Drupal modules (extensions, plugins, apps) are installed. In fact, Drupal fully supports a changelog and has a workflow system as robust as AEM’s, though achieving this functionality does require the installation and configuration (in the GUI, not code) of several modules like Content Moderation and Workflow.

#5: Images cannot be reused in multiple components.

AEM teams often point out that AEM offers an excellent media handling system, specifically when it comes to reusing the same image in multiple components. Media handling is now built into Drupal core, but to achieve feature parity with AEM, users need to employ a variety of media handling modules (like Content Browser), specifically the Inline Entity Form module to achieve a similar content reusability experience.

#6: Drupal cannot store assets in a hierarchy.

Building on AEM’s native content hierarchy model, the Adobe platform supports organizing assets in folders to enhance the user experience. AEM teams often look at the default media support in Drupal and think that assets cannot be organized in a hierarchy and are just maintained as a long list.

Drupal takes a different approach to this problem. Instead of a file folder browser experience where the author organizes content themselves, Drupal site builders configure the folder paths that media should use on each individual file field added to the system. This allows content from different fields—think a logo image field and an icon field—to be organized into different folders. To enhance SEO and make the experience even better,  you can use the File (Field) Paths module to have the media file name and folder structure dynamically built from various attributes of the uploaded content on-the-fly, automagically.

#7: You cannot compile Less files into CSS with Drupal.

Less is a stylesheet language that allows developers to write CSS, the visual theming language of websites, faster and better, with less technical debt over time. Sass is a competitive approach to Less.

Web browsers don’t support Less or Sass. When you make a change using Less or Sass, a program translates that change into CSS, which browsers do understand. AEM has built-in support for this translations process. Drupal doesn’t support it.

However, Drupal’s perspective is not that this is a missing feature but that this is not something a CMS should do. In computing, there is a concept called  Separation of Concerns (SoC)—solving discrete problems with discrete solutions. CMS is a big problem and requires a big platform to solve it, which is why you have popular platforms like Drupal, WordPress, Sitecore, and AEM.

But compiling Less and Sass into CSS is an entirely different problem than managing content for editors and building marketing sites, so Drupal’s perspective is that you should compile your Less and Sass in an outside system (which is easy with tools like Gulp). This is the industry best practice and the best solution when you ’re using Less or Sass with Drupal.

AEM teams may similarly push back on Drupal’s ability to compile JavaScript ES6 (the latest and greatest version of JavaScript) to ES5, the previous version, to ensure wide visitor browser support. Compiling JavaScript, like dealing with stylesheet languages, is something best done outside of the CMS.

#8: You cannot move a page in Drupal from one folder to another.

A major difference between AEM and Drupal that often causes confusion is how each system approaches the organization of content in the backend. AEM uses a hierarchical content model, organizing content into a tree whose structure mirrors your site information architecture (IA). Drupal takes a different approach and maintains a flat content structure in the backend, and users rely on menus, taxonomy, and URLs to build their site IA.

This difference causes confusion when AEM developers look into Drupal and think that pages can’t be moved between folders to appear in two places. Drupal fully supports organizing content into any kind of hierarchy, you just do this outside of the main content list in the Drupal author backend. Individual pieces of content in Drupal can have multiple taxonomies (tags, categories, any number of custom categorizations, etc.), appear in multiple menus (main nav, footer nav, etc.), and use multiple URL aliases. (Drupal ensures strong SEO support by redirecting all other URL aliases to a primary URL alias in a search-engine and user-friendly way.) That means you can achieve the same kind of flexibility in content hierarchy in Drupal or AEM.

#9: Drupal does not support a collection of individual fields into a single multi-field type.

AEM components are made up of different kinds of field types, and AEM has this neat field type called a multi-field that is a collection of other individual fields treated as an aggregate field. A simple example: Say you want to have a component on your page that lists four products, and for each product, an author will need to set a title, image, and a URL (to the product details page). What you have here is a single multi-field, filled out four times, with three individual fields each, one for product title (text), image (file upload), and URL (link).

This one is easy: Drupal fully supports multi-fields out-of-the-box via the Paragraphs module.

#10: Drupal can’t inherit page properties from parent pages.

One of the things AEM does really well is present an intuitive tree of content to the user to editing site pages, and couples that view with the inheritance of page properties of parent pages to children. AEM teams will often have a hard time finding an intuitive content tree in Drupal and conclude that parent page property inheritance isn’t supported.

Compare the AEM content tree to the Drupal content list and it’s easy to see why this confusion exists:

AEM content tree


Drupal content list

Friendly Machine

However, Drupal does support the creation of pages that inherit properties from parents using the Panelizer module and the Layout API, now in Drupal core. Drupal organizes different kinds of content into user-defined content types and calls individual pieces of content nodes. Using these modules you can define a global layout for all content types, and then customize properties, layout, and theming for each content type, inheriting global properties and making as many distinct content type level refinements as you need.

#11: Digital asset management integration is not as seamless as AEM.

Drupal can integrate with most major digital asset management solutions just as well as AEM.

AEM teams will often point out the tight integration of Adobe’s Digital Asset Management (DAM) product into AEM itself as a compelling advantage over Drupal. This is a bit misleading because both Drupal and AEM integrate with a wide variety of off-the-shelf DAM solutions. In both systems, you can achieve a strong editorial experience with different solutions and workflows.

The larger issue is one of the values of tightly coupled solutions. Adobe didn’t build AEM but has been acquiring a series of businesses so that it continues to add new capabilities to its content management platform. The foundational acquisition was Day Software’s CMS, CQ, to which Adobe added analytics (by acquiring Omniture) and marketing (Efficient Frontier), and this year, commerce (Magento) and marketing automation (Marketo) to the mix. This means that today AEM is a collection of disparate tools, developed by separate companies on separate technology platforms with separate goals, hard woven into a single solution.

Curiously, while Adobe drives towards a single unified platform of (allegedly) tightly-coupled components, the world of digital marketing is splintering into literally thousands of marketing technology tools, each of which can be easily integrated into a website based on specific needs. As the sophistication of cloud services continuously improves, the ability of a digital marketing team to execute quickly using the best tools continues to get easier and easier. The appreciating currency is about speed and agility, and the ability to respond to changing capabilities, market realities, and institutional priorities, and less about a tightly coupled monolithic system.

Sure, you can make your core CMS do lots of stuff, but the real question to ask is, should you? Think about the person in your extended family (we all have one) who is very handy around the house and can tackle serious home improvement projects. What is the big difference between this person and someone who can do just handle the very basics? Tools. The serious home improvement person will have a robust set of tools they know how to use—and when.

#12: The marketing team can’t update page layouts without involving an engineer.

With the latest version of Drupal 8 and the addition of the Layout system, Drupal now offers feature parity with AEM’s most compelling feature: inline page building.

AEM is perhaps best known for providing marketing teams with a slick interface for building page layouts without the help of an engineer. Teams can create new pages, dynamically create layouts, columns, and grids, and add various content modules.

But take a moment to think about how necessary it is for marketing teams to have this capability in light of the dramatic shift to agile marketing.

There is scant evidence that this is a feature marketing teams will actually use. Most of Third & Grove client’s are mid-market and enterprise organizations, both B2B and B2C, in a variety of different sectors. Nearly all are U.S.-based. While many requested the ability to build page layouts, over the last five years, less than five of our clients have actually used this functionality once it was provided to them. Indeed, the actual usage was so low across all of our projects that we quietly stopped creating page layout builders by default unless the client asked for it. And no one ever did.

The marketing teams we encounter do not want to spend time building page layouts in the CMS. The best executing agile marketing teams we see spend their time working with writers on a content strategy, evaluating and deploying a continuous stream of various marketing technology tools (Drift anyone?), and iterating on new ways to capture informative engagement data from tagging and analyzing analytics. Building a page layout is considered a low priority task they prefer to outsource, to their development teams or an outside partner.

Let us now turn to the issue of whether Drupal offers as compelling an experience of page layout building. This claim was most valid when comparing AEM to Drupal 7, the previous version of Drupal. Drupal 7 did not provide a compelling parity of experience. And, when it was released two years ago, neither did Drupal 8. However, since the Layout system was added into Drupal core, it now offers a compelling, similar page-building experience.

Drupal layout


#13: Drupal is free… like a puppy.

Adobe likes to say that Drupal is free like a puppy is free. They mean that yes, Drupal is free and fun, but, like a puppy, it takes a lot of work (read: customization) to grow into a well-behaved dog.

The reality is that both options require a lot of work to meet your needs and mature into a valuable solution for your organization. So why pay money up front when you can get a great outcome (and feel good) rescuing a puppy from a shelter?

#14: Drupal’s lack of support for multiple master database backends means Drupal can’t be made highly available (HA).

This one is a bit technical.

Drupal works out-of-the-box with any MySQL variant (MariaDB, Amazon RDS, etc) and Postgres. Drupal can also be made to run with Microsoft SQL Server and SQL Azure. Like most database platforms, MySQL supports running as a single database, where applications read and write data to one database, running one master and multiple slaves, where applications write only to one database instance (master) but can read from any number of slaves, or master-master replication where there are multiple database instances where a change to one database cascades to all of the other master instances automatically.

Drupal fully supports a single database instance and a master slave configuration but doesn't really support master-master replication because of (among other things) its standard use of auto-increment primary keys.

This limitation is often called out by AEM teams to mean that Drupal cannot be made highly available (HA). While the limitation is technically accurate, it does not mean that Drupal can’t be highly available. Global high availability is an important requirement for any organization that relies on their site to generate leads, engage with customers, sell products, or generate brand goodwill. But it is how you go about achieving HA that matters.

Ask the AEM team a simple question: Why do you need to use master-master replication to achieve highly availability for a marketing site?

The crux of this issue is that AEM costs a lot to buy (licensing fee) and implement (budgets typically are double enterprise Drupal build budgets), and when something costs a lot, people tend to justify spending more money in other areas, like infrastructure. This is why you will often hear AEM teams talk about needing globally-distributed data centers with multiple master databases to power a marketing site.

But remember, today the main website of even large enterprise companies is no longer complex or dynamic. Why? For starters, the public doesn’t log into marketing sites. They might log into a dashboard or application or even a store, but those experiences are likely in other systems, not the marketing site. Further, the areas of a site that remain dynamic today—like a lead generation form, the investors portal, or a careers section—are now provided by third-party tools like Marketo, Pardot, Drift, and West Communications. In 2018, the burden of HA has been offloaded to the data centers of third-party providers.

Regardless of the traffic level or importance to your business, what you are often left with is a static marketing site that can be entirely fronted on a content delivery network (CDN), like Akamai, Fastly, or Cloudflare. And nothing is better at global HA than a CDN.

#15: Java is superior to PHP.

We have to nerd out again, however briefly. AEM teams will often raise concerns about PHP, the language of Drupal. AEM is written in Java.

I once chatted with an AEM team that said,  because PHP did not include certain state memory constructs that Java included on a per process level, more server overhead and complexity was required to track that data separately when they used a PHP application. They argued more complexity meant more potential for issues.

I responded that since Java was doing more per process, the memory overhead was higher and chances for fault were higher because of added complexity in a single thread. Is this technically correct? Yes. Is this really a flaw of Java? Absolutely not.

PHP and Java are both mature, robust programming languages with real strengths and real weaknesses. Neither is better. Both are great.  Both can be a headache, and both are paths to success as often as they are paths to project failure. World-class organizations run world-class applications solving problems in both PHP and Java. When used correctly, both PHP and Java scale are secure and can be maintained. Both languages have large communities of talent from which you can hire people, here in the US and abroad.

In the context of Drupal vs AEM, programming language is no longer a valid point of consideration.


Drupal is not perfect nor right for every project but you should at least make a decision based on the straight truth of each platform.

Feb 06 2019
Feb 06

At the end of 2018, Dries Buytaert, creator of Drupal, asked folks involved with the project to share their thoughts on what's "holding Drupal back." His prompt came on the heels of two great blog posts related to his company Acquia's growth strategy and lessons he's learned and applied from Amazon's growth strategy. I didn’t beat his third post on overcoming Drupal’s obstacles to the punch, but the series did prompt me to think long and hard about the barriers we face as maintainers and leaders of the Commerce project within the Drupal ecosystem.

For the entirety of our existence, Commerce Guys has focused on building and promoting Drupal as an eCommerce platform, first through Ubercart and then Drupal Commerce. While eCommerce is a huge industry, our reach within the community has only averaged around 5% of all Drupal sites. Given the diverse and varied types of users Drupal serves, I consider this relatively low number unsurprising. (A certain percentage will also choose to integrate third party shopping cart systems, but historically that’s always been a fraction of the number of Drupal sites using our native solutions.)

It’s tempting to be fatalistic about Drupal Commerce’s growth and accept that our growth rate will be pegged to Drupal’s own growth rate so long as our relative percentage holds. It actually is an important baseline to acknowledge - our success is tied to Drupal’s success, and so we prioritize contributing to initiatives that help improve Drupal’s core APIs, make it easier to maintain and upgrade, and attract new audiences through API-first / JavaScript initiatives. However, I think we can and should do better than just waiting for growth to happen upon us.

Why should I think we can do better?

After Dries’s posts last year I compared our usage statistics for Commerce 2.x (on Drupal 8) to our usage statistics for Commerce 1.x (on Drupal 7) at the same point in its life-cycle. What I saw convinced me we have plenty of room to grow:

  • In 2013, Drupal Commerce 1.x grew from 23,224 to 33,989 sites.
  • These numbers represent growing from 4.02% to 4.50% of all Drupal 7 sites.
  • Our average growth rate that year was 3.89% month over month; Drupal’s own growth rate was 2.72%.
  • In 2018, Drupal Commerce 2.x grew from 3,097 to 6,980 sites.
  • These numbers represent growing from 1.41% to 2.85% of all Drupal 8 sites.
  • Our average growth rate last year was 8.65% month over month; Drupal’s own growth rate was 1.23%.

Just based on those numbers, even though Commerce 2.x grew over twice as fast last year as Commerce 1.x did in a similar timeframe in its life-cycle, we still represent only half of the relative number of Drupal sites we did back then. We can double our user base on Drupal 8 without challenging our historical average representation at all. That’s good news!

Our growth rate right now is fantastic, especially compared to Drupal's own. There are likely a variety of factors at play here, but I think it boils down to some combination of recognized maturity, excellent word of mouth from a steady stream of case studies, and our contributed module ecosystem stabilizing to a point that Drupal 7 / Commerce 1.x sites are finally porting to Drupal 8 / Commerce 2.x. As our 2.x project lead recently observed, we’re now up to over 250 contributed modules on drupal.org and maintain a community support Slack channel with over 1,000 participants.

Eliminating barriers to growth in 2019

In order for us to keep up and even accelerate our rate of growth, Commerce Guys has been working hard to identify our barriers to growth and develop solutions to them. As a small team playing in a large market (against very well-funded competitors), we can only do so much … but every bit of progress on any of the following fronts will help.

1. Features and integrations

The biggest barrier to growth has historically been our under-developed contributed module and integration ecosystem. Ecosystem development is incredibly important - agencies don’t often have the expertise or confidence to develop new features or integrations themselves. Our major competitors (Magento, Shopify, et al) all have massive ecosystems that third-party software vendors take the initiative to join while our own ecosystem remains dependent on our own team or the core of our development community to expand.

2. Developer support and education

It’s tempting to point to performance and scalability as another barrier to growth, but we see poorly performing Drupal Commerce sites as a symptom of another issue - lack of exposure by the average Drupal developer to best practices for scaling sites with a large amount of authenticated (or otherwise cache-breaking) traffic. We know that we can scale Drupal Commerce to support 10,000+ transactions per hour and thousands of concurrent users, but we also know that otherwise capable Drupal teams struggle at a fraction of that scale. In other words, it’s not a capabilities gap, it’s a knowledge gap, and we’re to blame for not sharing what we've learned with our userbase.

3. Reaching our core audience

Finally, we’re hardly communicating to the market at all about why they should be choosing Drupal Commerce. Our websites are aging, and organizations who do decide upon Drupal are often confused about what sort of support, if any, we might offer them if they choose to adopt our software. We understand how our solution differs from other major players in the market and where it should be seriously evaluated (e.g. cross-border commerce, digital product sales, subscription billing), but we aren’t doing enough to demonstrate our capabilities or provide a vision for why merchants will be better off using Drupal Commerce than a competing application.

We certainly have our work cut out for us in 2019, but we’re encouraged by last year’s growth and the support of our friends and champions within the Drupal community. We believe we can work to eliminate these barriers to growth while building a sustainable business that allows us to grow without compromising our values. In reverse order, the basic roadmap we’re targeting to address those known-blockers above will be:

  1. Relaunch our company and project websites to more clearly communicate who we are, what our software can do, and how we support eCommerce teams to build with confidence on Drupal.
  2. Standardize our consulting efforts and support retainers into concrete, documented offerings that anyone can understand.
  3. Coordinate our development roadmap with more agency and technology partners to ensure essential contributed modules receive the attention they deserve and our integration roster continues to grow.

We'll be encoding our expertise into productized solutions that allow us to grow a team focused on ensuring eCommerce sites built with Drupal are optimized for stability, security, and scalability. We've always valued the impact we have on the Drupal community even as a small team, and we believe addressing these issues will afford us the opportunity to grow, broaden our impact, and grow Drupal itself as a result.

Feb 05 2019
Feb 05

As someone who has been building Drupal sites for over 12 years now, I'd like to think that my knowledge and expertise has grown at a rate similar to the power, flexibility, and complexity of the Drupal project itself. For well over 10 years, Drupal training and development has been the focus of my consulting business; over the holidays I took some time to look back and really think about the lessons I've learned and how I can utilize them moving forward. 

In addition to documenting the process for myself as well as my current and future clients, I also wanted to share what I've learned with the Drupal community. After all, it is this community that has made it possible for me to have the success that I have found so far. I have worked on projects of all sizes from large Fortune 500 companies to small local businesses. I’ve been alone on project as well as with large teams of developers. There have also been projects with massive budgets as well as projects with no budget. The breadth of this experience has really contributed to my ability to provide more value for my clients. 

One word I use often when speaking with current as well as prospective clients is "sustainability". I always want to be involved in a solution that provides good value not only now, but for the lifetime of the project. I want to build sites that are easy to maintain, easy to update, and easy for different developers to cycle in-and-out of. With sustainability, and all of the elements that contribute to it in mind, I present the 11 tips to start a Drupal project right. 

1. Commit to a Local->Dev-Stage->Prod developer workflow

Having a professional developer workflow should go without saying, but I often come on-board small, single-developer projects that have a remote development environment and a live environment - and nothing else. At the very least, projects of all sizes should have not only a dev and live environment, but developers should have local environments as well. 

There's a lot of focus on DevOps in the Drupal ecosystem (with good reason), but before you jump into a continuous integration/continuous development (CI/CD) system, be sure you have the basics first and then add complexity only as necessary. I've seen way too many projects invest in a full-on CI/CD system only to have it ignored because developers didn't have the time and/or expertise to utilize it properly.

2. Commit to the entire team using a project tracker

This is a bit of a pet-peeve of mine. I'm a firm believe that commitment to a project tracker must include 100% of the development team and stakeholders. Note the "and stakeholders" - this includes project managers, content and QA folks, and anyone else who has a role in the project. How often is a project ready to launch and then at the last minute a stakeholder chimes in requesting changes? This is demoralizing and frustrating for the entire development team.

Project tracker tasks should be focused. Large tasks like "theme the site" aren't very helpful and comment threads in tasks like this often become unwieldy, defeating the purpose of using a project tracker. Train the entire team on using the project tracker and committing to using it for the majority of project task communication. 

3. Utilize a remote Git repository

You're not using Git yet? Seriously? Stop reading this and go get yourself and your team trained up (we offer training). Also - commit early and often. Smaller, more focused commits (like project tasks) are easier to manage.

4. Use Composer to manage the code base

This is an article about Drupal 8, so this isn't really optional. While there is work in the community on various Composer-related projects, for now the Composer template for Drupal projects is the de-facto standard for managing your Drupal 8 project's codebase. Don't know how to use Composer? Learn it (we also offer Composer training).

5. Use consistent local development environments for development team

Avoid "it works on my machine" conversations for the rest of your life by ensuring that the entire development team is using identical local environment configurations. Docker-based solutions are tailor-made for this type of thing, but it has been possible for awhile with virtual machine-based solutions as well. A solid local development environment will pay dividends - making it easy to get new developers up-and-running, and allowing developers to focus on building the project, not monkeying around with their local environment.

I've been a fan of DDEV-Local, a Docker-based solution, for awhile - I provide training and I also wrote a book about it! 

6. Define information architecture with all stakeholders

This is where I see projects go sideways more often than not. When defining the information architecture (IA) for the site, all stakeholders must be involved. This tip really goes hand-in-hand with the next one, but the bottom line is that this needs to be a discussion. There's nothing worse than getting near the end of a project and showing it to a content author and finding out that there are gaps. Generally, the goal is to get the granularity right when defining IA. This is next to impossible to do without feedback early in the process from all stakeholders.

Review any existing content that is to be migrated to the new system, ask content authors what the issues with their current system are, and be careful not to over-engineer a solution that won't provide enough bang-for-the-buck. 

7. Prototype information architecture with content authors

This tip goes hand-in-hand with the previous one - an important part of defining the IA is testing and confirming that everything is accounted for. In my experience, the absolute best way to do this is by prototyping the system. Allow your actual content authors, editors, and admins to test-drive the new architecture by adding and editing content on a prototype of the site. This needs to be done very early in the development process, so the focus should be 100% on the add/edit forms - not the output. In fact, I recommend not putting any effort into theming the output at this point, making it crystal clear that the prototyping exercise is to confirm that the set of entities, bundles, and fields designs are on-target.

I really cannot stress enough how important this step is. IA mistakes made early that are not corrected will be a burden until they are corrected (if ever). It's normally relatively easy (and inexpensive) to fix IA mistakes early - quite the opposite if they are left to fester and other parts of the site are built upon them. I have never been part of a project where the IA prototyping didn't result in important updates to the IA. 

8. Create a style guide

If you're building a custom theme, then you probably need a style guide. Part of a solid UX/UI design is consistency in design. Consistency brings user comfort. When users are more comfortable on your site, they'll spend more time there. 

Style guides can be as simple or as complex as they need to be. At the absolute minimum, I would recommend that a style guide contain basic typography and a color palette. You'll need to consider how/if typography will change based on responsive mode (are H1s the same pixel size on mobile as they are on a desktop display?) Similarly, you'll want to think about how the header/navigation/footer respond to various screen widths as well. Have an element that appears throughout your site? Then define rules how it looks in various places and various screen widths. 

9. Create wireframes and mockups as necessary

Similarly, if your project is going to have a custom theme, then you're going to need to design the layout of key pages. How are landing pages arranged? How do they respond at various screen widths? Think about the entire site and design wireframes for a representative sample of pages. Only 2 or 3 wireframes are necessary for many projects (home page, content page, interior landing page). 

Consider these representative pages as a group, not individually. Look for common elements (easier to theme) and value consistency. If every page is a one-off, then implementation costs will rise. 

Start with wireframes and generate only the mockups you need. Often, between a solid style guide and some good wireframes, mockups aren't necessary in many cases. Think of the style guide as a box of LEGO bricks that can be assembled into mockups in various configurations. If time and budget is limited, favor the style guide over mockups.

10. Use the Configuration System

Drupal 8's configuration system provides a powerful tool to easily push non-code configuration changes between environments. The "trick" to using it is that the entire team has to understand and participate in the process. If the development team is five people, and only two are using the configuration system, you're going to have rough sledding. 

The configuration system will help enforce a solid developer workflow, encouraging team members to update and test configuration (like a new View) locally before pushing it to remote development environments. A byproduct of using the configuration system is that config changes can easily tracked by the project tracker via commit messages. 

11. Define realistic and meaningful milestones

There's not much that kills developer morale and confidence in a project more than lack of project leadership. At the core of this is often a lack of project planning and milestones. All team members should be involved in the setting of goals and milestones for the project. A single milestone of "the site must be done in 5 months" doesn't cut it. The entire team should work together to define realistic and meaningful milestones. Take into account non-project responsibilities of team members, identify and plan for potential pain points in the project. 

Project leaders need to listen to team members and provide training and professional guidance when necessary. Most developers are problem solvers who like to learn new things. Project leaders should embrace and leverage this for the betterment of their projects, the result will be a positive one for the entire team!

Mike Anello is the architect and instructor for DrupalEasy’s Drupal Career Online, which includes intensive live online sessions, rich learning resources, an active learning community and hands-on projects designed to provide those who need to get skilled up in Drupal with the best possible start. The next session of the DCO starts February 25th. If you’d like to learn more, you can sign up for a no-cost Taste of Drupal mini-webinar.

Feb 05 2019
Feb 05

Looking back

Three years ago on Christmas day, I tagged the first alpha of the YAML Form module, which became the Webform module for Drupal 8. Looking back, it has been a great learning experience building and maintaining the Webform module. Looking forward, I want to make sure the Webform module is as stable as possible while still trying to smooth out any rough edges around accessibility and user experience. Everyone should feel that the Webform module is a stable, supported, and maintained part of Drupal's ecosystem of contributed modules. To help organizations and individuals understand what to expect from a stable release of the Webform module, it’s worth defining some general goals.

Setting goals

The goals of this blog post and the overall stability of the Webform module are to…

  • Define the ongoing stable release cycle.

  • Document what to expect from stable releases.

  • Encourage the growth of Webform add-ons and integrations.

Tagging releases

For the past three years, I've been tagging a new release at the beginning of each month. Frequently monthly releases were quickly followed up with a hotfix release to address unexpected regressions. Regressions happen because the Webform module is a feature-rich application with maybe not enough test coverage and definitely not enough eyeballs reviewing the code. Quality assurance is a challenge for open source projects; reviewing code for free is not as much fun as writing it. Even Drupal core needs help with improving the reliability of minor updates.

We need more people reviewing and testing each release.

For example, Webform 8.x-5.1 was released at the beginning of January. It has been followed by Webform 8.x-5.2-beta releases which will last until March, at which point we will transition over to release candidates that will go until April 1st when 8.x-5.2 will be released.

The availability of these beta and release candidates appear on the Webform project page and Drupal's available updates. Hopefully, people will test out these releases, especially for projects that are under active development and would benefit from leveraging the latest features and bug fixes without immediate concerns for stability.

What should people expect from the stable release of the Webform module?

Making changes

Now that the Webform module is stable and covered by the security advisory policy, it's important that we tag new releases anytime there are security issues. Security issues will force any pending beta or release candidates forward into next stable release. Until contribute modules support semantic versioning, this is the only way to move everyone forward to a secure release and stable release.

For me, second to ensuring the security of the Webform, is to ensure that the Webform module is accessible and usable for everyone. Accessibility and usability issues will be fixed as needed with change records documenting any major changes.

Anytime you update the Webform module, please read the release notes and change records.

Finally, the Webform module for Drupal 8 is designed to build amazing forms which can route submission data to any system. Any feature that helps improve this vision will be committed.

For example, I just added the Webform Attachment sub-module which provides webform elements that generate or load files that can be attached to a webform submission and an email handler.

It's important that Webform's ecosystem of add-ons and integrations continues to grow.

Expanding integrations

Even though the Webform module is a feature-rich application, advanced integrations with core and other APIs and applications, including Views, REST, Analysis, and Rules, should continue to be developed as dedicated contribute modules. Integrations with third-party applications also need to be built out as add-on modules. One of Drupal's and Webform's strengths is its flexibility and massive community who make it possible for Drupal applications to be integrated with any system.

Thank you to everyone who has contributed Webform add-ons which integrate with external applications including CiviCRM, Commerce, Druminate, Eloqua, HubSpot,, OpenInbound, iContact, MailChimp, MyEmma, Slack, Stripe, SugarCRM, Salesforce, and more…

Migrating to D8

Lastly, it's time for everyone to start migrating to Drupal 8. Heshan Wanigasooriya (heshanlk) built and supports the Webform migrate module which everyone should use to move their Drupal 6 and 7 webforms and submissions to Drupal 8.

Thank you, Heshan for making everyone's road to Drupal 8 a little smoother.​​

Looking forward

Once we are all migrated to Drupal 8, it will be time to upgrade to Drupal 9. Drupal 9 will provide us with a chance to explore what core improvements make it necessary to create a 6.x branch of the Webform module. Supporting headless webforms and the modernized Drupal admin UI using React could require us to rethink and rework some internal APIs and the form presentation layer.

Getting Involved

There are many ways to get involved with Drupal and the Webform module. And getting involved helps us all.

If you work on a new project which requires the Webform module, please use the latest beta or release candidate during development and testing.

If you create a useful Webform add-on or integration, consider contributing it back to the Drupal community by collaborating on an existing project or creating a new project.

If you launch a Drupal 8 project using the Webform module, consider backing our ongoing effort by joining the Webform module's Open Collective.

Almost done…

We just sent you an email. Please click the link in the email to confirm your subscription!

OKSubscriptions powered by Strikingly

Feb 05 2019
Feb 05

ABJS is a contrib Drupal module, and, without any requirements or ties to paid services, is as low cost as you can get. As we’ll see, it’s pretty basic but it really lets you get down to building your own understanding of how A/B testing works. The beauty of ABJS is in its simplicity. The settings pages are fairly self-explanatory, which is really helpful. Let’s set up a basic A/B test to show how things work.

Setting up our first experience

In our test, we’re going to split the site 50:50 in order to test an alternate homepage design. Go to /admin/config/user-interface/abjs and get a feel for things. See the tabs across the top? The best way to set up a new test is to work backwards. That’s because your Tests will need to reference your Conditions and Experiences - and you’ll need to create them before you can use them.

The ABJS admin interface tabs.

First up, create an Experience. Experiences make the actual A’s and B’s of your A/B tests. Go to the Experiences tab. Give your experience a very clear and helpful name. Our first one will be our normal homepage experience. Making a ‘normal’ experience allows us to explicitly log our page views for our analytics.

Our example ABJS normal Experience page

The Javascript we set up for our site looks like this:

if (typeof(ga) !== "undefined") {
  ga('set', 'dimension1', 'normal');
window.Drupal = window.Drupal || { 'settings': {}, 'behaviors': {}, 'locale': {} };
window.Drupal.behaviors.abtesting = {
    attach: function(context, settings) {
        jQuery('#request-a-quote-form').on('submit', function() {
            ga('send', 'event','Productfinder', 'ID search', 'Homepage');

1. We came to the Drupal Behavior format after realising that the ABJS scripts in the header would run before the Google Analytics scripts, and we would need the GA script to run before we could log our analytics. You could probably do this another way if you wanted, but this is easy enough to copy and paste for now.

2. Set our custom GA dimension.

3. This ends up happening before Drupal is actually ready to accept and execute behaviors, hence the very careful creation/copy of the window.Drupal variable.

4. Add a submit handler to our form, which will send an event to GA. This is the thing we’re trying to measure. Hopefully our alternate version of the page will result in more clicks on this button, and we’ll be able to track those in GA.

If you copy & paste the above, you'll want to make your tweaks:

1. Change the first call to ga() in line 2 to be a dimension you’ve set up in Google Analytics (Go do that now! Their support articles are really good, so I won’t explain that here).

2. Set the value for that call to be the value you want (‘normal’ may well be fine).

3. Change the event values in the final call to ga() to send the event values you want or need. They don’t need to be fancy, just unique - you just need to be able to track them in GA. Now, go create an “Alternate homepage experience” experience.

Set up your Alternate Experience

This is the Experience for the change / difference you're wanting to test.

Copy the JS from your ‘Normal’ experience, and tweak it to:

1. Have a different value for your GA dimension

2. Make an actual change to your page. Put this after the jQuery/ga call.

Now go create your condition(s).

All your experience Javascript will be added to every page, so this is where you make sure that you’re only running things where and when you really want to. Again, you write up some Javascript; it will return a Boolean value indicating to ABJS whether you want your test to be run. In our example, we’re just testing the homepage. So we’ll just do this:

return (window.location.pathname == "/");

Don't forget to set a helpful and clear name for your Condition, so it's easy to select later.

ABJS homepage condition page.

Test time!

At last, you can now go set up your Test.

1. Give your test a name. Make it helpful, so that you know which test does what when you have multiple tests later :) Perhaps name it after the change you’re making in your alternate test.

2. Select your two experiences in the two select boxes. Don’t let the fraction field confuse you - this is just the proportion of people you want to be diverted to each of your two experiences. This can be super helpful if you want, for example, to test something on a small proportion of users. For us doing our small, low-cost A/B test on our small client’s site, we want to maximise our data. So we’re doing 50:50 - this means fractions of 0.5 and 0.5 You can have multiple experiences here, which is pretty neat. So if you want to test multiple variations of your homepage, you can! Go for it!

3. Double check your Javascript :) Go execute it in the browser console or something, to make sure it works. No point taking your site down accidentally!

4. Set your test to 'Active'! This will add your tests to the site, so you can start collecting data! Now is the time to go to Google Analytics and watch the data pour in (for some definition of pour, depending on how busy your site is right now!).

ABJS Test edit page

Analysing your data

A key thing to remember when watching your analytics is that things change all the time, and sometimes randomness can be responsible for what you’re seeing. Or maybe there was a seasonal spike in sales which increased revenue that week, or maybe you’re not filtering your users to the right segment… A few recommendations for you:

  • Create segments for your two dimension values, so you can easily filter your data.
  • Data can be misleading. Always check other angles before declaring you’ve fixed the problem.
  • Run your numbers to check the Statistical Significance. If you don’t have tens of thousands of samples, your results may just be random chatter rather than necessarily related to the changes your Experience made. Either remember your A-Level statistics, or go use an online calculator. I recommend https://measuringu.com/statistically-significant/ for a good explainer.
  • If your site is not high traffic, you may need to run your tests for weeks or even months to get enough data to clearly show whether there's a difference. Or, it may be worth deciding that there's not clearly a difference, so it's worth testing something else.
     An example Google Analytics graph

So, we’ve created some tests with ABJS. How did it go?

Overall, ABJS is nice because it feels like you’re in control. And all developers like to feel in control. It’s also nice because if you want to go set up a test, you can! It’s easy!

Where ABJS loses out is in the pile of lovely features that the big products out there can offer. Creating, managing, scheduling and analysing are all tasks that have been made a lot easier by some off-the-shelf products. But if you can’t afford that budget, or really rather enjoy thinking things through (or indeed love a bit of statistics!) then this is your lot - and it works well enough.

Later on in the series we'll be playing with Google Analytics' A/B testing suite and seeing how it compares. Stay tuned!

Feb 05 2019
Feb 05
How do you start contributing to Drupal without code?

<img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=1114119085333160&amp;ev=PageView&amp;nosc...">

<img height="1" width="1" style="display:none;" alt="" src="https://dc.ads.linkedin.com/collect/?pid=247202&amp;fmt=gif">

Outlets for contributing to Drupal beyond code, whilst abundant, are not always evident to those having interest to do so. I want to help people become better acquainted with ways to get involved and how to start their contribution journey. Be they completely new to Drupal or simply yet to find an outlet.

At DrupalCamp London 2019 I will be speaking about non-code contributions and invite you to share your experiences and ideas. Open my eyes to the many ways individuals can create impact with their time, without knowing code at all.

Your participation will ensure attendees discover a multitude of ways to get involved well beyond my experiences alone. In doing so you are embodying the principle of contributing without code.

Therefore I have set up a Google Form to collect suggestions from the community. Please complete it with as many ideas as you have and I look forward to reading your suggestions!


Share your ideas

Feb 05 2019
Feb 05

Just like every month, we’ve prepared a selection of the most interesting and engaging Drupal-related blog posts from the previous month. Check out January’s list and make sure you haven’t missed any!

Drupal Pitch Deck initiative update and call for Case Studies

With the Promote Drupal initiative gaining ground, it was high time to get the larger community involved. Since Drupal Europe in September, the lead proponents of the initiative (Paul Johnson, Suzanne Dergacheva and Ricardo Amaro) have been working on the Pitch Deck of case studies showcasing the various benefits of choosing Drupal for a particular project. 

The goal of the document is to have sales material always at hand to help promote and sell Drupal. And, since Drupal has been a collective effort from its very beginnings, this post hence functions as a call to action to anyone within the Drupal community to contribute to the Pitch Deck by sharing their interesting case studies and helping Drupal win more often.

Take a look

Refreshing the Drupal administration UI

Now this is a post that gained a lot of traction - and not only because it was authored by Dries. There have been talks for quite some time now about the outdated look of Drupal’s admin UI and the need to refresh it, especially from the sales perspective. 

Early last month, Dries finally catered to the community by providing a glimpse into the new look of the UI (aptly called “Claro”, meaning “clear” in Spanish). The new design system is already being implemented and an alpha release is planned for next month. Anyone wanting to get involved, especially designers and front-end developers, is of course more than welcome to do so - more details on how to go about it can be found in the post itself.

Take a look

A Step in a New Direction. Farewell from Amanda Gonser.

This next post is quite a bit more emotional - and rightfully so, since it is essentially a farewell letter from Amanda Gonser after stepping down from her role within the Drupal Association

In this post, Amanda revisits the greatest achievements during her 4 years as a member of the Drupal Association, and thanks everyone who was part of this journey. Now she will finally be able to start getting hands-on with Drupal. Good luck, Amanda!

Take a look

6 Tips to Rock Drupal 8 SEO

Ben Finklea, the CEO of Volacci, has written a helpful blog post on how to make your Drupal site as SEO-friendly as possible. The post was originally published over a year ago, but has been updated with more up-to-date information and best practices. 

Since SEO is a field that is constantly changing, site builders have likewise to remain flexible and adapt to emerging trends. But, luckily, in the words of Ben Finklea, “Drupal is phenomenal for SEO”. Taking into account the 6 tips highlighted in this post, you can start taking advantage of Drupal 8’s innate affinity for SEO today.

Take a look

How to decouple Drupal in 2019

Another great post by Dries, this one explains all you need to know when decoupling Drupal in 2019. The post includes a flowchart mapping the perfect decoupled solution based on the needs of your site or app. Here, a balance between developer and editorial needs is crucial.

Accompanying the flowchart are the explanations of the different architectural options as well as a more accessible version of said flowchart in textual form. With the help of this post, you can now easily and painstakingly determine to which extent you need to decouple your Drupal site and plan the project accordingly.

Take a look

Getting ready for the Drupal Global Contribution Weekend

In light of Drupal’s Global Contribution Weekend which took place in late January, Nathan Dentzau of Chromatic wrote a post aimed at new developers who are eager to start contributing to Drupal. 

Nathan includes links to useful resources for new contributors to get started, as well as a short step-by-step guide on how to set up a local development environment with Lando.

Take a look 

Happy eighteenth birthday, Drupal

Contrary to what one would expect after such a hectic end of the year, January was likewise a very hectic month. Amidst all the interesting developments in the Drupalverse either taking place or on the agenda, we also celebrated Drupal’s birthday on January 15. But not just any birthday - it was, in fact, Drupal’s 18th birthday!

With 18 representing the age of maturity in many cultures, we can now proudly say that our favorite CMS has successfully entered adulthood. In his post, Dries looks back on Drupal’s humble beginnings through an emotional video showcasing some of the most powerful brands that have adopted Drupal for their online presence.

Take a look

The Webform module for Drupal joins Open Collective

The last post from January that we wanted to highlight is Jacob Rockowitz’ post on the sustainability of open source. As the creator and maintainer of the Webform module, Jacob has invested a lot of time and effort into said module. 

In this post, he tackles the problem of making open source sustainable. A very good solution he presents is Open Collective - a global platform for the collection and distribution of funds. The Webform module has already joined Open Collective, and so Jacob explores how to best leverage the funds obtained through the platform.

Take a look

We’re off to a great start of the year. The abundance of activity so early on is a true testament to how the Drupal community is always active, never resting. Be sure to check back next month for an overview of the top Drupal content from February. Till then - enjoy!



Feb 04 2019
Feb 04

Kaleem Clarkson, Operations Manager and Front-End Drupal Developer at Kennesaw State University and Drupal developer at blend me inc. Listen in as they discuss the newly formed Drupal Event Organizers Group and Mike breaks bad news about the Marvel Universe to Kaleem.


DrupalEasy News

Upcoming Events


Follow us on Twitter


Subscribe to our podcast on iTunes, Google Play or Miro. Listen to our podcast on Stitcher.

If you'd like to leave us a voicemail, call 321-396-2340. Please keep in mind that we might play your voicemail during one of our future podcasts. Feel free to call in with suggestions, rants, questions, or corrections. If you'd rather just send us an email, please use our contact page.

Feb 01 2019
Feb 01

By Jesus Manuel OlivasHead of Products | February 01, 2019

By Jesus Manuel OlivasHead of Products | February 01, 2019

This is the latest post of the “Improving Drupal and Gatsby Integration” series. This time I will be talking about the Gatsby Boina Starter; we are contributing to make your Drupal-Gatsby integration easier. The Boina starter ships with the main Gatsby configuration files you might need to get up and running on your Gatsby site.

What does this Gatsby Boina Starter provide among others features:

  • React components to render home, blog and taxonomy pages.
  • Source plugin for pulling data (including images) into Gatsby from Drupal sites.
  • Support for image markdown preprocessing on Drupal body fields.
  • Pre-configured RSS feed available at `/drupalplanet.xml` (make sure you use the `drupal` tag on your blog pages or make the proper changes on your `.env` files.
  • This starter is based on a theme which allows you to keep receiving updates and override look and feel.

Where do I find this project?

Github repository is located at  https://github.com/weknowinc/gatsby-starter-drupal-boina

Project dependencies

Download Project Dependencies

gatsby new boina https://github.com/weknowinc/gatsby-starter-drupal-boina
cd boina

Copy environment file

cp .env.dist .env.development

NOTE: You should use .env.production for the production environment.

Update environment variables

# drupal

The DRUPAL_HOST variable contains the URL for your Drupal backed server. We highly recommend you to use the Drupal Boina Distribution. But in case you want to try right away. Don't worry we prepare a demo server running our Boina Distribution at http://drupal-boina.weknowinc.com/ 

Start Gatsby in development mode

gatsby develop

Open your browser and point to http://localhost:8000/

How Gatsby Boina looks like?

If you want to take a look at an example of the running Gatsby site looks like try this https://boina.weknowinc.com/

Are you excited as we are with GatsbyJS and this new API Driven approach?

We invite you to check back as this series continues, exploring more tools we are building to contribute back to Drupal and Gatsby ecosystems that will allow you to implement a Drupal and Gatsby integration without needing to DIY.

Want to learn how to take advantage of these modules?

We can show you how these modules can improve your Drupal and Gatsby integration.

Feb 01 2019
Feb 01

Just imagine it: Drupal 8's robust features as a CMS, the flexible e-commerce functionality of the Drupal Commerce ecosystem and a JavaScript framework for the front-end! All in the same native mobile app! You can easily achieve this “combo” — a reliable content repository & a JS-based front-end providing a fantastic shopping cart experience — if you just... decouple Drupal Commerce.

For why should you trade Drupal's battle-tested content authoring and administration tools for a more interactive user experience? 

And why should you give up on your goal to deliver richer cart experiences just because Drupal 8 can't rival the JavaScript in terms of advanced native mobile app functionality?

  • push notifications
  • complex shopping options
  • enabling users to manage their own delivery times and places
  • ... to configure various aspects of their orders and so on

Just leverage a decoupled Drupal Commerce strategy in your shopping app project and you can have both:

  • Drupal as your secure content service 
  • the front-end framework of your choice “in charge” with the user experience 

In this respect, these are the most useful Drupal tools at hand for implementing an API-based headless architecture:

1. Headless Commerce Comes Down to...

… separating your commerce stack (back-end content handling area, data store etc.) from the user interface.

Or the “head”, if you wish.

The presentation layer would “retrieve” content from the back-end content storage area and is the one fully “responsible” with delivering fantastic user experience.

This way, you're free to choose your own front-end tools.

Now, why would you consider choosing a decoupled architecture for your e-commerce solution? The benefits are quite obvious and not at all negligible:

  • higher flexibility and scalability (that JS frameworks are “famous” for)
  • freedom to customize your app to your liking (for every platform or/and device)
  • richer, more interactive shopping experiences 

2. Decoupled Drupal Commerce... Out of the Box? The Commerce Demo 

Narrowing our focus down to... Drupal, to Drupal Commerce, more specifically, the question's still there:

“How do I decouple Drupal Commerce?”

Considering that:

  • there are specific challenges that such a decoupled front-end architecture poses
  • Drupal solutions like Forms API and Views won't fit your specific (probably quite complex) design implementation requirements

Luckily, the Commerce Guys team has already faced and solved these challenges.

First of all, they've put together the Commerce Demo project, a store providing default content to be “injected” into Drupal.

Secondly, their attempt at integrating a design meant to support advanced functionality, for richer shopping cart experiences, resulted in 2 new modules:

  • Commerce Cart API
  • Commerce Cart Flyout

More about them, here below...

3. Useful Modules to Decouple Drupal Commerce 

Here's a collection of the most... relevant modules that you could use in your headless Drupal Commerce project:

3.1. The Commerce Cart API Module

It's no less than a handy Drupal tool that enables you to custom build your shopping cart widget. 

3.2. The Cart Flayout Module

The go-to module when you need to ajaxify the “Add to cart” form in your shopping app.

Basically, what it does is:

Provide a sidebar that “flies out” once the user clicks the “Add to cart” button or the cart block.

If I were to dive into details a bit, I'd add that the flyout enables users to:

  • view the products in their shopping carts
  • remove all the items there
  • update the quantity of a specific item

Should I add also that Cart Layout comes with no less than 9 different Twig templates, for various parts of the module? By leveraging Drupal's library management feature you can easily override these JS segments of the module.

And not only that you get to customize it to suit your needs entirely, but:

  • it comes with a well structured JS logic
  • it's built on top of Backbone

… which translates into an efficient models-views separation.

3.3. Commerce 2

Use Drupal Commerce 2 as the core structure of your e-commerce project.

Being an ecosystem of Drupal 8 modules and “spoiling” you with unmatched extensibility via its APIs, Drupal Commerce empowers you to implement all kinds of headless commerce scenarios.

It enables you to use Drupal as your content/data (user and order-related info) repository and to easily serve this content to your mobile app. To your end-users.

3.4. The Commerce Recurring Framework Module

Some of its handy charging & billing features include:

  • configurable billing cycles
  • configurable retries in case of payment declines
  • both prepaid and postpaid billing systems

3.5 The JSON API & JSON API Extras Modules   

Need to decouple Drupal Commerce, to enable a full REST API in JSON format? 

It's as easy as... enabling a module (or 2 at most): the JSON API module.

What it does is:

Expose the API so you can vizualize the data in JSON format.

And Drupal's built and perfectly adapted to support JSON API, which turns it into the go-to option when you need a back-end content repository for your headless shopping app.

In addition to this module, feel free to enable JSON API Extras, as well. It comes particularly handy if you need to customize the generated API. 

It allows you to:

  • override the name of your resources
  • change their path...

You'll then have a specific place in your app's user interface where you can visualize your content paths.

Once you have your data in JSON format, safely stored in your back-end content creation & moderation Drupal area, you're free to... serve it to your mobile shopping app!

The END!

And these are some of the already tested tools and techniques to decouple Drupal Commerce so that you can deliver richer, more interactive cart experiences.

Have you tried other modules/methods? Writing custom JavaScript code... maybe?

Feb 01 2019
Feb 01

The hotels we chose each offer an ideal hub—connecting you to a rewarding DrupalCon community experience. 

Feb 01 2019
Feb 01


As mentioned previously, we have been collaborating across the Drupal community on updating and, expanding Drupal.org/community and that work is ongoing. There are still wrinkles to resolve, such as how to make the menus on that page more obvious, but we are getting there:

A screenshot of the community section on Drupal.org

Next step - community group sections

One of the things I was especially keen to do was to make areas for the groups of people that make our community work available under /community and give them the tools and space to tell the World about:

  1. Who they are
  2. What they do
  3. How they work
  4. What their latest updates are
  5. How you can get involved.

Well, the framework to do this looks good and the first couple of sections are now available. You can see the following community groups already:

  1. Event Organizers’ Group
  2. Core Mentoring Group
  3. Agency marketing Group (the Promote Drupal initiative)

Each section will have a “standard” home page content, detailing the info above, as many content pages as the group can muster and a blog that will go onto Drupal Planet.

a screenshot of the event organizers section

Of course, a group will likely have content across many different parts of the Drupal.org website. I’m especially keen for all members of our community to be able to see what groups there are and how they work in one easy to consume place. Our project values challenge us all to clearly define how our community functions: "We foster a learning environment, prefer collaborative decision-making, encourage others to get involved and to help lead our community."

What about the community group you are a member of?

If you represent a community group and would like to join the growing list of those with sections under /community, please get in contact

I’m looking at globally-relevant groups right now - maybe in the future, we will look at what we can do to support local groups.

Imagine what could be possible when new members of our community come to /community and find right where they belong! I'm excited to see what's next.

Feb 01 2019
Feb 01

The number eight in bible signifies resurrection and regeneration, a digit that implies “New beginnings” 

Just like the resurrection of Drupal which loudly announced its new inceptions as a content management system, and its ability to connect with Saas CRM like Salesforce. 

Salesforce is like the heart for most of the business that has allowed them to handle there sales data at one stop and given highest priority in terms of customer’s growth. And now that it has a tighter integration than ever before, Drupal 8 can do it too 

Image of Drupal logo in the bottom with a speech ink bubble that says salesforce

So instead of wasting any more of your time and beating around the bush, let's explore the paths that lead down its integration and the key considerations that are involved in it. 

Benefits of Integrating Drupal and Salesforce

Managing Territories

When you have a team of salespeople small or big, how would you manage that which territories or which areas each of them is going after? 

Definitely with the help of Salesforce that would monitor and track almost anything that you can imagine of. Instead of managing those old school spreadsheets, a CRM like Salesforce can help you track and monitor all the tasks. It saves your time, resources that arrives while managing small and large scale teams. With the help of this CRM, you have the power to do many things such as:

  • Better management of lead processing and territories.
  • The leads can be assigned to the users according to according to the data that have business sense.
  • Instant email notifications can help in rep up the sales of the customers and prospects immediately.
  • It can help you attain better efficiency. 

Tracking competitors and managing opportunities 

In this competitive world, it is important to track and manage your competitors. You can do this thing with the help of Salesforce CRM. 

It diligently ensures that each and every opportunity is followed up on and not forgotten through the various in-built tools and responses faster to any client that enquires about your services or products which shows ultimately to your customers that you care about their business.


A good CRM system gives you the ability from a business point of view to track exactly what is happening but also accurately forecast the growth or decline of your business. For forecasting, salesforce can also provide you with:

  • Calculate the forecasting including all the information from the sales team.
  • Differentiate between booked and recurring venues 
  • Customize forecast based on the parameters that make sense to the business.

Managing Orders

The Salesforce CRM allows you to truly manage end to end customer relationships. You can see everything from the first time when you engage with a client to when they place an order and beyond. 

The best part about Salesforce CRM in terms of managing order is that it can easily turn an estimate into order and beyond with a single click of a button and customized or automated reports based on what you need to see

Architectural approaches

There are different architectural approaches to have you think about data flow that provides for different requirements and satisfy different needs. Architectures like:

Technology Description Strengths Weakness Real-Time Push Sends data immediately on the entity and creates,  updates and deletes Fast, limited, update lag, avoids UX, can avoid race conditions  Less durable and reliable  Cron Based Sync Identify records requiring sync on the cron Handles large volumes well, can be stopped and start as needed Slow, lags and risk the update conflicts Work Queue Single point of integration receives data and action Reliable, performant and has a shorter time lag Large changes create backlogs, the risk of update conflicts

Real-Time Push

With the real-time integration, the Drupal objects are exported to salesforce immediately. You get the feedbacks indicating whether the item failed to export and the data is available in Salesforce or not. This can be a great option if you need the data to be in the salesforce as close as possible.

Cron Based Sync

Earlier in Drupal 7 the asynchronous push left hiccups concerning error handling (which involved debugging and troubleshooting) optimization, API calls etc.

Now in Drupal 8 salesforce cron based push service has been introduced to construct database queues, normalizing queue items, optimizing queue operations and implementing error handling. 

The Cron based sync has helped Drupal’s core API schedule synchronization from salesforce to Drupal. 

Work Queues

With the queue-based batching system running in the background, it allows many objects to be sent to the salesforce as soon as possible. Instead of the objects being sent to the Salesforce at the same time. In this architecture, instead of the objects that are being sent to the salesforce as soon as it is created, edited, deleted it goes into the queue where it waits to be exported to other items. 

The queues items are then picked up on the configurable schedule and then exports to the Salesforce in batches. Batching the data helps in synchronization and helps to increase the performance by using fewer API calls.

Approaches suitable for integration

There are many ways to move your data from the website to another application. Drupal and Salesforce out of which is the easiest and allows integration in almost all projects. Here are some approaches which are suitable to integrate Drupal and Salesforce.

Simple web forms

Salesforce lets you create simple HTML web form (Web-to-lead or web-to-case)  that generates lead or case records in Salesforce when they are submitted. 

Anyone of the Salesforce administrator can create these forms and then paste them in Drupal for the users to complete it. 

 Image of a file with blue outlines pointing towards a blue salesforce cloud

While not all of the things are addressed in every circumstance, there are specific situations when this method is a good solution: 

  • A basic idea on the user data or inquiry information into Salesforce is needed.
  • There is no or little expertise in web development. 
  • Something quick and easy is needed. 

Third party form service 

There are an ample number of form services like Formstack, click and pledge and Wufoo that have the power to pass the data to Salesforce. In this, you can either embed the form in Drupal or let the user click through the platform.

Image of a desktop with file image in it with two bi-directional arrows pointing towards and backward salesforce cloud

This method is suitable when the following conditions are applied:

  • When there is a need to pass both user and transaction data into Salesforce. 
  • There is no need to move the information in both the directions. 
  • You may want users to log in to submit a form or return to the form and provide more information later. 
  • You want sophisticated solutions that don’t really need to be customized

Salesforce Suite

The Salesforce Suit is the collection of all the Drupal modules that allow synchronization of all the data and the information that is between Drupal and Salesforce in single or both directions. This suit also has the ability to provide a mapping tool that can be used to define the integration which is field-by-field and object-by-object.

 Image of the Drupal logo that is pointing towards and away from the blue salesforce cloud

Salesforce forms

The simplest way to hook Drupal up (or any other website) with Salesforce is by simply linking over to a form that is created by the Salesforce. Any data that the user is entering gets dumped directly to the salesforce and Drupal is not involved in it.

This type of method is good for a lead generation or simple application form. One of the biggest advantage in using salesforce forms is that it is not only cheap and easy to use, but there are zero setups that are done on Drupal side besides providing a link to the form.

Salesforce mapping 

There might be instances where you might have content that constitutes in both Drupal as well as Salesforce and is needed to stay in sync. Salesforce mapping does that task for everyone. 

Salesforce mapping keeps the version of the data at both ends, whatever happens to one happens to the other version too. 

Rules can also be made to add, delete, push or pull data.  

Drupal logo on the left upper side of the page, on the right upper side is the salesforce logo. Below both the images are two rectangles stating user profiles and support tickets


  Cost Direction   Complexity Simple Web Forms Free  One direction inbound to Salesforce DIY Third Party Form Service Low One direction  DIY or Developer Assistance Salesforce Suite Moderate To High  Bi-directional  Developer Assistance Salesforce Mapping High Double-entering the same content in two places Developer Assistance Salesforce Forms Low  Natural  DIY

Integrating with different Directions

  Integrating with One Direction Integrating with two directions Useful when When you have to pass user data, transaction data, and specific node types  When data is entered directly into Salesforce  To keep Integration Simple  Modern  Advantage This approach limits complexity and therefore liability and errors. Fewer duplicate records are created in Salesforce. User Experience No updates required to impact UX  Users need sophisticated interaction such as the ability to view offline data you have entered  Use Cases Donation forms, Event registration Donation forms, Event registration 

Drupal modules are here to ease the integration with Salesforce 

The Drupal Salesforce Suite module is a testament to both the ingenuity and passion of the Drupal community and the flexibility of Drupal as an enterprise platform. As a contributed module, the Salesforce Suite for Drupal enables out of the box connection with Salesforce, no matter what your configuration is. It supports integration by simply synchronizing Drupal entities (eg users, nodes) with the Salesforce objects (organization, contacts)

The Drupal community, as a matter of fact, has been contributing a lot to this part. It has come together to sponsor the development of the suite of Salesforce integration modules that can deal with a variety of business needs. To rewrite the module, the community gathered time and the resources, taking full advantage of the advances that were made in the Drupal and Salesforce platforms. To put it all together it now has been rearranged into a modular architecture exposing core functionality via an API enabling other systems, E.g., Springboard, Jackson River’s fundraising platform 

Most importantly the Drupal suite module has authorized Auth 2.0 to its highest access control 

For the non-technical users, the Drupal entity and Salesforce object mapping system has provided them with the power to configure the data maps between any objects in any 2 systems. Not only this but the synchronization between any Drupal entity and Salesforce object, E.g., Drupal users, donation receipts has been made easy. It has presented its users with a lightweight wrapper around the SOAP API, which has more capabilities for some use cases, using the same OAuth authorization 

Examples of the Use case of Drupal and Salesforce Integration 


A packaged distribution of Drupal for non-profit organizations, Springboard, Jackson River’s innovative solution (for online fundraising and marketing), needed to accept online donations and wanted to use Drupal to power other user touch points such as petitions, email registration and more. Springboard presented a robust integration queue for bi-directional sync of data between Drupal and Salesforce.com CRM.

RedHen CRM 

RedHen CRM has been designed for the needs of membership organizations and associations, the RedHen framework is extensible and flexible and can be leveraged to produce a broad range of CRM solutions. For instance, RedHen could be used as a light-weight sales pipeline management tool for small businesses. RedHen CRM could also be leveraged as an integration point between Drupal and much larger, enterprise CRM solutions such as Salesforce. 

Case studies on Cornell University 

The university offers hundreds of opportunities to the students including the ones that are living aboard. But to take the advantages of the opportunities the student had to navigate a full maze of departments and websites. Thus, to solve this issue Cornell University Experience Initiative (CUEI) came up with a plan to bring out a “Netflix” like experience to the students that provide customizable user guide making it easy for the students and the opportunities. 

An organization known as Pantheon was chosen. They wanted to maintain there content with Drupal but also wanted to manage student application and data with Salesforce CRM. The whole team chose Message Agency as their partner to help conceptualize how Drupal and Salesforce would work. Message Agency is also an architecture of the Salesforce Suite, a set of Drupal modules that allows integration of these two powerful solutions.

Screenshot of the home page of Cornell University’s official website

There are interested students who come to the site to find things and explore. For that task, Drupal does a really good job, but when it comes to actions and customization Salesforce wins in it. This created a whole new paradigm of student’s communication and interaction. 

The technique of centralizing information also provided Cornell with opportunities where each department had their individual page or site with content strategies. But before the website went live the CSEI team tested the user experience with the most trusted stakeholders: Cornell Students

The feedback which they received was overwhelming. They granted with positive reviews telling that how great and well organized the website was. Not only this but Pantheon also evaluated the site’s performance under the traffic load by providing complexity and image-heavy design 

The Future 

The wide raps of what Salesforce and Drupal make possible has given us a vivid idea on how the sales can be increased and raised among the marketing organizations. If you take one view away from all of the above, it should be this: there's definitely an integration that will work for your organization's needs and budget, but it might not be as efficient as integrating Salesforce and Drupal.

If you are able to get a Drupal-Salesforce integration deployed to your operation and organization, there is no doubt on the fact that you will enjoy streamlined and optimized business processes in the short and long term, thus boosting sales and also making the entire process much more comfortable and effective. The flexibility and customizability of Salesforce could prove to be troublesome when it comes to the consistency of your back-end.


Drupal installations are all unique because of the different modules and customizations that they use, so integration has to be set up in a different manner by an expert.

If you already have a Salesforce instance set up, we'll be happy to explore the appropriate integration options. If you're new to Salesforce, we can work with your Salesforce developers to make sure your data is structured in a way that minimizes the integration effort and costs. 

Ping us at  [email protected] now for the required services related to the whole topic.

Feb 01 2019
Feb 01
Since the beginning, our goal has been to balance technical expertise with creative flair when building and designing websites, applications, and digital platforms to deliver real solutions for clients. We continue to stand as leaders in our…
Feb 01 2019
Feb 01

In this article we will see how to update data models in Drupal 8, how to make the difference between model updating and content updating, how to create default content, and finally, the procedure to adopt for successful deployments to avoid surprises in a continuous integration/delivery Drupal cycle.

Before we start, I would encourage you to read the documentation of the hook hook_update_N() and to take into account all the possible impacts before writing an update.

Updating the database (executing hook updates and/or importing the configuration) is a very problematic task during a Drupal 8 deployment process, because the updating actions order of structure and data is not well defined in Drupal, and can pose several problems if not completely controlled.

It is important to differentiate between a contributed module to be published on drupal.org aimed at a wide audience, and a custom Drupal project (a set of Drupal contrib/custom modules) designed to provide a bespoke solution in response to a client’s needs. In a contributed module it is rare to have a real need to create instances of configuration/content entities, on the other hand deploying a custom Drupal project makes updating data models more complicated. In the following sections we will list all possible types of updates in Drupal 8.

The Field module allows us to add fields to bundles, we must make difference between the data structure that will be stored in the field (the static schema() method) and all the settings of the field and its storage that will be stored as a configuration. All the dependencies related to the configuration of the field are stored in the field_config configuration entity and all the dependencies related to the storage of the field are stored in the field_storage_config configuration entity. Base fields are stored by default in the entity’s base table.  

Configurable fields are the fields that can be added via the UI and attached to a bundle, which can be exported and deployed. Base fields are not managed by the field_storage_config configuration entities and field_config.

To update the entity definition or its components definitions (field defintions for example if the entity is fieldable) we can implement hook_update_N(). In this hook don’t use the APIs that require a full Drupal bootstrap (e.g. database with CRUD actions, services, …), to do this type of update safely we can use the methods proposed by the contract EntityDefinitionUpdateManagerInterface (e.g. updating the entity keys, updating a basic field definition common to all bundles, …)

To be able to update existing data entities or data fields in the case of a fieldable entity following a modification of a definition we can implement hook_post_update_NAME(). In this hook you can use all the APIs you need to update your entities.

To update the schema of a simple, complex configuration (a configuration entity) or a schema defined in a hook_schema() hook, we can implement hook_update_N().

In a custom Drupal project we are often led to create custom content types or bundles of custom entities (something we do not normally do in a contributed module, and we rarely do it in an installation profile), a site building action allows us to create this type of elements which will be exported afterwards in yml files and then deployed in production using Drupal configuration manager.

A bundle definition is a configuration entity that defines the global schema, we can implement hook_update_N() to update the model in this case as I mentioned earlier. Bundles are instances that persist as a Drupal configuration and follow the same schema. To update the bundles, updated configurations must be exported using the configuration manager to be able to import them into production later. Several problems can arise:

  • If we add a field to a bundle, and want to create content during the deployment for this field, using the current workflow (drush updatedb -> drush config-import) this action is not trivial, and the hook hook_post_update_NAME() can’t be used since it’s executed before the configuration import.
  • The same problem can arise if we want to update fields of bundles that have existing data, the hook hook_post_update_NAME() which is designed to update the existing contents or entities will run before the configuration is imported. What is the solution for this problem? (We will look at a solution for this problem later in this article.)

Now the question is: How to import default content in a custom Drupal project?

Importing default content for a site is an action which is not well documented in Drupal, in a profile installation often this import is done in the hook_install() hook because always the data content have not a complex structure with levels of nested references, in some cases we can use the default content module. Overall in a module we can’t create content in a hook_install() hook, simply because when installing a module the integrity of the configuration is still not imported.

In a recent project i used the drush php-script command to execute import scripts after the (drush updatedb -> drush config-import) but this command is not always available during deployment process. The first idea that comes to mind is to subscribe to the event that is triggered after the import of the configurations to be able to create the contents that will be available for the site editors, but the use of an event is not a nice developer experience hence the introduction of a new hook hook_post_config_import_NAME() that will run once after the database updates and configuration import. Another hook hook_pre_config_import_NAME() has also been introduced to fix performance issues.

A workflow that works for me

To achieve a successful Drupal deployment in continuous integration/delivery cycles using Drush, the most generic workflow that I’ve found at the moment while waiting for a deployment API in core is as follows :

  1. drush updatedb
    • hook_update_N() : To update the definition of an entity and its components
    • hook_post_update_N() : To update entities when you made an entity definition modification (entity keys, base fields, …)
  2. hook_pre_config_import_NAME() : CRUD operations (e.g. creating terms that will be taken as default values when importing configuration in the next step)
  3. drush config-import : Importing the configuration (e.g. new bundle field, creation of a new bundle, image styles, image crops, …)
  4. hook_post_config_import_NAME(): CRUD operations (e.g. creating contents, updating existing contents, …)

This approach works well for us, and I hope it will be useful for you. If you’ve got any suggestions for improvements, please let me know via the comments.

Jan 31 2019
Jan 31

We do a lot of Drupal 8 migrations here at Aten. From older versions of Drupal and Wordpress, to custom SQL Server databases, to XML and JSON export files: it feels like we’ve imported content from just about every data source imaginable. Fortunately for us, the migration system in Drupal 8 is extremely powerful. It’s also complicated. Here’s a quick-start guide for getting started with your next migration to Drupal 8.

First, a caveat: we rarely perform simple one-to-one upgrades of existing websites. If that’s all you need, skip this article and check out this handbook on Drupal.org instead: Upgrading from Drupal 6 or 7 to Drupal 8.

It’s Worth the Steep Learning Curve

Depending on what you’re trying to do, using the migrate system might seem more difficult than necessary. You might be considering feeds, or writing something custom. My advice is virtually always the same: learn the migrate system and use it anyway. Whether you’re importing hundreds of thousands of nodes and dozens of content types or just pulling in a collection of blog posts, migrate provides powerful features that will save you a bunch of time in the long run. Often in the short run, for that matter.

Use the Drupal.org Migrate API Handbooks

There’s a ton of great information on Drupal.org in the Migrate API Handbooks. Be prepared to reference them often – especially the source, process, and destination plugin handbooks.

Basic Steps

Here’s a much simplified overview of the high-level steps you’ll use to set up your custom Drupal 8 migration:

All Migrations

  • Enable the migrate module (duh).
  • Install Migrate Tools to enable Drush migration commands.
  • Install Migrate Plus as well. It provides a bunch of extensions, examples and plugins for migrations. I’d just assume you need it.
  • Create a custom module for your migration.
  • Use YAML configuration files to map fields from the appropriate source, specifying process plugins for necessary transformations, to the destination. The configuration files should exist in “my_migration_module/config/install/“.
    (Pro tip: you’ll probably do a lot of uninstalling and reinstalling your module to update the configuration as you build out your migrations. Use “enforced dependencies” so your YAML configurations are automatically removed from the system when your module is uninstalling, allowing them to be recreated – without conflicts – when you re-enable the module.)

Enforced dependencies in your YAML file will looks something like this:

      - my_migration_module

See this issue on Drupal.org for more details on enforced dependencies, or refer to the Configuration Management Handbooks.

Drupal-to-Drupal Migrations

  • If you’re running a Drupal-to-Drupal migration, run the “migrate-upgrade” Drush command with the “--configure-only” flag to generate stub YAML configurations. Refer to this handbook for details: Upgrade Using Drush.
  • Copy the generated YAML files for each desired migration into your custom module’s config/install directory, renaming them appropriately and editing as necessary. As stated above, add enforced dependencies to your YAML files to make sure they are removed if your module is uninstalled.

Process Plugins

Process plugins are responsible for transforming source data into the appropriate format for destination fields. From correctly parsing images from text blobs, to importing content behind HTTP authentication, to merging sources into a single value, to all kinds of other transformations: process plugins are incredibly powerful. Further, you can chain process plugins together, making endless possibilities for manipulating data during migration. Process plugins are one of the most important elements of Drupal 8 migrations.

Here are a few process plugin resources:

Continuously Migrate Directly from a Pantheon-Hosted Database

Most of our projects are hosted on Pantheon. Storing credentials for the source production database (for example, a D7 website) in our destination website (D8) code base – in settings.php or any other file – is not secure. Don’t do that. Usually, the preferred alternative is to manually download a copy of the production database and then migrate from that. There are plenty of times, though, where we want to perform continuous, automated migrations from a production source database. Often, complex migrations require weeks or months to complete. Running daily, incremental migrations is really valuable. For those cases, use the Terminus secrets plugin to safely store source database credentials. Here’s a great how-to from Pantheon: Running Drupal 8 Data Migrations on Pantheon Through Drush.

A Few More Things I Wish I’d Known

Here are a few more things I wish I had known about back when I first started helping clients migrate to Drupal 8:

Text with inline images can be migrated without manually copying image directories.

It’s very common to migrate from sources that have inline images. I found a really handy process plugin that helped with this. In my case, I needed to first do a string replace to make image paths absolute. Once that was done, I ran it through the inline_images plugin. This plugin will copy the images over during the migration.

     plugin: str_replace
     source: article_text
     search: /assets/images/
     replace: 'https://www.example.com/assets/images/'
     plugin: inline_images
     base: 'public://inline-images'

Process plugins can be chained.

Process plugins can be chained together to accomplish some pretty crazy stuff. Sometimes I felt like I was programming in YAML. This example shows how to create taxonomy terms on the fly. Static_map allows you to map old values to new. In this case, if it doesn’t match, it gets a null value and is skipped. Finally, the entity_generate plugin creates the new taxonomy term.

     plugin: static_map
     source: webinar_track
       old_tag_1: 'New Tag One'
       old_tag_2: 'New Tag One'
     default_value: null
     plugin: skip_on_empty
     method: process
     plugin: entity_generate
     bundle_key: vid
     bundle: webinar_track

Dates can be migrated without losing your mind.

Dates can be challenging. Drupal core has the format_date plugin that allows specifying the format you are migrating from and to. You can even optionally specify the to and from time zones. In this example, we were migrating to a date range field. Date range is a single field with two values representing the start and end time. As you can see below, we target the individual values by specifying the individual value targets as ‘/’ delimited paths.

   plugin: format_date
   from_timezone: America/Los_Angeles
   from_format: 'Y-m-d H:i:s'
   to_format: 'Y-m-d\TH:i:s'
   source: start_date
   plugin: format_date
   from_timezone: America/Los_Angeles
   from_format: 'Y-m-d H:i:s'
   to_format: 'Y-m-d\TH:i:s'
   source: end_date

Files behind http auth can be copied too.

One migration required copying PDF files as the migration ran. The download plugin allows passing in Guzzle options for handling things like basic auth. This allowed the files to be copied from an http authenticated directory without the need to have the files on the local file system first.

   plugin: download
     - '@_remote_filename'
    - '@_destination_filename'
   file_exists: replace
       - username
       - password

Constants & temporary fields can keep things organized.

Constants are essentially variables you can use elsewhere in your YAML file. In this example, base_path and file_destination needed to be defined. Temporary fields were also used to create the exact paths needed to get the correct remote filename and destination filename. My examples use an underscore to prefix the temporary field, but that isn’t required.

 plugin: your_plugin
   base_path: 'https://www.somedomain.com/members/pdf/'
   file_destination: 'private://newsletters/'
   plugin: concat
     - constants/base_path
     - filename
   plugin: concat
     - constants/file_destination
     - filename
   plugin: download
     - '@_remote_filename'
     - '@_destination_filename'
   file_exists: replace
       - username
       - password

This list of tips and tricks on Drupal Migrate just scratches the surface of what’s capable. Drupalize.me has some good free and paid content on the subject. Also, check out the Migrate API overview on drupal.org.

Further Reading

Like I said earlier, we spend a lot of time on migrations. Here are a few more articles from the Aten blog about various aspects of running Drupal 8 migrations. Happy reading!

Jan 31 2019
Jan 31

It is easy to see Twig code samples and just accept that label is some magic property of an entity now and use it in your template.

<h3>{{ node.label }}</h3>

Then you come across an example that calls referencedEntities, and it quickly becomes apparent some magic is going on.

{% for entity in node.example_reference_field.referencedEntities %}
  <li>{{ entity.label }}</li>
{% endfor %}

The secret is that in Drupal 8, methods are now exposed in Twig templates.

However, not all methods are exposed (including referencedEntities in the example above). The TwigSandboxPolicy class defines the whitelisted method names and prefixes that are allowed. It also allows for these settings to be overridden via settings.php if needed.

$settings['twig_sandbox_whitelisted_methods'] = [
$settings[twig_sandbox_whitelisted_prefixes] = [

Note that additional items cannot be appended to the array due to the logic in TwigSandboxPolicy. The existing defaults must be included in the custom override.

See Discovering and Inspecting Variables in Twig Templates for additional information and background.

Example Use Case

Let’s use an example to further explore how this could be used. Suppose we have a user entity available in our template and want to retrieve some additional data.

The first step is overriding the core user class so we can add custom methods.

 * Implements hook_entity_type_build().
function example_entity_type_build(array &$entity_types) {
  // Override the core user entity class.
  if (isset($entity_types['user'])) {

Next we can add custom methods that allow retrieval of data following some business rules.

namespace Drupal\example\Entity;

use Drupal\user\Entity\User;

 * Extends the core user class.
Class ExampleUser extends User {

   * Load custom data associated with the user.
  public function getExampleData() {
    // Return the entity returned by some business logic.
    return $entity;

With the user class override in place, we can pass a user to our template.

return [
  ‘#theme’ => ‘example_template’,
  ‘#user’ => \Drupal::currentUser(),

Then in our template, that has a user entity passed in with the variable name user, we can access our custom method.

{% set entity = user.exampleData %}
<h4>{{ entity.label }}</h4>
<p>{{ entity.example_field.value }}</p>

Note that we defined our method as getExampleData, but we called exampleData’. This is due to thegetprefix being whitelisted byTwigSandboxPolicy. Had we named our methodloadExampleDatait would not have worked. However, addingloadExampleData` to the whitelisted method names would fix it.

Sticking to methods that strictly retrieve data is best, and it honors the intentions set forth in TwigSandboxPolicy.

$whitelisted_methods = Settings::get('twig_sandbox_whitelisted_methods', [
  // Only allow idempotent methods.

The ability to call and expose methods on entities, fields, etc allows for simple theme hook definitions, while still allowing the template easy access to nearly any data it needs without bloated preprocess hooks. The real power begins when you chain these methods and entity references fields together to drill into your data model all from your template.

It should be noted that this can begin to blur the lines in the MVC pattern. The view layer can quickly begin taking over logic previously owned by the controller. It’s up to you how far to take it, but either way, it is another powerful tool that Drupal 8 and Twig offer to make development easier.

Jan 31 2019
Jan 31

In one of the episodes of Star Trek - “The Trouble With Tribbles” there is a graphical example of how small changes leads to monumental consequences over a short period of time.  

The episode depicted the effect of new “species” on the established society, somewhat similar to the rise of the open source software and its tools in today’s technology. 

Yet many of us aren’t cognizant of the reach and the influence that open source has on our personal and professional endurance.

Image of 6-star trek characters drawn upon a big bundle of new species

Thus to solve this awareness issue, OpenEuropa initiative was introduced. This Directorate- General for information initiative aims at strengthing and adopting open source tools and its practices in consolidating the European institutes' web presence. 

What the initiative focuses on?

In order to achieve such goals, the OpenEuproa Initiative focuses on the following activities. 

  • Software components licensed under EUPL-1.2

The initiative focuses on building, maintaining and releasing loosely coupled, reusable software components that are licensed under EUPL-1.2 

The European Union Public License is a free software that has been created and approved by the European Commission. The goal of this license was to create open source license in 23 different languages for the European Union and also that it conforms the copyrights law of member states of the European Union.

Image of a circle which consists of an inner blue circle. Inside the blue circle there is EUPL text drawn around golden stars
  • Open Source Strategies 

The initiative also focused on building, maintaining and releasing full-fledged solutions and open source strategies for the European institutes. The special objectives of these strategies are:

Equal treatment in the procedure 

Under this, the open source solutions and a proprietary solution will be assessed on an equal basis, both being evaluated on the basis of total cost of ownership, including the prevailing cost. 

Contribution to communities 

The commission service would actively participate in open source software communities to build a strong open source building block which is used in the commission software.

Clarifying legal aspects

For easy collaborations with open source communities, commission developers benefit from the right legal coaching and the advice on how to deal with intellectual property issues related to open source software

Good Communication

The strategy emphasis strongly on improved governance, increasing use of open source in the domain of ITC security and the alignment of this strategy. 

A circle that says open source strategy which is overlapped by four circles in all the four direction


  • Web Services Architecture Overview 

The initiative provides a high-level architecture overview of web related information systems. 

Web information system or web-based information system is an information system that uses internet web technologies to deliver information and services, to users or other information systems. 

A software system whose main purpose is to publish and maintain data by using hypertext-based principles. 
A blue circle that says retrieving Processing Interpreting with three Unicode arrows around it. Image of data, information, and humans are made in between it


  • Open Source Projects 

The initiative contributed back to the upstream open source projects. Each project complies with PHP-FIG standards and adheres to best practices put forward by PHP the “right” way.

PHP and Drupal Projects released under the EUPL-1.2 license.are:

Screenshot of the PHP projects that are under EUL license


Screenshot of the Drupal projects that are under EUL license

OpenEuropa Coding Standards

OpenEuropa and its components are built with a public contribution in mind. In order for all components and contributions to look and feel familiar, OpenEuropa has agreed to follow some coding standards 

Although OpenEuropa does not follow any coding standards guidelines as such, it does follow known standards such as PSR-1 and PSR-2.

The code review components have been created in order to make it easier for the contributors to create new components or to modify the existing ones. The coding standards have to be reviewed and validated under OpenEuropa code review across different OpenEuropa components. 

Development Environment

The projects that are developed under the Open Europa initiative does not follow any development environment, there are software packages that follow it. The software packages like:

Tools Required Purpose PHP YES  Needed by Drush, Compose,  and Tash Runner  Composer YES A package manager for PHP  GIT YES Version control system Drush YES CLI (command line interface) integration with Drupal  ROBO YES Required by Open Europa task runner  Node.js YES Required to develop OpenEuropa theme

PHP:  We have heard about this word once in our lifetimes. Here the use of PHP is required by various tools which include the composer, Drush, Robo and Drupal itself.

Composer:  Composer is used for managing dependencies of the PHP project. All the projects are required to use it and the plus point about this is that it has its natural integration with Drupal.org.

Git: Git is the distributed control version that is used as a foundation of OpenEuropa ecosystem. 

Drush: This is the command line shell and UNIX interface scripting for Drupal and is used to interact with the Drupal website through line command.

ROBO: This is a simple PHP task runner which is inspired by Gulp and Rake that aims to automate common tasks.

Node.js: It is required for the development of OpenEuropa themes. All the development dependencies are defined under package.json. 

Automated Testing for functionalities

OpenEuropa requires automated tests to be written for every new feature or bugfix to ensure that the functionality will keep working as expected in the future. There are two types of test 

User Stories

OpenEuropa practices Behaviour Driven Development to facilitate effective communication between business and development teams. User stories should be accompanied by test scenarios that have been written in non-technical language. After the user stories are accepted it can then be used to perform automated tests to ensure the business requirement work. 

Unit Test 

If there are any pull requests that do not result in from user stories can be covered by unit tests rather than BDD user stories. The user should use the appropriate unit testing framework that is available for the programming languages in which the components are developed. 

Can Drupal components be tested as well?

In addition to the testing framework that comes with the Drupal core, OpenEuropa also uses Behat to describe business requirements. 

Behat is a test framework for behavior-driven development written in the PHP programming language. 

When a PR is compelled to change the user behavior it is demanded to describe the expected end user behavior in the Behat scenario. 

  • Each of the user stories is accompanied by Behat scenario. The scenario provides to the project stakeholder for the acceptance testing. 
  • The target audience of these scenarios is stakeholders. 
  • Every Behat test scenario is written in domain-specific building language and should only be used to describe expected user behavior as it is specified by the stakeholders.
  • Any code is written that does not directly affect the expected end-user behavior should be covered by unit tests instead.

Drupal 8 has introduced the concept of experimental modules, that are not under privacy policies or fully supported but used for testing purposes. They offer a wide range of functionalities, starting from migration till the site building. 

Due to the experimental nature of these modules, OpenEuropa defined a set of policies under its components.

Minimum Stability Required

These modules follow different levels of stability by Drupal: alpha, beta, RC and stable.
In order for OpenEuropa to provide stability, the only experimental module in its beta and greater stage are allowed. 

This is done because the modules that are in beta and later stage are very stable in API. Whenever API is changed, great care is taken to provide a compatibility layer. 

Experimental modules in the alpha state

Although the rules state that the alpha modules are not allowed in the vanity, there is still a great potential value to the customers. 

If for a technical reason or business reason the alpha module does justification to the project, alpha modules are allowed to the experiment. However, in such cases, the components will use the same labels as in the experimental modules they are using. That means if you are using the alpha module you are required to use its label as well until the related module is changed. 

OpenEuropa Release Cycle

OpenEuropa releases its components following semantic versioning. There would be three types of releases planned:


Incompatible API changes, very rare and planned in


Adds backward compatible manner functionalities and bug fixes

Adds backward compatibility bug/security fixes and can be deployed instantaneously. No new functionalities would be introduced. 

Release Preparation and testing in Drupal

OpenEuropa Drupal components are released with the follow of Drupal 8 components and will be always tested against. 

  • Current stability in Drupal 8 core minor release. (n)
  • Previous release Drupal 8 core minor release. (n-1)
  • Development range in Drupal 8 core minor.

This allows to follow same support cycle as Drupal core and be better prepared for next minor releases as they occur.

Release Support 

For Drupal components, OpenEuropa team will have a support policy inspired by Drupal core:
Components support current and previous Drupal Core minor versions. New minor versions for components are made compatible with these respective core versions.
When a new minor core version (n) is supported, the support for release n-2 is dropped.


Open Source and its components have become really essential for building trust and safety around the software and web. It has been contributing to the projects, service-oriented architecture and technical governance that derive the design and development of the components.

The initiative has emerged as a lightning bolt in this dark world of “unawareness” It has not only aimed the strengths and powers of open source tools and practices but established a stronghold on the web presence. 

Contact us on [email protected] for any queries and questions to the related topic. The professionals would guide you with the same and provide you with adequate services.  

Jan 31 2019
Jan 31
In this third installment of our series on conversational usability, we look at conversational design, an already well-explored area that is still burgeoning with emerging best practices.
Jan 31 2019
Jan 31
  • Shriganesh Hegde
  • 31-01-2019

“The real question is, when will we draft an artificial intelligence bill of rights? What will that consist of? And who will get to decide that?” —Gray Scott, American Philosopher

Keeping in mind the spectacular potential that Artificial Intelligence has, and given the way we interact with technology, we might have to consider this "bill of rights' anytime soon now! Over the years, AI has been instrumental in personalizing user experience and this is one of the prime reasons why brands are investing in Big Data as a key element of their customer offerings.

However, organizations have failed to utilize the enormous potential of Artificial Intelligence by not embracing the technology completely in the field of website development. In the fast growing digital age, web presence plays an important role for businesses to stay ahead of the curve. Artificial Intelligence with its amazing capabilities will give the companies the boost that they need to craft a seamless digital experience for their customers.

Drupal & Artificial Intelligence

In the recent years, modern mainstream website development has mainly focused on building a customer-facing front-end presence on the Internet and the integration of the front-end with enterprise back-office operations. And Drupal is a leading open-source platform for creating such enterprise websites.

As a reliable enterprise-grade CMS, Drupal is well known for its ability to organize and present content in the most effective way to create a seamless omnichannel digital experience. On integrating Artificial Intelligence algorithms to your Drupal-based website, you can turn it into an interactive ecosystem capable of handling your potential customers, interacting with them, studying their behavior and identifying patterns in them to aid targeted marketing and subsequent revenue growth.

However, the question is, what is the 3rd-party AI solutions and libraries that Drupal developers have in their toolkit? Which of these provide the most value? We have picked some of the top modules that can assist your team in creating a AI driven digital experience.

Cloudworks for Multilingual Drupal Module

Cloudworks for Multilingual Drupal empowers you to deliver successful global campaigns and localized assets with speed and scale. With the ability to onboard any language provider in a matter of few minutes, Cloudworks can help you deliver globally consistent, high quality content to multiple countries in various languages. The smart AI allows workflow automation and powerful project manahrgement capabilities to pick the content you want to localize while Cloudworks does the rest.

It also has a CAT tool that has a smart internal translator which increases the productivity by leveraging artificial intelligence and machine learning.

Azure Cognitive Services API

With an ability to seamlessly integrate with intelligent features and use machine learning, artificial intelligence and natural learning process to detect speech, facial expressions and vision recognition, and other sentiments, this module can do wonders. The four different module that it offers are:

1. Face API Module

Integrates with Microsoft Face API, a cloud based service that provides some of the most advanced face algorithms. With two main function of face detection with attributes and face recognition, it can

  • Detect human faces and compare similar ones
  • Organize images into groups based on similarities
  • Identify people in previously tagged images

With an ability to seamlessly integrate with intelligent features and use machine learning, artificial intelligence and natural learning process to detect speech, facial expressions and vision recognition, and other sentiments, this module can do wonders. The four different module that it offers are:

2. Emotion Recognition API Module

Although in beta stage, this module is capable of taking image as an input and return the confidence across a set of emotions for each face in the image, as well as bounding box for the face, from the Face API.

3. Computer Vision API Module

This module is capable of extracting rich information from images to categorize and process visual data and machine assisted moderation of images to help curate your business services.

4. Azure Text Analytics API Module

  • Sentiment analysis
  • Key phrase extraction
  • Language detection

Acquia Lift Connector

A module that can help you merge content and customer data into a single tool, thus allowing marketers to target audiences in real time, enabling them to scale their web personalization efforts to drive better conversions. The Acquia Lift Connector module provides the integration with Acquial Lift Service and an enhanced user experience for better personalization, testing and direct targeting. This will help you in delivering cohesive, personalized experiences across multiple channels and cross devices.

Some of the features of Acquia Lift Connector include:

  • Drag-and-drop UI for content targeting Unified customer profile Content distribution Behavioral targeting and A/B testing
  • Unified customer profile
  • Content distribution
  • Behavioral targeting and A/B testing

Integrating AI into your Drupal Website - Why is it good for your Company?

Let your website be HUMAN!

The current level of AI, by no means allows developers to teach your Drupal website to think or behave like humans. However, this smart technology is catching up soon and is getting better at automating content management and customer service tasks. This in turn allows you to free up your editorial and customer support teams.

Better user experience

One thing that stands out in an AI incorporated Drupal-based business website is its ultimate user experience. With effortless content management and publishing, round-the-clock approach to customer support, better targeting and connecting with the customer touchpoint, Artificial intelligence empowers your company to craft personalized experiences for your customers.

Better targeting

It is a known fact that 80% of the digital data generated by businesses around the world is unstructured, confusing and thus underutilized. However, with AI and Machine Learning anchoring the tools that help your company analyze these data, mapping the digital customer journey is a cakewalk. With better understanding of the customer behavior based on historical data, you can come up with relevant products or service recommendations targeted to each individual customer and his needs.

Higher ecommerce conversion rates

Implementing AI in ecommerce will potentially grow the global ecommerce market profitability by 59% in a span of 15 years. Features such as advanced lead generation, predictive analytics, targeted customer service, and upselling opportunities will help you to create a AI driven ecommerce ecosystem with better conversions and revenue.

The Future?

The future of websites looks interesting and is predicted to be automatically tailored to individual user behavior by analyzing their searches, reads, time spent on each page etc. Every user will be assigned a unique ID (uid) and their behavior like the clicks, searches and exits on the website will be linked to this particular uid. Just like how the analytics tools do. Using AI and Machine learning, each uid and the data connected will be analyzed to tailor the website according to each individual user. While such personalizations have already been implemented by certain big websites, integrating it with Drupal will take it up by a notch.

Artificial Intelligence and Machine Learning have a lot to offer and on integration with Drupal CMS will open up new possibilities of feature rich modules with futuristic features. A digital ecosystem with features such as "voice controlling", "website personalization based on user behavior" and more can be seen as the dawn of customer interaction 2.0. Leveraging the power of AI and Drupal CMS will allow businesses to gain a competitive advantage and achieve sustainable futuristic growth.

Jan 31 2019
Jan 31

By Jesus Manuel OlivasHead of Products | January 31, 2019

By Jesus Manuel OlivasHead of Products | January 31, 2019

Drupal 8 has plenty of contributed modules to help you building a headless/decoupled web application. However, getting all those set up correctly could be a daunting task. 

Understanding this is an issue that should be addressed and as mentioned previously in our blog posts of this “Improving Drupal and Gatsby Integration” series we wrote and contributed two modules Toast UI Editor and Build Hooks. But there are some other needed modules: JSON-API, JSON-API Extras, Site Settings to mention a few and also a minimum configuration you should take care of to have a pleasant experience with your Drupal-Gatsby integration. 

In order to save you from DIY and make this ramp-up easy for Drupal and non-Drupal people. At weKnow, we decided to contribute the Drupal Boina Distribution. Boina comes with everything you need (code, configuration, and even default content), all that will be added to your site during the installation process so you can start working with the Boina Gatsby Starter immediately.

Which modules are included on the Boina distribution?

To see the full list of dependencies for Boina distribution you can take a look at the project composer.json file.

Where do I find this project?

Github repository is located at https://github.com/weknowinc/drupal-boina

Project dependencies

Project setup

# Clone repository
git clone [email protected]:weknowinc/drupal-boina.git

# Change directory
cd drupal-boina

# Copy .env file
cp .env.dist .env

# Add hostname entry in your /etc/hosts file    drupal-boina.develop

# Start containers
ahoy up

# Install Composer dependencies
ahoy composer install

# Install Boina distribution
ahoy drupal boina:install

If you want to take a look a the running Drupal site


You can access the API endpoints from this link


Feel free to give a try end let us know your thoughts leaving a comment 

Are you excited as we are with GatsbyJS and this new API Driven approach?

We invite you to check back as this series continues, exploring more tools we are building to contribute back to Drupal and Gatsby ecosystems that will allow you to implement a Drupal and Gatsby integration without needing to DIY.

Want to learn how to take advantage of these modules?

We can show you how these modules can improve your Drupal and Gatsby integration.

Jan 31 2019
Jan 31

The Drupal 8 "Flickr" module allows you to insert Flickr images or photosets (albums) on your site, without the need of keeping the images on your server. This has a couple of advantages (we won’t discuss the disadvantages in this tutorial):

  • Less use of resources on your own server
  • Improvements on the performance of the site
  • You avoid copyright issues in your site, Flickr takes care of that
  • Make use of thousands of Flickr images available under CC License.

The user (editor) types a shortcode in the text editor of the node and the Flickr module connects to the Flickr API, which retrieves the images from Flickr and sends them to your site.

This tutorial will explain how to install the Drupal 8 Flickr module and to configure Flickr API, to retrieve the images of one of your Flickr albums.

Step #1 - Install the module

If your site installation is not based on composer:

  • download the module from its project page
  • place it in the modules folder of your Drupal installation
  • enable it in your Drupal backend

If your site installation is based on composer, type:

composer require drupal/flickr

How to Display Flickr Images on Your Drupal 8 Site

  • Click Extend
  • Scroll down to the FLICKR section
  • Check Flickr, Flickr API Integration
  • Flickr Filter
  • Click Install.

Step #2 - Configure the module

After enabling the modules,

  • Open the Flickr API integration description
  • Click The Configure link.

You will be prompted to get an API key, so click this link, in order to be redirected to Flickr.

  • Read both info cards carefully.
  • Request a non-commercial key (your screen should be in English).

  • Give your application a proper name and description
  • Check both checkboxes
  • Click Submit.

Flickr creates a Secret and another key in order to integrate your site with the Flickr platform.

  • Copy both keys and paste them on the Flickr configuration screen of your Drupal site under Configuration > Media > Flickr API Settings
  • Click Save configuration.

Step #3 - Create a Media Editor Role

This person (or these persons) will have the special permission to embed Flickr images with a shortcode in the Drupal site.

  • Click People > Roles > Add role.

  • Add a proper role name
  • Click Save.

Step #4 - Configure the Text Format for the Media Editor

  • Click Configuration > Text formats and editors.

  • Give the text format a proper name according to the role you created in Step #3
  • Select the Media attendant role
  • Select CKEditor from the dropdown list.

  • Enable and rearrange the filters shown on the image
  • Choose to display captions
  • Leave the default image size (single image) by 75px
  • Click Save configuration.

Your Text formats configuration screen looks like this:

Step #5 - Create a New User

  • Click People > Add user
  • Assign a user name and password
  • Assign this user the Media attendant role
  • Click Create new account.

Step #6 - Set permissions

  • Click People > Roles
  • Click the dropdown arrow beside Media attendant
  • Select Edit permissions
  • Check the following permissions:
    • Filter
      • Use the media attendant text format
    • Node
      • Article: Create new content
      • Article: Delete own content 
      • Article: Edit own content 
      • View published content 
      • View own unpublished content
    • System
      • View the administration theme
      • Toolbar
      • Use the administration toolbar
  • Click Save permissions
  • Click Configuration > Performance > Cache rebuild.

Step # 7 - Create an Article with a Flickr Shortcode

Open a different browser and log in as the user you created in step # 5.

  • Click Shortcuts on the administration toolbar
  • Click Add content
  • Give the node a proper title
  • Select the Text format you created in Step # 4
  • Write this shortcode into the editor:


  • Make sure that the photo is open to the public and doesn’t have any view restrictions. You get the photo ID from its URL at Flickr.

  • Finish the node and click Save.

Notice that you did not specify a size for the image, so it takes the default configuration of 75px. In order to set a specific size for the image, click the edit tab and change the shortcode like this:

[flickr-photo:id=9315513698, size=q]

The image will double its size to a 150px square.

  • Click the Edit tab once again.

Instead of one photo, you’re going to display a whole album, so you need the album ID.

You get the ID of the album from its URL at Flickr.

  • Edit the shortcode

[flickr-photoset:id=72157634694871388, size=n]

You can read more about image sizes in Flickr here. Notice that the sizes Slideshow and Basic Slideshow are not available for Drupal 8.

The Drupal 8 Flickr module allows you to embed single images and albums from Flickr in a Drupal 8 site.

Thanks for reading!

About the author

Jorge lived in Ecuador and Germany. Now he is back to his homeland Colombia. He spends his time translating from English and German to Spanish. He enjoys playing with Drupal and other Open Source Content Management Systems and technologies.
Jan 31 2019
Jan 31

Since I was young, I've been an avid tennis player and fan. I still play to this day, though maybe not as much as I'd like to.

In my teens, Andre Agassi was my favorite player. I've even sported some of his infamous headbands. I also remember watching him win the Australian Open in 1995.

In 2012, I traveled to Melbourne for a Drupal event, the same week the Australian Open was going on. As a tennis fan, I was lucky enough to watch Belgium's Kim Clijsters play.

Last weekend, the Australian Open wrapped up. This year, their website, https://ausopen.com, ran on Acquia and Drupal, delivered by the team at Avanade.

In a two-week timeframe, the site successfully welcomed tens of millions of visitors and served hundreds of millions of page views.

I'm very proud of the fact that many of the world's largest sporting events and media organizations (such as NBC Sports who host the Super Bowl and Olympics in the US) trust Acquia and Drupal as their chosen digital platform.

When the world is watching an event, there is no room for error!

A photo of the team that worked on the Australian Open website in 2019Team Tennis Australia, Acquia and Avanade after the men's singles final.

Many thanks to the round-the-clock efforts from Acquia's team in Asia Pacific, as well as our partners at Avanade!

January 30, 2019

50 sec read time

db db
Jan 30 2019
Jan 30

All sorts of organizations have made their predictions and proclamations about what 2019 will be the year of... Some say it is the Year of Optimism and growth for helicopters, others, …of the Hack & Slash, …of indigenous languages, …of the electric SUV, and even the International Year of the Salmon.  It all comes down to what someone sees as an important aspect of their field to promote or what is or should be a trend.  DrupalEasy would therefore like propose we make 2019 the Year of Drupal Talent Development.

As an active member of the community, we've observed, had great discussions and provided several sessions at Camps and Cons about the talent shortage in the community as well as how to build a Drupal career. We feel it is pretty important to Drupal. Right now, there are more than 2,000 jobs requiring Drupal skills on Indeed, and hundreds more continually being added. The Drupal Association also recognized the need, as we discovered while putting together this blog post, with the introduction of a Drupal Educational Opportunities Newsletter, which will help get the word out to those looking to further their skills, and those looking to start a career in Drupal.  

As a training organization, we not only train within the community, but bring in new people to develop passion for Drupal. We’ve had over a decade to watch people who started out not being able to spell Drupal develop the commitment and skills to excel at it. We’ve seen our Drupal learning community grow, diversity, and expand internationally, as new students hone their skills and strive to contribute to the community while they do it. Through all of this talent development for Drupal and the community, most gratifying is seeing the companies and organizations compete for the people building rewarding and fulfilling careers through experience and participation. 

How can we make it the Year of Drupal Talent Development?  A simple way is for each of us to simply sharie information on Drupal as a career and the opportunities in Drupal to those who may benefit from it. For those with the need and resources, providing the education and training needed for individuals or teams. There are some great resources to get information about Drupal as a career

The US Department of Labor has an Occupational Outlook Handbookprovides summaries of careers including salary ranges, anticipated job growth, and types of work environments.  Their entry on Web Developer careers, though not specific to Drupal, seems to track pretty well. There is also great salary information about Drupal specific web development through the Indeed Salary Tool, as well as Glass Door's version

Of course, salary is just a part of it, so a few years ago, we put together a Drupal Career Resources page to provide an index of information, insight and news for those looking to get into Drupal. It is a quick way for those of us who are in the community to share a lot of information.    

We also truly believe that solid education in the ways of Drupal is key to get and keep people active in the community.  Mike Anello teaches our our 12-week live, Drupal Career Online course twice each year.  The career technical education course is licensed as a certificate program through the Florida Department of Education Commission for Independent Education.

Drupal Career Online is a  comprehensive program that includes 2 class sessions and one co-working lab session each week, along with Mike's office hours and access to other training provider resources, most recently Drupalize.me.  Participants are also provide rich learning resources including a lesson guide, class slides, links to go further in-depth into topics, and a screencast for every lesson, which is all accessible through a session-specific class web site. 

Prior to each DCO session, we hold Taste of Drupal mini-webinars to introduce people to Drupal, Drupal careers and our course.  There are 2 more sessions before the Spring 2019 session of Drupal Career Online kicks off on February 25th.  Those interested can sign up for a Taste of Drupal, or contact us to get more information.      

Jan 30 2019
Jan 30

If you were an early Drupal 8 adopter you've might have downloaded and installed your Drupal 8 sites by downloading a tarball or using Drush. We did as well, but the benefits of using Composer are so great that it's time to convert those in to being Composer-managed.

Luckily, grasmash has built a great Composer plugin called Composerize Drupal which does all the heavy-lifting for us.

Here's how we did it:

Before you even begin, make sure you branch out $ git checkout -b chore/composerize-drupal

And then we installed the Composer plugin globally:

composer global require grasmash/composerize-drupal

Consider the plugin options available:

  • Use the --exact-versions option if the site is big and complex. Especially if you don't have any good test coverage to ensure your site doesn't break. The option sets the constraints of your composer.json to the exact versions of your currently downloaded modules.

Now we run the command:

composer composerize-drupal --composer-root=. --drupal-root=. --exact-versions


  • Update your .gitignore and ignore the vendor/, core/ and modules/contrib folders. If the files were already commited you also need to remove them: Ignore files that have already been committed to a Git repository
  • Re-apply your patches! Since all the core code and contrib. modules are managed by Composer you'll need to add those patches to your composer.json:
    Something like this:
    "extra": {
        "enable-patching": true,
        "patches": {
            "drupal/core": {
                "2492171 - Adds transliteration to uploaded file and images": "_kodamera/patches/use_new_transliteration-2492171-72.patch"

When you run composer install they are automatically applied for you. No more manually work here. Yay!

Do some regression testing and if everything looks fine, you're done! Commit and deploy :)

Jan 30 2019
Jan 30

Composer has become a must for relatively ambitious Drupal 8 projects. Even if it is still possible to initialize a Drupal 8 project with drush or simply by downloading a zip archive, these two methods can become limiting over time. Or at least not to facilitate the installation of new modules with dependencies on third-party libraries.

Another of the reasons I have encountered, why some Drupal 8 projects have not been initiated by Composer, is the lack of Composer support on some shared hosting, even so-called professional ones.

If starting a project without Composer can give the impression of saving time at the beginning (by bypassing a necessary phase of appropriation of Composer), it can very quickly become time-consuming, and the initial time saving fades away.

There comes the inevitable moment when you have to rely on Composer to simply manage even the installed modules.

Switching an existing Drupal 8 project to a code base managed by Composer can be done relatively easily.

Create a new project based on Composer

First, initialize a new project with the recommended Composer template (and if necessary install Compose first).

composer create-project drupal-composer/drupal-project:8.x-dev NEW_PROJECT --stability dev --no-interaction

This command will create a new NEW_PROJECT directory, and download the latest version of Drupal, and its dependencies

The initialized directory will look like this.

├── config
├── drush
├── scripts
├── vendor
└── web

Install the active contributed modules and theme on the new project

This is the most daunting part of the procedure, especially if the number of activated modules is large. It is necessary to install the different modules or themes contributed, activated on the project, with Composer.

You can list the different modules from the Extensions configuration page, or list the modules with a drush command.

drush8 pml | grep "Enabled"

This allows you to obtain the list of enabled modules, as well as their version.

 Administration       Admin Toolbar (admin_toolbar)                                                       Module  Enabled        8.x-1.24    
 Administration       Admin Toolbar Extra Tools (admin_toolbar_tools)                                     Module  Enabled        8.x-1.24    
 Chaos tool suite     Chaos tools (ctools)                                                                Module  Enabled        8.x-3.0     
 Custom               Linkit (linkit)                                                                     Module  Enabled        8.x-4.3     
 Field types          Datetime (datetime)                                                                 Module  Enabled        8.6.3       
 Field types          File (file)                                                                         Module  Enabled        8.6.3       
 Field types          Image (image)                                                                       Module  Enabled        8.6.3       
 Field types          Link (link)                                                                         Module  Enabled        8.6.3       
 Field types          Options (options)                                                                   Module  Enabled        8.6.3       
 Field types          Text (text)                                                                         Module  Enabled        8.6.3       
 Multilingual         Interface Translation (locale)                                                      Module  Enabled        8.6.3       
 Multilingual         Language (language)                                                                 Module  Enabled        8.6.3       
 Other                Contact storage (contact_storage)                                                   Module  Enabled        8.x-1.0-bet 
 Other                Pathauto (pathauto)                                                                 Module  Enabled        8.x-1.3     
 Other                Redirect (redirect)                                                                 Module  Enabled        8.x-1.3     
 Other                Redirect 404 (redirect_404)                                                         Module  Enabled        8.x-1.3     
 Other                Token (token)                                                                       Module  Enabled        8.x-1.5     
 SEO                  Metatag (metatag)                                                                   Module  Enabled        8.x-1.7     
 SEO                  Metatag: Open Graph (metatag_open_graph)                                            Module  Enabled        8.x-1.7     
 SEO                  Simple XML Sitemap (simple_sitemap)                                                 Module  Enabled        8.x-2.12    
 Spam control         Antibot (antibot)                                                                   Module  Enabled        8.x-1.2     
 Spam control         Honeypot (honeypot)                                                                 Module  Enabled        8.x-1.29    
 Statistics           Matomo Analytics (matomo)                                                           Module  Enabled        8.x-1.7     
 Bootstrap            Bootstrap (bootstrap)                                                               Theme   Enabled        8.x-3.13    

And so for each module present on the existing project, you can install them with the command, for example for the redirect module.

composer require drupal/redirect ~1.3

and this for each module.

Another alternative, instead of launching this command module by module, is to complete the composer.json file with this list of modules, the minimum version to recover, then launch the command

composer update --with-dependencies

In order to update and download all the modules contained in the composer.json file.

Retrieve user files

Once all the active modules have been uploaded to the new Composer-based project, all that remains is to copy the user files (generally the sites/default/files directory), the custom modules if any, as well as the libraries, configure the settings.php file for connection to the database.

And that's it.

Remember to empty the caches before accessing your new project based on Composer, this time in order to rebuild the Module Registry, in case the modules have not been installed in the modules/contrib directory on the existing project.

Versioning the source code of a Drupal project

Depending on your hosting, constraints and deployment process, and if you use git (highly recommended) it may be interesting to version all the Drupal source code. Indeed, by default, the Drupal Composer template excludes the following directories.

# Ignore directories generated by Composer

You can comment on these lines in order to be able to version the entire code base. However, some third-party modules or libraries may not be versioned because the download process will have used a git clone command, and as such will have created a .git directory in the project directory, excluding this directory (by the presence of a git submodule) from your versioned main code database.

In order to be able to version the entire code base, we can slightly modify the behavior of the project's Composer template.

We will modify the file below to add a command allowing us to delete the .git directories present in the 2 main vendor and web directories after each update command made with composer.

└── composer
    └── ScriptHandler.php

We add these new methods to the ScriptHandler class

protected static function getDrupalRoot($project_root) {
  return $project_root .  '/web';

protected static function getVendorRoot($project_root) {
  return $project_root .  '/vendor';

public static function removeGitDirectories(Event $event) {
  $root = static::getDrupalRoot(getcwd());
  exec('find ' . $root . ' -name \'.git\' | xargs rm -rf');
  exec('find ' . $root . ' -name \'.gitignore\' | xargs rm -rf');
  $vendor = static::getVendorRoot(getcwd());
  exec('find ' . $vendor . ' -name \'.git\' | xargs rm -rf');
  exec('find ' . $vendor . ' -name \'.gitignore\' | xargs rm -rf');

Then in the composer.json file, we modify the scripts section to get

"scripts": {
    "drupal-scaffold": "DrupalComposer\\DrupalScaffold\\Plugin::scaffold",
    "pre-install-cmd": [
    "pre-update-cmd": [
    "post-install-cmd": [
    "post-update-cmd": [

Thus, with each installation or update command launched with composer, any git sub-modules created will then be deleted, allowing the entire source code to be versioned under the same project.

This strategy of whether or not to version the entire code base is not to be applied systematically. It must be evaluated project by project, according to your organization, your deployment processes and the nature of your projects, from a simple Drupal 8 site to a Drupal web factory. Advice from a Drupal expert, or from your DevOps teams if you have one, will certainly not be useless.


About Drupal Sun

Drupal Sun is an Evolving Web project. It allows you to:

  • Do full-text search on all the articles in Drupal Planet (thanks to Apache Solr)
  • Facet based on tags, author, or feed
  • Flip through articles quickly (with j/k or arrow keys) to find what you're interested in
  • View the entire article text inline, or in the context of the site where it was created

See the blog post at Evolving Web

Evolving Web