Jun 24 2019
Jun 24

The planned Drupal 9 release date is June 3, 2020. While the Drupal 9 branch is not yet open, we've been working on Drupal 9 ever since the release of Drupal 8.0.0 through our deprecation processes. In fact, that is our process to clean up and refactor our APIs.

For a PHP API to be removed we need to deprecate and introduce a replacement (as appropriate). For a module to be removed, we need to deprecate it and at least move it to a contributed module (or provide a replacement in core). For a JavaScript dependency to be removed (such as the already end of life jQuery UI), we need to deprecate it and provide a replacement, and so on. So what can we get rid of in Drupal 9 finally? Well, all the things marked deprecated.

Other than third party dependency updates, things not deprecated in Drupal 8 will stay in Drupal 9 and be subject to backwards compatibility support in Drupal 9 until its end of life (likely around the end of 2023).

And this is a good thing. We want stability with Drupal, we want people to invest and find their investments work with Drupal for a reasonable time. To completely answer my clickbait title though: how long do we have to "finally" get rid of something? Well as per Dries's DrupalCon Seattle keynote, we have until Drupal 8.8 to define what we are deprecating for (and thus removing in) Drupal 9. Here is the video snippet:

What does that mean in practice? 8.8.0-alpha1 is by when we need to get the API for Drupal 8.8.0 done and therefore the API of Drupal 9 done (other than third party dependency updates). And 8.8.0-alpha1 is scheduled for the week of October 14th, 2019.

In other words, you have 111 days to get your least favourite thing removed from Drupal. If not, well, we will live with backwards compatibility to what we have in October 2019 for 4 more years to come.
Jun 24 2019
Jun 24

It is crucial for website security and usability to determine who is allowed to view, edit, or delete content on your platform. Things become easier with the configuration of user access if you are using Drupal. This CMS offers out-of-the-box user roles, as well as contributed modules for such functionality.

Today, the team at WishDesk explores user access modules in Drupal 8 — the latest Drupal version.

What is user access?

User access means that user possesses a particular role on a website that lets him access certain areas of the site, as well as see the specific elements displayed on each web page after logging into the site.

Top Drupal 8 user access modules

Here is a list of the most popular user access modules for Drupal 8. Check out the information before choosing the one for your website! The choice of this module depends on the functionality you want to add.

top Drupal8 user access modules

  • Permissions by Term

Permissions by Term is the Drupal module that lets you restrict or allow access to the specific website content on the basis of taxonomy terms. These permissions can be applied to user roles, as well as individual users and work for nodes, views, menus, etc. With the help of this module, taxonomy terms can be coupled to specific accounts.

  • Node View Permissions

The Node View Permissions module simply adds two types of permissions to every content type: "View own content" and "View any content." Besides, it can be easily combined with other user access modules.

  • Menu Admin per Menu

If you need certain users to add, edit, or delete particular menus, without access to other menus, the Menu Admin per Menu module is for you. Note, that users without full admin permissions may not see all the menus, so you need to move the necessary items to the root of the Management menu or somewhere else where it can be seen by those users.

  • Block Content Permissions

The Block Content Permissions module allows you to set permissions to custom block types, as well as create, update, or delete specific types of block content.  

  • Protected Pages

Protected pages is the Drupal 8 user access module that allows the administrator to protect certain web pages with a password. Some interesting features include global password setting, session expire time setting, bypass permission to skip password protection, and more!

Configure user access on your website with WishDesk!

This is just some of the Drupal 8 user access modules and the choice of it depends on the type of your website and content you provide. Our Drupal team is always here to choose the most suitable modules for your platform and configure it to meet all your needs. We can also create custom modules for you if none of the existing ones fulfill your requirements!

User access in Drupal 8 is easy, especially when you have a reliable web development agency at hand. Contact us for any kind of digital help or assistance.

Jun 24 2019
Jun 24

Store Drupal logs on Amazon S3 via hook_watchdog, so that you can get rid of heavy logs on your drupal database and can later read from the S3.

For this todo on Drupal

  • You should use the "hook_watchdog" hook, where this hook allows modules to route log events to custom destinations.
  • In our case, our custom destination will be S3.
  • Initially we need to get the access to AWS and appropriate S3 bucket.
  • Store the connection configuration details of S3 buckets in the Drupal.
  • In the hook_watchdog, read the S3 Auth configs.
  • Create a connection to AWS S3, on success it return back with the S3 object.
  • Check if any buckets exist to write the logs, of not you should create bucket on S3 for logs.
  • Next, Create a log directory and log file, populate it with the data came on hook_watchdog.
  • Next, Write to the S3 bucket with parameters which "putObject" expects.
  • Next, Remove the log directory & file which is created in the process.
  • Check the S3 bucket via S3 UI, you could see the logs

Here's the piece of code, via we log to S3.

    t('Info: Successfully completed.'),
    t('Error: Issue while processing.'),
    array($exception, $data),

Here, the piece of code which helps to connect & write log's to S3.


use \Aws\S3\S3Client;

 * Implement hook_watchdog
 * @param array $log_entry
function audit_watchdog(array $log_entry) {
    // Set the modules which needs to be logged to S3
    $modules = array(
    if (in_array($log_entry['type'], $modules)) {
        if(isset($log_entry) && !empty($log_entry)) {
            // Get the S3 config details
            $s3_config = variable_get("s3_config");
            $s3_bucket = $s3_config->s3_bucket;
            $s3_region = $s3_config->s3_region;
            $s3_key = $s3_config->s3_key;
            $s3_secret = $s3_config->s3_secret;
            try {
                if (!empty($s3_bucket) && !empty($s3_region) && !empty($s3_key) && !empty($s3_secret)) {
                    // Create AWS connection
                    $s3 = create_aws_connection($s3_region, $s3_key, $s3_secret);
                    if (!empty($s3) && is_object($s3) && $s3 != FALSE) {
                        if ($s3->doesBucketExist($s3_bucket)) {
                            $log_path = 'public://logs/to_aws';
                            // Create log directory
                            $dir_path = create_aws_log_directory($log_path);
                            // Create log file
                            $file_path = create_aws_log_file($log_entry, $dir_path);
                            // Get the name of log file
                            $keyname = get_keyname_for_log_file($log_entry['severity'], $file_path);
                            // Store the log file to S3
                                'Bucket' => $s3_bucket,
                                'Key' => $keyname,
                                'Body' => '',
                                'SourceFile' => $file_path,
                            // Remove the directory & file created
                            if (is_dir($dir_path)) {
            catch (Exception $e) {
                // Exception is ignored so that watchdog does not break pages during the
                // installation process or is not able to create the watchdog table during
                // installation.

function create_aws_connection($s3_region, $s3_key, $s3_secret) {
    $s3 = new S3Client([
        'version' => 'latest',
        'region'  => $s3_region,
        'credentials' => [
            'key'    => $s3_key,
            'secret' => $s3_secret,
    $buckets = $s3->listBuckets()->get('Buckets');
    if (isset($buckets) && !empty($buckets)) {
        return $s3;
    else {
        return FALSE;

function create_aws_log_directory($log_path) {
    if (!is_dir($log_path)) {
        mkdir($log_path, 0777, true);
        chmod($log_path, 0777);
    return $log_path;

function create_aws_log_file($log_entry, $dir_path) {
    $content = json_encode($log_entry);
    $log_file_name = $log_entry['type'] . '-' . date("Y-m-d-H-i-s") . '-' . preg_replace("/^.*\./i","", microtime(true)) . '.log';
    $file_path = $dir_path . '/' . $log_file_name;
    $log_file = fopen($file_path, "w");
    $write_log_file = fwrite($log_file, $content);
    $close_log_file = fclose($log_file);
    $chmod_log_file = chmod($file_path, 0777);
    return $file_path;

function get_keyname_for_log_file($severity, $file_path) {
    $watchdog_array = array(
        "0" => "WATCHDOG_ERROR",
        "1" => "WATCHDOG_INFO",
    return 'drupal-logs/' . $watchdog_array[$severity] . '/' . basename($file_path);

function rmdir_recursive($dir) {
    foreach(scandir($dir) as $file) {
        if ('.' === $file || '..' === $file) continue;
        if (is_dir("$dir/$file")) rmdir_recursive("$dir/$file");
        else unlink("$dir/$file");

Advantage of having Logs on S3

  • Reduce the number of DB log entries on Drupal database.
  • Completely Keep the Audit system outside Drupal, So Prod instance will play smooth.

Cheers :)

Jun 24 2019
Jun 24

When seven out of the world’s top 10 universities choose Drupal as their preferred partner in the vital task of creating and maintaining their websites, it’s safe to assume that the platform has much to offer even the best universities.

A good website saves on costs and optimizes the user experience of its visitors. All told, it’s a vital asset that few organizations can be without.

In this article, we’ll be going through the top 10 universities that built their websites using Drupal, an open source platform known for producing remarkable digital experiences. Drupal’s scalability and capacity for large amounts of content make it the number one choice for top universities all over the world.

1. Oxford University

In a fast-paced environment where broad functionality is key, Oxford University’s website is a testament to Drupal’s ability to host multiple sites and tasks while letting each department have control of its own web presence.

From information on admissions and university research to current news & events, the Oxford University website is a one-stop platform where faculty, students, and alumni alike can stay in the loop when it comes to life both on and off-campus.

Oxford University

2. Harvard University

The words ‘Ivy League’ call to mind a certain sense of prestige and tradition. Harvard University’s website brings these features to life with a distinct look and feel that communicates the Harvard brand to visitors right from the homepage.

Drupal’s friendly user interface enables Harvard administrators to design pages, host media, and post content in a way that allows branding consistency across the entire site.

Harvard University website

3. MIT

Best known for its programs in engineering and the hard sciences, the Massachusetts Institute of Technology maintains a competitive culture, encouraging its undergraduates to pursue their own original research.

Like all sites built on Drupal, The MIT website is strikingly well-equipped for site protection and data privacy. Institutions like MIT, which work hard to preserve the safety of their student and faculty records, trust the Drupal CMS for eliminating the risk of breaches. In fact, many corporations, non-government organizations, and state agencies choose Drupal for its strong safety and security capabilities.

MIT Website

4. Stanford University

Higher education websites tend to require different access privileges for a wide range of contributors, and Stanford University’s website demonstrates Drupal’s ability to provide ease of management and sharing content across various portals and sites. The Stanford website features a significant amount of content from its many offices and departments.

Stanford University Website

5. Duke University

Duke University takes pride in being a global institute of learning that houses perspectives from all over the world. The university ensures that this core belief translates into their online presence by building their website with Drupal, a CMS known for catering to a multilingual demographic.

Since Drupal operates in more than 110 languages, the platform provides an outstanding translation module that enables higher education institutions such as Duke University to cater to the global needs of their students and faculty.

Duke University Website


UCLA is known for advancing knowledge and addressing social needs by fostering an environment full of diverse perspectives. The university extends the pursuit of these goals to their website, which houses rich content that’s accessible to all.

The UCLA website demonstrates how Drupal makes reusing and circulation content quick and easy. After the creation of a particular bit of content, website users are able to circulate it effortlessly through departments, intranets, and subsites.

UCLA website

7. University of Arizona

Drupal allows for powerful collaboration that supports both educational and research departments. As the University of Arizona prides itself on being a global and student-centered university, its website enables its faculty and students to access manuals, procedural forms, and research updates with no fuss or frills.

The University of Arizona’s website remains to be one of their key tools in the pursuit of their goal of community-wide collaboration to help solve critical challenges we face today.

University of Arizona Website

8. Penn State

A major public university that serves Pennsylvania and the global community, Penn State aims to make its online presence widely accessible. Built with Drupal, the Penn State website allows for responsive mobile access. In an always-on, mobile-first environment, the Penn State website paves way for great and functional communication that translates across all kinds of mobile devices.

Penn State University

9. University of British Columbia

With the university’s purpose of pursuing excellence in research to foster global citizenship, the University of British Columbia continuously works for the advancement of a sustainable and just society across the globe.

One of their most crucial tools in this regard is a website that hosts rich content on their core institutional objectives and accomplishments. Drupal allows the UBC website to access a wide range of people across different communities by enabling seamless integration from their website to different social media platforms.

University of British Columbia

10. University of Toronto

In the same way that Drupal allows non-experts to easily create and manage amazing websites, the platform also enables the creation of websites with sophisticated and user-friendly journeys.

The University of Toronto’s website demonstrates Drupal’s ability to allow for a platform that’s deceptively easy to navigate and browse through. For institutes of higher education, this feature matters greatly as users ought to have an easy time accessing information on a university’s website.

U of T website

Drupal continually demonstrates high levels of functionality, security, scalability, and flexibility in every way, and it’s no surprise, then, that Drupal is considered the foremost platform for developing higher education websites.

Finally, it’s worth mentioning that universities looking to use Drupal to jump-start their digital presence or revamp an existing website should consult with experts for a comprehensive assessment of where to begin. The platform is intuitive, but expert guidance can go a long way when making a digital transformation.

Jun 24 2019
Jun 24


Hi, I am Artem and I am front-end developer. In my everyday work, I face with the styling of Drupal sites.

In this article, I am going to share my experience in integrating dynamic imports, splitting code into small chunks in Drupal 8. Also, I am going to show you how to write a webpack plugin that automatically connects these chunks with Drupal. With this plugin, you will not worry about the new chunk that needs to be connected, whether it is some js module or a piece of CSS.

What you need for comfortable usage of sites

When you open a web page, you definitely pay attention to its loading speed. Of course, no one wants to look at a blank page that is going to show you a super design with interesting animations but it takes ages to load. There can be many reasons for the long loading and not all of them are directly related to the size of the code that the browser is trying to load and execute. But the size of a bundle still plays a big role, especially with the advent of http2, where the main emphasis is put on speeding up multi-threaded loading of small packages.

So how can we deliver the code to the browser as efficiently as possible so that it does not overload and does not get anything else instead of the desired content? Try to answer this question by considering the chunks and dynamic imports solution.

Chunks and dynamic imports in Drupal

What we mean by “Chunks and dynamic imports”: it is splitting one large piece into smaller ones and having them lazy loaded if needed. Let's see how it can be implemented in Drupal 8 with examples.

I decided to keep up with the trends in our beloved front end world and write a config for the webpack dividing our bundle into two, to begin with: one for the Browser-That-Must-Not-Be-Named, the other for modern browsers that support all the main features of ES6 without compiling. 

Jun 23 2019
Jun 23

The summer of 2019 gave a reason for the Delhiites to rejoice. This time as one of the most conspicuous open source technology events of India, DrupalCamp was back after a sabbatical of two years, in Delhi.

DrupalCamp Delhi was a two-day conference that happened on 15-16 June at JNU Convention Centre. The event proudly hosted 350+ people, 20+ sessions, 7+ Founders speakers, and 3 trainings and a Drupal contribution sprint. Sponsored by 7 top Drupal companies across India and partnered by 10 technology/open source communities, DCD had some power packed Drupal talks by the brightest minds in Drupal and in India.

As an insignia of community inclusiveness, it had the presence of specially-abled artists from KPCT Foundation.


Participants appreciated the spectacular paintings by specially abled people from Kalpana Charitable Trust (KPCT)

We started with the prenote where we introduced DrupalCamp Delhi and discussed the flow of event. More importantly, we threw light on the very beginning of Drupal, the first Drupal event in Antwerp and how DrupalCamp community has grown to 1.3 million people globally.

Following this, the Keynote was delivered by Sudhanshu Mani, the man behind the conceptualization, engineering and manufacturing of India’s first engineless train, Train18.



He enthralled the audience by sharing his journey (talking about culture, structure and processes) as the General Manager of the Integral Coach Factory (ICF) and some to-the-point Shayari.

Day 1 witnessed a total of 18 sessions ranging from business & leadership, community, frontend & web design, coding & development, CI/CD & QA automation, beyond Drupal and case studies. People loved the session by Mathieu Spillebeen on - Frontend United: The energy of the people- which also took the audience by surprise since it was a virtual session. The attendees participated throughout by asking questions through the online platform, Slido.


Mathieu Spillebeen in action

Another notable event in the camp was the launch of Drupal India Association (DIA), by Shyamala Rajaram, a local chapter for Drupalites to contribute in India.


The official launch of DIA

At Birds of a Feather (BOF), we discussed the reasons for the inability to contribute to the community and what should be the action plan. Participants didn’t shy away from stating that it was the lack of exposure, mentorship and time which was holding them to contribute effectively.

Two parallel workshops were also running throughout the day for - beginners in Drupal and content writers.

Day 2 was filled with sessions, contribution workshops on Drupal and Gatsby, BoF, and Trivia Night. The day gave way to camp’s second keynote speaker Prashant Singh, VP - Product Management PayTM, take the podium to talk about the importance of technology in building a better track for India.


Prashant Singh, VP - Product Management PayTM talking about the importance of technology in building a better India

The Contribution Sprint by Axelerant let people know how and why is it important for them to contribute to Drupal as much as possible. The two-hour-long contribution sprint, which was guided by mentors, saw people from coding as well as non-coding backgrounds joining to network with peers.

The event wrapped up with Drupal Trivia, which kept the audience engaged with some mind-boggling Drupal questions. It was adorable to see two cute kids join as co-hosts, to Tanisha and Akanksha, and were adamant to share no clue when asked for one! The winners of the evening were announced and team Srijan won by answering maximum questions right.


Team Srijan with hosts and the prize

#DCD19 remains special to my heart, for being able to carry out the whole thing successfully, whilst bringing in new set of volunteers to contribute, and for receiving a special note of appreciation from Shyamala Rajaram, Director and Co-founder Unimity Solutions.



Community events fuelled by passion, such as DCD, are always special. Here’s why:



For professionals, organisations and students, this is the best way to learn and reinforce your commitment to Drupal. These events create leaders, showcase the importance of non-code contributions and help us in propagating Drupal around the globe. DrupalCamp Delhi would be bigger and better in 2020. Would you be with us?

Time for a groupfie!

Jun 23 2019
Jun 23

Starting a new Drupal 8 project? And the first thing you might do is to install a module, but which one first. There are a few obvious ones to install and sometimes these have no relation with the functionality of your project but they always help you in the background.

But why do we install them? It's simple, they make our life easy while we are implementing the universe of features into our Drupal website. But then you always miss some of those life-saving modules and only install them when you feel the pain.

Now here is my list of Drupal 8 modules which will make your life smooth and you should install them as soon as you see that welcome message on the home screen.

  1. Admin Toolbar
  2. Environment Indicator
  3. Config Split
  4. Module Filter
  5. Site Settings and Labels

1. Admin Toolbar

Project page: https://www.drupal.org/project/admin_toolbar

Availability: Drupal 8

Downloads: 133157+

Okay, this was obvious! It was always annoying to go through all those pages to reach the manage field of a content type. In Drupal 7, Administration Menu module came to the rescue but in Drupal 8 it's Admin Toolbar which does the job perfectly. Admin Toolbar module integrates with the core's toolbar module and provides a drop-down menu for easy access to the menu items in the Administration menu. Just install and forget about it.

2. Environment Indicator

Project page: https://www.drupal.org/project/environment_indicator

Video: https://www.youtube.com/watch?v=8WbP9ZYxAx0

Availability: Drupal 8 | Drupal 7

Downloads: 18314+

Remember the time when you accidentally change settings or updated content on the wrong environment, thinking you are in the local environment. For these situations, the Environment Indicator module comes to the rescue. This module simply adds colors to the Drupal admin toolbar to indicate which environment you are working on.

You can simply configure different colors for different environments to differentiate like Development (Green), Staging (Orange) and Production (Red). Just try it and you will see how often you leave the wrong environment tab open in your browser.

3. Configuration Split

Project page: https://www.drupal.org/project/config_split

Tutorial: https://www.daggerhart.com/drupal-8-configuration-management-with-config-split/

Availability: Drupal 8

Downloads: 18816+

Drupal 8 introduced configuration management in the core to allow export of database configurations in YML files. But what if we don't want to keep everything same on all environment, maybe you want some development modules on configurations different for the local environment.

For these situations, Configuration Split does the job for us. This module allows you to create groups of configurations that you want to separate from the rest of the configuration. 

4. Module Filter

Project Page: https://www.drupal.org/project/module_filter

Availability: Drupal 8 & Drupa 7

Downloads: 327,907+

One of the first things you do on a first install is to go to the modules listing page and enable or disable modules. But with time this list of modules becomes so big that you start searching for it in browser search. So the best solution is to use the Module Filter module to search for the required module with a search box on the module listing page.

Another feature of the Module Filter module is that it provides a horizontal view for the module list page where modules are categories with their package. This makes it easy to just simply click on the package tab to see what module are available in it. This was the must-have module in Drupal 7 and so does in Drupal 8.

5. Site Settings and Labels

Project Page: https://www.drupal.org/project/site_settings

Availability: Drupal 8

Downloads: 641

With Drupal 8 all settings start to save into configuration and we export configuration. But if you want to have a configuration which can be changed whenever needed without the fear of overriding it on next config import.

"Site Settings and Labels" module is something you can use in your Drupal 8 project if you are in the same situation. This module allows you to set settings as content with the features and feel of Drupal 8 configuration system . So remember this module as this could be your secret weapon on your next Drupal 8 project.

In the comment, let me know which one is your favorite or if I missed your go-to module for a fresh Drupal 8 installation.

Jun 23 2019
Jun 23

APIGEE recently announced - from May 31, 2020, Apigee-sponsored hosting for Drupal-based portals will end. The existing customers who wish to remain on Drupal 7 need to assume hosting responsibility, they can either migrate to Drupal 8 or move to Apigee's integrated portal.


Those who wish to stick to Drupal 7 developer portals might possibly face challenges. But if Drupal has many security features and remains as one of the most secure Content Management System (CMS), what could possibly be the urgency to migrate?

What are the concerns?

Drupal 7 End-of-Life is Near

The developer portal is essentially a CMS, in case of APIGEE, based on Drupal. As the backend CMS, Drupal provides a core set of features in the form of modules that make it easy for you to build the content, as well as manage, websites.

Developer portals orchestrate API ecosystem which helps developers and external partners to quickly and securely gain access to the tools and information they need to explore, test, & consume APIs.

Apigee supports several developer portal solutions, ranging from simple turn-key to fully customizable and extensible, most if not all were built on Drupal 7. With community focus shifting to Drupal 9 release and end of life approaching for Drupal 7 (November 2021), among other circumstances Apigee will no longer be supporting the D7 developer portals.

With APIGEE support ending in May 2020, Drupal 7 developer portals will face the following security challenge.


Drupal 7 Can Put your Developer Portal at Risk

While Drupal also has many security features, security is not about working in isolation.  If one is to secure their digital property from the possible threats, it needs to follow best practices to maintain the top-notch standards.

One of the most important is keeping the core updated.

If you fall a long way behind the latest update, you are opening yourself to vulnerabilities. Let’s know in detail how Drupal 7 can put your developer portal at risk.

1. Doesn’t prevent cross-site scripting

Cross-site scripting (XSS) is a class of code vulnerabilities that allows code to be executed inside your browser without your consent or knowledge. XSS exploits are commonly performed with JavaScript, but Flash, Java, and other similar web programming technologies have been used.

It is one of the most frequent security vulnerabilities, a site owner should be aware of. It can be introduced in custom themes and custom-and-contributed modules. A poorly configured site can allow a malicious visitor to use XSS to change a user's password. Out of the box, Drupal 7 isn’t very effective to identify and fix XSS vulnerabilities.

In Drupal 7, elements like Drupal variables or Ctools exportables are represented as PHP code. This use of PHP input format in the core exposes possible code execution to vulnerability.

Drupal 8, however, filters the PHP input format in the core, manages code in a revision control system like GIT, and protects the code from any possible attack. Configuration Management Initiative uses YAML as the export and import format. YAML files are easy to manage together with your code and is a best practice to check it into a revision control system (like GIT).

2. Exposing session cookies

Drupal 7 stores the session ID and checks directly against the incoming session cookie from the browser. This poses a huge risk as the value from the database could populate the cookie in the browser assuming the session as well as the identity of any user who has had a valid session in the database.

On the other hand, Drupal 8 secures the session IDs against exposures via database backups or SQL injection, encourages serving your entire site via secure channel SSL and no longer strips the www from the session cookie domain.

3. No Automated CSRF token protection in route definitions

Cross-site request forgery (CSRF or XSRF) is a process where a request is made to a site which takes an action when the user did not intend to take that action.

GET requests with configuration change are not protected from CSRF in Drupal 7. This brings all the secure and unsecured requests under the scanner.  However, Drupal 8 makes it easy to specify a route (or system path) require a CSRF token.

4. No Clickjacking Protection

Drupal 7 cannot protect a site from click-jacking attacks wherein forms or links on the site are presented in a disguised fashion on an attacker's site inside an iframe. It cannot block the unauthorized re-use of site content via iframes too. However, Drupal 8 does this easily by sending the X-Frame-Options: SAMEORIGIN header in all responses by default. This header is respected by most browsers and prevents the site from being served inside an iframe on another domain.

Should you Migrate your Developer Portal to Drupal 8?

When choosing a solution, you need to balance your customization requirements against the time and knowledge required to implement your portal. Migrating your developer portal to Drupal 8 will ensure that any investments you make will extend the security of your digital presence.

Have doubts around your API security or want to migrate to Drupal 8 developer portal? Get in touch with our experts. We provide a range of services around API designed with a strategy tailored to your success.

Jun 21 2019
Jun 21

This is no news anymore: preparing to upgrade to Drupal 9 is just a matter of... cleaning your website of all deprecated code. 

No major disruption from Drupal 8. No more compatibility issues to expect (with dread)...

“Ok, but how do I know if my website's using any deprecated APIs or functions? How do I check for deprecations, identify them and then... update my code?”

2 legitimate questions that must be “haunting” you these days, whether you're a:

  • Drupal 8 website owner
  • developer currently working on a Drupal project

Since the great news of this smooth Drupal upgrade ships with the answer to your “What” question (“What do I do to get my website ready for Drupal 9?”), but leaves the “How” question open:

“How precisely do I check my website for deprecated code?”

Are there any analysis tools available? Tools that you could run to get a thorough and accurate deprecated code report? 

Luckily, there are. And I'll be focusing on 2 of the most effective ones that you should consider integrating into your workflow: Drupal Check and the Upgrade Status module.

1. But What Is Deprecated Code? And What Website Elements Should You Audit?

A piece of code is considered deprecated if:

  • there's an upgraded alternative for it already available
  • it's no longer in use

With this real “dilemma” now solved, there comes another one:

“What parts of my website should I check for deprecated code?”

Make sure you scan your:

  • Drupal core
  • Drupal modules
  • theme

Note: pay special attention to the contributed modules enabled on your Drupal 8 website; run a deep-scan and, if you get any deprecation warnings, make sure to alert those modules' maintainers to clean them up.

2. Drupal Check: Scan Your Database for Any Deprecations 

A handy PHP analysis tool to grab and to run whenever you need to look for deprecated code in your database. 

A command-line tool that Dries Buytaert recommends running the... automated way,  closely integrated into your own workflow. What it'll do is track down instances of deprecated code for you.

Then, all there's left for you to do is to... remove them. And, depending on the context, to replace them with their upgraded alternatives.

3. The Upgrade Status Module: Determine Your Site's Readiness to Upgrade to Drupal 9

If the idea of working with a command line doesn't sound too... “tempting” to you, how about adding a user-friendly graphical interface to the equation?

The Upgrade Status module, delivered to us by the Aquia team, lead by Gábor Hojtsy, makes checking for deprecated code a lot more enojyable and intituive, thanks to its admin dashboard.

It's particularly handy if you're a Drupal site owner and not a senior Drupal developer highly familiar with CLIs.

Install it, enable it and use it to evalute your website and to assess to what degree it is ready (meaning up to date) for the Drupal 9 upgrade.

But let's delve head first into details on:

  • what it takes to install it properly
  • what parts of your website it will deep scan
  • how you can narrow down its analysis to specific projects only

3.1. Use the Composer Package Manager to Install It

Since it ships with its whole collection of third-party PHP dependencies...

Another key requirement to set the stage for the Update Status module is to enable the Update Manager and the Git Deploy modules on your Drupal 8 website.

Once installed, you can access its user interface at /admin/reports/upgrade.

3.2. Check Up Your Codebase, Modules and Themes

The great thing about this module is that you get to run your checks right in your admin UI and get a full report.

Another great aspect is that, when it comes to contributed modules, it will provide you any available updates... inline. 

Once it's completed its scan it'll display either an “Errors found” or a “No known errors” message. To localizae the identified deprecations on your website, just click “View errors”.

3.3. Run It on Specific Individual Projects, Too

Maybe you don't always need a full check. Maybe you'd like to scan only a specific project that you might be working on, to ensure that it's ready to upgrade to Drupal 9 when due time.

You can do that. The module allows you to cut down the time you'd spend on an uneccessary full-scan by focusing on one target project only. 

Furthermore, to streamline things even more, it enables you to export each deprecated code report individually...

4. So,You'Ve Identified Your Deprecated Code: What Next?

In most cases, keeping your codebase up to date once you've detected the deprecated parts is just a matter of replacing those deprecations.

For the other few cases left, you'll need to carry out a more complex refactoring process.

Now that you know which are the tools to use for:

… your website's smooth upgrade to Drupal 9 depends on you exclusively. 

On sticking to your own routine of checking up your Drupal core, modules and theme and keeping them up to date.

Image by fajar budiman from Pixabay

Jun 21 2019
Jun 21

"There are hundreds of startups with a lot of brains and money working on various alternatives to traditional banking" - Jamie Dimon, CEO, JPMorgan Chase

FinTech and the disruption it can cause to the traditional banking systems is now a hot topic of debate in the banking conferences. Global venture capital funds are super-bullish on this front and are accentuating investments in the FinTech companies. Thanks to the burgeoning demand of FinTech in recent times, more crowdsourcing platforms are letting artists or fledgling entrepreneurs to crowd-source capital from a large constituency of online donors or investors.

A sheet of paper with Finance written in bold letters alongside relevant icons and laptop, notebooks, pen, and plant pot placed around it

For instance, peer to peer (P2P) lending, the high-tech equivalent of borrowing money from friends, helps in raising a loan from an online community at a mutually negotiated interest rate. Also, digital wallet providers allow people to zip money across borders even without any bank accounts using handheld devices.

Amalgamation of these technologies, which goes under the umbrella term FinTech, is expected to metamorphose the way all of us use banking and financial services. And Drupal can act as the perfect content management framework for building a great FinTech platform.

A portmanteau of financial technology

[embedded content]

Financial technology, which is referred to as FinTech, illustrates the evolving intersection of financial services and technology. FinTech allows people to innovate while transacting business ranging from digital money to double-entry bookkeeping.

The lines between technology and the financial services are blurring

Since the advent of the internet revolution and later the mobile internet revolution, financial technology has grown multifold. Originally referred to   technology applied to the back office of banks or trading firms, FinTech now caters to a broad variety of technological interventions into personal and commercial finance.

According to EY’s FinTech Adoption Index, one-third of consumers leverage at least two or more FinTech services and more and more of these consumers are also aware of FinTech being a part of their daily lives.

FinTech encompasses the startups, technology companies or even legacy providers. Startups use technology to offer existing financial services at affordable costs and to provide new tech-driven solutions. Incumbent financial enterprises look to acquire or work with startups to drive digital innovation. Technology companies offer payment tools. All these can be seen as FinTech. Surely, the lines between technology and the financial services are blurring.

Origins of FinTech

infographics showing the history of FinTech with relevant icons against each yearSource: 16Best

In broad lines, the financial industry has seen a gargantuan shift over the years with the way it is leveraged in the times of rapid technological advancements. 16Best has compiled a brief history of FinTech which shows how the gap between financial services and the technology has got bridged over the years.

The gap between financial services and the technology has got bridged over the years.

In 1918, the Fedwire Funds service began offering electronic funds transfer. And while the Great Depression was ravaging the world’s economies, IBM provided some solace with its 801 Bank Proof Cach Machine that offered the means for faster cheque processing. Subsequently, credit cards and ATMs came into existence in the ‘50s and ‘60s.

In 1971, first all-electronic trading emerged in the form of NASDAQ. And in 1973, the SWIFT (Society for Worldwide Interbank Financial Telecommunications) built a unified messaging framework between banks for handling money movement.

1997 was the year which saw the emergence of mobile payment through Coca-Cola Vending Machine. Fast forward to 2000s and the present decade, a slew of innovations crashed into the finance sector with the introduction of digital wallets, contactless payments and cryptocurrencies.

FinTech is definitely re-inventing a quicker and more durable wheel as the world continues to witness a superabundance of new ventures refining financial services with technology.

Merits of FinTech

Bar graph showing statistics on different areas of FinTech

Financial technology has taken the financial services to a whole new level with a cluster of merits that it offers. Here are some of the major benefits of FinTech:

  • Robo Advisors: They are one of the biggest areas of FinTech. These online investment services put users through a slew of questions and then relies on algorithms to come up with an investment plan for them.
  • Online Lending: It encompasses all aspects of borrowing from personal loans to refinancing student loans which improves money lending.
  • Mobile payments: There is a growing demand for mobile payment options with the stupendous rise of mobile devices over the years.
Bar graph showing statistics on global mobile payment marketTotal revenue of global mobile payment market from 2015 to 2019 (in billion U.S. dollars) | Statista

Personal Finance and Savings: A plethora of FinTech organisations in the micro saving department have been helping people to save their change for rainy days and a whole lot of them rewarding customers for doing so. For instance, Digit allows you to automate the process of saving extra cash.

Bar graph showing statistics on personal financeSource: Statista

Online Banking and Budgeting: Online banks like Simple reward users for using their ‘automatic savings’ service and also offer a cost-effective option over a traditional bank. Leveraging online tools, they assist users to plan budgets and handle their money smartly from their mobile devices with minimal effort to meet their savings goals.

Insurance: New insurance models have been strengthening the FinTech space. Metromile, an insurance model, sells pay per mile car insurance.

Bar graph showing statistics on Insurtech industrySource: Statista

Regtech: Regulation Technology, which utilises IT to enhance regulatory processes, is one of the significant sectors where numerous FinTech app ideas have come into light around this domain. Regtech is useful for trading in financial markets, monitoring payment transactions and identification of clients among others. For instance, PassFort helps in standardising the online compliance processes.

How is Drupal powering FinTech?

Organisations offering FinTech solutions need to maintain a robust online presence. Drupal has been powering the landscape of FinTech with its enormous capabilities.

The launch of TPG Capital

Homepage of TPG Capital with a timelapse image of running cars on the road and trees in the background

TPG Capital is one of the major enterprise-level FinTech companies which has leveraged the power of Drupal 8.

One of the primary objectives for TPG’s marketing circuit was to harness the Drupal’s flexibility as a digital empowerment platform. They wanted the ability to make alterations to content on the fly and try out new messaging approaches. Simultaneously, the financial industry’s stringent legal and regulatory requirements called for a flexible TPG platform that would meet the specific needs of the sector thereby offering top-notch security.

Drupal came out as the right choice when it came to the CMS that would facilitate the TPG’s goal for mirroring their cutting-edge business practices and incorporate modern website design and branding.

A digital agency built a responsive, mobile-first site. It featured newer CSS features like Flexbox and CSS animations and minimised the site’s dependence on Compass by introducing auto prefixer. Moreover, Drupal 8 version of Swifttype was built for the search component and contributed back to the Drupal Community.

The launch of Tech Coast Angels

Homepage of Tech Coast Angels with two people working on their laptop

Tech Coast Angels are one of the biggest angel investment organisation in the US. 

Tech Coast Angels selected Drupal as their CMS of choice for its excellent features vis-à-vis user authentication, account management, roles and access control, custom dashboards, intricate web forms for membership and funding application, workflow management and email notifications.

Performance improvements were made by a digital agency to both the Drupal application and the server environments which brought down the costs to a huge extent by minimising the hardware requirements necessary to run the Drupal codebase in both staging and production environments.

With Drupal being one of the most security focussed CMSs, it helped a great deal in making amendments related to security of the site. Views caching were enabled and unnecessary modules were turned off on the production server.

Market trends

Bar graph showing global investments activity in FinTech companies

The Pulse of FinTech 2018 by KPMG shows that global investments activity in FinTech companies has been steadily rising with 2018 turning out as the most profitable year. It is only going to grow more in the coming years.

Infographics showing bubbles inside a box on the left and description on the right about the size of bubbles with respect to FinTech companies

In the coming years, the main trends in the asset and wealth management, banking, insurance and transactions and payments services industries can be seen in the illustration above.


FinTech is a great alternative to traditional banks. FinTech excels where traditional banks lag behind. In addition to offering robust financial services leveraging technological advancements, organisations offering FinTech solutions need to have a superb digital presence to offer a great digital experience. Drupal can be an awesome content store for an enterprise-level FinTech platform.

Drupal experts at Opensense Labs have been powering digital transformation pursuits of organisations offering a suite of services.

Contact us at [email protected] to build a FinTech web application for your business using Drupal.

Jun 21 2019
Jun 21

EU Cookie Compliance, one of the top 100 Drupal modules, is a Drupal module that offers a cookie consent banner with various features, making it more convenient for your site to become GDPR compliant. GDPR is the new data privacy regulation that came into effect on 25 May 2018 and it sets out to bolster the rights citizens of the EU have over their data which is held by companies. Ramsalt Lab is currently supporting and maintaining the module as part of our GDPR audit services.

According to GDPR, if you have any traffic from EU citizens on your site, you need to ask for consent before you, or third-party scripts, process any of their personal data.

One recurring GDPR feature request we’ve seen over the past few years has been to allow granularity in the cookie compliance consent, so that the user could accept or decline various cookie categories. This feature has now been added to the recently released versions 8.x-1.6 and 7.x-1.29. You can find the new consent method on the module settings page. To enable this feature, select “Opt-in with categories” as the consent method.

In this blog post, you can learn how to configure the EU Cookie Compliance banner to use GDPR categories, as well as how to use the categories in your code to track the user only when they give consent.

The different GDPR consent methods that the EU Cookie Compliance supports.

GDPR consent banner configuration

Choosing this consent method reveals an expanded set of fields named “Cookie Categories” that you can find beneath the “Consent method” options. Here you can set up your cookie categories and configure how the banner behaves. Let’s first look at the categories:

Field for GDPR cookie categories showing configuration where 4 categories are entered

Categories are entered using the following pattern: “key|label|description”. The description is optional. The above setup will result in the following EU Cookie Compliance consent banner:

The resulting GDPR cookie banner, with the categories "Strictly necessary", "Performance", "Functional" and "Advertising" showing.

This will result in a fairly large GDPR consent banner. Note that the banner appearance in EU Cookie Compliance is based on a Drupal theme template, so you could always create a theme specific template and for example place the descriptions on the same line as the title, or perhaps have the descriptions appear on hover if space is a concern. By default, the banner has two buttons when you use the category consent method: “Save preferences” and “Accept all cookies”.

Below the text field for cookie consent categories are some additional options. The first option, which is on by default allows you to replace the “Agree” button with the two “Save preferences” and “Accept all cookies” buttons. In addition to labeling the buttons, you can also choose to make the first option compulsory by choosing “Tick the first checkbox and mark it read-only”. You can also choose to “Tick all category checkboxes by default” to make it more convenient for the user to opt-in to cookie usage under GDPR.

Screenshot showing the configuration options for the cookie banner with categories.

Code usage

In order to let your site and javascript comply with the cookie preferences set by the visitor, you may have to write some custom code. Although EU Cookie Compliance has some options to whitelist cookies and block scripts, not all scripts are added to the page source using the standard Drupal methods and can be altered through f.ex hook_js_alter in Drupal 7 (which is what the module attempts to do).

EU Cookie Compliance has for years had a method you can call to check if the user has agreed to store cookies and processing their personal data:


This function will return true when consent is given, and false when the user has declined processing of their data.

With the newly introduced categories, you can call the same function with a parameter:


Where ‘category’ is one of the category keys that you have defined on the EU Cookie Compliance module settings page, for example:

if (Drupal.eu_cookie_compliance.hasAgreed('performance')) {
  // Load scripts that deal with performance.


Many high profile sites allow visitors to choose among categories when the visitors give consent to the processing of private data through cookies in their browser. Now your site can do offer the same granularity if you use a recent version of the EU Cookie Compliance module.

If you need help setting up your GDPR cookie banner, or have questions about how your site can become GDPR compliant, you can always get in touch with us at Ramsalt Lab through our contact page.

Jun 21 2019
Jun 21

Your website, like a king, should look good in any situation — and on any device that users might be accessing it from. Thankfully, there is responsive web design.

With responsive web design, all images, buttons, columns, and other layout elements change their size and position to adapt to the device dimensions. This creates the smoothest user experiences, as well as improves website performance.

A special reason to be happy is that responsive design in Drupal 8 is thriving. Drupal 8 has been built with mobile devices in mind. It has responsive default themes, responsive admin interfaces, and powerful opportunities for mobile-friendly design. Great Drupal 8 modules are very helpful in implementing any ideas in this area.

Responsive design

Drupal 8 core modules for responsive design

Of course, we need to start with the powerful built-in modules that arrived at the core with the release of Drupal 8 to everyone’s applause.


The Breakpoint module allows you to specify the breakpoints, for example, screen dimensions (minimum or maximum width), at which your website should start showing a different layout. The module is enabled out of the box in Drupal 8.

Breakpoints should be defined in the theme’s themename.breakpoints.yml file. Default themes like Bartik are known to be responsive out-of-box, so they already have this file with a set of ready breakpoints. For custom Drupal 8 themes or modules, this file needs to be created in the theme’s or module’s root directory.

Breakpoints in Drupal 8

The module manages the height, width, and resolution breakpoints. It enables modules and themes to use each other’s breakpoints.

Responsive Image

The Responsive Image module provides the appropriate image display for each breakpoint. The module is part of Drupal 8 core but needs to be enabled.

According to Drupal image style capabilities, images can be automatically scaled, cropped, resized, and so on, to be used in different scenarios. With the help of the Responsive Image module, these different image styles can be served for different devices based on breakpoints.

It’s just necessary to:

  • create the desired image styles in Configuration — Media — Image Styles

Image styles in Drupal 8

  • create a “Responsive image style” in Configuration — Media — Responsive Image Styles, choose the theme name in “Breakpoint group,” and assign image styles to breakpoints

Assign image style to breakpoints

  • assign the responsive image format to the image field of the desired content type in Structure — Content types — *Content type name* — Manage display

Assign responsive image format to image field

The Responsive Image module uses the HTML5 "picture" tag. It once used to be known as the Picture contributed module.

Contributed modules for responsive design in Drupal 8

Alongside the strong core features, there are contributed modules available in Drupal 8, each of which adds its own touch to responsive web design creation. Let’s review a few nice ones.

Simple Responsive Table

The Simple Responsive Table is a lightweight module that instantly makes Drupal website tables responsive. All that is needed to do is set the maximum screen width for which tables should be responsive. You can also optionally enable or disable this feature for Drupal admin pages.

Simple Responsive Table

Sidr: Responsive Menus

The Sidr: Responsive Menus module for Drupal 8 integrates a JavaScript plugin called Sidr, which is great for creating responsive side menus and more. The module should be installed together with the Sidr libraries.

With the help of this module, you can create configurable Sidr “trigger” blocks on your website. They can be placed anywhere in your theme region and configured to your liking. Their essence is that when a trigger is clicked, the Sidr side menu slides out or slides back in.

Sidr: Responsive Menus


The Viewport is a simple Drupal 8 module that offers a user interface for adding a viewport meta element to the HTML header. The viewport element instructs the browser on how to display the visible part of the page on the users’ screen. Viewport varies from device to device.

The Drupal Viewport module’s interface allows you to specify the viewport values and the pages for which the element should be added.

Viewport module Drupal 8

Juicebox HTML5 Responsive Image Galleries

Here is a nice module for creating responsive image galleries and sliders. The Juicebox HTML5 Responsive Image Galleries module integrates the famous Juicebox library. The library is known for its full responsiveness, touch gesture support, embedding features etc.

The module provides a field formatter and a views style plugin that allows image fields and Views to be formatted as Juicebox Galleries. It features multilingual support, integration with the Media module, search engine friendliness, and much more.

Juicebox HTML5 Responsive Image Galleries

Fulfill your responsive design ideas

Responsive design in Drupal 8 is easy for developers to set up and enjoyable for users to work with. So contact our Drupal team if you are interested in:

  • building a responsive theme for your Drupal 8 website
  • making your current theme responsive
  • configuring any responsive design modules
  • providing responsive layout for any elements on your website
  • migrating your website to Drupal 8 that has so much for responsive design

The era of convenient web is here!

Jun 21 2019
Jun 21

Burnout is becoming an increasingly prevalent problem, especially in a field as fast-paced as development. With more and more businesses undergoing a digital transformation, the demand for experienced developers has never been higher - and with it, naturally, come higher and higher demands from these developers.

This is further accentuated by the work- and career-oriented mentality we see widespread today. You can frequently spot people on social media either bragging or complaining about how hard or how long they’ve worked, but, even in the first case, such a workflow is certainly not sustainable. 

It’s true that more work yields more profit; but what good is profit when one’s mental health, and by consequence also physical health, suffer on account of work overload?

Another reason for burnout that should also be mentioned, besides excessive working hours, is a general dissatisfaction with how the work is done and a suboptimal workplace experience. 

In fact, we could argue that monotony or having very little control over one’s work is even more detrimental than working really long hours. Put the two together and you’re practically calling for burnout to arrive. 

In this post, we’ll explore how you can spot the symptoms of your developers burning out and how you can mitigate or even prevent developer burnout. 

In the first part, we’ll focus on the symptoms of burnout; in the second, we’ll take a look at how to reduce the risks of burnout as a developer, as well as what measures to take as a manager to reduce those risks in your team and mitigate burnout when it happens.

Symptoms of burnout - and how to spot them

Let’s start with the symptoms of burnout. Logically, it’s easier to spot these through self-reflection (e.g. you notice a lack of energy and/or motivation, you start suffering from headaches, etc.), but it’s even more crucial for managers to be able to spot them in their employees. So, let's take a look at what signs to look for as indicators that your developers are burning out.

  • They’re lacking energy and/or motivation: this is likely the most obvious symptom of burnout, but should nonetheless be mentioned. If you notice that certain developers on your team constantly seem sleepy and unmotivated, especially in a more hectic period, this should be a red flag that something is wrong.
  • They’re frequently late to work: in line with the previous point, sleepiness and late working hours may result in sleeping through morning alarms and consequently arriving late. The first instinct would be to scold or punish the person in question, but a deeper investigation may reveal other reasons for it - especially if they still seem lacking in energy after arriving late, and this happens on a relatively regular basis.
  • They’ve isolated themselves and stopped talking to coworkers: this can be difficult to spot in employees who are more introverted by nature, or those who work on specific projects that don’t require as much collaboration (or even disallow it altogether, e.g. when working under a very strict NDA). This means that you need to be extra mindful of these employees so that potential signs of their burnout don’t go overlooked. 
  • They’ve stopped participating at meetings: this point is similar to the previous one in that it concerns a kind of isolation. If someone is physically present at meetings, but “not really there” in the practical sense, it can either be because they have so much on their mind already, or because they’re too tired to actively participate. Both of these can be signs of burnout. 
  • The quality of their work has decreased: if you notice an increase of bugs and mistakes in a certain developer’s code, or if they take longer than usual to solve relatively simple tasks that involve familiar technologies, this could indicate that they’re suffering from burnout. Make sure to thoroughly explore this possibility before you sanction them.

Granted, some of these are almost impossible to spot if you have a freelancer or a team of developers working for you remotely. In such a case, you should also look for the following indicators: a remote worker fails to do certain tasks, or delivers them very late, they stop responding to calls and direct messages, they fail to track their time, etc. 

A word of warning, though: most of the points we’ve discussed here can be indicators of other issues, not necessarily burnout, but also personal issues such as family troubles and health issues (but, again, these could be the result of burnout, so it’s a bit of a “chicken-and-egg” situation). 

Nevertheless, if you are an open company that has a healthy company culture and a pretty good grasp of the goings-on in the lives of your employees (without being too Big Brother-y, of course), you can assume these are symptoms of burnout - especially if they start appearing in periods that demand more, or more difficult, work than usually. 

As a manager or a CEO of a smaller company, you need to communicate frequently and clearly with your subordinates and establish a trusting relationship with them. This will make it more likely that they’ll be willing to open up to you about their work and any difficulties they might be facing, and getting to know them will help you spot that something is off.

This holds true for teammates as well - be mindful of changes in your coworkers’ behavior that may indicate that they are overworked and on a path towards burnout. It’s much easier to spot something when you’re aware of it and know what you’re looking for. 

A very useful tool for collecting feedback from your employees, which we at Agiledrop also make good use of, is Officevibe. By guaranteeing anonymity, it gives those individuals who don’t want to expose themselves a chance to voice their opinions and/or dissatisfactions. With it, you’ll be able to get honest feedback and therefore a better overview of your team.

How to prevent or mitigate burnout

Well, the first thing you can do to deal with burnout is to know how to spot it - we already discussed this in the previous section. The problem here is that this is only possible once someone is already suffering from burnout, so it’s not really a preventive measure. 

In this second part of the post, we’ll take a look at some ways of effectively preventing burnout and also dealing with it when it does occur. We’ll start with what you can do to prevent yourself from burning out and how to recover from burnout; while this is primarily aimed at developers, it can apply to anyone, in particular everyone working in the digital. 

What you can do as a developer

  • Find a job you enjoy doing at a company which respects you: this is some of the best advice even outside the context of burnout and is as such a no-brainer. If you enjoy your work and get a sense of accomplishment out of it, even longer working hours become less of a problem. In contrast, doing something you don’t enjoy or take pride in will likely lead to burnout even with a regular 8-hour workday. 
  • Understand that some days are harder than others: if you expect too much from yourself and always want to give 110%, you’re setting yourself up for dissatisfaction. Don’t beat yourself up if you perform a little less optimally on certain days. If you maintain an overall high quality of your work, your manager will know that you’ll more than compensate on other days. 
  • Don’t bite off more than you can chew: this coincides with the previous point to some extent. If you want to please everyone, people start to take advantage of that, often completely subconsciously. Things then quickly pile up and, before you know it, you’re swamped with tasks that give you less time to do the really important things, resulting in worrying and the inability to separate work from your personal life.
  • Maintain healthy habits: this helps both with preventing burnout as well as alleviating it once it’s already there. If you eat well and get enough sleep and exercise, you’ll be able to start each day fresh enough to tackle your daily tasks even in the more hectic periods. When you feel that you’re already burning out, you can do a lot by reestablishing a healthy sleep cycle and taking a short exercise break during your work. 

The bottom line is essentially this: the better you feel, the less likely you are to burn out. If you take proper care of yourself and enjoy what you do and the workplace experience in general, you’ll have already greatly diminished the chances of burnout occurring. 

Know your limits and remember that your company also benefits from you putting yourself first, so don’t overwork yourself in the belief that it’s beneficial to business. Chronic fatigue can be a very nasty thing - it’s relatively innocuous, but stubbornly everpresent. In extreme cases, it can even lead to short- or long-term illness, paving the way for even more health issues down the road. 

What you can do as a manager / CEO

Ok, we’ve outlined some of the things you can do to prevent yourself from burning out. Let’s now take a look at what measures to take as a manager to reduce the risks of burnout occurring in your team or, if it does occur, how to at least alleviate it. 

  • Provide a good working environment: naturally, employee well-being starts with a pleasant working environment. This includes healthy snacks, coffee, an agreeable atmosphere and good working conditions. A very important thing here is ergonomic equipment, which goes a long way towards improving at least the physical health of your employees.
  • Encourage and allow exercise: unfortunately, even ergonomic desks and eye-friendly displays aren’t enough for someone who has to spend countless hours hunched over their keyboard. You should encourage exercise, in and outside the workplace; it doesn’t have to be long, just something that stretches the muscles (especially the back!) and breaks the monotony. 
  • Allocate certain times of the day for breaks: you can connect this to the previous point - allow for short breaks in the workplace which developers can use either to get coffee, some exercise or for a non-work-related chat among colleagues. This should be available on a daily basis.
  • Organize teambuilding activities that encourage interaction and participation without forcing them: for longer stretches of time, organize events and teambuilding activities that bring the whole team together. We at Agiledrop frequently have common themed lunches, short presentations by developers on specific topics (not obligatory in any way, but always rewarded), group sports and other activities - next weekend, for example, we’re going kart racing! 
  • Motivate your employees with regular constructive feedback and praise for a job well done: lack of motivation in one’s work is one of the major causes of burnout. In contrast, feeling motivated and getting the deserved recognition can help weather through even the toughest days or weeks. If you acknowledge the hard work of your employees, you’re showing them that their extra effort is appreciated and not simply taken for granted. 
  • Reduce overtime and weekend work: in a perfect world, we’d all have weekends to ourselves, reserved for some quality family time or simply a break from a hard week’s work. Sadly, though, industry demands make the total elimination of overtime a hopeful utopia. At Agiledrop, we understand how crucial this time-off is for our employees and consequently to our overall work culture. We try to keep overtime to a minimum; even when it’s necessary, we coordinate it with the developer well beforehand. 
  • Allow for flexible working arrangements: for someone working on-site, the opportunity to work from home every once in a while can be extremely rejuvenating, especially in a period with a lot of work where the commute itself is already exhausting. But, be careful: while working remotely can mitigate burnout, it can also accentuate it, as the lines between work and free time become more blurred, especially for individuals who are very work-oriented. Ben Robertson of Mediacurrent has recently written about his very efficient solution to dealing with this.
  • Ensure a healthy work-life balance of your employees: while a lot of the points in this section are directly tied to this, a healthy balance between work and free time is so vital to preventing burnout that we believe it deserves its own slot. Guaranteeing our employees’ happiness and ensuring this balance are among our top priorities at Agiledrop. We wrote briefly about work-life balance and motivating our team in this blog post


While burnout is admittedly a persistent problem, there exist a number of ways of effectively preventing and tackling it. Being aware of it and implementing preventive measures into your very work culture is already half the battle. 

We hope we were able to shed some light on the issue of burnout and provided some guidelines, or at least inspiration, to counteract it. Have any more ideas on how to deal with developer burnout? Or have you spotted other symptoms of burnout in yourself or your team? If we missed something, please let us know! 

Jun 21 2019
Jun 21

"Information is a source of learning. But unless it is organized, processed, and available to the right people in a format for decision making, it is a burden, not a benefit." - C. William Pollard, Chairman, Fairwyn Investment Company

Have you always secretly wanted to spend your evenings writing symphonies, learning about filmography or assessing climate change? Studying niche subjects have traditionally been for niche students. But e-learning platforms have changed all that with the provision for learning almost any subject online.

A student in the front and two behind him sitting on their chairs with a paper and a pen in their hands

Corporate e-learning has witnessed a stupendous 900% growth in the last decade or so. With more and more e-learning platforms flourishing, organisations are striving to be the best to stand apart from the rest. Drupal has been a great asset in powering education and e-learning with its powerful capabilities that can help enterprises offer a wonderful digital experience. Let’s trace the roots of e-learning before diving deep into the ocean of possibilities with Drupal for building an amazing e-learning platform.

Before the internet era

Infographic with ten rows, icons and text showing the timeline of e-learningSource: eFront

A brief history of e-learning can be traced through the compilation made by eFront. Even before the internet existed, distance education was being offered. In 1840, Isaac Pitman taught shorthand via correspondence where completed assignments were sent to him via mail and he would, then, send his students more work.

Fast forward to the 20th century, the first testing machine was invented in 1924 that enabled students to test themselves. The teaching machine was invented in 1954 by a Harvard professor for allowing schools to administer programmed instruction to students. In 1960, the first computer-based training program (CBT program) called Programmed Logic for Automated Teaching Operation (PLATO).

At a CBT systems seminar in 1999, the term ‘e-learning’ was first utilised. Eventually, with internet and computers becoming the core of businesses, the 2000s saw the adoption of e-learning by organisations to train employees. Today, a plenitude of e-learning solutions are available in the form of MOOCs (Massive Open Online Courses), Social platforms and Learning Management System among others.

E-learning: Learn anywhere, anytime

In essence, e-learning refers to the computer-based educational tool or system that allows you to learn anywhere and at any time. It is the online method of building skills and knowledge across the complete workforce and with customers and partners. It comes with numerous formats like the self-paced courses, virtual live classrooms or informal learning.

E-learning refers to the computer-based educational tool or system that allows you to learn anywhere and at any time

Technological advancements have diminished the geographical gap with the use of tools that can make you feel as if you are inside the classroom. E-learning provides the ability to share material in all sorts of formats such as videos, slideshows, and PDFs. It is possible to conduct webinars (live online classes) and communicate with professors via chat and message forums.

There is a superabundance of different e-learning systems (otherwise known as Learning Management Systems or LMS) and methods which enable the courses to be delivered. With the right kind of tools, several processes can be automated like the marking of tests or the creation of engrossing content. E-learning offers the learners with the ability to fit learning around their lifestyles thereby enabling even the busiest of persons to further a career and gain new qualifications.

Merits and Demerits

Some of the major benefits are outlined below:

  • No restrictions: E-learning facilitates learning without having to organise when and where everyone, who is interested in learning a course, can be present.
  • Interactive and fun: Designing a course to make it interactive and fun with the use of multimedia or gamification enhances engagement and the relative lifetime of the course.
  • Affordable: E-learning is cost-effective. For instance, while textbooks can become obsolete, the need to perpetually acquire new editions by paying exorbitant amounts of money is not present in e-learning.

Some of the concerns that are needed to be taken care of:

  • Practical skills: It is considered tougher to pick up skills like building a wooden table, pottery, and car engineering from online resources as these require hands-on experience.
  • Secludedness: Although e-learning enables a person to remotely access a classroom in his or her own time, learners may feel a sense of isolation. Tools such as video conferencing, social media and discussion forums can allow them to actively engage with professors or other students.
  • Health concerns: With the mandatory need of a computer or mobile devices, health-related issues like eyestrain, bad posture, and other physical problems may be troublesome. However, sending out proper guidelines beforehand to the learner like correct sitting posture, desk height, and recommendations for regular breaks can be done.

Building Yardstick LMS with Drupal

OpenSense Labs built Yardstick LMS, a learning management system, for Yardstick Educational Initiatives which caters to the students of various schools of Dubai.

Homepage of Yardstick LMS with logos of schools containing leaves, candle, open books, and firestickYardstick LMS Homepage

The architecture of the project involved a lot of custom development:

1. Yardstick Core

This is the core module of the Yardstick LMS where the process of creating, updating and deleting the nodes take place.

2. Yardstick Quiz

We built this custom module for the whole functionality of the quiz component. It generates a quiz, quiz palette and quiz report after quiz completion based upon the validation of the visibility of the report.

Quiz report of Yardstick LMS with table consisting of columns showing the list of schools, students and grades.

We could generate three kinds of reports: 

  • An individual-level quiz where one’s performance is evaluated
  • A sectional-level report where performance for each section is evaluated
  • Grade-level report where performance for all the sections is compared and evaluated.

For the quiz, we had different sub-components like questions, options, marks, the average time to answer, learning objective, skill level score, and concept. The same question could be used for different quiz thereby minimising the redundancy of the data. Also, image, video or text could be added for questions.

Subcomponents of yardstick LMS with a tabular column for assessing the learning objective and two of the metrics coloured yellow and red.

3. Yardstick Bulk User Import

This module was built to assist the administrators in creating users all at once by importing a CSV file. Also, there is an option to send invitation mail to all the users with login credentials.

Message box for importing users with a blank box and a submit button

4. Yardstick Custom Login

We provided a custom login feature where same login credentials could be used to log into the Yardstick system. That is, we provided an endpoint for verifying the login credentials and upon success, users were logged in.

5. Yardstick Validation

This module offers all the validation across the site whether it is related to access permission or some time validation.

6. Yardstick Challenge

It offers the user an option to submit a task which is assigned to them where they are provided with text area and file upload widget.

Yardstick LMS has an intricate structure

On the end user side, there is a seamless flow but as we go deeper, it becomes challenging. Yardstick LMS has an intricate structure.

We had two kinds of login:

  • Normal login using Yardstick credentials
  • And the other for school-specific login like the Delhi Public School (DPS) users.
Flowchart with rectangles and circles of different colours explaining Yardstick LMS custom loginYardstick LMS custom login for DPS users

For DPS users, we used the same login form but a different functionality for validating credentials. DPS school gave us an endpoint where we sent a POST request with username and password. If the username and password were correct, then that endpoint returned the user information.

If the username was received, we checked on our Yardstick system if the username exists. If it does not exist, then we programmatically created a new user with the information that we received from the endpoint and created a user session. And if does exist, then we updated the password on our system.

Yardstick LMS is designed to govern multiple schools at the same time

We designed Yardstick LMS in such a way that multiple schools can be governed at the same time. All the students of various schools will be learning the same content thereby building uniformity.

The core part of our system dwells in the modules. The module is a content type that can store numerous information like components, concept, description, objective, syllabus among others. 

Several different components can be added like Task, Quiz, Video task, Extension, Feedback, Inspiration, pdf lesson plan, Real life application, and Scientific principles.

Yardstick LMS real-life application component page with an image showing animated human figures and atomic theory written above themYardstick LMS Real life application component page

Schools could opt for different modules for different grades. When a module was subscribed by a school, a clone module of the master module was created and the school copy was visible only to the school. School version could be modified by the school admin as per their needs and preferences. Master module remained the same. While creating a subscription, administrator had to provide the date so that the components were accessible to the students. School admin could set different dates to different components and only the components with past date were accessible.

Flow chart showing rectangles, squares and elliptical circle of different colours to explain module subscription to school in yardstick LMSFlow Diagram of module subscription to school

Also, we provided an option to create a dynamic feedback form for the modules for analysis. Yardstick Admin had the option to design and create a feedback form as per their requirement and could assign it to a particular module. Different types of elements could be utilised for designing the form like rating, captcha, email, range slider, text field, checkboxes, radio buttons and so on.

Message box showing star icons, a blank box and a submit button

Students and teachers need to submit their feedback for each of the modules. On the basis of this, Yardstick team try to improve the content of the system.

Session evaluation page of yardstick LMS with a set of questions on the left and different options on the right and a blank box at the bottom

Also, various roles were defined for users such as Yardstick Administrator, School Administrator, Teacher, and Student.

1. Yardstick Admin

Yardstick Admin can perform all the operations. He or she can create new users, grant permissions and revoke them as well.

2. School Admin

It has the provision for handling all the operation which are only related to their school. School Admin handles the modules and their components and can import user for their school. All school reports and task submissions are visible to School Admins.

3. Teachers

Teachers can view modules and components assigned to their classes and provide remarks to the students for multiple components and they can view all kinds of reports.

4. Students

They can attempt quiz, submit tasks, view components and view their own reports.

What’s the future of e-learning?

According to a report on Research and Markets, the e-learning market is anticipated to generate revenue of $65.41 billion by 2023 with a growth rate of 7.07% during the forecast period.

The report goes on to state that with the advent of cloud infrastructure, peer-to-peer problem solving and open content creation, more business opportunities would pop up for service providers in the global e-learning market. The introduction of cloud-based learning and AR/VR mobile-based learning will be a major factor in driving the growth of e-learning.

The growth of the e-learning market is due to the learning process enhancements in the academic sector

According to Technavio, the growth of the market is due to the learning process enhancements in the academic sector.

Infographic showing statistics on e-learning market with icons representing bar graph, speedometer, horizontal lines, and a bulbGlobal self-paced e-learning market 2019-2023 | Source: Technavio

Following are major trends to look forward to:

  • Microlearning, which emphasises on the design of microlearning activities through micro-steps in digital media environments, will be on the rise.
  • Gamification, which is the use of game thinking and game mechanics in a non-game context to keep the users engrossed and help them solve more problems, will see increased adoption rates.
  • Personalised learning, which is the tailoring of pedagogy, curriculum and learning environments to meet the demands of learners, can be a driving force.
  • Automatic learning, like the one shown in the movie The Matrix where a person is strapped onto a high-tech chair and a series of martial arts training programs are downloaded into his brain, can be a possibility.


It’s a world which is replete with possibilities. As one of the most intelligent species to walk on this earth, we perpetually innovate with the way we want to lead a better lifestyle. We learn new things to gain more knowledge. And in the process, we find ways of improving our learning experience. E-learning is one such tech marvel that promises to be a force to reckon with. It is not a disrupting technology but something that is going to get bigger and bigger in the years to come.

As a content management framework, Drupal offers a magnificent platform to build a robust e-learning system. With years of experience in Drupal Development, OpenSense Labs can help in providing an amazing digital experience. 

Contact us at [email protected] to build an e-learning system using Drupal and transform the educational experience.

Jun 21 2019
Jun 21

I am working with a customer now that is looking to go through a JSON:API upgrade, from version 1.x on Drupal 8.6.x to 2.x and then ultimately to Drupal 8.7.x (where it is bundled into core).

As this upgrade will involve many moving parts, and it is critical to not break any existing integrations (e.g. mobile applications etc), having basic end-to-end tests over the API endpoints is essential.

In the past I have written a lot about CasperJS, and since then a number of more modern frameworks have emerged for end-to-end testing. For the last year or so, I have been involved with Cypress.

I won't go too much in depth about Cypress in this blog post (I will likely post more in the coming months), instead I want to focus specifically on JSON:API testing using Cypress.

In this basic test, I just wanted to hit some known valid endpoints, and ensure the response was roughly OK.

Rather than have to rinse and repeat a lot of boiler plate code for every API end point, I wrote a custom Cypress command, to which abstracts all of this away in a convenient function.

Below is what the spec file looks like (the test definition), it is very clean, and is mostly just the JSON:API paths.

describe('JSON:API tests.', () => {

    it('Agents JSON:API tests.', () => {
        cy.expectValidJsonWithMinimumLength('/jsonapi/node/agent?_format=json&include=field_agent_containers,field_agent_containers.field_cont_storage_conditions&page[limit]=18', 6);
        cy.expectValidJsonWithMinimumLength('/jsonapi/node/agent?_format=json&include=field_agent_containers,field_agent_containers.field_cont_storage_conditions&page[limit]=18&page[offset]=72', 0);
    it('Episodes JSON:API tests.', () => {
        cy.expectValidJsonWithMinimumLength('/jsonapi/node/episode?fields[file--file]=uri,url&filter[field_episode_podcast.nid][value]=4976&include=field_episode_podcast,field_episode_audio,field_episode_audio.field_media_audio_file,field_episode_audio.thumbnail,field_image,field_image.image', 6);


And as for the custom function implementation, it is fairly straight forward. Basic tests are done like:

  • Ensure the response is an HTTP 200
  • Ensure the content-type is valid for JSON:API
  • Ensure there is a response body and it is valid JSON
  • Enforce a minimum number of entities you expect to be returned
  • Check for certain properties in those returned entities.
Cypress.Commands.add('expectValidJsonWithMinimumLength', (url, length) => {
    return cy.request({
        method: 'GET',
        url: url,
        followRedirect: false,
        headers: {
            'accept': 'application/json'
    .then((response) => {
        // Parse JSON the body.
        let body = JSON.parse(response.body);

        // Ensure certain properties are present.
        body.data.forEach(function (item) {
            expect(item).to.have.all.keys('type', 'id', 'attributes', 'relationships', 'links');
            ['changed', 'created', 'default_langcode', 'langcode', 'moderation_state', 'nid', 'path', 'promote', 'revision_log', 'revision_timestamp', 'status', 'sticky', 'title', 'uuid', 'vid'].forEach((key) => {


Some of the neat things in this function is that it does log the parsed JSON response with cy.log(body); this allows you to inspect the response in Chrome. This allows you to extend the test function rather easily to meet you own needs (as you can see the full entity properties and fields.

Cypress with a GUI can show you detailed log information

Using Cypress is like having an extra pair of eyes on the Drupal upgrade. Over time Cypress will end up saving us a lot of developer time (and therefore money). The tests will be in place forever, and so regressions can be spotted much sooner (ideally in local development) and therefore fixed much faster.

If you do JSON:API testing with Cypress I would be keen to know if you have any tips and tricks.

Jun 20 2019
Jun 20

We just moved our Drupal site to DigitalOcean and powered it with fully open-source, Kubernetes infrastructure that you could be using too. This is thrilling for us, and will be for you too!

Kubernetes Blog Header

A Little Background

Our very own Tess has been giving the session, “Return of the Clustering: Kubernetes for Drupal” during the last few months at Drupal camps across the U.S. In it she explains how it’s theoretically possible to deploy Drupal in production on a Kubernetes infrastructure. Drupal and Kubernetes don’t naturally play together, but we’ve done some serious work in devising a solution in which they would. For the last six months, Tess has been deep in research and development testing a solution, and last week we were confident enough to launch our own TEN7 site using it. 

Why is This a Big Deal?

Running a Drupal site on Docker in a production environment using open sourced Kubernetes  object descriptors has never been done before—not until now, and it’s all open source.  

“For the longest time, we’ve had a disjunction between what we use to develop sites locally, test sites locally, and what ends up on production environment,” said Tess. “It happens a lot, it’s difficult to get it to be the same thing. You need many more bits of technology, best practices, and discipline to pull it off. Kubernetes is becoming the de facto clustering standard, and they run Docker containers. We already do that locally. We’ve invested time and effort into developing those containers so they run in production.”

Using Kubernetes also solves a problem with scalability on VPS (Virtual Private Server) and shared hosting. “There’s a happy trough in the price curve for hosting at the far end,” said Tess. “If you don’t need the hosting to do much, you can do a lot for very little. But as soon as you get more traffic and need it to do more things, it gets really expensive.” 

“If your only choice is to make the server bigger, that has exponential cost. If you wanted to avoid that, you can scale out instead of scaling up. If you scale out, you need technology to have servers to coordinate with each other. That’s where Kubernetes comes in: it orchestrates the containers on the servers in a timely and flexible fashion.” 

You used to need hosting companies to do the hard work of infrastructure and container orchestration, but Kubernetes does all of the hard work for you. “You don’t have to build cluster orchestration, and you don't have to solve complex problems,” said Tess.

We still needed a partner to furnish the Kubernetes instance, and we chose DigitalOcean. They were one of the first companies to offer Kubernetes infrastructure. “DigitalOcean support for Kubernetes is impressive,” said Tess. “I didn’t expect a hosting company to offer that amount of flexibility, versatility and support versus the cost. We could do this without DigitalOcean, but we really like them. They’re more approachable than Google.”

Why This is Awesome for You

The success of this solution means we can roll out Kubernetes-based Drupal site hosting for our clients. And because we’ve open sourced the description and setup of the clustering itself, you could do it for yourself and your own clients too!

More Control Over Your Site and Fewer Hosting Limitations

The hosting on which your website code resides is the silent partner of your website, and it can either enable your website to be powerful, or curtail its development. 

Agencies that build websites typically don’t do the hosting for clients; they usually just farm it out to hosting companies with whom they have a business relationship. But your website will pay the price if the hosting isn’t up to snuff. “There are a lot of things that you can’t do with some of the popular hosting companies,” said Tess. “If you want certain capabilities, you might get into the ‘if you have to ask you can’t afford it’ category.” 

“Even if the providers let you do certain things, they might make it so you have to modify Drupal in ways to make it work on that particular host,” said Tess. “As a result, it won’t work well elsewhere. We call this ‘vendor lock.’” 

What we’ve done is create an open-source clustering standard that isn’t tied to hosting. “We're using open source containers and orchestration, and Kubernetes has a vendor isolation layer built in,” said Tess. “All this allows you to avoid vendor lock entirely! Our partner DigitalOcean furnishes the Kubernetes instance and they’ve installed the infrastructure around it. There’s nothing vendor-specific about it. We’re just allocating the cluster.” We use their object store called Spaces for file storage, but you could use any other S3 compatible object store on the market.

This Solution Helps Us Help You

The benefit of Kubernetes-based hosting for TEN7 clients is huge: “We can offer purely open source hosting that provides you top-tier hosting functionality, and we can do that at a lower price point than our competitors can,” said Ivan Stegic. “What we’re offering comparatively blows a lot of other agencies out of the water. For a comparable price, we can offer more scalability, bandwidth and versatility, which means we can do more ambitious sites. We’ll also have better tuning and finer control over the environment, allowing us to support our clients better.” 

Using this Kubernetes solution also aligns with TEN7’s love of open source products. “We want to be independent, and using a hosting solution that is supported in the open source and is vendor agnostic, which aligns with our commitment to open-source products and services,” says Ivan Stegic. 

You Could Host It Yourself Too (and We Won’t Be Offended)

We have long relationships with our clients, but if at some point they want to do their own Kubernetes hosting in the future, they can! They can pull the same containers and workflow we’ve been using, and put it on their own Kubernetes host. Since we’ve already architected the hosting, reusing our solution will be easier. “You don’t need to be nearly as much of an architect as I had to be in the first place!” Tess said.

We’d Love to Care for Your Site

We’ll be rolling out this solution to existing TEN7 Care clients over the next few months. In the future, we’ll experiment in setting up a Flight Deck cluster, for people to set up Kubernetes hosting for themselves!

Drop us a note if you’d like TEN7 to care for your Drupal site!

Jun 20 2019
Jun 20

For years, community members from Chattanooga talked about their local camp. These community members routinely support other camps, through attendance, volunteerism, and by giving talks. It was our time to return the favor.

Hook 42 not only sponsored the event, but delivered a training and two sessions. From our team Jonathan and Adam attended, and they really enjoyed the time there.

Adam’s Experience

I was grateful to have the opportunity to deliver a full-day training on GatsbyJS on Friday and one of the featured talks on Saturday. I want to recognize my training peer Ryan Bateman who helped out with many of the preparations for the training. I also want to thank attendees who came to either. 

The training was an end-to-end GatsbyJS primer. We set up a Pantheon instance running Umami. We walked through a series of primers and hands on lessons. Most in the room were able to deliver a working Gatsby recipe site to Netlify. It was fun to cover so much material and watch people go from nothing to a functional site. Feedback was positive and it was very helpful to have the super fast Chattanooga internet speeds.

I prepared a brand new talk entitled “Evolving Priorities: Tech, Community, and Impact.” I looked at topics like technical skills, emphasizing the needs of people, and changing our individual frame of reference to what has an impact on the world. I also shared some thoughts on the evolution of Drupal, both from a community and a product. I appreciated those who attended and subsequently gave me feedback for future improvements.

Many people from other close by camps were able to attend. It was so nice to see friends from Asheville and Atlanta to show their support for the deserving Chattanooga crew. Doug Vann, Mike Herchel, Aaron Feledy, and Jordana Fung, among others, also attended from the broader community. It was great spending time with everyone.

I found the camp to be friendly and represent the spirit of those giving back to the Drupal community. Organizers selflessly volunteered their time and committed to helping their guests have a wonderful time. In particular, I was able to go to Rembrandt coffee, Freemont (burger and craft beer night), and Heaven and Ales brew pub. It was a beautiful area with green scenery and beautiful waterways.

Jonathan's Experience

And so we meet again. 2019 was my 2nd year at Drupal Camp Chattanooga, and it was even better than the first. Hanging out with the locals and those visiting from other areas is one of my favorite parts of attending a Drupal Camp. Last year I had to rush home and didn’t get much of a chance to get the full experience, but this year was different in all the best ways.

We started the camp off right with a game night at Code Journeymen’s offices and had a rambunctious night of accusing people of fascism while enjoying each other’s company. It was a welcoming and comfortable atmosphere that, as a camp co-organizer myself, I admired greatly.

After I had a short adventure of being lost in the parking lot, the camp itself seemed to go off without a hitch. They had a lot of really great presentations. I evolved my priorities with Adam, learned about fixing my mistakes as a developer with Jordana Fung, finally got to see Mike Herchel’s Front-end Performance talk, and over lunch looked at some code and talked about custom composite/rich fields with Hawkeye Tenderwolf. It was great times all around.

It was also a great enjoyment to have the opportunity to give my presentation, Glitch: Love to Learn the web again, as the Glitch product and community are a topic I’m very excited about. Reception of the talk seemed to be good as well. There were multiple outstanding questions that I tried my best to answer, and I even remembered to repeat one of them back on microphone for the recording. Otherwise, it was basically a blur of me gushing over Glitch. Check it out!

After camp wrapped up, we were off to the arcade. Rather, a pinball museum, where we played some games older than anyone I’ve ever met and played on another machine that had to weigh over 1,000lbs. We enjoyed a round of pizzas and beverages before hitting the town, exploring a few of Chattanooga’s secrets.

All-in-all, what a great camp experience. As a co-organizer of Drupal Camp Asheville I have some sense of what it takes to make a camp happen, and those Chattanooga folk make the hard work look easy. I can’t recommend enough that you try to attend Drupal Camp Chattanooga 2020.

*Image taken at Drupal Camp Chattanooga, borrowed from Twitter.

Jun 20 2019
Jun 20

What does Drupal 8 do that Laravel does not? What key functionalities, that Drupal ships with, do you need to build from scratch in Laravel? And how would opting for Laravel benefit your specific type of project? In short: Laravel or Drupal 8?

“It's like comparing apples to oranges” some might say since one's a framework and the other one a CMS.

Even so, if it's unclear to you what are their particular use cases and their built-in features, you can't know whether it's a CMS or a framework that best suits your project type, right? That best serves your project-specific needs:

  • to be super fast
  • to leverage a solid, off-the-shelf content management system for publishing different pieces of content on the website
  • to feature an easy to scale database
  • to support multisite
  • to tap into robust user and content management features that are already implemented
  • to be built on top of a solid framework acting as a reliable back-end application
  • to leverage a highly intuitive admin user interface
  • to be 101% secure
  • to leverage a mixture of server and client-side logic

Now, keep your list of project requirements and constraints at hand to evaluate these 2 technologies' pros and cons against it:

1. Drupal 8: Top Benefits, Main Drawbacks, and Specific Use Cases

If a robust user and content management system is critical for your project, then Drupal 8 makes the smartest choice. It's that “thing” that Drupal excels at that, which would take you a whole lot more time to do in Laravel.

And it's not just its robustness that might “lure you in”, but the level of convenience that it provides: a lot of the essential features and functionalities that you might need are already built-in.

Moreover, you can easily manage them and custom-tune them via your admin interface...

By comparison, you'd need to build these functionalities, from the ground up, if you chose to go with Laravel.

Top benefits:

  • you can rest assured that your website runs on a particularly robust, Symfony-based CMS
  • there's a huge, dedicated community backing it up
  • you get to create various content types, for different parts of your website, assigned with different roles; unlike basic CMSs, that only enable you to write... posts and to create new web pages
  • you can set up different editorial workflows and assign specific user roles, with fine-grained access control
  • you can always further extend its CMS-specific functionalities: extensibility is one of the strongest Drupal 8 benefits

Main drawbacks:

  • you do need a team of Drupal experts (senior-level preferably) to keep an eye on your Drupal 8 website/app and keep everything properly maintained
  • you can't get away with a “get it up and running and... move on” type of philosophy; Drupal 8 is a more of a long-term commitment: there's always a newly launched promising module to consider adding on, a new update to run...

Specific Use Cases for Drupal 8:

  • large-scale projects that depend on a robust and reliable content management system; one that withstands an intense, ongoing process of creating, editing and publishing lots of fresh content
  • Laravel or Drupal 8? Definitely the later if it's a multi-site, multi-language web project that you plan to develop; not only that it streamlines content publishing  across your whole network, but it significantly speeds up localization thanks to its server-side caching capabilities

It means that no matter the place on the globe where that your users might be located, they get to access your web pages and have them loaded... instantly.

2. Laravel: Pros, Cons, and Project Types that It's Best Suited For

Laravel stands out as a highly reputed, powerful PHP framework


  • maintainability is one of your biggest concerns
  • you're looking for a robust framework
  • you need to carry out your project fast enough
  • you need a framework that ships with all the latest functionalities

... then Laravel is what you need.

Top Benefits:

  • a fast-growing, devoted community
  • you can easily integrate LDAP authentication 
  • it leverages the Model-View-Controller architecture
  • it's just... fast
  • provides you with a great admin user interfaces
  • it “spoils” you with intiutive, beautifully written code
  • it ships with a heavy “toolbox”: scan through and pick the most suitable one(s) for your project
  • in-built code for social login and sending out emails
  • everything you might need to set up during the development process is right there, already integrated into your code: cron jobs, database queries, routes...

Main drawbacks:

  • more often than not identifying performance issues isn't that straightforward
  • upgrading to the latest version of Laravel can turn out to be quite a challenge: be prepared for “buggy scenarios” and for the need to rewrite code
  • you can't just jump straight to Laravel: learning the basics of OOPS first things first is a must

Specific Use Cases:

  • your project needs a back-end application (rather than an off-the-shelf CMS)
  • when the benefits of the MVC architecture (faster development process, suitable for large-scale projects, multiple views, etc.) are critical for the given project 
  • whenever you need to mix the client-side with server logic
  • whenever time factor is the main concern for you: you just need your project developed super fast

3. So... Laravel or Drupal 8? 

Now, I'm sure that you already anticipate my answer:

The choice depends strictly on your project requirement and objectives.

On your own hierarchy of priorities in terms of features and functionalities.

And depending on these key aspects, that should be clearly defined, one technology will benefit you over the other.

So... what type of project are you looking to build?

Photo by Raquel Martínez on Unsplash 

Jun 20 2019
Jun 20

We’ve been starting many of our projects using Acquia’s Lightning distribution. This gives a good, consistent starting point for and helps speed development through early adoption of features that are still-in-the-works for Drupal 8. Like other distributions, Lightning bundles Drupal Core with a set of contributed modules and pre-defined configuration.

While Lightning is a great base to start from, sometimes you want to deviate from the path it provides. Say for example you want to use a Paragraphs based system for page components, your client has a fairly complex custom publishing workflow, and you also have different constraints for managing roles. Out-of-the-box, Acquia Lightning has a number of features you may find yourself in conflict with. Things like Lightning Layout provide a landing page content type that may not fit the needs for the site. Lightning Roles has a fairly hard-coded set of assumptions for role generation. And while it is a good solution for many sites, Lightning Workflow may not always be the right fit.

You may find yourself tempted to uninstall these modules and delete the configuration they brought to the party, but things are not always that simple. Because of the inter-relationships and dependencies involved, simply uninstalling these modules may not be possible. Usually, all looks fine, then when it comes time for a deployment things fall apart quickly.

This is where sub-profiles can save the day. By creating a sub-profile of Acquia Lightning you can tweak Lightning’s out-of-the-box behavior and include or exclude modules to fit your needs. Sub-profiles inherit all of the code and configuration from the base profile they extend. This gives the developer the ability to take an install profile like Acquia Lightning and tweak it to fit her project’s needs. Creating a sub-profile can be as easy as defining it via a *.info.yml file.

In our example above, you may create a sub-profile like this:

name: 'example_profile'
type: profile
description: 'Lightning sub-profile'
core: '8.x'
type: profile
base profile: lightning
  - mytheme
  - seven
  - paragraphs
  - lightning_media
  - lightning_media_audio
  - lightning_media_video
  - lightning_roles
  - lightning_page
  - lightning_layout
  - lightning_landing_page

This profile includes dependencies we’re going to want, like Paragraphs – and excludes the things we want to manage ourselves. This helps ensure that when it comes time for deployment, you should get what you expect. You can create a sub-profile yourself by adding a directory and info.yml file in the “profiles” directory, or if you have Drupal Console and you’re using Acquia Lightning, you can follow Acquia’s instructions. This Drupal Console command in Lightning will walk you through a wizard to pick and choose modules you’d like to exclude.

Once you’ve created your new sub-profile, you can update your existing site to use this profile. First, edit your settings.php and update the ‘install_profile’ settings.

$settings['install_profile'] = 'example_profile';

Then, use Drush to make the profile active.

drush cset core.extension module.example_profile 0

Once your profile is active and in-use, you can export your configuration and continue development.

Jun 20 2019
Jun 20

Acquia Content Cloud, a new content-as-a-service solution for simplified content creation and syndication across multi-channel digital experiences, is now available in private beta.

Earlier this week at our Acquia Engage conference in London, Acquia announced a new product called "Content Cloud", a headless, SaaS-based content-as-a-service solution built on Drupal.

Years ago, we heard that organizations wanted to:

  • Create content that is easy to re-use across different channels, such as websites and mobile applications, email, digital screens, and more.

  • Use a content management system with a modern web service API that allows them to use their favorite front-end framework (e.g. React, Angular, Vue.js, etc) to build websites and digital experiences.

As a result, Acquia spent the last 5+ years helping to improve Drupal's web services capabilities and authoring experience.

But we also heard that organizations want to:

  • Use single repository to manage all their organization's content.
  • Make it really easy to synchronize content between all their Drupal sites.
  • Manage all content editors from a central place to enable centralized content governance and workflows.
  • Automate the installation, maintenance, and upgrades of their Drupal-based content repository.

All of the above becomes even more important as organizations scale the number of content creators, websites and applications. Many large organizations have to build and maintain hundreds of sites and manage hundreds of content creators.

So this week, at our European customer conference, we lifted the curtain on Acquia Content Cloud, a new Acquia product. Acquia Content Cloud is a content-as-a-service solution that enables simplified, headless content creation and syndication across multi-channel digital experiences.

For now, we are launching an early access beta program. If you’re interested in being considered for the beta or want to learn more as Content Cloud moves toward general availability, you can sign up here.

In time, I plan to write more about Content Cloud, especially as we get closer to its initial release. Until then, you can watch the Acquia Content Cloud teaser video below:

June 20, 2019

1 min read time

db db
Jun 19 2019
Jun 19

Earlier this month we launched a redesign of the Commonwealth Fund’s Health System Data Center, a platform for exploring state health system data through custom tables, graphs and maps. With interactive visualizations covering dozens of topics, roughly 100 indicators, and tens of thousands of individual metrics, the platform helps make underlying data actionable for advocates, policy makers, and journalists tackling healthcare system issues all over the country.

We used Drupal 8 to build the data center backend, and we used React and Highcharts to render its interactive charts and graphs. Drupal 8’s flexible entity storage system made it a perfect fit for housing the data. Its capabilities for leveraging third-party APIs and JavaScript libraries made integrating with React and Highcharts far simpler than other alternatives.

We’re all incredibly excited to see the Health System Data Center live. For us at Aten, this is the latest in a series of project launches dealing with data visualization. Along the way, we’ve been working on a collection of tools specifically tailored to the unique needs of data-intensive projects. Here are six Drupal 8 modules that help solve specific challenges when working with data. (Note that some of these are sandbox modules. While sandbox modules don’t have official releases, you can still download the code, try them out, and of course, get involved in the issue queue!)

Six Drupal Modules for Working with Datasets


We’ve worked on a lot of data projects that use a common architecture. Typically, projects include a collection of Datasets, each of which references a variable number of specific Indicators and Metrics. This module provides custom entities and related functionality for quickly deploying this common architecture.

JS Entity

When embedding multiple instances of a Javascript application on a page (in this specific case, a React app), we often need a way to very quickly pass data to the DOM. This module provides a configurable approach for defining which fields should be passed directly to Drupal’s JavaScript API for each specific view mode. It also offers a number of configuration options, including the ability to rename properties (or field names) to match what your application is looking for.

JS Component

Here at Aten, data projects often involve dynamic visualizations built as JavaScript applications (specifically with React or Vue) that are both embedded within a page rendered by Drupal and leverage data stored in Drupal’s entity system. This module provides an easy way for developers to define JavaScript apps entirely in YAML configuration files, which are exposed in Drupal automatically as blocks. Since they are ultimately just blocks, defined applications can be added to pages by any of the typical means.

MarkJS Search

We often need a way for users to quickly search through a lengthy list of indicators. This module provides fast, responsive highlighting and filtering for search input by leveraging the 3rd-party Mark.js JavaScript library.

Entity Importer

Site owners need a way to keep data accurate, relevant and up-to-date. This module provides a drag-and-drop interface for Drupal’s migrate functionality, making it easy to upload datasets as a series of CSV files. (Learn more from an earlier post: Entity Import: A User Interface for Drupal 8 Migrations.)

Entity Extra Field

When working with JavaScript applications exposed in Drupal as custom blocks, we often want a way to push those blocks directly into the node view page. This module provides a way for site builders to define Extra Fields on entities, which can be blocks, views, or tokens. Extra Fields can be placed and rearranged like any other entity field. (Entity Extra Fields module leverages Drupal’s “Extra Field” system. To learn more about Extra Fields, read Placing Components with Drupal's Extra Fields).

Let’s Talk

If you’re considering a data project for your organization and having trouble getting started, we’d love to help – whether that means talking through long-term goals, responding to a formal RFP, or anything in between. Get in touch and let’s talk about your data.

Jun 19 2019
Jun 19

Your browser does not support the audio element. TEN7-Podcast-Ep-062-2019-Flyover-Camp.mp3

Our frequent DrupalCamp attender and speaker, DevOps Tess Flynn, returns to the podcast to recap her recent experience at Flyover Camp, a brand new Drupal camp in Kansas City, Missouri.

Host: Ivan Stegic
Guest: Tess Flynn, DevOps Engineer at TEN7

Podcast highlights: 

  • We in the midwest totally own the “flyover” jokes!
  • The continuing diversity in camp talks (business, self-care, human focus tracks)
  • Tess reviews both her talks (Return of the Clustering: Kubernetes for Drupal, and Health Check Your Site)
  • How you should stretch your mind to prepare for all the rapid-fire information you get in the Kubernetes talk!
  • Location, location, location is as important for conference talks as it is for real estate
  • Listen to Ivan and Tess geek out over the Raspberry Pi session



IVAN STEGIC: Hey everyone you're listening to the TEN7 Podcast, where we get together every fortnight and sometimes more often, to talk about technology, business, and the humans in it. I'm your host Ivan Stegic. Let's talk about Drupal Flyover Camp 2019, that happened from Friday the 31st of May to Sunday, the 2nd of June, in Kansas City. Joining me to give her thoughts is socketwench. That's wench, not wrench. Welcome back to the podcast.


IVAN: Now, did I say it the right way, because I know you always have a specific way of saying it when you give your intro to socketwench.

TESS: Well, that’s pretty close. That works.

IVAN: Close? Okay. Good. So, you were at a Flyover Camp. What's in a name? I just love how Flyover Camp were poking fun at themselves in Kansas. I mean, we're pretty much in flyover land here in Minneapolis too, so I totally get it.

TESS: [laughing] So let's first frame what that is because if we're having international listeners, they might not get what the reference is.

IVAN: Good idea.

TESS: So, the thing that goes with it is, if you're from the Midwest you're considered in flyover country. And the reason why is because the joke goes, that there is nothing in the United States that's of interest unless if you're on either coast, which is actually completely untrue. However, that is what a lot of people tend to think of it. So as a result, if you're in the Midwest you kind of go, Well, you know, what we're going to own that turf.

IVAN: Exactly.

TESS: We're going to go and names things after it and take that world.

IVAN: I love it. I love that they did that. Drupal Flyover Camp in Kansas City, Missouri. And so, this is a brand-new camp, right? This is the first time they've ever done this camp. How great is that? We have a new camp on the schedule.

TESS: Yeah, I was surprised that it was new because they hit everything running. It felt like this was a well-oiled machine for a camp.

IVAN: That's wonderful. It's wonderful to have that on the calendar again. So, well-oiled machine. Did you recognize any of the organizers? Maybe these people have done it before.

TESS: I think that I recognized a few people from…oh, what is their name…VML and YL. What are they called now, because they merged with somebody?

IVAN: I don't know.

TESS: VML Y&R. Wow, that is a mouthful.

IVAN: What?

TESS: Victor, Mike, Lima, Yankee and Romeo.

IVAN: Okay. What are they, a global marketing agency that needs a new name? [laughing]

TESS: [laughing] That is their new name. [laughing]

IVAN: [laughing] Okay. I don't even know how to say it.

TESS: They used to be two different companies that got merged, and this is the resulting name.

IVAN: Oh, it's on their BOF page. If you're looking for something about VML you can still visit the VML website. If you're looking for something about Y&R, don’t sweat, you can still visit the Y&R. So, it's basically like you said, a concatenation of their former names. Maybe it's just temporary. Ok. A little bit of a tangent. [laughing] So, some sort of experience in Flyover Camp organization. Sounds like you said they were a well-oiled machine. It was a three-day camp?

TESS: I believe so. There was a day of trainings which I did not attend, and then two days of sessions, which actually has been bucking the trend lately.

IVAN: Yeah. And also, from what I can tell there were contributions as well on Sunday so, maybe it was a four-day camp, if there were trainings as well.

TESS: Might’ve been.

IVAN: Yeah. So, you were there Friday and Saturday. It looked like they had numerous tracks. So, I thought, usually these camps have five tracks and then you have five rooms and people go to the room for the track that they're interested in. This felt like it had a dozen tracks, but three rooms and it sort of was interspersed track sessions and BOFs as well amongst these three rooms. Is that what it was like? I mean I’m only gauging from the website.

TESS: So, you know the thing with the tracks is that a lot of the time it depends on how promoted they are as their own top-level entity in the data, as it were. And some camps do a very good job of this, that they have this track, this track and this track. I think DrupalCon recently reorganized so that there's only particular tracks that they directly advertise to different audiences, like a business audience, a frontend audience, something like that. Some camps have a lot of tracks and they're not particularly consistently organized, or if they are, it doesn't feel like that when you're attending because you don't tend to notice it, and Flyover Camp seemed to fall into this latter category. That's not bad but it's just a thing.

IVAN: Yeah. And I love that the tracks were so diverse as well, right? There was security, QA, site building, the usual frontend/backend stuff and there was a self-care track as well. I mean, more of that please. More mental health stuff, more business stuff, more human focus sessions. I love it.

TESS: Mm hmm.

IVAN: I love it. I think that's awesome. And, it looked like there were about 30 sessions, so similar to Drupaldelphia and those 30 sessions were spread across two days as opposed to one day at Drupaldelphia.

TESS: Yeah and it seemed to attract a lot of people from the area. I mean I was there from Minnesota and I saw people that usually I see at DrupalCorn there as well. So, it attracted a lot of people from the Midwest.

IVAN: That's wonderful. And there were BOFs as well, and it kind of looked like they were spread out across the two days as well.

TESS: I think there were, but I was so focused on other stuff that I completely missed it.

IVAN: Yeah. This was a heck of a camp for you. I mean it wasn't one session it was two sessions.

TESS: Oh man, it was a double feature. That was hard.

IVAN: I'm sure you absolutely shone on that and I'm sure you did really well. So, let's talk about those two sessions. So, your first session on Friday was the famous cloaked talk, Kubernetes called Return of the Clustering, right? The third part of the trilogy. So that was Friday. And then Saturday you gave a talk essentially about the Healthcheck module, right? What can you do to keep tabs on the health of your Drupal site?

TESS: Well, it was also about site auditing as well, in general.

IVAN: That’s right, and site auditing. So, I guess the critical question here is, did you wear a costume for both talks?

TESS: So, here's the problem with that. I don't have a car. And in order to actually get the costume for that one I would have probably had to rent a car to go to a local thrift store chain called Ax Man surplus and see if I could find like a stethoscope or whatever that little satellite dish head gear thing that they wear, I forget what it's called, and see if I could shove one of those into my luggage. But I didn't have the time to do that. Every weekend that I've had lately has just been completely booked up.

IVAN: Well maybe we'll have to work on that if you get asked to do that talk again and we'll figure out another costume for you.

TESS: Well, rumor has it that's going to happen. [laughing]

IVAN: [laughing] So, comparatively, how were the two sessions attended? Was there a drop of people on Saturday compared to Friday or was it comparable?

TESS: It was actually the other way around. I think a lot of people find the Kubernetes talk is fun, but it can be very intimidating because it seems like, “oh, that's a very devopsy, very technical talk and it's going to be way over my head.” And I was able to attract some people to come to it, especially by making a fool out of myself, by dressing up like a Jedi and standing outside of my door waving a lightsaber to have people come and join the session. But, it was a smaller room and it was still well attended, but the site audit talk actually had a lot more people in it, mostly because it was also in the main auditorium, so a lot of people who were just there were also just there, but there was a lot of people paying attention to it as well, because it tends to be a really fun, engaging talk and it tends to appeal to a much broader audience than the Kubernetes talk, which tends to be more infrastructury devopsy people. Even though I try to make that as broadly appealing as I can.

IVAN: So, location, location, location. Right. You had a wonderful location in the auditorium for that talk.

TESS: Yeah. The only downside is that when you're in an auditorium you're usually on a pedestal or a dais or something like that, and the problem is that it sounds like I'm a T-Rex walking around on stage, because the thing is hollow so the microphone just picks up everything, and I don't tend to stay still when I give a talk, I tend to gesticulate and walk around and do lots of weird things.

IVAN: Jump around I believe you do as well. [laughing]

TESS: [laughing] Yeah. Well, I think the site audit talk, I also fall to my knees at one point, dramatically. [laughing]

IVAN: [laughing] It's a good talk.

TESS: I still remember skinning my knee at DrupalCorn.

IVAN: Well, it’s a good talk. I think it gets valuable as you do that. It certainly reminds people how important it is. Right? So, what do you think the biggest question was that people had from that health check talk, from that audit talk?

TESS: You know, I didn't get many questions. I was actually thinking about this a few days ago. I tend not to get that many questions directly after a talk because usually my talks last the entire amount of time, and afterwards, I have to rush out the door for the next person to start setting up their talk. And usually I don't get many questions, and I do try to anticipate a lot of the potential questions as well within the contents of the talk. So sometimes people will come by and ask me questions later, but that hasn't happened lately.

IVAN: It's a similar sort of thing for both talks then.

TESS: Yeah. I did have a nice conversation with someone, I think they're from the U of Kansas. I forget. I remember their face. I know that they go to DrupalCorn regularly too, but they were telling me about Kubernetes operators and all of that nifty technical stuff and that was a really interesting conversation to have, but it really wasn't a question.

IVAN: Well that actually leads me into my next question. Usually you're the one educating people about whatever you're talking about. What do you think your biggest takeaway from a session was in Flyover camp? What did you learn from each of them?

TESS: Ok. Geez, I’m trying to remember all the sessions I went to because Twin Cities Drupal was last weekend, and now I'm trying to remember any of the sessions I went to.

IVAN: Oh, I think maybe you misunderstood. What I meant was, what did you learn in your talk from the audience?

TESS: Oh. So, one thing that definitely occurred to me is that, when it comes to the Kubernetes talk is, just how much technical knowledge you need, all technical terms you need to pick up very, very quickly to get anywhere with understanding Kubernetes without feeling like you're “drowning,” in technical terms, all of a sudden. And I certainly had that experience myself just trying to learn Kubernetes in the first place and that is after having a very strong background in how containers work and how Docker works and some of the top terminologies I picked up from running production workloads in Dockers form, and I realized that after that talk, like, wow, in 45 minutes I take you from, you kind of, sort of know what Docker is, and you might have heard of Ansible, but you don't know too much about it, to, here’s how you run a Drupal site in production on Kubernetes using a simple effective formula. And that kind of struck me as Wow, not many people are doing that because, wow that can be really complicated.

IVAN: Yeah, it's the bleeding edge of it isn't it?

TESS: It's not just the bleeding edge, it’s just that the underlying design that I went for strives for minimalism and simplicity, and a lot of people find that appealing because it reduces the number of working parts that you have to know. A good example would be memcached. The way that it's presented in the talk is as a stateful set and that works. A lot of people will say, "What you should do is run it as another object called a daemon set." But in order to introduce a daemon set, I'd have to introduce a completely new object type that only works for that, and afterwards it's like, "Is that really necessary to talk about it?” “How often do you add or remove notes?” If you are already thinking about adding and removing notes, you're probably going to look up this stuff for you. So, I don't need to actually tell you about this in this talk. [laughing]

IVAN: Yeah, I love that you're able to educate people in one session even at a very high level. To go from, kind of knowing to, being interested in the technology and in what we're doing and in being interested in continuing to find out more. And, maybe that's a good reason to do a separate podcast just on the talk you gave and the contents of the talk and why are we doing that? Why is TEN7 investing as much as we are in Kubernetes and in Docker and in Drupal, and, you know, sending you to all of these camps, and then putting all of this work into the open source domain? Like, maybe there's enough there to talk about. I mean, just from my perspective, we want to be independent, and using a hosting solution that is supported in the open source that is vendor agnostic. And, if we're doing it for ourselves, there's no reason why we couldn't put it out there and have others learn and leverage from it as well. So, we should probably talk about this a little more in a separate podcast.

TESS: That's not a bad idea at all.

IVAN: I love it. Okay. We'll do that. We'll ask Jonathan to make that happen for us. Okay, so, a little more about Kubernetes. I was looking through the schedule of talks and as you, Tess, know, Raspberry Pis are really near and dear to my heart. I've used them for many different things at home, most recently as an ad blocker for the whole network, but I saw that Jeff Geerling was at Flyover Camp, and he had a talk about the cluster of RPis, or the Raspberry Pis, that he's been building since 2012-2013, something like that, and how it taught him everything he knows about Kubernetes. Did you catch that talk by any small chance?

TESS: I actually did go to that talk.

IVAN: You're kidding?

TESS: Because I was like, Oh that sounds really fun and I'd like to see what he does. Is he going to use straight K8s or is he going to use that K3 that I heard about? And, what was funny to me is that I remember watching a talk that he gave, not about Kubernetes, but about Ansible. Way, way, way back in the day at MidCamp with a very similar block of a Raspberry Pi cluster in a box. And I really wanted to see what he was going to do with this. So, sure, I went to it.

IVAN: And was it everything you wished it could be? I mean, I looked at the slides and there was a shout out to socketwench in one of the slides.

TESS: Yeah, I was like thankful. I was in the front row and no one could see how I was blushing [laughing] the entire time. Like, Oh, stop talking about me please. This is your talk. [laughing]

IVAN: [laughing] That’s great. I mean, you guys are related and connected by Kubernetes, so, how wonderful that that would be the case. So, can you give me a quick synopsis of the talk? What was the nugget that you took out of it?

TESS: So, what was interesting is that Jeff has built a small Kubernetes cluster using a standard distribution Kubernetes to run on, I think it's four or five Raspberry Pis.

IVAN: I think it’s four.

TESS: I think it's four now. Four Raspberry Pis with a single ethernet switch with power over ethernet so that it reduces the amount of additional circuitry and cables he has to carry around to power them altogether.

IVAN: Hold up. Hold up. He's actually powering the RPis now through power over ethernet? That's amazing. Of course, you could.

TESS: You can get an adapter board for that.

IVAN: That's awesome.

TESS: It's not really complicated.

IVAN: That’s so great. I'm sorry. I totally interrupted you there. What was the nugget?

TESS: [laughing] Well he didn't even mention the power over ethernet except for one thing, but I was looking at the screenshots like, Oh, you’re using power over ethernet now. Nice. [laughing]

IVAN: Nice. That’s nice.

TESS: So, a lot of the talk was about how he was running his own personal site, using a Raspberry Pi cluster out of his home network. And, I used to run my own single node server out of a home network way back, many, many years ago. And there's a number of challenges that come with that out of the box. You tend not to get static IPs from most ISPs. They'll get a Dynamic IP, some of them don't like that you have a significant amount of outbound traffic or incoming traffic that's coming from the net and they may block you for that reason, if you're on a particular service tier. Some ISPs are better at that than others, it really depends. But running his own site on a Kubernetes cluster on Raspberry Pis it's like, it reminds me of this meme that I saw passed around Kubernetes Twitter a while ago, which is, the subtext is, I deployed my blog on Kubernetes and it's this big semitrailer and it has a toy truck trailer box in the middle of it, completely dwarfed by the full size trailer. [laughing] That’s kind of like, Yeah that's pretty accurate.

IVAN: Well, I mean if you ever get reddited or slashdotted, I guess maybe it'll survive?

TESS: [laughing] Kind of. There’s a degree of front side caching I think that he also used. This kind of a project always comes across to me as not a serious, You should use this instead of traditional hosting and more like, I wanted to see if I could do that and it would be fun and it's something to do and it's something that lets me learn by doing. And that's you know, a worthy pursuit in its own right.

IVAN: But if you look at the other side of that coin, you're hosting your own website, you own the hardware, you own the software, you own your site, you can see it, you're not putting the risk of hosting in another large company's data center, right? You own it all from top to bottom, and honestly if you have a small blog and you're using your ISPs connection, and you have this overkill of a Raspberry Pi cluster that is powering the static site, you're probably not going to ever get enough traffic to bring that thing down. You're probably fine.

TESS: Probably not.

IVAN: Yeah.

TESS: Although I think Jeff's site is Drupal 8.

IVAN: Oh [laughing] so, not static, not static. Well, I'm very jealous of you getting to see that talk. That must’ve been pretty cool. I'm hoping that maybe we can get Jeff on the podcast to talk about his cluster and what he's been through and how it's evolved soon. So, Jeff if you happen to be listening, watch out for an email from us about that.

Let's talk about diversity at Flyover Camp. What did it look like? Were there the kind of usual cast of people that look like I do, white males, or what did that look like amongst attendees and speakers this year?

TESS: So, there certainly is a large contingent of white straight cis male people there as well. There were a lot of women there as well, and there were several POC as well. I didn't actually take any moment to really do any kind of headcounts on that. It just never crossed my mind to log that kind of information. But I did sit with several people which were really fascinating and really interesting to talk to, and that was really nice.

IVAN: I hope we can have more of that and more attention to that in the future and we'll try to continue to talk about it and bring it up in our podcast as well. What about attendance as a whole at Flyover Camp? Was it comparable to Drupaldelphia or to Twin Cities Drupal Camp? Did you get a feel for what it was like?

TESS: I think that it was more closer to the size of Twin Cities Drupal than Drupaldelphia. Drupaldelphia had a surprising amount of people in it. And it could have been complicated by the space, because it was a smaller space than Flyover Camp or Twin Cities Drupal, but there was certainly a large number of people there.

IVAN: Any particular sessions besides Jeff’s, that were memorable to you?

TESS: Oh geez, I'd have to look it over because so much of it was kind of a blur. I was kind of sad that I missed John Rearick's session about 45 Modules and Forty-Five Minutes. I caught the end of it. But, yeah, that would have been a really interesting talk to go to, because literally every slide has a timer. So, the talk is only 45 minutes long. So every slide is only a minute long.

IVAN: So, it's kind of like an ignite session, where it's 30 seconds per slide, 20 slides, something like that?

TESS: Mm hmm. I saw one by Ria Dixon called CloudWatch-ing, which was all about creating logs and alerts using AWS CloudWatch. That was really fascinating. And, it makes me wonder if there is a way to create similar mechanisms and use similar strategies in a purely open source implementation that doesn't rely on AWS's productized version of that.

IVAN: What is CloudWatch?

TESS: It's kind of an event and log tracking mechanism meant for distributed logging. There's a lot of that I didn't get into because it was mostly a case study about how they implemented it, and how they solved their own problems. There was a lot of additional research that I'd love to circle back to, but it was a really good session and I really enjoyed it.

IVAN: So, is CloudWatch then, kind of similar to Splunk?

TESS: I think that it's a bit similar to Splunk. I know that there might be part of that that's similar to Prometheus and Grafana which is a common Kubernetes logging mechanism.

IVAN: Yeah, Prometheus is pretty widespread as well, isn't it?

TESS: Mm hmm.

IVAN: Yeah. Okay. So, a couple of good sessions. Generally, you had a good time at the camp, gave two wonderful talks. Where was the camp? Was it at the University?

TESS: I believe it was. It was a pretty good location, although because it is in the middle of Missouri, I did have a problem getting to and from the Camp, because I didn't have a car rental. So I ended up walking there and that was a 20 minute walk in Missouri in June, which was a bit warmer than I’m used to. [laughing]

IVAN: Yeah, I guess the flipside of that is it could have been Missouri in December or January.

TESS: I mean I would have been fine with that but that’s me, I like winter. [laughing]

IVAN: [laughing] Well, go figure. I like it too. So, what do you know? Okay. So, the event venue was good. The attendance was comparable to TCDrupal. And before we wrap up, overall impression of the event? If there's another one next year are you going to go?

TESS: I would love to go again. It was a lot of fun to go there. And it’s a lot more interesting than I had expected it to be, which kind of lives up to the name. [laughing]

IVAN: [laughing] That's great. Well, I appreciate the time you spent with us today once again. Thank you so much for being with me. It's really been a pleasure.

TESS: Mm hmm.

IVAN: Well, Tess Flynn or socketwench, is the Devops Engineer here at TEN7, and she was just at Drupal Flyover Camp 2019, where she gave her talk, “Return of the Clustering Kubernetes for Drupal.” Of course, that's the third in a trilogy and the other talk, “Dr. Upal Is In - Healthcheck your Site.” Those slides are all online and a recording of the sessions are also available. Just visit this episode's webpage for those links. You’ve been listening to the TEN7 Podcast. Find us online at ten7.com/podcast. And if you have a second, do send us a message, we love hearing from you. Our email address is [email protected]. Until next time, this is Ivan Stegic. Thank you for listening.

Jun 19 2019
Jun 19

Over the past few months working on migrations to Drupal 8, researching best practices, and contributing to core and contributed modules, I discovered that there are several tools available in core and contributed modules, plus a myriad of how-to articles. To save you the trouble of pulling it all together yourself, I offer a comprehensive overview of the Migrate module plus a few other contributed modules that complement it in order to migrate a Drupal site to 8.

Let's begin with the most basic element: migration files.

Migration files

In Drupal 8, the migrate module splits a migration into a set of YAML files, each of them is composed by a source (like the node table in a Drupal 7 database), a process (the field mapping and processing), and a destination (like a node entity in 8). Here is a subset of the migration files present in core:

$ find core -name *.yml | grep migrations

And below is the node migration, located at core/modules/node/migrations/d7_node.yml:

id: d7_node
label: Nodes
audit: true
  - Drupal 7
  - Content
deriver: Drupal\node\Plugin\migrate\D7NodeDeriver
  plugin: d7_node
  nid: tnid
  vid: vid
    plugin: default_value
    source: language
    default_value: "und"
  title: title
  uid: node_uid
  status: status
  created: created
  changed: changed
  promote: promote
  sticky: sticky
  revision_uid: revision_uid
  revision_log: log
  revision_timestamp: timestamp
  plugin: entity:node
    - d7_user
    - d7_node_type
    - d7_field_instance
    - d7_comment_field_instance

Migration files can be generated dynamically via a deriver like the node migration defines above, which uses D7NodeDeriver to generate a migration for each content type’s data and revision tables. On top of that, migrations can be classified via the migration_tags section (the migration above has the Drupal 7 and Content tags).

Configuration vs Content migrations

Migration files may have one or more tags to classify them. These tags are used for running them in groups. Some migration files may have the Configuration tag—like the node type or field migrations—while others others might have the Content tag—like the node or user migrations. Usually you would run the Configuration migrations first in order to configure the new site, and then the Content ones so the content gets fetched, transformed, and inserted on top of such configuration.

Notice though that depending on how much you are planning to change the content model, you may decide to configure the new site manually and write the Content migrations by hand. In the next section, we will examine the differences between generating and writing migrations.

Generating vs Writing migrations

Migration files living within the core, contributed, and custom modules are static files that need to be read and imported into the database as migration plugins so they can be executed. This process, depending on the project needs, can be implemented in two different ways:

Using Migrate Upgrade

Migrate Upgrade module implements a Drush command to automatically generate migrations for all the configuration and content in an existing Drupal 6 or 7 site. The best thing about this approach is that you don’t have to manually create the new content model in the new site since Migrate Upgrade will inspect the source database and do it for you by generating the migrations.

If the existing content model won’t need to go through major changes during the migration, then Migrate Upgrade is a great choice to generate migrations. There is an API that developers can interact with in order to alter migrations and the data being processed. We will see a few examples further down in this article.

Writing migrations by hand

If the content model will go through a deep reorganization such as merging content from different sources into one, reorganizing fields, and changing machine names, then configuring the new site manually and writing content migrations may be the best option. In this scenario, you would write the migration files directly to the config/sync directory so then they can be imported via drush config:import and executed via drush migrate:import.

Notice that if the content model has many entity types, bundles, and fields, this can be a tough job so even if the team decides to go this route, generating content migrations with Migrate Upgrade can be useful since the resulting migrations can serve as templates for the ones to be written.

Setting up the new site for running migrations

Assuming that we have a new site created using the Composer Drupal Project and we have run the installer, we need to require and install the following modules:

$ composer require drupal/migrate_tools drupal/migrate_upgrade drupal/migrate_plus
$ drush pm:enable --yes migrate_tools,migrate_upgrade,migrate_plus

Next, we need to add a database connection to the old site, which we would do at web/sites/default/settings.local.php:

// The default database connection details.
$databases['default']['default'] = [
  'database' => 'drupal8',
  'username' => 'root',
  'password' => 'root',
  'prefix' => '',
  'host' => '',
  'port' => '3306',
  'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
  'driver' => 'mysql',

// The Drupal 7 database connection details.
$databases['drupal7']['default'] = [
  'database' => 'drupal7',
  'username' => 'root',
  'password' => 'root',
  'prefix' => '',
  'host' => '',
  'port' => '3306',
  'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
  'driver' => 'mysql',

With the above setup, we can move on to the next step, where we will generate migrations.

Generating migrations with Migrate Upgrade

The following command will read all migration files, create migrate entities out of them and insert them into the database so they are ready to be executed:

$ drush --yes migrate:upgrade --legacy-db-key drupal7 --legacy-root sites/default/files --configure-only

It is a good practice to export the resulting migrate entities as configuration so we can track their changes. Therefore, we will export configuration after running the above command, which will create a list of files like the following:

$ drush --yes config:export
 [notice] Differences of the active config to the export directory:
| Config                                                           | Operation |
| migrate_plus.migration.upgrade_d7_date_formats                   | Create    |
| migrate_plus.migration.upgrade_d7_field                          | Create    |
| migrate_plus.migration.upgrade_d7_field_formatter_settings       | Create    |
| migrate_plus.migration.upgrade_d7_field_instance                 | Create    |
| migrate_plus.migration.upgrade_d7_field_instance_widget_settings | Create    |
| migrate_plus.migration.upgrade_d7_file                           | Create    |
| migrate_plus.migration.upgrade_d7_filter_format                  | Create    |
| migrate_plus.migration.upgrade_d7_filter_settings                | Create    |
| migrate_plus.migration.upgrade_d7_image_styles                   | Create    |
| migrate_plus.migration.upgrade_d7_menu                           | Create    |
| migrate_plus.migration.upgrade_d7_menu_links                     | Create    |
| migrate_plus.migration.upgrade_d7_node_article                   | Create    |
| migrate_plus.migration.upgrade_d7_node_revision_article          | Create    |

In the above list, we see a mix of Configuration and Content migrations being created. Now we can check the status of each migration via the migrate:status Drush command:

$ drush migrate:status
 Migration ID                                 Status   Total   Imported   Unprocessed   Last Imported
 upgrade_d7_date_formats                      Idle     7       0          0
 upgrade_d7_filter_settings                   Idle     1       0          0
 upgrade_d7_image_styles                      Idle     193     0          0
 upgrade_d7_node_settings                     Idle     1       0          0
 upgrade_d7_system_date                       Idle     1       0          0
 upgrade_d7_url_alias                         Idle     25981   0          0
 upgrade_system_site                          Idle     1       0          0
 upgrade_taxonomy_settings                    Idle     0       0          0
 upgrade_d7_path_redirect                     Idle     518     0          0
 upgrade_d7_field                             Idle     253     0          0
 upgrade_d7_field_collection_type             Idle     9       0          0
 upgrade_d7_node_type                         Idle     16      0          0
 upgrade_d7_taxonomy_vocabulary               Idle     34      0          0
 upgrade_d7_field_instance                    Idle     738     0          0
 upgrade_d7_view_modes                        Idle     24      0          0
 upgrade_d7_field_formatter_settings          Idle     1280    0          0
 upgrade_d7_field_instance_widget_settings    Idle     738     0          0
 upgrade_d7_file                              Idle     5731    0          0
 upgrade_d7_filter_format                     Idle     6       0          0
 upgrade_d7_menu                              Idle     5       0          0
 upgrade_d7_user_role                         Idle     6       0          0
 upgrade_d7_user                              Idle     82      0          0
 upgrade_d7_node_article                      Idle     322400  0          0
 upgrade_d7_node_page                         Idle     342     0          0
 upgrade_d7_menu_links                        Idle     623     0          0
 upgrade_d7_node_revision_article             Idle     742577  0          0
 upgrade_d7_node_revision_page                Idle     2122    0          0
 upgrade_d7_taxonomy_term_tags                Idle     1729    0          0
-------------------------------------------- -------- ------- ---------- ------------- ---------------

You should inspect any contributed modules in use on the old site and install them in the new one as they may contain migrations. For example, if the old site is using Redirect module, by installing itm and generating migrations like we did above, you should see a new migration provided by this module ready to go.

Running migrations

Assuming that we decided to run migrations generated by Migrate Upgrade (otherwise skip the following sub-section), we would first run configuration migrations and then content ones.

Configuration migrations

Here is the command to run all migrations with the tag Configuration along with their dependencies.

$ drush migrate:import --tag=Configuration --execute-dependencies
 [notice] Processed 10 items (10 created, 0 updated, 0 failed, 0 ignored) - done with 'upgrade_d7_date_formats'
 [notice] Processed 5 items (5 created, 0 updated, 0 failed, 0 ignored) - done with 'upgrade_d7_filter_settings'
 [notice] Processed 20 items (20 created, 0 updated, 0 failed, 0 ignored) - done with 'upgrade_d7_image_styles'
 [notice] Processed 10 items (10 created, 0 updated, 0 failed, 0 ignored) - done with 'upgrade_d7_node_settings'
 [notice] Processed 1 items (1 created, 0 updated, 0 failed, 0 ignored) - done with 'upgrade_d7_system_date'
 [notice] Processed 5 items (5 created, 0 updated, 0 failed, 0 ignored) - done with 'upgrade_system_site'
 [notice] Processed 100 items (100 created, 0 updated, 0 failed, 0 ignored) - done with 'upgrade_d7_field'
 [notice] Processed 200 items (200 created, 0 updated, 0 failed, 379 ignored) - done with 'upgrade_d7_field_instance'

The above command will migrate site configuration, content types, taxonomy vocabularies, view modes, and such. Once this is done, it is recommended to export the resulting configuration via drush config:export and commit the changes. From then on, if we make changes in the old site’s configuration or we alter the Configuration migrations (we will see how further down), we will need to roll back the affected migrations and run them again.

For example, the Media Migration module creates media fields and alters field mappings in content migrations so after installing it we should run the following commands to re-run them:

$ drush --yes migrate:rollback upgrade_d7_view_modes,upgrade_d7_field_instance_widget_settings,upgrade_d7_field_formatter_settings,upgrade_d7_field_instance,upgrade_d7_field
$ drush --yes migrate:import --execute-dependencies upgrade_d7_field,upgrade_d7_field_instance,upgrade_d7_field_formatter_settings,upgrade_d7_field_instance_widget_settings,upgrade_d7_view_modes
$ drush --yes config:export

Once we have executed all Configuration migrations, we can run content ones.

Content migrations

Content migrations are straightforward. We can run them with the following command:

$ drush migrate:import --tag=Content --execute-dependencies

Logging and tracking

Migrate keeps track of all the migrated content via the migrate_* tables. If you check out the new database after running migrations, you will see something like this:

  • A set of migrate_map* tables, storing the old and new identifiers of each migrated entity. These tables are used by the migrate:rollback Drush command to roll back migrated data.
  • A set of migrate_messages* tables, which hold errors and warnings that occurred while running migrations. These can be seen via the migrate:messages Drush command.

Rolling back migrations

In the previous section, we rolled back the field migrations before running them again. This process is great for reverting imported Configuration or Content, which you will do often while developing a migration.

Here is an example. Let’s suppose that you have executed content migrations but articles did not get migrated as you expected. The process you would follow to fix them would be:

  1. Find the migration name via drush migrate:status | grep article.
  2. Roll back migrations with drush migrate:rollback upgrade_d7_node_revision_article,upgrade_d7_node_article.
  3. Perform the changes that you need either directly at the exported migration at config/sync or by altering them and then recreating them with migrate:upgrade like we did at Generating migrations with Migrate Upgrade. We will see how to alter migrations in the next section.
  4. Run the migrations again with drush migrate:import upgrade_d7_node_article,upgrade_d7_node_revision_article.
  5. Verify the changes and, if needed, repeat steps 2 to 4 until you are done.

Migrate events and hooks

Before diving into the APIs to alter migrations, let’s clarify that there are two processes that we can hook into:

  1. The migrate:upgrade Drush command, which reads all migration files in core, contributed, and custom modules and imports them into the database.
  2. The migrate:import Drush command, which runs migrations.

In the next sub-sections, we will see how can we interact with these two commands.

Altering migrations (migrate:upgrade)

Drupal core offers hook_migration_plugins_alter(), which receives the array of available migrations that migrate:upgrade creates. Here is a sample implementation at mymodule.module where we delegate the logic to a service:

 * Implements hook_migration_plugins_alter().
function mymodule_migration_plugins_alter(array &$migrations) {
  $migration_alterer = \Drupal::service('mymodule.migrate.alterer');

And here is a subset of the contents of the service:

class MigrationAlterer {

   * Processes migration plugins.
   * @param array $migrations
   *   The array of migration plugins.
  public function process(array &$migrations) {

   * Skips unneeded migrations.
   * @param array $migrations
   *   The array of migration plugins.
  private function skipMigrations(array &$migrations) {
    // Skip unwanted migrations.
    $migrations_to_skip = [
    $migrations = array_filter($migrations, function ($migration) use ($migrations_to_skip) {
      return !in_array($migration['id'], $migrations_to_skip);

  // The remaining methods would go here.


In the next section we will see how to alter the data being migrated while running migrations.

Altering data while running migrations

Drupal core offers hook_migrate_prepare_row() and hook_migrate_MIGRATION_ID_prepare_row, which are triggered before each row of data is processed by the migrate:import Drush command. Additionally, there is a set of events that we can subscribe to such as before and after the migration starts or before and after a row is saved.

On top of the above, Migrate Plus module exposes an event that wraps hook_migrate_prepare_row(). Here is a sample subscriber for this event:

class MyModuleMigrationSubscriber implements EventSubscriberInterface {

   * Prepare row event handler.
   * @param \Drupal\migrate_plus\Event\MigratePrepareRowEvent $event
   *   The migrate row event.
   * @throws \Drupal\migrate\MigrateSkipRowException
   *   If the row needs to be skipped.
  public function onPrepareRow(MigratePrepareRowEvent $event) {

   * Alters field migrations.
   * @param \Drupal\migrate_plus\Event\MigratePrepareRowEvent $event
   *   The migrate row event.
   * @throws \Drupal\migrate\MigrateSkipRowException
   *   If a row needs to be skipped.
   * @throws \Exception
   *   If the source cannot be changed.
  private function alterFieldMigrations(MigratePrepareRowEvent $event) {
    $field_migrations = [

    if (in_array($event->getMigration()->getPluginId(), $field_migrations)) {
      // Here are calls to private methods that alter these migrations.

   * Skips menu links that are either implemented or not needed.
   * @param \Drupal\migrate_plus\Event\MigratePrepareRowEvent $event
   *   The migrate row event.
   * @throws \Drupal\migrate\MigrateSkipRowException
   *   If a row needs to be skipped.
  private function skipMenuLinks(MigratePrepareRowEvent $event) {
    if ($event->getMigration()->getPluginId() != 'upgrade_d7_menu_links') {

    $paths_to_skip = [

    $menu_link = $event->getRow()->getSourceProperty('link_path');
    if (in_array($menu_link, $paths_to_skip)) {
      throw new MigrateSkipRowException('Skipping menu link ' . $menu_link);

   * Sets the content moderation field on node migrations.
   * @param \Drupal\migrate_plus\Event\MigratePrepareRowEvent $event
   *   The migrate row event.
   * @throws \Exception
   *   If the source cannot be changed.
  private function setContentModeration(MigratePrepareRowEvent $event) {
    $row = $event->getRow();
    $source = $event->getSource();

    if (('d7_node' == $source->getPluginId()) && isset($event->getMigration()->getProcess()['moderation_state'])) {
      $state = $row->getSourceProperty('status') ? 'published' : 'draft';
      $row->setSourceProperty('moderation_state', $state);
    elseif (('d7_node_revision' == $source->getPluginId()) && isset($event->getMigration()->getProcess()['moderation_state'])) {
      $row->setSourceProperty('moderation_state', 'draft');



When you are migrating a Drupal site to 8, Migrate Upgrade module does a lot of the work for free by generating Configuration and Content migrations. Even if you decide to write any of them by hand, it is convenient to run the command and use the resulting migrations as a template for your own. In the next article we will see how to work seamlessly on a migration while the rest of the team is building the new site.

Thanks to Andrew Berry, April Slides, Karen Stevenson, Marcos Cano, and Salvador Moreno for their feedback and help. Photo by Barth Bailey on Unsplash.

Jun 19 2019
Jun 19

Jen Lampton (Backdrop user account), co-founder of Backdrop CMS, senior Drupal developer at Jeneration.com joins Mike Anello and Ryan Price to get reacquainted with Backdrop and to discuss why it could be a good long-term solution for sites after Drupal 7's end-of-life.


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.

Jun 19 2019
Jun 19

In the last article, we programmed a new module which created CSV files from data on a different server. Now, we need to migrate this data into our live-system. As first step we need to create a commerce store to which our products and product variations belong. Otherwise, they cannot be imported.

Commerce product and product variations

Afterwards we need a commerce product type and a commerce product variation type. A product type stores a general product, while a product variation type stores different variation of said product type. I.e. "Pair of cotton pants" would be defined as product type, while "Pair of cotton pants in red/blue/yellow, size s/m/l would be defined as product variation type.

Our product type is a 'room' and as fields, we want to store an id, a title and an image carousel showcasing the room.

Our product variation type needs to display different variations of a 'room'. Here we also need the id and additional fields for a variation title and a description of the room variation.

Feed settings

After these types are finished, we need to define two corresponding feed types. Both feed types need almost the same settings.

Feeds Tamper basic settingsThe fetcher is 'Directory' as parser we choose 'CSV'. As processor we choose 'product' for our rooms and 'product variation' for our room variations. As product type/product variation type we choose the commerce types we just created in the first step.

The other settings can be changed to personal liking, except the default delimiter in the Parser settings which needs to be a comma(,) because that is what we chose for our csv files.

Now, the feed type mapping has to be set up. The feeds will only work, if all mandatory fields are mapped correctly. We need to select 'Feed: Authored by' and 'Feed: Authored on' as source fields. Additionally we need 'Status' and 'SKU' which need to be set for Commerce products. These are the minimum settings we need for feeds to run. Additionally, our product type room also needs 'Store'. Otherwise commerce cannot import the product. Store and status need to be imported from the csv files, authored by and authored on don't need to be. Store has to be the store for which the product and product variation types were created for.

feeds mapping

We select all other fields from the csv file we'd like to map to our product type /product variation type and save.

If we were to import now, the variations would not appear. They are linked to their corresponding products by the sku defined in the csv file, but the feeds module needs help to understand the link. The module feeds tamper creates another tab 'Tamper' in the feeds type settings. Here we create a plugin for our feeds type room. We select explode and as field we chose the sku and as delimiter we select '|', because that is what we chose during the csv file creation.

feeds tamper

Creating Feeds and importing

After defining the feed types, we have to create actual feeds from them. In Content > Feeds. All we need the the path to our csv file and the correct delimiter ','. After creating one feed for the products and one for the product variations, all we have to do is activate them. Feeds belong to website-content, which means they need to be imported like content. Otherwise you have to create them again and they can't be exported to config-files.


When actually importing, the order is important. We need to import the product variations before the products, otherwise they will not appear. Feeds module creates a temporary table with the newly imported product variations and compares their skus with skus from newly imported products and connects them accordingly. It does not work the other way around.

Jun 19 2019
Jun 19

Joris Snoek - Business Dev

+31 (0)20 - 261 14 99

Last month we worked in a project where we implemented a progressively decoupled Drupal platform. We needed a React.js frontend to to all kind of magic that was less available in Twig. Also, this way frontend engineers and backend engineers could work more loosely together, which is great.

Main reason we choose progressive decoupled instead of fully decoupled is because we wanted to make use of Drupal's roles, permissions and authentication, plus some other Drupal native stuff that in fully headless would become very cumbersome to deal with.

Check out this blog on 'How to decouple Drupal in 2019' and find out if you also need Drupal beheading or not.

React libraries dynamically in Drupal

The target was to implement the React.js libraries in Drupal pages, so React would load withín Drupal and we could use all native Drupal goodies like authentication.

By the way: you can also use Drupal authentication when fully decoupled, check this article

So, the thing with React is: every time you release a new version of your App, you'll have to render a new build, that sort of looks like this:

More specifically, the .js and .css files we need to load in Drupal are defined in asset-manifest.json:

So, those files need to be loaded in Drupal, and change every time you run a new build in your React App for example with npm run build.

But you can't add these React javascript libraries to your theme's YOURTHEME.libraries.yml because with the next build the links be be different.

hook_library_info_build() to the rescue

Aaaah, so Drupal 8 provides us with hook_library_info_build() that will save our day (づ。◕‿‿◕。)づ

Now, how we did this:

Implement the Drupal hook in your .module file (For highlighting's sake, I added .php, loose that. #nobrainer):

As you see, it will read React's asset-manifest.json and registers all .js and .css files of React.js as a library in Drupal.

Next up, you can render this library for example in a Controller like this:

Wrap up

So that's how we integrated React.js within Drupal pages and combined the power of a React frontend with the power of Drupal goodies, in a 'progressively decoupled' way.

Please let me know if you have any questions.

Jun 18 2019
Jun 18

While many things stayed the same as previous years, such as the camp location and month it is held, this year was a first for many small changes.

The first big change was programming. Unlike previous years, where there was 1 day of training, and two full days of sessions and tracks (like you would have at a DrupalCon), this year’s schedule had one day of training, and only one day of traditional sessions.

The third day of the conference was dedicated to “unconferencing,” where those attending decided as a group what topics to discuss, and everyone participated in round table discussions for the day. The feedback was extremely positive for the new schedule, so it seems likely to stick.

The @TCDrupal unconference is underway! pic.twitter.com/WqaQsNL2rk

— Twin Cities Drupal (@TCDrupal) June 8, 2019

Welcome Party
The second big change was adding a new social event, the Welcoming Party. While the first night of camp has traditionally included a party for sponsors and speakers, this year it was opened up to ALL camp attendees. One of the core values of TCDC has always been inclusiveness, and this small change just made a lot of sense.

Community Sponsors
The third big change related to sponsors. There were still a number of great organizations who stepped up to help sponsor the conference, but this year included a dedicated push to encourage more “community sponsors.” The conference was still a very affordable $50/person, but during registration, there was ask to those who used Drupal professionally to give more, if they could afford to.

And people really came through! While there had been some individual sponsors in the past, 2019 had more community sponsors than ever before. 34 people joined in, and helped keep the conference both affordable to all, and in the black.

Jun 18 2019
Jun 18

Our normally scheduled call to chat about all things Drupal and nonprofits will happen this Thursday, June 20, at 1pm ET / 10am PT. (Convert to your local time zone.)

Feel free to share your thoughts and discussion points ahead of time in our collaborative Google doc: https://nten.org/drupal/notes

We have an hour to chat so bring your best Drupal topics and let's do this thing!

Some examples to get your mind firing: how do I recreate [feature] on my Drupal 7 site in Drupal 8? I need to explain [complicated thing] to a non-technical stakeholder -- any advice? How can I get Drupal and my CRM to play nicely?

This free call is sponsored by NTEN.org but open to everyone.

View notes of previous months' calls.

Jun 18 2019
Jun 18

Drupal is lucky to benefit from a very active community of developers meaning that there is a wide and varied range of contributed modules to extend the functionality of Drupal core. In this article we’ll take a quick look at 10 interesting contributed modules; some are well known whilst others are a little bit more obscure.

1. Admin_menu (D7) / Admin_toolbar (D8)

Out of the box the Drupal admin interface can be a bit unwieldy and whilst this has been significantly improved over the years, especially with the advent of Drupal 8, there’s still room for improvement. Enter admin_menu/admin_toolbar which are two similar modules to make navigating the admin interface a whole lot easier by providing a neat little toolbar with drop downs so you can navigate the whole admin interface from any page of your site.

2. Kraken

This module allows you to use the kraken.io web service to optimise images on your website. It works be exposing a kraken optimise image style effect which can be applied to image styles on your Drupal website.

3. Popup_field_group

This is a nice little module maintained by ComputerMinds which gives the option to display the children of a field group in a popup overlay. Buttons are exposed to toggle the popup.

4. Flood_unblock

Drupal 7 introduced a feature to prevent brute force attacks meaning that no more than five failed login attempts per user in any six hour period or no more than 50 failed attempts from an IP address in a one hour period are allowed. Failed login attempts are recorded in the flood table and this module gives administrators an easy way to unblock users that have exceeded these limits.

5. Paragraphs

Paragraphs give much greater control over content creation on your Drupal site. A paragraph is a set of fields which has its own theme associated with it to give much greater flexibility over how content gets rendered on your site. So for example you might have a paragraph which floats an image left and displays text on the right - the possibilities are endless. Take a look at tiles in action to find out more about working with paragraphs (we use the term tiles to mean the same thing!)

6. Stage_file_proxy

This module is useful when working on a development version of your Drupal site by providing a proxy to the production site’s files directory. When you need a production file the module maps this the production files directory and downloads it to your development files directory.

7. Field_display_label

This is a nice little module to allow you to change a field label on the edit form so that it’s difference to what’s rendered when the field is displayed. So for example you might have a name field labelled ‘what’s your name?’ on the edit form which just renders ‘name’ when it’s displayed.

8. Custom_add_another

Another simple module maintained by ComputerMinds which gives site admins the ability to customise the ‘add another’ text for multi valued fields.

9. Notice_killer

This is a nice little module that will split out PHP notices and warnings from other Drupal notices and also logs a bit more information about each so that you can track them down and fix them more easily.

10. Rabbit_hole

This is a useful module that prevents certain entities from being viewable on their own page. So for example if you have an image content type which you never want to be accessible on node/xx then this is the module for you!

Jun 18 2019
Jun 18

The new version of Acquia Lift makes it simpler for marketers to run website personalization campaigns themselves, without the need for writing code.

Today, we released a new version of Acquia Lift, our web personalization tool.

In today's world, personalization has become central to the most successful customer experiences. Most organizations know that personalization is no longer optional, but have put it off because it can be too difficult. The new Acquia Lift solves that problem.

While before, Acquia Lift may have taken a degree of fine-tuning from a developer, the new version simplifies how marketers create and launch website personalization. With the new version, anyone can point, click and personalize content without any code.

We started working on the new version of Acquia Lift in early 2018, well over a year ago. In the process we interviewed over 50 customers, redesigned the user interface and workflows, and added various new capabilities to make it easier for marketers to run website personalization campaigns. And today, at our European customer conference, Acquia Engage London, we released the new Acquia Lift to the public.

You can see all of the new features in action in this 5-minute Acquia Lift demo video:

The new Acquia Lift offers the best web personalization solution in Acquia's history, and definitely the best tool for Drupal.

June 18, 2019

47 sec read time

db db
Jun 18 2019
Jun 18

Agiledrop is highlighting active Drupal community members through a series of interviews. Now you get a chance to learn more about the people behind Drupal projects.

Meet Mario Hernandez, Senior Frontend Developer at Mediacurrent. With over 10 years of experience in Drupal, Mario has seen the CMS evolve significantly throughout the years. Read on to find out more about some of Mediacurrent's most interesting projects and what aspect of his work Mario enjoys the most.

1. Please tell us a little about yourself. How do you participate in the Drupal community and what do you do professionally?

I am a Senior Front End Developer at Mediacurrent and the majority of my contribution to the Drupal community is around conducting training workshops and writing blog posts. In the past I’ve contributed to the Out Of The Box initiative and also helped with the implementation of the Simplify Menu module.

2. When did you first come across Drupal? What convinced you to stay, the software or the community, and why?

Back in 2007 I was working for the Federal Government in Los Angeles as a developer and was tasked with building an Emergency Preparedness website which would provide access to resources to employees for disaster recovery in the event of a major disaster. I looked and tested several content management systems and ultimately decided on Drupal as it was the one which provided the most flexibility and ability to scale.

3. What impact has Drupal made on you? Is there a particular moment you remember?

I believe after building the website I cited above, I realized the power of Drupal. As a Front End Developer with minimum programming experience, I realized Drupal could do all the heavy lifting for me in the Back-End while I focus on my area of expertise, Front-End. Nowadays and for the past 20+ years I’ve been making a living building Drupal Websites for some of the most well known brands in the world.

4. How do you explain what Drupal is to other, non-Drupal people?

First I find out if they are familiar with content management systems at all and tell them Drupal is like one of those but for enterprise level websites. If they know about WordPress or Powerpoint I draw some kind of comparison such as being open source or written in PHP. I also share examples of high profile websites built with Drupal. Best example is The Weather Channel website which most people use and I tell them we at Mediacurrent built it. (shameless plug).

5. How did you see Drupal evolving over the years? What do you think the future will bring?

I started working with Drupal 6 back in 2007 and it is great to see how far Drupal has come. As a Front-End developer going from PHP templates to Twig was a huge improvement. Mobile first and accessibility have improved drastically from the old days. Other significant improvements are APIs, Layout Builder and Configuration Management. Lastly, the promise of a better upgrade path will be a big win for people building websites as well as site owners when Drupal 9 is released.

6. What are some of the contributions to open source code or to the community that you are most proud of?

Although I have made code contributions to the Drupal ecosystem, my proudest contribution is being able to provide training and technical resources for others to consume. I personally enjoy conducting training workshops at small camps where people are eager to learn. In most cases this contribution is free of charge but it is the most rewarding experience for me personally.

7. Is there an initiative or a project in Drupal space that you would like to promote or highlight?

Mediacurrent recently introduced our own Drupal Distribution called Rain, which is an Enterprise Distribution. We have worked and continue to work very hard on providing a turn-key solution for anyone looking to build an enterprise level website. In addition to hand-picked modules and functionality, the Rain distribution provides an optional Decoupled front-end which runs on Gatsby. We are very proud of Rain and are excited to see what people build with it.

8. Is there anything else that excites you beyond Drupal? Either a new technology or a personal endeavor. 

We at Mediacurrent are working hard to take our training offerings to a new level. We have great plans for providing custom training for teams and the community and are very excited to make Mediacurrent the go-to agency for training that goes beyond Drupal.  

Jun 18 2019
Jun 18

Agiledrop is highlighting active Drupal community members through a series of interviews. Now you get a chance to learn more about the people behind Drupal projects.

Meet Mario Hernandez, Senior Frontend Developer at Mediacurrent. With over 10 years of experience in Drupal, Mario has seen the CMS evolve significantly throughout the years. Read on to find out more about some of Mediacurrent's most interesting projects and what aspect of his work Mario enjoys the most.

1. Please tell us a little about yourself. How do you participate in the Drupal community and what do you do professionally?

I am a Senior Front End Developer at Mediacurrent and the majority of my contribution to the Drupal community is around conducting training workshops and writing blog posts. In the past I’ve contributed to the Out Of The Box initiative and also helped with the implementation of the Simplify Menu module.

2. When did you first come across Drupal? What convinced you to stay, the software or the community, and why?

Back in 2007 I was working for the Federal Government in Los Angeles as a developer and was tasked with building an Emergency Preparedness website which would provide access to resources to employees for disaster recovery in the event of a major disaster. I looked and tested several content management systems and ultimately decided on Drupal as it was the one which provided the most flexibility and ability to scale.

3. What impact has Drupal made on you? Is there a particular moment you remember?

I believe after building the website I cited above, I realized the power of Drupal. As a Front End Developer with minimum programming experience, I realized Drupal could do all the heavy lifting for me in the Back-End while I focus on my area of expertise, Front-End. Nowadays and for the past 20+ years I’ve been making a living building Drupal Websites for some of the most well known brands in the world.

4. How do you explain what Drupal is to other, non-Drupal people?

First I find out if they are familiar with content management systems at all and tell them Drupal is like one of those but for enterprise level websites. If they know about WordPress or Powerpoint I draw some kind of comparison such as being open source or written in PHP. I also share examples of high profile websites built with Drupal. Best example is The Weather Channel website which most people use and I tell them we at Mediacurrent built it. (shameless plug).

5. How did you see Drupal evolving over the years? What do you think the future will bring?

I started working with Drupal 6 back in 2007 and it is great to see how far Drupal has come. As a Front-End developer going from PHP templates to Twig was a huge improvement. Mobile first and accessibility have improved drastically from the old days. Other significant improvements are APIs, Layout Builder and Configuration Management. Lastly, the promise of a better upgrade path will be a big win for people building websites as well as site owners when Drupal 9 is released.

6. What are some of the contributions to open source code or to the community that you are most proud of?

Although I have made code contributions to the Drupal ecosystem, my proudest contribution is being able to provide training and technical resources for others to consume. I personally enjoy conducting training workshops at small camps where people are eager to learn. In most cases this contribution is free of charge but it is the most rewarding experience for me personally.

7. Is there an initiative or a project in Drupal space that you would like to promote or highlight?

Mediacurrent recently introduced our own Drupal Distribution called Rain, which is an Enterprise Distribution. We have worked and continue to work very hard on providing a turn-key solution for anyone looking to build an enterprise level website. In addition to hand-picked modules and functionality, the Rain distribution provides an optional Decoupled front-end which runs on Gatsby. We are very proud of Rain and are excited to see what people build with it.

8. Is there anything else that excites you beyond Drupal? Either a new technology or a personal endeavor. 

We at Mediacurrent are working hard to take our training offerings to a new level. We have great plans for providing custom training for teams and the community and are very excited to make Mediacurrent the go-to agency for training that goes beyond Drupal.  

Jun 17 2019
Jun 17

open waters

Mediacurrent is proud to announce the launch of our new podcast with the release of our pilot episode. Open Waters is a podcast exploring the intersection of open source technology and digital marketing. It’s made especially for CMO's, Directors and Managers of Marketing, technology, and digital strategy.

Our Purpose

We think open source is an ocean of opportunity to maximize your martech investment. 

We encourage you to listen and learn about using open source technology and forward thinking marketing strategy to generate and convert leads, improve security, increase speed to market, and identify the ROI of your digital investments. Our goal is to educate about the challenges and solutions we see with our own clients and in the market.

Welcome to Open Waters - Episode 0 

Dive in to our pilot episode!

Audio Download Link

In this episode:

  • New format, shorter but more frequent episode release schedule.
  • We're taking a different direction from our Mediacurrent Dropcast, no longer focused strictly on Drupal. Instead, we will be talking about the business benefits of open source software.
  • We are going to change up some sections. A little less news, and more about solutions.
  • We will probably still do the Pro Project pick from our Dropcast

Upcoming Episodes:

  •  Ben Robertson, who presented at the GatsbyJS Days conference in December, will join us to talk about the benefits of Gatsby JS.
  • Mario Hernandez will be on the podcast to talk about our upcoming expanded training for components. 
  • We’ll have an episode to talk about how to choose a CMS, whether it’s Drupal, WordPress, or any of the other bazillion options.
  • Bob Kepford, you may have heard of him, will be on to talk about serverless 101 and the problems it can solve.
  • We will have Jason Lengstorf from Gatsby on to talk about the project.
  • And much, much more.

Subscribe to Open Waters 

New episodes will be released tri-weekly on Tuesdays.

How Can I Support the Show?

Subscribe, leave a review, and share about us on social media with the hashtag #openwaterspodcast. Have an idea for a topic? Tweet at our hosts Mark Casias, Bob Kepford, and Mario Hernandez. Be sure to subscribe in your favorite podcast platform. Links to follow.

Jun 17 2019
Jun 17

Subscribe to the TCDrupal News

Jun 17 2019
Jun 17

Submitted by heykarthikwithu on Monday, 17 June 2019 - 14:18:28 IST

Run Simple test cases from terminal via Docker commands

from Drupal root, we could use the below command to run the test cases.

$ scripts/run-tests.sh --verbose --php /usr/local/bin/php Globe

In case, If we have a docker setup for our local envirnoment, we could use this below command to run the test cases.

$ docker exec -it drupal_phpfpm_1 /usr/local/bin/php scripts/run-tests.sh --verbose --php /usr/local/bin/php Custom

drupal_phpfpm_1: Docker container name
/usr/local/bin/php: Path to the Php installation
Custom: Group name of the test cases

The same command could be used to run the test cases on you CI/CD envirnoment.

Jun 16 2019
Jun 16

I was pleasantly surprised earlier this week to discover how easy it is to lazy load images in Lightning*.

Lightning ships with the Blazy module, which integrates the javascript library of the same name. Accomplishing lazy loading of images is as easy as changing the display widget to use the Blazy formatter. As a test, I set up a content type with an image Media field on my local environment, set the Media entity up to use Blazy, and created a View to display all the content.

With the formatter set, images are only loaded when they are within a configurable distance of the display window. The impact, as you can see in the screenshot below, is that with Blazy enabled initial page load makes 3 image requests, load time is just over half a second, and transfers about 5K. When scrolling the page, images are loaded in as they approach the viewport.

Screenshot of page and web inspector network traffic with lazy loading enabled.Screenshot of page and web inspector network traffic with lazy loading enabled.

With normal, full content loading, the page makes 19 image requests, the load time is roughly 4 seconds, and the transfer size is 600K (my source images are pretty small).

Screenshot of page and web inspector network traffic using normal loading.Screenshot of page and web inspector network traffic using normal loading.


The 1.x branch of Blazy, which is what Lightning ships with, does not work when embedding Media through CKEditor nor when using the CKEditor image embed option. There is a "Blazy With Media" formatter option in Lightning. I've not played with it but it may resolve at least the first issue. The 2.x branch of Blazy also apparently supports Media oEmbed and has an input filter for inline images.


Ironically, I don't actually use Lightning on this site, a fact which I expect I'll get some grief about from the folks at work, and which, perhaps, I'll reconsider at some point. Nor do I have Blazy enabled, though I expect I'll be changing that in short order also.

Jun 15 2019
Jun 15

This year's edition of Drupal North has come to an end and what a great experience it has been. We got to connect with so many people in the community, share our experiences, and learn from others. Here are some of the highlights and key takeaways from the last 3 days:

Accessibility really is on the top of everyone's minds

Throughout the conference, there were so many conversations about accessibility -- from best practices, to the future of accessibility tools and websites. With the passing of Bill C-81, government and higher education institutions in Canada will need to make this a top priority as their websites will need to be compliant with Level AA WCAG standards. Those using Drupal will already be 1 step ahead as it is more accessibility-friendly than other content management platforms.

Just like Drupal, the Drupal North community values openness

The people that make up the Drupal community are always willing to share tips, tools, information, and what processes work best for them. Some of the attendees we spoke with specifically said they were excited to implement some of the techniques and tools that were discussed at Drupal North. This is a community of learners and innovators, always striving to move the web forward.

We are a group of problem-solvers

Some of the most valuable conversations this week were held when attendees were encouraged to share problems they've been encountering and ask the community for ideas and suggestions. The roundtable breakouts at the summits were great for brainstorming and connecting with others having similar issues, and lots of great feedback and input was shared during the Interactive UX Workshop that Alex Dergachev and I hosted.

We hope everyone had a great time at Drupal North 2019 and we are very proud to have been a Gold Sponsor for this year's conference. Keep following along with us on LinkedIn and Twitter, stay up-to-date on future trainings and UX Meetups, and reach out to us if you want to talk Drupal.

Jun 14 2019
Jun 14

O'Reilly OSCON Open Source Convention logo in red black whiteDrupal will be represented again at this year's O'Reilly Open Source Convention (OSCON) in Portland, OR in July. We'll have table P8 in the exhibit hall. If you're attending, make sure to visit our table on Wednesday / Thursday.

Community volunteers and local Drupal Association staff members will be at OSCON to talk about Drupal with attendees. We're looking forward to spreading the Drupal love!

If you'd like to help out, please contact me.

Dates: July 15-18

Location: Oregon Convention Center

Register here and use code USRG to save 25% off most registration types.

Jun 14 2019
Jun 14

In April 2018 at DrupalCon Nashville, Dries and then-Executive Director of the Drupal Association Megan Sanicki announced the launch of an initiative to help promote Drupal in the marketplace. This initiative was designed for agencies worldwide, offering marketing and sales support that unifies the Drupal brand and provides standardized materials that can be customized to each user's needs.

The fundraising goal for this initiative was $100,000, and we committed to starting work once we hit the $75,000 mark. In summer 2018 we reached $76,000 in funding and outlined the first phases of work we would complete with these funds. That funding was utilized and those first phases completed in Spring of 2019. We’ll talk about what was accomplished here, and what comes next for the Promote Drupal program.

Purpose (as stated in previous posts)

One of the Drupal Association goals is to grow adoption of Drupal. The audience for Drupal is broad and varied, as are the decision-makers choosing to adopt Drupal, as well as the people and agencies selling Drupal services.

Our enterprise market competition has deep pockets for product marketing and heavy sales support. Even our mid-market open source competition’s marketing is heavily backed by corporate funding.

So how can the Drupal Association help grow adoption of the product, across such a diverse market, with our limited budget? It won’t be easy, and it won’t be perfect for everyone, but an ideal outcome will create a source for standardized Drupal materials and stories that the worldwide community can use in their own regions to promote Drupal to new audiences and grow adoption.

To that end, this initiative is focused on creating materials targeted to the decision-makers who choose to adopt Drupal for business; specifically, for marketing decision-makers—the audience most underserved in current materials. 

What we've accomplished

The Promote Drupal Initiative was designed in four phases:

  • Phase 1: Update Drupal's brand and strategic messaging to connect with new decision-makers and influencers
  • Phase 2: Provide sales and marketing materials that everyone can use (and translate!)
  • Phase 3: Coordinate PR campaigns
  • Phase 4: Create "marketing campaigns in a box" to support localized ad and industry event marketing

This fundraising campaign supported Phase 1 & 2.

In the past 10 months, we've moved forward on the following deliverables:

Phase I

Create Drupal brand book

Complete Found here Building an open source marketing infrastructure for collaborative projects - and governance to guide its use. Complete You can join here  Create a "Why Drupal?" Video for widespread use Complete Video here

Distributing press releases as they come up - sharing finished releases with international regional associations for translating and sharing in their own communities

Complete Found here Create Drupal Pitch Deck: More about it—and how you can use it Complete  Found here

Redesigning the submission process and template for case studies and how they are selected as Drupal business case studies—and using these for general Drupal brand collateral

Near completion This is in final development and will be launched in August.

Phase II 

Set a roadmap for the most-needed marketing and sales materials in the community Complete  Work found here

Begin implementing that roadmap through the online community interface

Complete  Work found here Redesign home page of drupal.org to be persona-focused Complete https://www.drupal.org/home

Continue pushing press releases and media recognition

Complete Found here Have "Why Drupal" Video available in different languages  German translation complete Here Complete a Competitive Comparison Chart  In Progress  Work found here Drupal in the Enterprise: Integration with other Digital tools/solutions In Progress Work found here Infographic(s): Number of sites using Drupal, other stats about Drupal usage In Progress Work found here Drupal and Future Technologies: Drupal integration with AI, data science, etc. Not yet launched Idea found here Video interviews of companies using Drupal Not yet launched  Idea found here

This work is important

We see this initiative as an important way to support agencies in building new business, and creating a unified brand for Drupal worldwide. By understanding Drupal and its capabilities - particularly as the shift to Drupal 9 will be happening in 2020 - we aim to educate the curious regarding the vast ecosystem of Drupal's digital marketing technology and other business applications. 

Funding & moving forward

The idea of the initiative was to be a combination of self-sustaining community contribution - much like the code developed for Drupal - and partially an ongoing program supported by the Drupal Association, assuming funding to pay staff to support the work. 

Now that the initial funding is done, the Association plans to continue hosting Promote Drupal meetings, and to help guide the process for those participating until a plan is in place for future funding of this work. 

Promote Drupal needs your support

In order for the work to continue we are asking for community support. 

If you own an agency, please consider allocating some of your marketing team's time toward the Promote Drupal Initiative to move it forward. You do not need to reach out to Drupal Association staff directly for this to happen - you can simply have your team members join the meetings and participate in the work. We invite you to view projects in progress and see where you can lend your expertise and time. 

One element of work that would be particularly useful is to have the "Try Drupal" video translated into languages beyond English and German. Likewise, the additional materials listed above would have further reach worldwide if translated. 

Another opportunity is to add your materials to the Promote Drupal Pitch Deck (a.k.a. "Drupal in the Wild"); see the process here.

Thank you!

On behalf of the Drupal Association, we extend a big thanks to the original sponsors of the Promote Drupal Project—more than 50 agencies, as seen here. We also have a shout out to individual contributors; thanks to all 54 Team Members.

It is our hope that the community engages in this initiative in a way that helps sustain its momentum and continue producing meaningful content for the Drupal community. 


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