Upgrade Your Drupal Skills

We trained 1,000+ Drupal Developers over the last decade.

See Advanced Courses NAH, I know Enough
Oct 02 2020
Oct 02

The Views Bulk Operations module is used by Drupal agencies when performing bulk operations on results to tables or other items created with Views. In this example, I will show you how to add your own action that will change the state (Workflows) of selected entries.


The action is performed on all selected entries and automatically performed in Batch queues so as not to overload the system and not to "crash" the page when the process takes too long. If you know what you are doing and you have reasons for it, you can turn off the queuing option in the field configuration.

VBO installation and configuration

The Views Bulk Operations module can be installed by downloading and unpacking the package in the modules/contrib directory or by using the composer command, which will download the latest stable version of the module.

composer require drupal/views_bulk_operations

After installation, the module does not need to be configured in any way, you just add the appropriate field to the page (or block) created by the Views module.

  • Add a new Content view that creates the page.
  • Set the display format to Table. It is not necessary, the checkboxes on the table simply look more natural
  • Add the title field
  • Add the Views bulk operations field


Action configuration for a VBO field

In the field configuration, you can mark which mass actions can be performed on the results. There are over a dozen predefined actions, such as:

  • deleting entries
  • publishing
  • sticking


The above list is compatible when the view displays Content. If you add the view that displays Users, you will notice that the list has different actions.

Adding own action to VBO

The goal is to add your own actions on entries (Content) that will change the state (Workflows) of the selected entries.

Entry states are not available immediately after Drupal installation. In order to do this, you need to enable two additional modules that are directly in Drupal, you do not need to additionally download anything.

Go to the page with modules - admin/modules

Enable the modules: Workflows and Content moderation


Workflows configuration

For the purposes of this post, I will use automatically-defined states for the Editorial type, which is available immediately after enabling the Content moderation module.

All you need to do is enable a given type of state transition for the selected content types.

  • On the page admin/config/workflow/workflows edit the Editorial type
  • Set the Article content type


This operation will add a new field to every add/edit article form.


To the view where the VBO field is, add

  • a field displaying the state of a given entry - Content: Moderation state
  • a filter that will limit the display of entries of the Article type

If added is a filter restricting entries to published only Content: Published (= Yes) then remove it. It will block the display of entries that have a state of e.g. Draftor Archived, which are not being published by definition.

Own action code

Create your own module end enable it. In my case, the module's name is d_workflows

In the module's directory create a directory structuresrc/Plugin/Action

Create in it a new class file for the action to change the state of the entry into Published.

Filename: PublishNodeAction.php

 * Content moderation publish node.
 * @Action(
 *   id = "d_workflows_publish_node_action",
 *   label = @Translation("Publish node (moderation_state)"),
 *   type = "node",
 *   confirm = TRUE
 * )

class PublishNodeAction extends ViewsBulkOperationsActionBase {

Class annotation is important here.

You set in it an id for the action – this can be any unique value. It is worth to include in its name the name of the module and what the given action is doing.

Label is the value that will appear in the VBO field configuration

Type is the type of entity, for which the new action will be available. In this case, it is node, but it can be, for example, user, taxonomy_term, or any other.

This class inherits from ViewsBulkOperationsActionBase

It requires declaring two methods:

  • execute() - what is to be executed for each record
  • access() - who can perform the action

Example of a code for the execute() method

 * {@inheritdoc}
public function execute(ContentEntityInterface $entity = NULL) {
  if (!$state = $entity->get('moderation_state')->getString()) {
    return $this->t(':title  - can\'t change state',
        ':title' => $entity->getTitle(),

  switch ($state) {
    case 'archived':
    case 'draft':
      $entity->set('moderation_state', 'published');

  return $this->t(':title state changed to :state',
      ':title' => $entity->getTitle(),
      ':state' => $entity->get('moderation_state')->getString(),

The first condition checks whether the given entity has the state setting option enabled.

In this case it is only Article. When the action is initiated on entries with no states enabled (empty $entity->get('moderation_state')->getString()) it will be interrupted and an information about it will be displayed.

The condition can be easily extended by e.g. checking the content type for the entity


Further down the code, the current status of the entry is being checked and if the condition is met, the code changes its status into Published.

$entity->set('moderation_state', 'published');

Example of a code for the access() method

   * {@inheritdoc}
  public function access($object, AccountInterface $account = NULL, $return_as_object = FALSE) {
    if ($object instanceof Node) {
      $can_update = $object->access('update', $account, TRUE);
      $can_edit = $object->access('edit', $account, TRUE);

      return $can_edit->andIf($can_update)->isAllowed();

    return FALSE;

In this simple condition, it is being checked whether you are operating on Node type objects and whether the user performing the action has the authorisation to edit and update it. Otherwise, the code will return a FALSE, and the action will not be executed.

The whole PublishNodeAction.php file looks like this:


namespace Drupal\d_workflows\Plugin\Action;

use Drupal\node\Entity\Node;
use Drupal\views_bulk_operations\Action\ViewsBulkOperationsActionBase;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\Entity\ContentEntityInterface;

 * Content moderation publish node.
 * @Action(
 *   id = "d_workflows_publish_node_action",
 *   label = @Translation("Publish node (moderation_state)"),
 *   type = "node",
 *   confirm = TRUE
 * )

class PublishNodeAction extends ViewsBulkOperationsActionBase {

  use StringTranslationTrait;

   * {@inheritdoc}
  public function execute(ContentEntityInterface $entity = NULL) {
    if (!$state = $entity->get('moderation_state')->getString()) {
      return $this->t(':title  - can\'t change state',
          ':title' => $entity->getTitle(),

    switch ($state) {
      case 'archived':
      case 'draft':
        $entity->set('moderation_state', 'published');

    return $this->t(':title state changed to :state',
        ':title' => $entity->getTitle(),
        ':state' => $entity->get('moderation_state')->getString(),

   * {@inheritdoc}
  public function access($object, AccountInterface $account = NULL, $return_as_object = FALSE) {
    if ($object instanceof Node) {
      $can_update = $object->access('update', $account, TRUE);
      $can_edit = $object->access('edit', $account, TRUE);

      return $can_edit->andIf($can_update)->isAllowed();

    return FALSE;

A new action will be available in the VBO field edit



Experienced Drupal developers ensure that adding new actions to Views Bulk Operations is simple and comes down to creating an additional class with two methods. Based on this simple example, you can build more complex mass actions on entities of various types.

Oct 01 2020
Oct 01

On the surface, it may seem like code that uses Guzzle to make HTTP requests will be difficult, however thanks to Guzzle's handler and middleware APIs and Drupal's KernelTestBase, it's not that painful at all.


When you write code in Drupal 8/9 that needs to make HTTP requests, you will make use of Drupal's http_client service. Under the hood, this is an instance of Guzzle's client.

Once you start using the service, it may feel like your code can't be tested, because you're making requests to other sites/services on the internet.

However, Guzzle has first class handling for testing HTTP requests, and with Drupal's KernelTestBase, it can be quite easy to wire up a mock handler


The code samples below assume you're using dependency injection in your code to inject an instance of the http_client service.

Getting setup

In your kernel test, firstly you need to mock the http_client service

The code for that looks something like this:


namespace Drupal\Tests\your_module\Kernel;

use Drupal\KernelTests\KernelTestBase;
use GuzzleHttp\Client;
use GuzzleHttp\Handler\MockHandler;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Middleware;
use GuzzleHttp\Psr7\Response;

 * Defines a class for testing your code ✅.
 * @group your_module
class YourModuleTest extends KernelTestBase {

   * {@inheritdoc}
  protected static $modules = [

   * History of requests/responses.
   * @var array
  protected $history = [];

   * Mock client.
   * @var \GuzzleHttp\ClientInterface
  protected $mockClient;

   * Mocks the http-client.
  protected function mockClient(Response ...$responses) {
    if (!isset($this->mockClient)) {
      // Create a mock and queue responses.
      $mock = new MockHandler($responses);

      $handler_stack = HandlerStack::create($mock);
      $history = Middleware::history($this->history);
      $this->mockClient = new Client(['handler' => $handler_stack]);
    $this->container->set('http_client', $this->mockClient);
   * Tests your module.
  public function yourModuleTest() {
    // ...

Let's breakdown what the mockClient method is doing:

  1. It takes a variable number or Responses as an argument. This is using the splat operator to type-hint that each argument needs to be an instance of Response, and that there is a variable number of arguments
  2. Then it's creating a new mock handler, wired to respond with the given responses
  3. Then it's using the HandlerStack's create factory method to create a new handler stack with this handler
  4. Then it's adding a new history middleware, using the $this->history variable to store the request/response history
  5. Next, we're pushing the history middleware into the handler stack
  6. Then we're creating a new client with the given handler stack
  7. Finally, we're setting the http_client service to be our newly created client

Putting this to use

Now, we need to tell the mockClient method what responses we expect, we do this in our test method - like so

   * Tests your module.
  public function yourModuleTest() {
      new Response('200', [], Json::encode([
        'something' => 3600,
        'foo' => 'bar',
      new Response('500', [], Json::encode([
        'errors => [
          'you did something wrong',
   // ...

This code is wiring up the http client service to expect two requests. For the first request it will respond with a 200 status code, and a JSON-encoded body. For the second request, it will respond with a 500 and a JSON-encoded body containing some errors.

After mocking the client, you would then trigger a code-path in the system you're testing and make assertions about the return values/logic

Inspecting the requests

It's likely that you'll also want to assert that your code was making appropriate requests based on certain input parameters.

To do this, you can work with the $this->history property, which will contain an array of request/response pairs like so:

$last_request = end($this->history)['request'];
$first_response = reset($this->history)['response'];

You can access the requests made, and asset that required parameters or headers were set based on passed arguments you used when triggering the code-path you're testing.

See some examples

The Build Hooks module has been recently updated to add a fairly comprehensive test-suite. The module is designed to trigger HTTP requests against remote systems when certain events occur in Drupal. You can see example test code in that module to get a complete sense of how to use this approach in real world scenarios.

Photo of lee.rowlands

Posted by lee.rowlands
Senior Drupal Developer

Dated 2 October 2020

Oct 01 2020
Oct 01

The long-awaited Drupal 9 was launched on June 3, 2020. It comes with solutions that empower businesses to take advantage of the power of Drupal. With the thousands of modules that Drupal provides, I will take you through the ones that will help you with the development of the Drupal 9 site.

Here’s a list of the must-have Drupal 9 modules! 


The Token module provides tokens that are not supported by core and also provides a UI for browsing tokens. 

Admin Toolbar

The Admin Toolbar module allows you to improve the administration menu at the top of your website and transforms it into a dropdown menu, to make it easier to access all the administration pages. 


Metatag module allows you to provide structured metadata about a website. It provides support for metatags that gives you control over how your content appears when you share it on social networks.

It supports a large number of commonly used meta tags, including the page title, description, canonical URL, etc. 

Simple XML Sitemap

The Simple XML Sitemap module is needed by every webpage for SEO reasons. It creates a multilingual sitemap for entities, custom links, and views.

This module allows you to create multiple custom sitemaps through sitemap generator plugins along with customizing the URL generation through URLGenerator plugins. Also, the module gives access to automatic submission to search engines and XSL stylesheets for human visitors. 


The Pathauto module allows you to create patterns for your content while creating it. It automatically creates a URL for different kinds of content without the user creating one manually. 

Redirect Module

The Redirect module provides interesting functions like allowing you to create redirects manually and maintaining a colonial URL for all kinds of content, that redirects all other requests to that path. 

This module provides a common API for loading, deleting, and saving redirects. It also provides case-sensitive redirect matching with a hook to allow the other modules to decrease the candidate redirects. 


The Paragraphs module allows the site builders to make things cleaner so that you are able to give extra editing power to the end-users. 

This module has a 'paragraphs' field type that helps to add a new paragraph field on your content and choose which paragraph type should be available to the end-users. You can also add a custom options field and do confidential coding in your CSS. 

With the Paragraph module, end users can now choose on-the-fly between predefined paragraph types that are independent of each other. 

Twig Tweak

Twig Tweak module provides a twig extension that helps in improving development experience. 


The Diff module adds a tab that shows all revisions like standard Drupal, to permissioned users. The tab also shows all added, deleted, and changed words between revisions. 


The Shield module handles Drupal as a 'walled garden' if a user does not know a user name or password. It also creates a shield for the website with Apache authentication. 

If you need to keep unwanted traffic away, shield is the module! 


The Seckit module allows the modification of certain HTTP headers on your website to enhance the security of your site. You can always increase security in other ways. But the Security module makes it easier and more convenient. It comes with many security hardening options and reduces the risks of exploitation of web application vulnerabilities. 

Environment Indicator

With the Environment Indicator module, it becomes easy to work with stage, dev, local, and prod.

If this module is coupled with configuration split and admin toolbar modules, it can display which environment you are working with. It adds a color bar that informs you about the environment you are currently working with. 

Configuration Split

The configuration Split module allows outlining of the sets that will be exported to different directories and get merged together when exporting.

403 to 404

403 to 404 module is designed to show a 404 error when someone tries to access a page that they do not have permission to view. 

Inline Entity Form

The Inline Entity module provides a widget for inline management like modification, removal and creation. It extends the functionality of entity reference fields in Drupal which makes sure that the entities are edited, created and deleted on the go.

Advanced CSS/JS Aggregation

Advanced CSS/ JS Aggregation module improves the frontend performance of your website. It provides stampede file protection and uses locking so that multiple requests for the same thing results in just one thing doing the work. Check out performance optimization techniques of a Drupal website to know more.


The Webform module is responsible for making surveys and forms in Drupal. Emails can be sent to administrators after submission is done. This module has an extensive API to be able to expand its features and it also provides a basic statistical review. 


If you are wondering about navigating through the admin quickly, Coffee is your module! All you need to do is type alt + D to visit start this module and type for the page you'd like to visit. 

Queue UI

The Queue UI module allows viewing queues and the number of items, deleting and processing queues during cron, and also removing leases.

Backup and Migrate

The Backup and Migrate module allows you to decide which table and data to backup. With the help of this module, you can dump all of your databases to a file download or save it offsite and also restore it from the previously saved database. Read about how to migrate to Drupal 9 to know more.


The Devel module allows the execution of PHP code inside the website and also creates dummy content. 


The challenge-response that we often see while signing up or logging in is the work of the Captcha module. The main purpose of this module is to block sign-ups from spam bots that post spam content anywhere they can.

Chaos Tool Suite (Ctools)

Chaos Tool Suite is primarily a set of APIs and tools that help in improving the experience of the developers. This suite contains a module known as the page manager that manages panel pages, and as it grows, it manages more than just panels.

RESTful web services

The RESTful Web Services module provides a customizable RESTful API of data managed by Drupal. It allows you to interact with different content entities like users, comments, nodes, etc along with watchdog database log entries. Read everything about Decoupled Drupal and its approaches to know more.


The JSON:API module helps in formatting JSON responses. It allows users to customize how their content is arranged on a page and even create landing pages with an easy to use drag and drop interface.

Layout Builder

The Layout Builder module allows content builders to quickly create layouts to display content. You can easily customize your content’s arrangement on a page or across different kinds of content and even create landing pages that have an easy to use drag and drop interface. 

Media module

Media module is a replacement of the Drupal core upload field that has a unified user interface wherein administrators and editors can manage their files and multimedia assets. 

Media library module 

The media library module comes with additional features to find and use existing media items and enhance the media list. This is specifically designed for sites with a lot of content where all the media assets can be reused. 


Claro is a clean and accessible administrative theme. It is a part of the Admin UI and JavaScript modernization initiative. 


There is so much more that Drupal modules provide for your website to become an interactive one. All of these modules are actively maintained and compatible with drupal 9. You can use them to build something great. For an interactive and great user experience for your website reach out to us at [email protected]

Oct 01 2020
Oct 01

All of you must have a fair idea as to what marketing is, it is the art of selling through persuasion. The consumer may not have a need for a product, but could still be compelled to buy it with the right kind of marketing. This is a concept that starts with product designing and ends at consumer satisfaction and feedback to improve the design, it is the cycle of product life.

This is not an article which consists of some age old marketing tactics. Rather I will be talking to you about the new age of marketing in a domain where facades don’t really matter, but features do. Yes, I am talking about technology, more specifically people who are working towards building and improving technology. These are the developers, these are people who are not easily fooled by the hyperbolic ads the non-developers might believe. These people are too smart for that and their intellect is one reason for the emergence of the vogue of Developer Relations.

If you have a muddled definition of this topic, don’t worry I will clear all the murkiness for you. All you have to do is continue reading.

Decoding Developer Relations 

Before getting into the depths of the Developer Relations concept, I wanted to give you a glimpse of what DevRel can actually do for you. Nexmo, now Vonage, is the prime example of DevRel’s positive impact. Within a year, the company had enhanced its profitability through DevRel.

A blue background is showing the successes a company had witnessed through Developer Relations.A glimpse of the success attained through Developer Relations | Source: Nexmo

Such a success is not unheard of with Developer Relations. Now, you might be wondering how this could be possible. So let us get right into it.

In simple terms, Developer Relations is merely a job title; however, it is a job title that has become increasingly important in the technological business, where innovations from developers are the driving force. Developer Relations, also known as DevRel, can be described as a job that creates a connection between a company and the community. You should know that when I say community, I mean a specific category of people. Since DevRev pertains to companies, its community encompasses the employees, the customers and the prospective customers; some would say there aren’t many people left behind and they just might be right.

One area that Developer Relations concentrate on more than others is the contact with external developers. You must be wondering why, especially when these companies have so many internal developers with them and you are right to do so. For Developer Relations to do its job properly, external developers are integral. For the IT and tech sector, it is important to be in the know-how of what is happening in the market. Their internal developers cannot do that on their own, so external developers act like outside counsel for them. Remember I said something about community? External developers are at the heart of that community.

So, who benefits here?

The entire community because this is a concept that aims at strengthening the entire developer community. Having conceptualised in the eighties, it has come a long way from its Apple days. Being a proponent of technology, it allows you to learn everything you can, from coding to public speaking to new technology tools. Isn’t it great? 

It is not just me who thinks that Developer Relations is important for the community. Many influential personalities and Developer Advocates have voiced their perception of this job and all of them have a positive outlook towards it. Following are some thoughts of influential persons on DevRel as stated in The New Stack:

Lorna Mitchell, IBM Developer Advocate, emphasises on the power of words in DevRel. These words have a significant impact on the reader, their reach is unparalleled, unfettered by time and space. Opening a dialogue in the community becomes quite easy.

Michael Ludden, a program director and senior manager at IBM’s eminent Watson developer program strategy, explains DevRel as “a hybrid role that requires a unicorn to fill.” The title holder needs to be competent with software engineering, public speaking and community participation, thus the use of the word hybrid.

Quoting Phil Leggeter from Nexmo, “Developer relations is like the force - you can’t see it and can't feel it - you just have to believe it.” And this belief almost always pays off.

Jess Rose, Developer Relations Advocate for Crate.io believes authenticity is important,if interactions between people are to feel real and hold value. According to her, the measurement of authenticity is indeed difficult, but taking care of yourself, slowing down the pace and focusing on really important things can make a difference.    

Now, let me tell you about the two essentials of Developer Relations. 

Its other name, that of Developer Marketing, will give you a hint. This is a job that essentially marries two very different fields and that are engineering and marketing. Since DevRel deals with only developers, you have to have knowledge about this. And DevRel also focuses on promoting the products, so marketing skills and that too great ones are pivotal for the job holder.

Who Comprises the Developer Relations team?

Developer Relations is indeed a job title, but it isn’t a single man’s job. It could be, if you happen to have all the necessary skills for it. The role of a DevRel is quite multifaceted, so it mandates a lot of different roles within it. 

Let us have a look at them.

The four key members of the Developer Relations team are shown working together on a desk.The DevRel Team

Developer Evangelist

Yes, this term has a religious connotation, but in the business setting, it means the voice of the company and its causes. The role of a DevRel is nothing short of being an ambassador for the developers. So, an evangelist acts as the connection between the company and its developers, both in-house and outside, creating a buzz about their company and its products. To become an effective evangelist, 

  • you would need to be aware of the technicalities a developer faces, 
  • you would need to have excellent communication skills 
  • and you would need to be extremely social, this is so that you can build new connections and keep them satiated. 

Developer Advocate

This is the role that advocates the company’s platform to the outside developers, compelling them to make use of it. The end goal is to build a product that unifies the efforts of the entire community of developers with the internal team. External feedback, demos, sample codes are a few examples of the things a developer advocate would collect to ensure the product is as good as it should be.

Developer Experience

You must be familiar with User Experience and what it entails, right? Developer Experience or DX is somewhat similar to that, with the user being a developer. DX will let you know how good your product is and how well its API or SDK function. Developer experience is important because a good DX ends up becoming the talk of the town and your goodwill grows.

Developer Marketing

Marketing is also quite important for DevRev. It allows your brand to attract an audience of developers, which is what is needed for the growth of a technical company. Organising events, getting paid sponsors along with effective content and competent advocates are how you do marketing in the developer realms. 

An example of an effective DevRel team can be found in Google. Google has a global DevRel team that includes developers from all across the globe teaming up to build something truly inspiring. You can simply visit developers.google.com to get an idea, it fulfilling developer content is bound to impress you. From participating in forums and conferences to writing blog posts, API docs and sample apps, the DevRel team does all that it has to do and the constant buzz around Google is proof of their competence.

Why Does DevRel Need to be Capitalised?

The present world is being dominated by technology, with digitalisation overtaking every nook and corner of the technological markets; even the non-technical businesses are not totally distanced from this trend. So, with technology expanding at such a fast pace, developers have taken up an important role. Consequently, the need for Developer Relations has risen over time.

Let us understand the need a little more. The IT and tech companies are constantly developing new products and upgrading the existing ones. Have you ever wondered how they decide what should be done and what not? If you have not, then let me tell you that all of the developmental decisions in the IT and technology industry are taken by the developers, since their heart and soul lies with technical innovation. Their growing influence is why Developer Relations has become a trending vogue all across the world, as it allows companies to make sustainable connections with global developers.

DevRel has been consistently making efforts in opening a dialogue between companies and external developers and these efforts have only proven to be fruitful.

  • The DevRel team is able to make the target audience, being developers, aware about their company’s present products and future goals.
  • The awareness allows the developers to come into play through guidance and feedback and the DevRel team soaks up every word and implements all that can be.
  • When the DevRel is constantly in touch with the developer’s community, they often come across many talented developers and resultantly, recruit them to work in-house. A win-win for both.

Developer Relations is not a one-time job, it's a perpetual undertaking that continues to build trust and convince the end users to take up their company’s products.

A pie chart depicts the importance of Developer Relations.The importance of Developer Relations  | Source: TechRepublic

How Does DevRel Come into Play?

Now that you have become familiar with DevRel and all of that it can do for you, it is time to understand how it can do all of that. Just having knowledge of a trending topic is not enough, you also need to be implementing it, and the implementation needs to be flawless. That is why I am here because the audience you will be targeting is a tough one to impress. 

So here are some of the most fruitful ways to luring and sealing the attraction of all the developers you target through Developer Relations, let us begin.

A pillar is shown with multiple signs representing the ways Developer Relations (DevRel) can be implemented.

Understanding the developers needs 

DevRel is a trend that is for the developers, so understanding their needs becomes integral. So, whenever you are thinking about a topic that could interest them, stop and reevaluate your decision with the aid of a developer. You would have to involve actual developers because they would know and understand the needs better. Ask them to give you their concerns, ask them to check your work before posting, ask them to simplify something you did not get. At the end of the day DevRel is all about developers, so in order for you to do your job, you have to know what they want. And who better to ask then the developers themselves.

Getting trustworthy insights

As I have already mentioned more than once I believe, DevRel combines two very different worlds, that of marketing and engineering. So, you need to marry the best of marketing to the best of engineering. However, that becomes a problem when the best of marketing is something that the developers are fond of. The excessive use of superlatives is what marketers excel at and it is also what developers abhor. You have to let the product speak for itself, you need not use phrases like ”The best in this genre,” nobody believes that. And how do I know this, my constant contact with developers is one of the reasons. Your company must have several internal developers as well, go to them and ask for insights and change your marketing tactics.

Along with this, you have to know that you cannot get the technical stuff wrong EVER. So, when you think that you are out of your league with the technical jargon, go to a developer, ask him or her whatever it is you need and quote him or her verbatim. There is no chance of going wrong then because they are the experts. 

Enunciating the road map 

Developers are all of facts and figures, they do not need you to go around in loops, they would much prefer it, if you could come straight to the point and that too without exaggeration. So, when catering for the developer audience, focus on the road map they can follow and how it has to be done instead of the reasons to do so. This could be done through a guide of a kind, which would tell them all the things they need to know, for instance how a product is lacking in features and how it can be improved. This way they know what is needed of them and they will start working on it.

Making the developer feel important 

When you write for the developers, you have to make them feel like they are the centre of attention for you. A simple way to do so is to dedicate an entire section of your website to them, wherein, everything that you post, pertains to them. Such kind of action will also help in cultivating a sense of loyalty amongst the entire community. They would know that they can rely on you, simply because you have given them the importance they need.

Making yourself a part of developer’s community 

This one is probably the most important out of them all. A major of DevRel is building contacts with external developers. And you can only do that if you become involved with the community of developers. You do not really have to be a coder yourself to make that happen, rather if you have knowledge about what a coder actually does and how crucial his work can be, consider yourself qualified enough. Also, being a DevRel, you would continue to learn and grow.  

To be an active member of the community, you would need to attend developer events, where you can socialise and actually talk with developers and make contacts. Going on tech events and spending time with the tech guys is the only way the DevRel can do his job properly. Even in COVID-19, there were numerous virtual events for the developers, DrupalCon being one of the biggest. 

Apart from this, many companies have taken to social media to make the community connection all the more faster, although e-mails are also quite handy. Platforms like Facebook, Twitter, LinkedIn, Instagram and Snapchat, all act like the gateway to success in DevRel, since a vast majority of developers are active here. This is another tactic that the COVID-19 could not put a damper in.

Commanding respect with knowledge

More times than not, DevRel is a team, with knowledge, diversity and excellence in communication. If you have one person, who satisfies all of these, good for you. If not, you need to find people excelling at each of these. The DevRel team deals with engineers everyday and engineers are often not fond of non-engineers. So, you have to have the knowledge to command their respect. As part of the job, you could be asked to give your input on code or an API design and review the same, and without knowledge you cannot do that. So, the inclusion of engineers in the Developer Relations team is absolutely necessary, only then will the developers take it seriously.

The Crux of DevRel

So, what does the essence of DevRel come down to? If I had to choose three words to describe this trend, I would choose education, content and outreach. 

Developer Relations is a trend that is intent on building the company by educating its employees through in-house educational programs about the company’s products and its future goals. It is also about educating the customers by making them aware about what the company is all about through effective and meaningful content that they can find with ease. Lastly, DevRel is about knowing what the customers want and making that happen with the help of internal and external developers.

If you think about it, developer relations is not a very complicated job, at the heart of it, there is only one thing and that is ensuring the company’s technological developments never fail. That should not be too difficult, should it? I do hope our guide helped you in comprehending the trending concept.

Oct 01 2020
Oct 01

Recently, I came across an issue where private files in media entities, that were embedded in a paragraph, were accessible by anonymous users. While a user could not get access to the page, access was allowed via direct URL to the file.

In Drupal 8/9, when a file is attached to an entity, it receives some assumptions regarding its general access. That access generally follows the permission access rules of the entity that it's attached to. While this has its benefits, and certainly made sense back in the days when files were directly attached to nodes, it can create a situation where a private file can be directly accessed because its parent entity type is publicly accessible. 

In my case, a paragraph type that allowed for embedding different media entities was set to be viewable by all. Even though the parent node of the paragraph was set to a private access control, the extra embed levels of paragraphs and media items created an access override.

After trying out many different setups and modules that added more permission levels and controls, I finally came across a simple hook based fix, for making sure that any file that comes from the private file directory gets it's access checked before downloading. That hook is hook_file_download. I prefer simple code fixes and setups, rather than adding more modules and config to try and manage.

The hook


This hook allows modules to enforce permissions on file downloads whenever Drupal is handling file download, as opposed to the web server bypassing Drupal and returning the file from a public directory. 

Basically, what this means is that as long as a file is not being publicly served up through the public file directory, we can use this as an extra check point to make sure that private items stay private. More on this hook here.

The code

I'm including 2 ways to setup some basic control. Hopefully one will help out or guide you to the solution you need.

The first way (# 1) just assumes that all anonymous users should not be able to view any files from the private stream wrapper. The second way (# 2) checks if the current user has a specific permission set. For our case, the custom permission is called `access private files`. If the current user does not have this custom permission, the file is blocked.

use Drupal\Core\StreamWrapper\StreamWrapperManager;

 * Implements hook_file_download().
function MODULE_file_download($uri) {
        # Check if the file is coming from the private stream wrapper
        if (StreamWrapperManager::getScheme($uri) == 'private') {
                # 1: Block anonymous users.
                if (Drupal::currentUser()->isAnonymous()) {
                return -1;
        # 2: The user does not have the permission "access private files".
        if (!\Drupal::currentUser()->hasPermission('access private files')) {
                return -1;
        return NULL;

For the custom permission, whichever module you place your hook in, you need to add a permission YML file (MYMODULE.permissions.yml) in the module directory, with the following snippet:

access private files:
  title: 'Access private files'
  description: 'View privately stored files from their direct URL path'

Once the permission is in place, you can assign what roles can access private files as an ultimate access control.

The happy ending

The use case for this setup may be unique for most Drupal sites, but I know I have come across this particular situation on more than one occasion. Node types that leverage the power of paragraphs and media entities, for creating unique page experiences, can easily find themselves in this "Private file access overridden" situation. So make sure to always test private file access by visiting the direct URL access to those files. You never want to be caught exposing your private files on the internet!

For more information about this issue, please see https://www.drupal.org/project/drupal/issues/2984093 
and https://www.drupal.org/node/2904842.

Oct 01 2020
Oct 01

by Elliot Christenson on September 30, 2020 - 9:04pm

Two years ago, we had a blog post with the same title: So, When Do I REALLY Need to Upgrade From Drupal 7? A lot has changed in the past two years. In the world, of course, but also in Drupal.

Drupal 7 was released on January 5, 2011. It's nearly 10 years old and going strong!
Drupal 8 was released on November 19, 2015 which itself is nearly 5 years old!

Where do our legacy and most used Drupals stand? Read on...

I'm On Drupal 7, So I Have to Upgrade to Drupal 9 by November 2021 2022?

Due to the COVID-19 worldwide pandemic, Drupal 7's End-of-Life has been

If you get support from a vendor providing Extended Support, then you will have service for several years beyond the 2022 cut-off.

Without an Extended Support vendor, you really should look to upgrade to Drupal 9 - or move off Drupal entirely. Maybe all you really need is a static website?

The good news is that you do have that extra time to get thnigs figured out - whether that is securing a partner to help with long-term support or getting an upgrade project underway.

Contact Us Today for a Free Drupal 7 Site Audit

So If I am on Drupal 8 Today, I Have to Upgrade to Drupal 9 by November 2021?

Maybe, but that's not nearly as bad as it sounds. :)

The secret of D9 is that it's really just the next iteration of D8 - it's not going to be a complete rewrite like D8 or D7 or earlier major versions were.

Drupal 9 simply drops deprecated APIs, and updates 3rd party dependencies (like Symfony) - and not much else. In fact, the goal is to allow contrib modules that don't use any deprecated API to be compatible with both D8 and D9, without needing to have two separate versions of the contrib module (like we have always done in the past).

Upgrading from Drupal 8 to Drupal 9 will be more like upgrading from Drupal 8.5 to 8.6.

If you are uneasy about an update to Drupal 9 from Drupal 8, feel free to let us know!

Contact Us Today for a Free Drupal 8 Site Audit

So If I Get Your Service, I Never Have to Upgrade to Drupal 9?


We've been providing Drupal 6 Long-Term support for over 4 years, and I think we've proven that commercial Long-Term Support (or as it's called now "Extended Support") works! We've made dozens of security releases, and kept hundreds of sites supported and maintained, and plan to continue to do so for a while.

We've even gotten Drupal 6 core and popular contrib modules updated to run on PHP 7.2.

So, if you don't update to Drupal 9, we're going to provide Drupal 7 Extended Support - just like we've been doing for Drupal 6 - for a long, long time!

But if you don't plan to purchase Long-Term Support from us or another vendor, then you really should plan your upgrade by November 2022 for Drupal 7 or by November 2021 for Drupal 8!

Isn't Drupal 7 Dead Already? Be Honest!

The Drupal Community has committed to getting Drupal 7 to work on the newer versions of PHP through November 2022. Drupal 7 needs adjustments to completely work with PHP 7.2. Since the earlier versions of PHP are all being "End of Life" as well, this is a necessary step to keep your Drupal 7 site safe and secure. PHP is the programming language Drupal is built on, so changes in PHP have massive effects on what happens with Drupal! If all of that sounds a little familiar, it's because myDropWizard announced recently that we would update Drupal 6 to make it compatible with PHP 7!

There are hundreds of thousands - if not over a million - Drupal 7 websites still in operation providing all sorts of critical services.

Drupal 7 is far from dead.

How Hard Is it Move to Drupal 9 (from Drupal 6, 7, or 8)?

As mentioned above, as long as you are updated to the latest version of Drupal 8, and your modules and themes are compatible: it should be relatively simple to upgrade from Drupal 8 to Drupal 9!

Since Drupal 9 is going to be so similar to Drupal 8, moving to Drupal 9 (from Drupal 6 or 7) should be pretty much the exactly same as upgrading to Drupal 8. That might be good news - or disheartening.

You have Drupal 6/7/8 and Want Some Guidance? Please feel free to contact us for a free site-audit today!

OK, So How Hard Is It to Move to Drupal 9?

  • Many of the best modules have gotten incorporated into Drupal Core!
  • Still others have been obsoleted by new and better ways of doing things!
  • Many others have largely gotten updates to Drupal 9 compatibility!
  • Simple sites can be relatively easily updated to Drupal 9 from older Drupals!

That said, upgrading for most older Drupal 6, 7 or even 8 sites can still a big investment of time and money. Especially with the events of the past year, we fully understand that some organizations would prefer to just sit tight!

That's what our Extended Support is all about.

D6LTS D7ES (Early Sign-Up)

What's the Short Answer? When Should I Upgrade?

  • Drupal 6? You should already upgrade if you don't have D6LTS. We've been providing Drupal 6 Long-Term Support (and will continue to do so for the forseeable future :-)
  • Drupal 7? You should make plans to upgrade by November 2022 - or make sure you have D7ES engaged before then.
  • Drupal 8? You should make plans to upgrade by November 2021 - but that should be relatively straightforward if you've been keeping pace with updates.

There are all sorts of reasons why organizations don't update to the latest software - most of it boils down to budget. Small organizations with simple sites can't afford thousands of dollars to upgrade to the latest version of Drupal. Large organizations with comparatively complex sites can't always afford the expense of every upgrade either.

myDropWizard has plans to accomodate the needs of all sorts of organizations.

Sep 30 2020
Sep 30

Good website navigation is the best way to provide an enjoyable user experience. To create intuitive website navigation on Drupal 8 or 9, you should use the appropriate website navigation modules.

As we have already mentioned in our previous blogs, if you want users to be comfortable using your site and find all the information they need, you should develop website navigation that would be easy for children to use.

We do not want to offend anyone, it just really helps to imagine that your primary target audience is children. The simpler and clearer the navigation on your site, the more conversions you will get.

Today experts from the Drudesk web development agency will reveal all the secrets of creating understandable navigation and share their favorite Drupal 8/9 modules for intuitive website navigation.

What Is a Website Navigation Menu and why is it important on a website?

Your site may be well SEO-optimized, well-designed, and contain quality content, but if it has poor navigation, it's all for nothing.

Navigation is needed so that visitors can find what they need as quickly as possible. Although the site owners often do not pay attention to this, it is vital.

If your Drupal site looks like a labyrinth without any clear paths or exits, fix it. Think over your website navigation structure so visitors use as few clicks as possible but still get all the information they need.

Best Tips To Improve Your Website Navigation

Whether you want to create your site navigation from scratch or improve existing sites, we advise you to use these tips. We bring to your attention a list of selected tips for creating user-friendly website navigation.

Top 9 Website Navigation Best Practices and Tips

  1. create clear headers for the navigation site menu
  2. add a site search function
  3. put yourself in the user's shoes
  4. create easy navigation for mobile devices
  5. only enable the main navigation menu
  6. consider sidebar to be different from the main one
  7. place the navigation where users expects to find it
  8. use footers productively
  9. link the logo to the home page

Drupal 8 and 9 modules for intuitive website navigation

Drupal CMS is the best option for creating a website with straightforward website navigation due to the possibility of using core and contributed modules.

1. Menu Block 

Version it works with: Drupal 8, 9

Updated: 24 April 2020

3 Main features of Menu Block

  • advanced site menu settings
  • creates a tree-style navigation 
  • unlimited menu levels
Menu Block

2. Easy Breadcrumb

Version it works with: Drupal 8, 9

Updated: 8 September 2020

3 Main features of Easy Breadcrumb

  • creates configurable breadcrumbs
  • can hide or edit any specified links
  • automatically extracts the breadcrumb's segments
Easy Breadcrumb

3. Superfish

Version it works with: Drupal 8, 9

Updated: 4 June 2020

3 Main features of Superfish

  • integrates jQuery plugin with your menus
  • creates megamenus
  • works for touchscreens
Super feis

4. Sitemap

Version it works with: Drupal 8, 9

Updated: 8 June 2020

3 Main features of Sitemap

  • shows the site structure in a clear hierarchical structure
  • generates and displays RSS feeds automatically
  • creates a site map of Drupal

5. Menu Item Role Access

Version it works with: Drupal 8, 9

Updated: 10 April 2020

3 Main features of Menu Item Role Access

  • controls access to your menus website
  • customizes menu display for different roles
  • restrict the separate items different users can see
Menu Item Role Access

6. Cheeseburger Menu

Version it works with: Drupal 8, 9

Updated: 27 February 2020

2 Main features of the Cheeseburger Menu

  • works well with Drupal Commerceuses taxonomy as the structure of your menu
  • uses CSS for Scrolling
 Cheeseburger Menu

7. Simplify Menu

Version it works with: Drupal 8

Updated: 27 December 2019

3 Main features of Simplify Menu

  • displays menu in Twig template
  • customizes the markup for your menus
  • gives you full control over on the menus array
 Simplify Menu

8. Total Control Admin Dashboard

Version it works with: Drupal 8, 9

Updated: 23 May  2020

3 Main features of Total Control Admin Dashboard

  • adds panel page with administration tools
  • creates a single place to manage the Drupal site
  • reflects admin panes, taxonomies, quick links to users, menus, content types, site stats, and more
Total Control Admin Dashboard

9. Footermap: a footer site map

Version it works with: Drupal 8, 9

Updated: 9 November 2019

3 Main features of Footermap: a footer site map

  • creates a sitemap for the site footer
  • sets menu level limit
  • supports translation and caching
Footermap: a footer site map

10. Menu Breadcrumb

Version it works with: Drupal 8, 9

Updated: 26 March 2020

3 Main features of Menu Breadcrumb

  • generates breadcrumb with titles menus
  • under active development for 8 and 9
  • sets breadcrumb
Menu Breadcrumb

11. Drupal Mega Menu

Version it works with: Drupal 8, 9

Updated: 18 June 2020

3 Main features of Drupal Mega Menu

  • works with all devices
  • creates a menu and sub-menu
  • adds special classes, icons, item captions
 Drupal Mega Menu

12. Menu Item Extras

Version it works with: Drupal 8

Updated: 3 August 2020 

3 Main features of Menu Item Extras

  • creates extra fields for the Menu Items
  • builds complex menus
  • makes navigation stand out on the site
 Menu Item Extras

13. Hierarchical Taxonomy Menu

Version it works with: Drupal 8, 9

Updated: 2 June 2020

3 Main features of the Hierarchical Taxonomy Menu

  • creates a menu from taxonomy terms
  • configures a collapsible menu
  • customizes the HTML
Hierarchical taxonomy menu

14. Taxonomy Menu UI

Version it works with: Drupal 8, 9

Updated: 2 April 2020

3 Main features of Taxonomy Menu UI

  • creates menu items for Taxonomy terms
  • edits available menus and default parent item
  • edits menu link title, parent item, and weight
Taxonomy Menu

15. Varbase Total Control Dashboard

Version it works with: Drupal 8, 9

Updated: 23 May 2020

3 Main features of Varbase Total Control Dashboard:

  • works with Google Analytics Reports, Panels
  • creates a convenient and concise Admin Dashboard
  • has the mobile preview for admins
 Varbase Total Control Dashboard

Add the best modules for website navigation with Drudesk web development help!

Both you and your users will benefit from the fact that you installed the right modules for website navigation. You find it more convenient and faster to work with the site, and your visitors will get good user experience.

The Drupal website gives you this opportunity through installing various modules. Web developers from Drudesk can help you with installation and module customization. Contact our web company to get more!

Sep 30 2020
Sep 30

Our Drupal contributions history

Srijan has been part of the Drupal community for over 12 years. From very early on, we (Srijan) have been contributing to the Drupal project in multiple ways, from sponsoring nearly all DrupalCons since 2013, to regularly contributing code to core and contrib projects.

Many of our people have been mentors for new contributors at DrupalCons and local meetups. For the past 2-3 years, we even had a dedicated open-source community manager within the organization.


One of the earliest Drupal.org media case studies, published in 2009

Due to the COVID pandemic, we had a fairly large bench earlier this year. Given this, we decided to create three dedicated contribution teams to leverage this time efficiently and increase our contributions. During the same time, Drupal India Association (DIA) had set out a big-hairy-audacious-goal (BHAG) of putting DIA among the highest contributors globally.

Years of contributions and the above 2 events improved our overall ranking in the Drupal marketplace.

Where we fell short

Highly motivated by the dual goal of putting DIA on the marketplace and improving Srijan's ranking in the marketplace, some of our team members digressed from the objective and started "gathering contribution credits".

Soon we realized that out of the 25 contributors, a few were making mistakes like "assigning/unassigning issues without comments", or "submitting duplicate patches", meanwhile gathering credits intentionally or unintentionally in the process.

We acted immediately, realizing our mistake that we had not conducted a D.O "contributions code of conduct" training — as most of them were first-timer contributors.

We asked some of our seasoned contributors to organize a code of conduct training. These contributors led an internal training session to reiterate the Drupal code of conduct as well as build an internal best practices checklist for contributors at Srijan.

                        A screenshot from the training session

While this session helped in improving the quality of the contributions, we still noticed that a few people were not following all the best practices. Community members were still tagging Srijan and registering their complaints…we acted again.

This time we ‘painstakingly’ made a comprehensive report to identify the key issues and the defaulters.

The following unhealthy practices were identified and each team member was evaluated against these-

  1. Assigning/unassigning without comments
  2. Hopping/hijacking issues - i.e.,not reading the issue history and submitting incomplete patches
  3. Submitting duplicate patches
  4. Incorrect patches, or patches without comments/screenshots

Self-evaluation form filled by each team member, against each issue worked on

This detailed evaluation process took about 2 weeks to complete but helped us address the quality issues. These evaluation sheets will be maintained regularly going forward.


With the above steps, we eventually succeeded in putting a stop to the breach of the ‘code of conduct’ by a few overzealous (or careless) contributors.

We should have done a "code of conduct training" and set up a monitoring system so that we could have avoided these incidents. But that’s the benefit of hindsight.

On behalf of Srijan, I would like to apologize to the Drupal module maintainers and core contributors (including other Srijan contributors) who had to face unnecessary challenges due to some of our nonchalant actions.

Srijan is and will remain among the leading contributors to the Drupal community and a responsible one at that.

The purpose of this post is to address our problem of being tagged on Slack in the Drupal group, rectify them with the right practices, and share this learning experience with others to help them avoid these slip-ups.

I would like to end this post by highlighting some of the positive attention that Srijan’s contribution teams have received during the past few months.

Sep 30 2020
Sep 30

Drupal 10 is targeted for release in June 2022, but why is it necessary so soon after Drupal 9, and what will be in it?

Drupal 9.1’s first alpha release will be in October, and we’ve already started to prepare for Drupal 10. Drupal 10 will be the third major release since the adoption of a new development cycle for Drupal 8, however it will also be the first major release where the development has started with that cycle fully in place. Whereas Drupal 9.0 was released four and a half years and nine minor releases after Drupal 8, Drupal 10 will be released two years after Drupal 9 and just four minor releases.

Many aspects that allowed us to release Drupal 9, such as the deprecation policy, were developed while we were still building up to it, but Drupal 10 has all this infrastructure in place, and with few minor releases in between, the total change between Drupal 9 and 10 will be smaller. However, there are pressing reasons to release a new major version sooner than later.

Drupal 8 adopted a number of external PHP and JavaScript dependencies, notably Symfony and CKEditor. Both Symfony 4 and CKEditor 4 will reach end of life in 2023, meaning unless we backport security fixes for those projects ourselves, this also needs to be the end of security support for Drupal 8. Major versions are also when we tend to drop support for operating system requirements like older versions of PHP and databases, and for example PHP 7.4 will also go out of security support in 2023.


Drupal 9 released on Symfony 4.4, the LTS release for that major version of Symfony. However while we released on Symfony 4.4, we still had some Symfony 4 deprecations to deal with. We’re therefore updating Drupal 9’s codebase so that it’s up-to-date with the latest Symfony 4 code and where necessary providing bridges and custom deprecation notifications to enable contributed modules to become Symfony 5 compatible. In addition, Symfony 5 has already been released and is adding it’s own deprecations for Symfony 6, many of which can be addressed in Drupal 9. The goal then, is to release Drupal 10 on at least Symfony 5.4, but also keep up with Symfony 6 development and potentially jump to Symfony 6, if we can do so without disruption to contributed modules


CKEditor 5 was released in spring 2018, which means CKEditor 4 will go out of support during 2023. CKEditor 5 was rewritten from the ground up, and according to the CKEditor team should be considered an entirely new editor. This means we need to update to CKEditor 5, or even switch to a different modern editor in order to benefit from bugfixes and new features. Either approach has significant challenges both for adapting our integrations to the new editor as well as preserving existing content when it’s edited.

To make CKEditor available for Drupal 10, it actually needs to be available as a new module in Drupal 9 beforehand, so that sites can switch to the new editor and update their configuration before they actually update to Drupal 10. This means that time is short!

jQuery UI

jQuery UI was added to core eleven years ago and is stil used in several places in Drupal 9. However the rest of the JavaScript world, including the jQuery team itself, has moved on and it is not really supported any more, there is also no new version of jQuery UI to update to. Work is in progress to replace jQuery UI components we use in core with supported solutions. There’s also work to reduce our dependencies on jQuery itself, now that writing vanilla JavaScript is a lot cleaner than over a decade ago.

Guzzle, Twig, and more!

Guzzle 7 was released this month. Twig 3 was released in November last year. As time goes on, new major versions of different dependencies may be released, which we’ll in turn need to update to.

As with jQuery UI, Drupal 10 also gives us the opportunity to factor out dependencies from core, this has already been done with Symfony CMF.

New Features in Drupal 10?

As with Drupal 8 and Drupal 9, the Drupal 10.0.0 release is not really a target for new features, since we aim to minimise the changes between Drupal 9.LAST and Drupal 10.0.0. The good news though, is that features can be added to each Drupal 9 minor release. This means that CKEditor 5, the new Olivero front end theme, the new Claro admin theme etc. may well be available in Drupal 9 either as experimental or stable components before Drupal 10 itself.

How Can I Help With Drupal 10?

As well as the issues linked above, there is an overall tracking issue + several child issues for Drupal 10 In the Drupal 10 issue queue.

Every Monday at 6pm UTC, there is a Drupal 10 readiness meeting in the #d10readiness channel in Drupal slack.

Sep 29 2020
Sep 29

Image credit: Aaron Deutsch

I just started the process of preparing my Drupal 6 (!) site for migrating to Drupal 9. One of the first steps of my migration process was to figure out where to host my Drupal 9 site. Right now kristen.org is on Pantheon. Yes, Pantheon supports Drupal 6! Maybe they don't want me to advertise that though. :)

In this post, I'll discuss my initial impressions of surveying some of the biggest Drupal managed hosting companies. If your favorite hosting provider isn't covered here, let me know and I might do a follow up post.

Drupal 9 support

I've almost always used Pantheon or Acquia hosting for client Drupal projects. If the client was already using something "cheap" like InMotion or Bluehost, I would try (usually in vain) to get them to switch to a more robust managed hosting provider. When I started on this, I looked at 4 of the most popular Drupal managed hosting companies: Acquia, Amazee.io, Pantheon, and Platform.sh.

When I checked the status of Drupal 9 support by these "Big Four", I found that Drupal 9 was officially supported by Acquia, Amazee.io, and Platform.sh. Pantheon has a way to test Drupal 9 on a "multidev" (testing site) but doesn't have official support yet.

At the time of writing, Pantheon Co-Founder Josh Koenig said via Twitter that Drupal 9 should be supported by Pantheon within the next few months in time for Drupal 9.1. If you have an existing site, Pantheon's advice is to upgrade your site to the latest version of Drupal 8.9 and make sure your site is completely compatible with Drupal 9. Then, it will be very simple to jump to Drupal 9 when they flip the switch.

First impressions of Drupal 9 support

I went to each of these "Big Four" hosting companies websites to see if: 1) they supported Drupal 9, and 2) there was a free trial for me to test it. Unfortunately, I found each of the providers had some user experience (UX) or developer (DX) issues when attempting to evaluate Drupal 9. I reviewed companies in the following order.


Source: Screenshot of Pantheon.io Home Page

Of these "Big Four", I have the most experience with Pantheon, and I've always enjoyed their workflow and tools. Since I already have a Pantheon account and my kristen.org site is hosted on Pantheon, I logged in and went to create a new "sandbox". Pantheon allows a small number of free sandboxes to be created for each account.

My thought was that I would create a Drupal 9 sandbox and also create a "migration multidev" for my Drupal 6 site. Then, I would try to migrate directly from the Drupal 6 multidev site to the Drupal 9 sandbox site without using my local machine.

The issue I had on Pantheon was already mentioned previously. It doesn't yet officially support Drupal 9. I found this pretty surprising given that this is one of the oldest Drupal managed hosting providers.

One UX/DX issue I had was that it didn't mention Drupal 9 at all on the page where you choose a CMS. It only had WordPress, Drupal 7, and Drupal 8. I found out via Twitter that Drupal 9 wasn't officially supported yet, and that it would be probably couple months before it would be ready.

My advice to Pantheon is to add text on the CMS-selection page with Drupal 9 information or a link to a Drupal 9 page. That page could explain the Drupal 9 roadmap, including workarounds, so that others don't have to poke around to find out what to do. This would be very simple, but they said it wasn't something they typical do. Seems like a pretty obvious yet easy UX/DX improvement.


Source: Screenshot of Acquia Home Page

I already knew that Acquia supported Drupal 9 because I saw that information fly by on Twitter. This is not surprising since Drupal is the only CMS Acquia supports. But, I wasn't sure if they had a trial version and, if they did, how long the trial was good for.

I searched for "acquia drupal 9" which went to acquia.com/drupal9, but I didn't find that page helpful. So then I searched with "acquia drupal free trial" which had "Create a Free Acquia Cloud Site" that sounded promising.

Side note: I didn't see any mention of a free trial on Acquia's site when I clicked around. Even if I used their internal search. The only way I could get to the free trial was searching via a search engine and finding the correct form. I assume this is by design as they probably want people to contact them and work with their sales team.

I went to the "Create a Free Acquia Cloud Site" page and filled in the somewhat long form asking for the site name, first name, last name, email address, password, and even phone number. Along with, of course, the obligatory and ubiquitous "I'm not a robot" and terms of service checkboxes. In my opinion, this is too much to ask for when I just want to try the service out. I'm wondering how many people drop off here.

So I filled in the form and it asks me if I want a try a free application and there's another checkbox to check (hmm…). Then it created my application and when I clicked the "next" button, it LOGGED ME OUT of the Acquia site to have me log back in. :(

Okay, so I try to log back in and it doesn't work. Since there was only one password field, I was wondering if maybe I typed the password wrong in the original form. (Yes, I know, I should use a password manager, but I haven't set that up yet.) I checked my email to make sure I didn't get an email with a confirmation link I needed to click but I didn't see one anywhere.

So, I reset my password with their form (with another "I'm not a robot"). Then I try to use the password that I thought I had used and get "Passwords must contain at least 1 special character." Ugh. This isn't going well.

At this point, I get back in but am a bit discombobulated (I like that word though not that feeling). I'm on my account page and not sure where to go. I haven't worked on an Acquia site in awhile and when I did it was mostly on the command-line for several sites that are part of a very large multi-site infrastructure. Mostly what I did in the UI was download a copy of the database because drush didn't work for those sites.

I see "DEVELOP", "MANAGE", and "ENHANCE" so I pick the first one. Under "DEVELOP", I see my new "application" (with a typo in its name, whoops). I click on it and get to a more familiar "Dev", "Stage", "Prod" workflow. But now I'm wondering if this is even Drupal 9. Since Acquia only does Drupal (unlike the other providers), I assume it must be. One thing I notice is that it's using PHP 7.3. It would be nice if it was using 7.4.

I clicked on the application link and get a very uninspiring "Welcome to Acquia Cloud" page. The Marketing department needs to help the Engineering team here to make this better. But, what's worse is that the page isn't helpful at all.

At this point, unfortunately, I'm just tired and annoyed and decide to move onto Platform.sh. One side note though was that I had tried this about a week prior to this test. I forgot to take screenshots, so that's why I did it again. It seemed a lot easier the first time around, but I'm not sure what the difference was.

That first time, I did have an issue with that application-creation process where it *appeared* to be hung up, but it really was just taking a *long* time. I gave up waiting for it after about 10 minutes. It took somewhere between 10 and 30 minutes to provision the application. It would have been good if the screen would have told me it was going to be awhile and to go get a drink or go for a walk.


Source: Screenshot of Platform.sh Home Page

I've been curious about trying Platform.sh ever since I saw their first demo at BADCamp many years ago. The fact you could spin up an entire copy of your site by just creating *any* git branch seemed like a dream come true. Pantheon has "multidevs" which I love that are similar to this but are limited to a small number. This feature is much more commonplace these days with services like Tugboat.qa (which is pretty awesome).

I knew Platform.sh supported Drupal 9 and saw the eye-catching "Free trial" call to action (CTA) button at the top of their site so I started there. In my mind, this was the most compelling CTA of the four. Both Acquia and Amazee.io have "Request a Demo" which sounds like I'm going to have to talk to a sales person. Pantheon does have a "Get Started" CTA at the top as well as a "Start a Free Trial" CTA that's lower on the page but that one is overwhelmed by the bright yellow "Watch the Demo".

The biggest issue I had with Platform.sh right away was I got a "white screen of death" (WSOD) during the registration process. I think it was right after filling in my password. I was still able to go to my account after getting the fatal error and then everything seemed fine. But, this was a huge deal, obviously. Fortunately, Platform.sh fixed the issue right away which I confirmed today by trying the registration process again.

One nice thing I liked about their registration process is that I only needed to provide an email address to start with (or you can connect using Github, Google, or Bitbucket which I didn't try). Fill in your email address, an email is sent, you click on the button in the email, and it brings you to the form to fill in your password.

When going through the registration process again (to check it was fixed), I saw a lot more fields on the multi-step form with all but one required. In my opinion, username, country, and company shouldn't be required fields. Even the first and last name fields shouldn't need to be required. The only required field on the account settings page is username which could probably be defaulted based on the email address if it is really needed.

The other couple UX issues I found were 1) not knowing the password requirements and only finding out after submission, and 2) the multi-step navigation was not working properly (my data would get wiped when I used it).

Once I had an account, the process for creating a new project was very straightforward and I didn't have any major issues. I followed the process below. There is also a quick link on the Platform.sh Drupal 9 template page that will choose the template for you.

All-in-all, other than the WSOD, I was pretty happy with the Platform.sh process. I found it to be pretty straightforward. I was able to look around the page to figure out what I should do next. I appreciated the fairly simple workflow and the wizard to help with dealing with CLI and SSH key configuration. I hope to have a follow up post soon discussing the CLI and setting up Drupal 9.

  1. Click "Add a project" button
  2. Click "Use a template" option
  3. Enter "Project name" and "Region"
  4. Select "Drupal 9" template (you can filter by type of "Drupal")
  5. Wait about a minute
  6. Voila! You have a new Drupal 9 project to configure
  7. Click on the project, click URLs, and choose first URL
  8. Go through the site install
  9. Follow the "wizard" on the right of the project to set up CLI, SSH key, etc.

Platform.sh UX/DX feedback

One minor issue I had was when I looked at the templates. At first, I didn't realize you could scroll for more templates because the scrollbar doesn't show up unless you hover over the template region. Maybe this is obvious to everyone else, but I think it would be best to always show the scroll bar even if this isn't as "pretty".

One other thing was that the project placeholder image shows Error 502 which doesn't instill a lot of confidence. Maybe show the cute rabbit mascot or something more friendly and/or informative.

My final bit of feedback is that when you are on the "Projects" page, it has a link for "Back to projects". This is confusing, so it would be good to change the wording so this is clearer.

Click "Add a project" button

Click "Use a template" option

Enter "Project name" and "Region"

Select "Drupal 9" template (you can filter by type of "Drupal")

Wait about a minute

Voila! You have a new Drupal 9 project to configure

Click on the project, click URLs, and choose first URL

Go through the site install

Follow the "wizard" on the right of the project to set up CLI, SSH key, etc.


Source: Screenshot of Amazee.io Home Page

I heard via Twitter that Amazee.io could do a free trial by request which they call a "demo". When I saw "demo" on their site, I assumed that meant I would sit on a call with a sales person and they would show me their platform. That is not something I was interested in. I just wanted to play with it on my own.

Amazee.io's Founder, Michael Schmid, said he'd hook me up with a free trial. At the time of writing, I haven't seen an email for that, so I'll have to report on that later. I am empathetic here—I know Michael is a busy person—so no judgements! Also, now I'm wondering if I was supposed to fill in the contact form to make trial that happen... hmm...

Regarding the do-it-yourself nature of the other platforms, the Amazee.io founder said it's called Platform-as-a-service, not Platform-do-it-yourself. So, after thinking about this more, since Amazee.io isn't "do it yourself", then it probably shouldn't be included in this "Big Four" list. My goal, for now, was to find SaaS where I could easily create Drupal 9 sites for my personal, contribution, and small business use.

11 takeaways for Drupal hosting companies

Image credit: Aaron Deutsch

It's vital for EVERYONE in the Drupal space to do the best job possible to convert users to Drupal and keep them happy. There are many good alternatives to Drupal. Every hosting provider, freelancer, agency, and service provider needs to put their best foot forward to prevent Drupal going the way of the dinosaur. Even as competitors, we must all try to shine or Drupal can get bad reviews and lose market share.

I had UX issues with all platforms I looked at, some small and some large. Here are some generic and obvious takeaways that apply to any Drupal hosting company:

  1. Have a trial option that lasts at least 30 days
  2. Make it super simple to make an account
  3. Make it obvious how to create a new trial site
  4. Searching for "[company] drupal 9" & "[company] drupal free trial" should get me there
  5. For slow installations, add expected wait time (and a video to watch might be nice too)
  6. Make it easy to find your new trial site and understand the next step to take
  7. Have contextual help text/videos where appropriate
  8. Do user testing to see where people get hung up
  9. Use Lucky Orange, Hotjar, or similar heatmap software to see where people are looking and drop off
  10. Add automated testing for the entire registration and application creation processes
  11. Be very responsive on social media

Regarding that last point, Amazee.io, Pantheon, and Platform.sh responded quickly to me on Twitter, and engaged with others who commented on the thread. From what I could tell, Acquia did not respond, so possibly missed a marketing opportunity. Note that Amazee.io responded even though they weren't even in the original Twitter thread which was a smart marketing move.

I probably could go on and on, but that's good enough for now. For this exercise, the clear winner was Platform.sh BUT, if I had been completely new to Platform.sh as a vendor, then I may have just walked away when the white-screen-of-death (WSOD) came up during registration. For what it's worth, the fact that Platform.sh fixed the issue right after I reported was another good sign.

So, my final takeaway is to always assume your potential users might walk away at any point in your conversion funnel, and test and optimize each piece as if your business depends on it. Because it does.

Side note: I (unfortunately ;) did NOT get paid by any of these companies to review their services. But, if any of these or other vendors want to hire me for focused testing and evaluation, feel free to ping me on Twitter, LinkedIn, or at drupal at kristen dot org. :)

Image credit: Aaron Deutsch

Sep 29 2020
Sep 29

The Checklist API module is required: https://www.drupal.org/project/checklistapi 

Credits & Thanks

Thank you to Travis Carden (TravisCarden on Drupal.org) for helping Volacci create and maintain the SEO Checklist module. Travis also created the required Checklist API module.

About the SEO Checklist Module

The SEO Checklist module uses Drupal SEO best practices to check your website for proper search engine optimization.

The SEO Checklist module and the original book from which this guide is based upon, were designed to work together. While the SEO Checklist module tells you what to do, the book (and this guide) tells you how to do it. Over the course of this guide, we go through the SEO Checklist module one task at a time, explaining in more detail how to do each task and sometimes even a bit of why each item is needed.

As a module, the SEO Checklist does several helpful things that will speed up your work and learning curve.

  • It provides a to-do list with checkboxes of the SEO steps needed to optimize your Drupal site. There are modules to install and tasks to complete, organized by function. If you own this book or follow through this guide, you’ve got the one-two punch for Drupal SEO.
  • It checks for installed modules and, if it finds them, checks them off for you.
  • It adds a timestamp and username to track task completion.

Tip: Remember to click the Save button each time you check off an SEO Checklist to-do item or if an item is checked off for you!

Install and Enable the SEO Checklist Module

  1. Install the SEO Checklist module available here: https://www.drupal.org/project/seo_checklist

    NOTE: Drupal module installation instructions for modules can be found here: https://www.drupal.org/docs/extending-drupal/installing-modules

  2. Once the module is installed, make sure it's enabled by going to the Extend page of your website: Click Manage > Extend (Coffee: “extend”) or visit https://<yourDrupalSite.dev>/admin/modules.
  3. In the module filter search field, enter “seo checklist” to  find the SEO Checklist module.

    seo checklist installation image

  4. Select the checkbox next to “SEO Checklist” and click the Install button at the bottom of the page.
  5. You may get a message stating, “You must enable the Checklist API module to install SEO Checklist. Would you like to continue with the above?” If so, click the Continue button.

    install checklist api module

If necessary, give yourself permissions to use the SEO Checklist module.

  1. Click Manage > People (Coffee: “people”) and click on the Permissions tab. Or visit https://<yourDrupalSite.dev>/admin/people/permissions.
  2. Select the appropriate checkboxes for
  3. Click the Save permissions button at the bottom of the page.

Using the SEO Checklist module

To use the SEO Checklist module:

  1. Go to Manage > Configuration > Search and metadata > SEO Checklist (Coffee: “seo”) or visit https://<yourDrupalSite.dev>/admin/config/search/seo-checklist in your browser.
  2. You may see the message at the top that says “SEO checklist found X unchecked items...”. If you do, it means that there are some tasks already completed. Nice! You’re ahead of the game. If this happens, click the Save button near the bottom of the page.
  3. Click on the Be efficient tab. This expands the section and you'll be able to see:
    • A progress bar that shows you how many tasks remain;
    • Timestamps on your saved tasks (if you’ve done any yet);
    • Commands for Composer, Drupal Console, and Drush;
    • Task links to help you quickly get things done.

You’ll also notice that the tabs on the SEO Checklist loosely follow the sections of the Drupal 8 SEO book. We are currently updating and adapting that book to an online guide, so stay tuned for more content in the coming months! You can easily follow along and check things off as you go.

As you continue on your Drupal SEO journey you can use the SEO Checklist module to make sure you’ve done all you can to get the most out of your Drupal site.

Tip: Many steps throughout this guide start with going to an admin page, permissions page, etc. The links on the SEO Checklist can be another, even quicker way to get there.

You can now keep track of the Drupal SEO steps you've completed.

We always try to make sure our posts are as accurate and up to date as possible. If you find something is wrong, or you have a question, please feel free to contact us with any questions or feedback you might have.

And remember, Volacci stands ready to help you implement your Drupal SEO should you need us to.

Did you like this walkthrough? Please tell your friends about it!

facebook icontwitter social iconlinkedin social icon

Sep 29 2020
Sep 29

Let me give you an example. A change could be to correct a spelling mistake in a project. Which could be easily fixed were it not that someone could work on 10+ different projects. Finding the project, making a git clone, making a feature branch, making the change, committing it and making a merge request would all be manual steps that could be avoided. 

Notable features are:

  • Merge requests (also known as pull requests).
  • Discuss changes and improve code together.
  • Native integration with Dropsolid’s CI runners.
  • Single Authentication using the OAuth of Dropsolid Platform.
  • Take full control while protecting your main branch from rewriting its history.

Dropsolid Experience Platform wants to bring the best of those Open Core technologies closer to the end user. That is why, next to Drupal, Mautic, Apache Solr & Apache Unomi we also chose to embed GitLab in our mix to create the only real Open Digital Experience Platform in the world that is loved and embraced by developers.

In Phase 2 of our GitLab rollout we will also allow customers to enable Gitlab pipelines, either with runners that the customer brings or in packages that can be purchased at Dropsolid to run CI/CD tests with. It goes without saying that all official GitLab integrations also run on the Dropsolid Experience Cloud’s version of GitLab. 

Stop working around limitations of other deployment platforms, choose openness today and sign up for the Dropsolid Experience Cloud.

Sep 29 2020
Sep 29

Images play a significant role in improving the user experience of a website. A study shows that 90% of the information we pass on to our brains is visual. Many websites work around this theory alone and bombard users with tons of rich media like images and video files. Most of them overlook the presentation aspect of these media files and end up with a disappointing user experience. What they need is a tool like ColorBox that is an extremely lightweight jQuery plugin which allows you to display images elegantly and intuitively. The styles and functionalities are highly customizable via CSS and Javascript. The Drupal ColorBox module is compatible with Drupal 6, 7, 8, and now Drupal 9 too! In this article, you will learn how to configure, implement and further extend the ColorBox module for Drupal 9. 

colorbox for drupal

ColorBox for Drupal 

The ColorBox module integrates with ColorBox jQuery plugin into Drupal. The plugin is a lightweight customizable lightbox for jQuery. Among the other competitor “box” modules that are used for similar purposes (Thickbox, Lightbox2, Shadowbox, Greybox, etc.), the ColorBox module is the most popular and has the highest number of installs. The usage of Drupal ColorBox doesn't just end with displaying uploaded images beautifully. It also supports styling for like videos, pdfs, node, taxonomy, webforms, iframed content and more. The styling can be controlled through the CSS so the appearance is highly customizable. Functionality is also easily customizable via the JS file without having the need to touch the HTML. It supports photo grouping as well and preloads upcoming images

Steps to Install the ColorBox Module

           1. Using the Drush command

(Note: If you are using the drush command to install the ColorBox plugin, you must enable the module and then run the below command)

      drush colorbox-plugin

           2. Manually download ColorBox plugin
Download the Colorbox plugin and unpack in /libraries. Make sure that path to the plugin file looks like:


  •       Enable the Drupal ColorBox module.
            drush en -y colorbox

Congratulations! You are now ready to use the features of the ColorBox module.

Configuring the ColorBox Module

Configure the Drupal ColorBox module by navigating to Configuration -> Media -> Colorbox settings.

ColorBox Configuration          ColorBox Configuration

How to Create an Image Gallery Using ColorBox

1.    To make an image gallery, we first need to add an image field for one of the content types. Choose the label name and then click on the save and continue button.

Add an image field           Add an image field

2.    Next step is to configure the field settings. We can add the default image when there are no images uploaded. An alternative text for accessibility purpose and a title. The allowed number of values settings says maximum upload limit for a field. Select the desired option and then click on the save field settings button.

Configure Field Settings          Configure Field Settings

3.    Then we will set the other configurations for this image fields like Allowed file extensions, File directory, Maximum and Minimum image resolution, Maximum upload size, alt and title for the image and then click on save settings.

More Configurations          More Configurations

4.    Now, we are done image field configuration. Let’s set the formatting option for the image field created for ColorBox. Navigate to Manage display of the content type and then set the format option from the dropdown as ColorBox. Clicking on the gear next to the format option allows us to customize the image displayed. Once all the options are updated, click on the update button and then click on save option.

Manage display of ColorBox        Manage display of ColorBox

5.    Now Let’s add some content into our ColorBox image gallery by clicking on Add content. We can change the order of images uploaded based on image weights. And then click on the save button. The display of the content will look as below.

The ColorBox Image Gallery       The ColorBox Image Gallery

6.    Finally, clicking on any of the images displays the image within the ColorBox modal as shown below.


You can also do the same with video embedded field.

How to Integrate with the ColorBox Inline Module

The Colorbox Inline module allows the user to open the content that is already on the page within the ColorBox.

           drush en -y colorbox_inline

  • Drush en -y colorbox_inline
  • Open image in ColorBox modal which is on the page using a link
  • Navigate to add content -> Any content type which has body field 

Change the text formatter from basic html to full html

colorbox in drupal
  • Then click on the save button.

    Here in above example, data-colorbox-inline attribute of anchor tag can also contain class name instead of id. view image is a link where it opens an already existing image in a page (modify the changes according to your project requirements). We can use this module to render any content - video, webform, etc., in a similar manner.colorbox galleery

    On viewing this page, you can see a link with the image. And on click of the view image link, a ColorBox popup will appear as shown in below image.

ColorBox Configuration          ColorBox image popup

How to Integrate ColorBox With ColorBox Load Module

The ColorBox Load module allows users to load the content into ColorBox using Ajax. With this module, users can specify a series of paths which when rendered will open a ColorBox with the content. It depends on the NG Lightbox module for paths admin interface. This method can be used to render nodes, pages, web forms and more.

Install the colorbox load module

composer require 'drupal/colorbox_load:^1.2'

Enable the module using drush command / Manually enable through drupal UI 

Implementing a login popup using ColorBox Load module.

drush en -y colorbox_load

1.    Configure the ColorBox Load module by navigating to Configuration -> Ng Lightbox (Under Media). We can configure the paths for which we want to provide the ColorBox modal display, width of the ColorBox modal, class for the lightbox modal and renderer options. (Choose your option as desired).

Configuring the ColorBox Load module       Configuring the ColorBox Load module

2.    Now we can see the Drupal ColorBox modal implemented for the login page by clicking on the login button on the homepage.


How to Integrate ColorBox with Drupal Views

For some websites, we might need a feature that can display a ColorBox modal for a list of images. This can be done with the help of the Views module.
1.    Go to structure -> views -> add view.
2.    Add the image field to view and configure the formatter to ColorBox and other settings accordingly and then save the view.

Adding Views        Adding Views

3.    Now take a look at the view that you have just created (In my case I have created a view as a page). You can see a list of images and when you click on one of them, the individual image is shown in the ColorBox popup window.

ColorBox popup window
Sep 29 2020
Sep 29

Covid-19 has presented higher education websites with distinct challenges. During a semester when it's iffy  whether students or faculty will be present on campus at all, a cohesive communications platform that offers easy access to all necessary updates, information, and resources is more important than ever before.

Waubonsee Community College was ahead of the pandemic, reaching out to Promet Source for help in redeveloping its mywcc communications platform at the very start of 2020.

The original mywcc site was built as a a homegrown platform, and a system of outdated applets had led to complicated navigation and difficulty finding needed information. The result was an over reliance on administrative staff for the types of questions and functions that mywcc was intended to handle.

Read the case study on Creating a Transformative, College-wide Communications Platform.

The overriding goal for the new mywcc was a the development of a top-of-mind, go-to resource for conducting college business and staying informed with updates and essential information.  

Flexibility, Speed Fuel Fast Adoption

An absolute key to this initiative was a greater understanding of how the community college cohort group used technology, which meant the assurance of mobile responsiveness and seamless integration with both the college website and students' email accounts.  Also helpful in fast-tracking student adoption of mywcc:

  • A Resources page that presents quick access to high-demand information, and
  • An enhanced Search capability that streamlines access to needed information.

Interested in upgrading and integrating higher education online resources to ensure alignment with both the new and the next normal? Contact us today

Sep 29 2020
Sep 29

"The path is the goal". Heard so often and quoted even more often. However, there is also an important essence in it for our everyday work.

Overall goal of our projects is to create or enhance websites that exactly meet the specific requirements and expectations of our customers. More and more the path determines the success of the results. So we at undpaul decided some years ago to apply agile project management and now follow the Scrum framework.

You do not know Scrum yet? Then have a look at the introduction from scrum.org.

Hikers at Sunset

What does Scrum mean for project work?

Scrum is a framework and provides a foundation. But how do we at undpaul use it for us? How does Scrum affect the projects? We have put together the most important questions here.

How does a web project run with undpaul?

First we agree with our customers on a cooperation and an overall goal, then it really gets started. A very important point is that not all details are determined and defined at the beginning. Instead, we realize the website step by step, in sprints of two weeks each. Each sprint expands the website with new functions and lays the foundation for further sprints. Depending on time and budget on the client side, we process a varying number of sprints per year.

In a digital ticket system (we usually use Atlassian Jira) we manage the backlog. Every member of the project team enters new requirements, change requests or errors into this living collection. Prior to each sprint, priorities and scope of the backlog entries are adjusted, if necessary, to meet the most relevant requirements in the upcoming sprint.

When the scope for a go-live is reached, the site goes live. From that point on, it belongs to the support/maintenance scope for us. If further adjustments or enhancements are pending, we plan these bundled in further sprints.

How does a sprint at undpaul work?

Together with the customer we define a time frame for the sprint. After all, everyone on the project team has to be available for the short sprint period and close cooperation.

With the preparation phase (grooming), we ensure that the requirements are defined in a clear and comprehensive way and that they are understood by the project team. What is possible and reasonable? What is unnecessarily complex? In most cases, a lot of discussion, additions or changes are made to ensure that the feature offers real added value for the end user.

In the planning meeting, the official start of the sprint, the development team estimates how many of the requirements can be realized during the sprint period. During the sprint, the requirements pass through various states: from implementation through internal developer QA to customer approval and deployment on the website. The dailies are the daily status update for the entire project team. Here we often clarify queries that have arisen during development.

With the end of the sprint period the sprint ends. The sprint board shows the result. At best, all issues are listed in the state "done" on the far right, i.e. they have been accepted by the customer and deployed on the website.

How do you involve the customers?

Regardless of the project management method, we see the collaboration as an equal give and take. We (from undpaul side and customer side) have a common goal and each member accomplishes important tasks and responsibilities. Through the Scrum process we involve our customers in the complete development phase and see the foundation in communication and transparency.

In the project teams we gladly hand over the role of the Product Owner to employees from the customer side, because they know the end users and their use patterns best. This means that a lot of responsibility for requirements, priorities and the release of new features is with our customers. Much of the preparatory work is done by the Product Owner with the support of the developers in grooming and planning. This determines the direction of the sprint. In the dailies, the Product Owner is welcome to get a daily overview of the current development status or to help with further questions.

What advantages do I have as a customer with the agile approach?

By now we have taken over many externally developed projects, as customers have requested more prompt communication and transparency. Our Scrum process helps enormously with these two points in particular, since the customers are involved in the entire development process: Among other things, they manage the backlog, communicate directly with the developers in the sprints, have access to the sprint board and can give immediate feedback at any time. The daily updates in the Daily allow for early coordination if a requirement exceeds the time frame.

Another advantage of Scrum is the focus on user-oriented and timely usable solutions. By working out the requirements together, an early exchange on usability, technical implementation or further development possibilities is created. Looking at things from different angles has often brought the project teams to good, new ideas.

New requirements are developed as a completed user story in a sprint. Thus, they are fully executable at the end of the sprint and the progress of the website is quickly visible.

Mann auf dem Gipfel
Sep 28 2020
Sep 28

Drupal 8 and 9 core were already made compatible with Composer 2 back in May. Last week the Drupal package repository (packages.drupal.org) rolled out full support for Composer 2 as well. While Michael Anello did Drupal vs. Composer 2-alpha2 benchmarks in July and Malabya also did an even more detailed benchmark in July, various things have been improved in Composer 2 since July and the packages.drupal.org improvement should also show.

Inspired by numbers posted by Konstantinos Skarlatos from a simple scenario to the #composer drupal.org/slack channel today, I went ahead and attempted to produce a reproducible scenario you can also try at home.

Set up the latest Composer 1 and 2 locally

First let's grab the latest Composer versions locally. This will avoid any confusion as to which version is used when.

$ curl https://getcomposer.org/composer-1.phar --output composer-1.phar
$ php composer-1.phar -V
Composer version 1.10.13 2020-09-09 11:46:34

$ curl https://getcomposer.org/composer-2.phar --output composer-2.phar
$ php composer-2.phar -V
Composer version 2.0.0-RC1 2020-09-10 15:39:45

Install Drupal 9 with create-project

Make sure that we are not using cache and ask composer to profile itself. This got me two Drupal 9.0.6 copies, again to separate our testing environments properly.

$ php composer-1.phar --no-cache --profile create-project drupal/recommended-project composer1site
[9.3MiB/41.02s] Memory usage: 9.35MiB (peak: 197.23MiB), time: 41.02s

$ php composer-2.phar --no-cache --profile create-project drupal/recommended-project composer2site
[12.5MiB/18.29s] Memory usage: 12.48MiB (peak: 13.71MiB), time: 18.29s

The time is cut in half but the peak memory usage had an even bigger drop to less than 7% of the Composer 1 memory peak with Composer 2.

Adding and removing a Drupal module

You only do site creation once for a site. Let's add and remove a Drupal module! Konstantinos tested with Metatag which sounds like a good one to do. While Metatag only has Drupal project dependencies, the savings are likely similar for projects with 3rd party dependencies.

$ cd composer1site
$ php ../composer-1.phar --no-cache --profile require drupal/metatag
[629.4MiB/65.35s] Memory usage: 629.36MiB (peak: 1557.29MiB), time: 65.35s

$ php ../composer-1.phar --no-cache --profile remove drupal/metatag
[450.9MiB/47.98s] Memory usage: 450.85MiB (peak: 1377.67MiB), time: 47.98s

$ cd ..

$ cd composer2site
$ php ../composer-2.phar --no-cache --profile require drupal/metatag
[13.7MiB/3.13s] Memory usage: 13.67MiB (peak: 14.23MiB), time: 3.13s

$ php ../composer-2.phar --no-cache --profile remove drupal/metatag
[12.1MiB/0.18s] Memory usage: 12.1MiB (peak: 12.49MiB), time: 0.18s

Ok, that is pretty jaw dropping. Adding Metatag goes from 65 seconds down to 3 seconds. Removing Metatag goes from 48 seconds to 0.18(!) seconds. Memory usage goes down to 1% (one percent!), from a gigabyte and a half to 12-14 megabytes.

What does this mean for Drupal?

Given the explicit support on drupal.org, you should be able to use Composer 2 for your Drupal site builds whenever you are comfortable. Maybe already in the RC stage or later on as it gets stable.

Not everybody is using composer at all to build sites. However, an increasing number of drupal.org projects require external Composer dependencies to function. Based on last week's data from Ryan Aslett from the Drupal Association, 12% of drupal.org projects directly have a third-party Composer dependency. Another 6% have a Drupal dependency that in turn has a third-party Composer dependency. So even if we only look at direct and one-level indirect dependencies, 18% of Drupal.org projects require Composer to be installed properly. I also looked at various segments of projects and the ones requiring Composer are very well distributed. 15.2% of the top 500 projects (by usage) require Composer while 16.2% of the top 5000 do. So if you are not yet using Composer to build your Drupal sites, it seems to be only a matter of time. The improvements in Composer 2 should help a lot with its adoption I think.

These improvements will also be crucial for the Automated Updates initiative which has Composer 2 compatibility on their roadmap as well. Signature verification is only possible with Composer 2 and the lower memory and time requirements allow it to be run from web requests.

Finally, the downloadable tarballs of Drupal core are built with Composer 1 currently to make it easy to transition from a tarball based site to a Composer site. Allow Drupal 9 (including dev builds) to use Composer 2, part 2 is open to move that to Composer 2. Unfortunately a sizable blocker to that is Composer's "prefer-stable" setting cannot be relied on to produce a stable release. That would need more discussion and a solid resolution to move forward. There is less than 3 weeks before Drupal 9.1 is locked down, so your feedback there would be more than welcome!

Sep 28 2020
Sep 28

Generating more B2B leads with a Drupal site is the secret desire of every web company. All web companies want more B2B leads, it's like forbidden fruit. While generating B2B leads with Drupal website or some other platform is not easy but it can bear fruit.

Today the Wishdesk web development company will share all its knowledge and experience in order to give you proven tactics for generating B2B leads with Drupal CMS.

What is a B2B Sales Lead?

B2B sales leads are a valuable type of customer. B2B stands for Business to Business. B2B sales leads are your clients who are already owners of some other business, but they need your services.

This may sound a little confusing, so we will try to make it clearer. For example, one company, let's call it "Daisy," sells flowers and they need to create a website. You are a Drupal web development company and can develop a website for them. In this case, "Daisy" becomes your B2B Sales Lead.

The 3 benefits of B2B sales leads generation:

Conquering B2B leads, as we have already said, is not an easy matter. However, it is worth working on because the result will be a solid base for the future development of your company.

  1. You get more reliable leads
  2. It contributes to the development and growth of your business
  3. You create a base of quality leads

The 13 Best Tactics To Gain More B2B Leads with Drupal CMS

1. Create a list of potential B2B leads

Creating such a database of potential companies will make your life easier. You can take notes of each potential B2B Lead, which will then help you figure out whether it is worth spending time on getting their attention, or whether you can forget about them.

2. Send personalized mailing

Sending personalized emails is a good opportunity to once again remind people of your web company. The big advantage of Drupal is that you can install a special mailing module, which will save you the trouble of writing the name of each company manually. It is convenient to generate B2B Leads with the Drupal site.

Drupal Modules to send personalized mailing:

3. Add live-chat and chat-bots to your website

More customers will come to you if they can communicate with you. Adding a live chat feature to your website is a popular marketing trend today and is showing good results. 90% of customers said that they use live chat and it is useful for them.

Therefore, adding live chat on the Drupal site now is an effective way to get more B2B Leads with Drupal website.

Best Drupal Modules to add live-chat and chat-bots: 

4. Take care of the SEO of your website

The right SEO takes your website to a whole new level. After you improve the SEO of your site, you will have the opportunity to get into the first results of search engines and accordingly expand your client base. What does Drupal CMS have for this? Drupal is very convenient as far as SEO is concerned. The main thing is to correctly configure the SEO of the site and install the necessary modules.

Top Drupal SEO Modules:

5. Create and Optimize your landing pages

A lot of blogs have been written about landing pages, and for good reason. Landing allows you to push the user to become your B2B lead. The landing page is a must-have for every website. It is important to have a properly built and designed landing. Therefore, even if you already have a landing page, make sure that it is optimized and attractive. The more powerful the landing, the more leads it will bring to your company. Drupal is very convenient for creating landing pages, so B2B Leads on Drupal sites often come from the landing page.

Drupal Modules to create and optimize landing:

6. Be active on social media

Social networks are now a concentration of users in one place, so use this to your advantage. Be active on social marketing, expand your profile on LinkedIn, Quora, Facebook and Twitter, and more. Take an active part in discussions in Facebook groups. Properly running these sites can create an explosion of potential B2B leads.

Modules for social media integration:

7. Add a blog to your Drupal site

Having a Drupal site without a blog is useless — we are not exaggerating. Blogging on your Drupal site can generate as many B2B leads for you as any other strategy. Blogging is another powerful push for your potential customers to become your leads. Plus, if you are the owner of a Drupal site, then you already have a leg up. Probably the main feature of Drupal is its super-convenient content management.

8. Continuously develop your website

We are talking about the constant development of your site for a reason. Do not forget to constantly update it and add some new features, because this way you can get more traffic and keep it safe. Internet business is an effective deal. Stay up to date with the latest news and keep your Drupal website current. If your business is developed in Drupal, then it will be much easier than in other CMS.

Since Drupal is an open CMS, there are no problems with updates and adding new features. All the modules are in the public domain, plus there are many developers that can update it.

9. Make your website design attractive 

B2B leads will come when you attract them with a favorable offer and visual appearance of your website. The visual appeal covers everything: the landing page, your main site, the design of blogs, the visual of mailings, etc. Remember, your potential lead is returning attention to your Drupal site design first. To get B2B leads you to need to stand out from your competitors and be conspicuous. Use the design and visual appeal of your site as bait.

Drupal Modules to make your website design attractive:

10. Give free access to some information

An effective strategy that has spread in 2020 is to give free access to paid information. How does it work? When you give your users free access, you get their email addresses in return. After receiving their email addresses, you have a path to them and you can make them leads. In order to make it more convenient, you can create a separate page on your Drupal site to which a potential B2B lead will be redirected and where there will be a form to fill out.

11. Add more dynamic CTAs 

There is no such thing as too many CTA’s on a website. Regardless of the scope of your business, you have to have a CTA. Place your CTA at the top of your menu and in the middle and bottom of your site. Think about the text for it carefully. A visitor should want to click on it. An important detail is the design of the CTA buttons.

Make them so they will stand out from the site, but at the same time look harmonious. To make it easier to manage and add CTAs, install a module:

12. Optimise your web forms

Want to get the personal details of potential B2B leads? Then just simplify the forms they have to fill out. If the leads comes to your site and sees a form with 10 fields, you will lose the leads. Users don't like to fill out long forms. Simplify and shorten the forms on your site as much as possible. You can create a form using Drupal modules. After these steps, getting B2B Leads with the Drupal site will be much easier.

Drupal Modules to optimize web forms:

13. Add podcasts and videos directly to your site

Adding podcasts or video content to your Drupal site is no longer a problem. In addition, all the data indicate that customers love different ways of presenting the information. Moreover, users prefer to listen to podcasts and watch videos over reading the article. Therefore, you should let users listen to your podcasts right on your site.

The 13 Best Tactics To Gain More B2B Leads with Drupal CMS

Generate more B2B Leads with Drupal site at Wishdesk web development agency

All of the above strategies have been carefully selected by Wisdesk`s team of web developers. In order to generate more B2B leads with Drupal site, though, you don't need to apply all 13 tactics — start with one feature.

This way you get more B2B leads, and we can help you. Contact our web development agency to add a new feature or to get our professional help.

Sep 27 2020
Sep 27

I've been building Drupal 8 sites with layout Builder over the past year. One feature that I think is missing is the ability to group specific fields inside a wrapper for enhanced theming; a layout within a layout if you will.

There are a few issues open in core for this feature but these seem to be just in the planning stage right now. There are some workarounds to achieve this feature.

  • Create a view with an argument that just renders the fields in context to the entity item they are a part of.
  • Use an entity view via the contrib. module, Chaos Tool Suite, AKA Ctools.

It is the second solution above that I will write about here as it is my favorite one and one which a developer friend of mine told me about. The idea behind Entity View is that you add some fields to a custom view mode and then render these as one chunk inside your default Layout Builder display. Think of it as a layout within a layout. Entity View is not a "View" from the Views module, rather it is a bundled group of fields referencing a specific view mode.

Enable / install modules

For this method to work, you will need a Drupal site on either 8.8.x + or Drupal 9.0.x. as well as Ctools. Since Layout Builder is in core, but is disabled by default, it will need to be enabled as well as core's Layout Discovery module. To get Ctools, you can download it via composer, composer require drupal/ctools

Once Ctools has been downloaded, enable these modules either via the admin UI or drush.

Modules to be enabled via the Drupal 8/9 admin UI Modules to be enabled via the Drupal 8/9 admin UI

Getting Started

Now that we have the required modules enabled, we will need to enable Layout builder for an entity type. In my case, I have a content type called "Person" which features people involved with an organization. I navigate to /admin/structure/types/manage/person/display and check the box under Layout Options, "Use Layout Builder." Note that this is done under the default view mode.

Enable Layout Builder in the Drupal admin UI Enable Layout Builder in the Drupal admin UI

Entity view use case

Here is an example use case for an entity view:

  1. We have a 2 column layout section in Layout Builder with several "person" fields such as email, phone, fax, company address, social media links, etc.
  2. In one of the columns, we want to have a "profile card" which will feature a person's image along with a few contact fields all themed as one item.
  3. We have other fields before and after the profile card.

With these specs above, we need a way of grouping our profile card fields all together as one unit, thus we will use an entity view. We are doing this as normally, Layout builder creates a "block" for each field so it would be tricky to theme these if we do not have a "wrapper" around our designated fields that will be part of the profile card.

Visualize it

Before building something, I often find it helpful to visualize it with a mockup. The image below illustrates what we are after.

The profile card within a Layout builder column that will be built using entity view. The profile card within a Layout builder column that will be built using entity view.

A recipe

Here is a list of "ingredients" and some instructions that are needed to build this:

Create a custom view mode for content called "contact card."

  1. Go to/admin/structure/display-modes/view
  2. Add new Content view mode at/admin/structure/display-modes/view/add/node
  3. Set the name as "Contact card" and save

Enable and set the new view mode

  1. Go to /admin/structure/types/manage/person/display
  2. Navigate to the display for the new view mode at /admin/structure/types/manage/person/display/contact_card
  3. Set the fields you'd like to display for the contact card.
Enabling the contact card view mode on the profile content type. Enabling the contact card view mode on the profile content type.

Configure Layout Builder for entity view

  1. Go back to /admin/structure/types/manage/person/display and click on Manage Layout which will bring you into the main layout Builder user interface.
  2. Here you will remove the fields that you just set above for the contact card view mode by hovering over each field and using the "Remove block" contextual link.
  3. Now for the fun part, we will setup the entity view.
    • Click in a section and "Add block."
    • You will see an option in the sidebar for "Entity view (Content)
    • Click and add that and set to the desired view mode, in our case "Contact Card."
    • Save the layout and preview!
Adding an entity view to the main default Layout Builder layout Adding an entity view to the main default Layout Builder layout Enabling the contact card view mode on the profile content type. Enabling the contact card view mode on the profile content type.

One more thing

Now that we have our entity view up working, we may want to enhance this by adding a custom class to the new block for theming. This comes in handy if you are using BEM (Block / Element / Modifier) CSS styling as you can add the block class to the parent block element. To do so, you can either use Layout Builder Styles or Layout Builder Component Attributes.


Entity view solves a specific problem for Layout Builder if you need an inner wrapper within a section. Note that I did not find very much documentation about this method so I thought it would be a good idea to document herein.



Sep 26 2020
Sep 26

Websites have overpowered the world of businesses today. There aren’t many business people left who do not have or want an online presence for their business. And websites are just the way to accomplish that. Now, building a website is not complicated at all, with just one youtube tutorial, you can do that. The tricky part is ensuring that it meets all the standards that the end user will desire. Websites built using Drupal and all its accompaniments are often considered to be up to the user standards. 

A blue background with the words layout builder vs paragraphs.

From world renowned privately owned enterprises to governmental organisations, Drupal has successfully served everyone. Drupal’s success is primarily attributed to the versatility and functionality it can provide to the web designers and content creators throughout the process of website development.

Continuing on the same lines, today we will discuss two such features in great detail to make you understand their importance, use and workings. We are going to talk about Layout Builder module, one of the most sought after modules in recent times, and Paragraphs module. Let’s dive right in.

The Seasoned Paragraphs 

A green background with different segments to depict the paragraphs module.This is how the paragraphs module will segregate your content into different paragraph types.

If you are reading this article, you must be familiar with the various modules of Drupal. You must also be familiar with the needs of websites and how complicated they can become. To satiate those needs, I will be telling you about one of the most convenient and user-friendly modules, which is Paragraphs.

Paragraphs module is a great tool that gives a high degree of editing power to the end users of a website. It does so by letting the end users choose predefined paragraph types that are independent from one another. This allows the web builder to avoid putting all the information in one WYSIWYG body type.

With this module, you can add a hero image that would be the banner of your webpage, you can add images and you can add grids as well. All of this can be done by simply selecting the types with the same name. Can website design become any more easy?

Although there are no default Paragraph types, you can easily create as many as you want. 

It is up to you to decide how many columns you want and where you want them. On top of that you also get to decide how much leeway you want to give to your end-users in terms of future edits.

The Modern Layout Builder

A green background with pink sections to depict the flexibility of the layout builder module.With Layout builder, you can add sections with each having a set of regions for the content to be placed thereby resulting in more flexibility than Paragraphs

The other convenient and user-friendly module is Layout Builder. Layout builder is a multi-functional tool that allows the content creators the ability to make content appear on their website as they wish to. 

Layout Builder has multiple settings that can be used to build pages from the ground up. Its highlighting feature is the visual layouts. When a layout is selected, if the web builder wants, he can implement the same throughout his website for consistency and brand image. If that is not what is desired by the web builder, he can also create customised templates for individual pages. This kind of ease in design is unfound in other options. 

Layout builder has become increasingly popular amongst designers and writers, and the reason is the power of customisation it provides. The below video by Dries Buytaert will give you a glimpse of what that really looks like, all you have to do is drag and drop.

How Advantageous Can Paragraphs and Layout Builder Modules Be?

I have already mentioned that Paragraphs and Layout Builders are two most popular modules in Drupal. So, how can I say this? I have reasons, validations and explanations for my claim, and all of them can be characterised as their advantages. People only make things popular because they like, and likability and advantageousness go hand-in-hand. So, let us delve right into them.

Paragraphs  Layout Builder 
  • No limits for Paragraph types
  • Grouping and reusing of Paragraph types
  • Flexible content model 
  • Simple and clean structure
  • Multilingual support for content 
  • Build from scratch 
  • Control over the layouts you want
  • Use of block types
  • Better structures for content 
  • Minimal coding required 
  • Enhanced authoring experience 

Paragraphs and Its Merits 

Paragraphs come with an array of features that only enhance its beneficial aspects. This may seem like a simple tool, but it has the ability to make your website design as appealing as it can get. 

Forget limits 

Let us start with the most helpful merit and that is Paragraph’s limitlessness. There is no limit as to the number of configurations you can create using Paragraphs. You want 20 different paragraph types scattered throughout your webpage, go for it!

Group and reuse 

Not only can you group various fields of your content into new complex elements, you can also reuse the components you have already created.  Can you possibly tell me that this does not fascinate you?

Flexible to the core 

Moving on, a website is constantly under construction, there is always going to be something or the other that needs to be updated, corrected or added. Most of the time these changes are not necessarily huge, and you do not need to change the entire layout. The advantage of Paragraphs is that it provides a great deal of flexibility in the content model, so that minor changes can easily be made by the content authors with ease.

Simple, yet impactful 

Paragraphs are often considered to be too plain and bland. Many regard this as a disadvantage, however I tend to disagree here. Yes, paragraphs are simple, but that is a benefit because simplicity means few clicks. The result; you do not need to be an expert to use this module, a content editor with minimal experience in Drupal can also use it with the least amount of effort. 

Its intuitiveness helps the web authors and builders to add pop-ups and quotes and easily rearrange them. On top of this, the simplicity of Paragraphs also means that your design will not seem cluttered, resultantly, your site will not slow down in its performance. Now, you tell me how can simple be bad for you, when it is actually avoiding a mess? 

Multilingual Setup 

Websites are becoming more multilingual in the present, so the setup of multiple languages in the content becomes somewhat of a necessity. Here, the paragraph module comes quite handy as it works within a multilanguage setup. 

Layout Builder and Its Merits

So far, you must have been impressed with the advantages of paragraphs, now prepare to be dazzled by the umpteen merits of the layout builder.

Builds from scratch 

The best feature of a layout builder is that it gives the developer the potential and resources to build something from the ground up. All you have to do is make custom block types, arrange them as you want and fill them up with content, pictures or videos and you are done.

Lets you be in control

With a layout builder, you will always be in control. I say this because customisation is ingrained in its formula. You can use it to make configuration of your liking, and if you want, you can implement your created template and use it throughout your website. The layout builder also allows you to build customised landing pages that will have your creative stamp all over it.

Blocks all the way

Blocks can be termed as the foundation of the layout builder, without them, it would be hard to imagine. Blocks are what help you get an idea of how your content would be displayed on the actual page. From globally available blocks suitable for all pages to uniquely build custom inline blocks made for specific pages, layout builder has your needs covered.

Structures your information 

Have you ever been to a website that had no structure at all? The information was all over the place and you couldn't tell where it began and where it ended? If you have, then you know how important structure is for a website. Layout builder helps you build a particular structure for your website that would organise your content appropriately. If you want e-form, customer testimonials and other such content information on one page, layout builder will provide a template that will segregate the information in a way that it does not look haphazard. 

Less custom code 

Layout Builder is popular because it mandates less custom code. This means that the module is less time-consuming and less complicated, once you become familiar with it. The use, maintenance and creation of content becomes easy with less code involved.

Better authoring experience

A website’s content can easily make or break it, so it has to be pitch perfect and in accordance to the needs of the site’s target audience. With a layout builder, you can be at ease with this aspect. It has proven to enhance the authoring experience of content creators by providing an improved interface to effectively communicate data about everything the author wants to.

Are Any Limitations Holding Them Back?

With the number of benefits you have read above for both paragraphs and layout builder, you might be inclined to think that they could not possibly have any demerits. Unfortunately, they do lack in some aspects. 

Paragraphs Layout Builder 
  • Not a core module
  • Becomes messy with intricate layouts
  • Dependency on developers.
  • Cannot simply drag and drop sections
  • May not connect nodes
  • Template combinations may become problematic 
  • May be difficult to achieve consistency with the customised layouts
  • Needs time to learn and adapt 
  • Needs to be customised with the use of other modules 

Challenges of Paragraphs module

Starting with paragraphs, its drawbacks are not necessarily drawbacks, they are more like functional mismatches to your needs as a web developer. Let us find out how.

Not part of Drupal core

Unlike Layout Builder, which was made a part of Drupal core ecosystem in Drupal 8.7, the paragraphs module is not part of the Drupal core. Although it does not come as default in Drupal, it is still quite popular. Being a contributed module, you would have to separately install it.

Can only handle simplicity 

Paragraphs were intended to make website design simpler for the non-technical folks. The problem with simplicity is that it cannot handle intricacy. So, when your content is anything but simple, paragraphs become messy and the output is just not upto the mark. With more nested paragraphs, the editing experience may slow down. Also, to ensure that the paragraphs are being displayed as preview, you have to always customise the Form display. If you do not do that, you will end up with a mega-form. 

Dependence on web developer  

Paragraphs also do not provide free reins to the content author. He would have to be heavily reliant on the developer for setting up even the tiniest of changes.

No drag and drop 

The ease of picking up a section from one part of the layout and dropping it in a different part is unfound here.

Challenges of Layout builder module

While the problem for paragraphs was its simplicity, the problems for layout builder stem out of its complexities. Let us understand how.

Challenges with nodes

Every blog, article, forum topic and even pages are stored as nodes in Drupal. Now, when a web builder makes new content, most often, he or she would relate it with an old piece of information. With layout builder, you may notice that block content is not entirely connected to nodes.

Challenges with combinations 

The templates in a layout builder can be used any way the designer wants to. He or she can make a number of combinations with the templates. However, when a custom-made layout is used with a template-based one, it becomes quite tricky to get right.

Challenges with consistency 

With layout builder, you can implement one layout throughout your website with ease. Although it is true, when customised layouts are the centre of attention for the entire website, it may be difficult to enforce sitewide consistency.

Challenges with control 

This is going to a little sound paradoxical, the layout builder provides more control to the content editors as opposed to paragraphs. When you do not trust your content creators’ judgement implicitly, this can become problematic.

Challenges with learning 

The switch to layout builder comes with a learning curve for the content writers, which can take some time. This module does not operate with form-filling like others, so a change in the way the work is done becomes mandatory and time consuming. 

Challenges with dependency on additional modules 

The layout builder may need customisation and that can be achieved through the help of other Drupal modules. Block Blacklist and Layout Builder Restrictions aid in limiting the block type and layouts, while Layout Builder Modal aids in enhancing the user experience.

Which Would Win the Race?

Before I answer this, it is important to know that the selection of a module depends on the developer’s needs. So, the winner in this module race would vary in accordance to the needs and wants of the site and its developers, both the designer and the content author. Let us have a look at these needs.

Paragraphs is suitable when Layout Builder is suitable when
  • You need to process content again;
  • You need to accommodate nodes;
  • You need nested paragraphs.
  • You need landing pages;
  • You need a customised web page;
  • You need to tweak the existing templates. 

Paragraphs and reuse 

The paragraphs module is ideal for situations that mandate simple solutions, with reuse being the primary answer. By reuse, I mean using the existing content again, while making changes in the website. With paragraphs you can use the earlier content in an entirely new webpage with ease. You can also use the same content in accordance to the nodes.

Apart from this, when nested paragraphs are of the essence for your content, paragraphs are bound to become your best friend. 

Layout Builder and customisation 

The suitability of layout builder varies a great deal from paragraphs primarily because reuse is not a term this module uses much. It is all about the new energy.

Whether you want to create new landing pages with a variety of blocks, views and fielded content structured like grids or you want to customise a page with a layout that you created yourself and is one of a kind, layout builder will help you. 

Apart from creating completely new pages from the ground up, layout builder is also perfect for tweaking the existing pages with templated layouts. 

You have to remember that both of these modules are configurations, they will not make the content for you, they would simply arrange it. So, when you make your choice ensure that you have a pre-formed vision and awareness of the layout you want for your pages. Once you have that the choice would become very easy for you. If the choice is still difficult for you, know that you can use the combination of both of these in your content configuration, so you do not really have to decide.

The Bottom Line 

Both these modules are quite amazing at the work they do for your websites, so choosing the better one out of the two is somewhat tricky. Of course, like I have told you that your need plays a pivotal role in this decision. However, ending this article without a clear winner would make it seem somewhat incomplete and I do not want that. 

So, for me layout builder is the better choice and I will tell you why. The kind of intricacy layout builder offers and the control I would get for layouts for each page, that too with consistency, makes the layout builder the one for me. 

Apart from these two, Gutenberg is also gaining some traction as a flexible module. However, it stores the content in a large body field and this often compromises the structure of the content.

I also want to mention one more fact and it is that flexibility often comes with a price. Having a really flexible content can often impede with the accessibility of  your website as your content may lose its semantic markup. Also make sure to add metadata to your content in addition to flexible content components..

All in all, Drupal allows you to create websites and their content in a well-structured manner and despite what module you choose, the end result is always going to be satisfactory. Contact us at [email protected] to get the best of both the worlds in your next Drupal project.

Sep 25 2020
Sep 25

I don't know about you, but as a site builder when I add a date field to a content type in Drupal, and I tell it I do NOT want the time just the date and then I go to a node, and I enter the date, and it shows me both the date AND the time... it kind of drives me crazy!

How do we fix it? In this video, I'm going to show you how to create new date & time formats in Drupal sites, so you don't have to worry about getting a time and a date when you only want the date.  And, as a bonus, you'll get it in the format that you want.

Let's get started!

"Welcome to OSTips from OSTraining. My name is Rod Martin.

I've just added a date field to my article content type, and you'll note I've set it to date only.

Well, you know the problem.  When I have a node that uses this field, it's automatically going to show the time even though I did not ask for it, and I did not enter a time.   

If I go ahead and manage display for that field, you'll note that the format has the time. Click on the gear.   I'm really limited here as to what kind of format I can choose.  Let's say I want the long date so: Tuesday June 23rd 2020, but without the time.  There's no format for that!

Let's take a look at how to change that.

  • head over to configuration / regional / language / date and time formats

You can either edit one of the top three, but I don't want to choose that, or you can create a new format. There's two ways to do this:

  1. I can start from scratch 
  2. I can click Edit and copy an existing one

I am choosing option #2.

  • copy one that is almost what I need
  • create a new one: long date with no time 
  • paste that string in

Now what's giving me the time is H : I.  It's worth looking at the PHP manual here, so you can see all of the different options. You can create a date and time stamp to reflect pretty much anything you want. For example:

  1. 12 hour format
  2. 24 hour format
  3. day /month /week
  4. ordinal suffix for a day

I'm gonna change this. I'm going to remove the dash and the time. 

  • L is going to be the day
  • F is going to give me the month
  • j is going to give me the days of the month without the leading zeros
  • S after the J
  • Y is for the four-digit year

Let's take a look. Your format is going to be:  Tuesday June 23rd 2020

Now all I have to do is update my display to structure content types article and manage display.

  • head over to my date (and my new date format with no time is there)
  • click update
  • click Save
  • look at the node

And there it is: Tuesday June 23rd 2020

Well that's it! It was pretty simple. With just a little bit of PHP and some help from PHP net, you can build whatever date and time formats you need for your Drupal website. 

Thanks for watching. This has been OStips from OS Training, and I'm Rod Martin."


[embedded content]

About the author

Rod holds two masters degrees and has been training people how to do "things" for over 25 years. Originally from Australia, he grew up in Canada and now resides just outside Cincinnati, Ohio.
Sep 25 2020
Sep 25

Sometimes the Road of Life Takes an Unexpected Turn and You have No Choice but, to Follow it to End Up in the Place You are Supposed to Be.
- Anonymous

A thought that’s crossing my mind while I type this is I never expected myself to be here as a writer. For me, since childhood, I have always been told that I’d end up being a doctor. And I always thought I would. But as I grew up, I realized that it wasn’t what I actually wanted at all. Life did take an unexpected turn and I am where I should be today. Something like this hits each one of us at a point in life. 

At OpenSense Labs, we have Lakshay, who started off working as an Electrical engineer and went on to become an Acquia-certified front end developer. Let’s look at his experience with OSL and Drupal! 

on the left side of the circle is an electrcial engineer and on the right is a person in front of the screen

Tuba: So Lakshay, I heard you pursued electrical engineering. Tell me about your education.

Lakshay: I switched to three different schools in the last 3 years of my school life. I wanted to start something of my own while I was in high school but my parents always told me I lacked experience. Although I studied electrical engineering, I have had a lot of interest in developing websites for a very long time.

Tuba: How the shift to web development finally happened and how did it all begin at OpenSense Labs?

Lakshay: A very old friend of mine was already working with OpenSense Labs. He told me that he was working with a web development company and asked me to come and join them. So, I gave it a shot and joined OSL. When I reached there, I had no idea what I had to do, because everybody there was a professional developer. So I joined them as an intern and started watching tutorial videos and studying how to build a website and then tried coding it and showing my work to senior pros like Vinit and Pritam at the end of the day. After 3 months of the internship, I was hired as a full-time front end developer. A year later, I was an Acquia-certified front end specialist. I was promoted to the position of a senior frontend developer. Since then a lot of interns have worked under me and I’ve trained them sharing whatever I learned during my early days as an intern.

Tuba: That’s amazing! How is your experience with Drupal?

Lakshay: It’s been 3 years now and the experience so far has really been great. The Drupal community is really amazing. I’ve attended many camps where I got a chance to interact with people working across the globe.

I got to learn about different emerging technologies and how Drupal is rising with these technologies thereby embracing innovation always. I’ve presented sessions in DrupalCamp Delhi 2019 and DrupalCon Amsterdam 2019

Tuba: Do you think you made the right decision?

Lakshay: I definitely think I made the right decision. While I was working in the electrical industry for 6 months, it felt like a job, but working here felt like something that I willingly wanted to do. I’m following my passion, working with Drupal.

Tuba: That’s great! Thank you for your time Lakshay. It’s been great talking to you. I hope people are inspired to make decisions and accept the turns that life takes as you did. 

These turns can be the most challenging thing to experience, but it is the starting point of something great in your life. There is always light at the end of the tunnel, take your time to find it! The journey, I promise, will be way better than the destination. Good luck!

Sep 24 2020
Sep 24

What is a views display extender

The display extender plugin allow to add additional options or configuration to a views regardless of the type of display (e.g. page, block, ..).

For example, if you wanted to allow site users to add certain metadata to the rendered output of every view display regardless of display type, you could provide this option as a display extender.

What we can do with it

We will see how we implement such a plugin, for the example, we will add some metadata (useless metatags as example) to the document head when the views is displayed.

We will call the display extender plugin HeadMetadata (id: head_metadata) and we will implement it in a module called views_head_metadata.

The implementation

Make our plugin discoverable

Views do not discover display extender plugins with a hook info as usual, for this particular type of plugin, views has a variable in his views.settings configuration object.

You need to add your plugin ID to the variable views.settings.display_extenders (that is a list).

To do so, I will recommend you to implement the hook_install (as well uninstall) in the module install file. To manipulate config object you can look at my previous notes on CMI.

Make the plugin class

As seen in the previous post on Drupal 8 plugins, you need to implement the class in the plugin type namespace, extend the base class for this type of plugin, and add the metadata annotation.

In the case of the display extender plugin, the namespace is Drupal\views_head_metadata\Plugin\views\display_extender, the base class is DisplayExtenderPluginBase, and the metadata annotation are defined in \Drupal\views\Annotation\ViewsDisplayExtender.

The display extender plugins methods are nearly the same that the display plugins, you can think of its like a set of methods to alter the display plugin.

The important methods to understand are :

  • defineOptionsAlter(&$options) : Define an array of options your plugins will define and save. Sort of schema of your plugin.
  • optionsSummary(&$categories, &$options) : To add a category (the section of the views admin interface) if you want to add one, and define your options settings (in wich category there are, and the value to display as the summary).
  • buildOptionsForm(&$form, FormStateInterface $form_state) : Where you construct the form(s) for your plugin, of course linked with a validate and submit method.

Generate the metadata tags in the document head

Now that we have our settings added to every views display, we need to use those to generate the tags in the document head as promised.

To work on the views render we will use the hook for that : hook_views_pre_render($view) and the render array property #attached.

Implement that hook in the .module of our module views_head_metadata, let's see :

Sep 24 2020
Sep 24

For the example we are going to implement an area that will present some links and text in a custom way, not sure if it's really usefull, but that not the point of this article.

The Plugin system

For the first post on the plugins I will introduce briefly on the concept. For those that already been using Ctools plugins system, you already now about the plugin system purposes.

For those who doesn't know about it, the plugin system is a way to let other module implements her own use case for an existing features, think of Field formatter : provide your own render array for a particular field display, or Widget : provide your own form element for a particular field type, etc...

The plugin system has three base elements :

Plugin Types

The plugin type is the central controlling class that defines how the plugins of this type will be discovered and instantiated. The type will describe the central purpose of all plugins of that type; e.g. cache backends, image actions, blocks, etc.

Plugin Discovery

Plugin Discovery is the process of finding plugins within the available code base that qualify for use within this particular plugin type's use case.

Plugin Factory

The Factory is responsible for instantiating the specific plugin(s) chosen for a given use case.

Detailled informations : https://www.drupal.org/node/1637730

In our case Views is responsible of that implementations so we are not going further on that, let see now how to implement a plugin definition.

The Plugin definitions

The existing documentation on the plugin definitions are a little abstract for now to understand how it really works (https://www.drupal.org/node/1653532).

You have to understand simply that a Plugin in most case is a Class implementation, namespaced within the namespace of the plugin type, in our example this is : \Drupal\module_name\Plugin\views\area

So if I implement a custom views area Plugin in my module the class will be located under the location module_name/src/Plugin/views/area/MyAreaHandler.php

To know where to implement a plugin definition for a plugin type, you can in most case look at module docs, or directly in the source code of the module (looking at an example of a definition will be enough)

In most cases, the modules that implement a Plugin type will provide a base class for the plugins definitions, in our example views area provide a base class : \Drupal\views\Plugin\views\area\AreaPluginBase

Drupal provide also a base class, if you implement a custom Plugin type, for the Plugin definition : \Drupal\Component\Plugin\PluginBase

Your custom plugin definition class must also have annotation metadata, that is defined by the module that implement the plugin type, in our example : \Drupal\views\Annotation\ViewsArea

In the case of views you will also need to implement the hook_views_data() into module_name.views.inc file, there you will inform views about the name and metadata of your Area handler.

Hands on implementation

So we have a custom module let's call it module_name for the example :)

We will create the class that implements our plugin definition and we are gonna give it this Plugin ID : my_custom_site_area.

We save this file into module_name/src/Plugin/views/area/MyCustomSiteArea.php

Now we just have to implements the hook_views_data() and yes this is the end, you can use your awesome views area handler into any view and any area.

Define this hook into the file : module_name/module_name.views.inc

Sep 24 2020
Sep 24

There is three types of configuration data :

The Simple Configuration API

  • Used to store unique configuration object.

  • Are namespaced by the module_name.

  • Can contain a list of structured variables (string, int, array, ..)

  • Default values can be found in Yaml : config/install/module_name.config_object_name.yml

  • Have a schema defined in config/schema/module_name.schema.yml

Code example :

The States

  • Not exportable, simple value that hardly depend of the environment.

  • Value can differ between environment (e.g. last_cron, maintenance_mode have different value on your local and on the production site)

The Entity Configuration API

  • Configuration object that can be multiple (e.g. views, image style, ckeditor profile, ...).

  • New Configuration type can be defined in custom module.

  • Have a defined schema in Yaml.

  • Not fieldable.

  • Values can be exported and stored as Yaml, can be stored by modules in config/install

Code example :


Store configuration object in the module :

Config object (not states) can be stored in a module and imported during the install process of the modules.

To export a config object in a module you can use the configuration synchronisation UI at /admin/config/development/configuration/single/export

Select the configuration object type, then the object, copy the content and store it in your custom module config/install directory following the name convention that is provided below the textarea.

You can also use the features module that is now a simple configuration packager.

If after the install of the module, you want to update the config object, you can use the following drush command :

Configuration override system

Remember the variable $conf in settings.php in D6/D7 for overriding variables.

In D8, you can also override variable from the configuration API:

You can also do overrides at runtime.

Example: getting a value in a specific languages :

Drupal provide a storage for override an module can specify her own way of override, for deeper informations look at :


Configuration schema

The config object of Config API and of the configuration entity API have attached schema defined in module_name/config/install/module_name.schema.yml

These schema are not mandatory, but if you want to have translatable strings, nor form configuration / consistent export, you must take the time to implement the schema for your configuration object. However if you don't want to, you can just implement the toArray() method in your entity config object class.

Example, docs and informations : https://www.drupal.org/node/1905070

Configuration dependencies calculation

Default is in the .info of the module that define the config object like in D6/D7

But config entity can implements calculateDependencies() method to provide dynamic dependencies depending on config entity values.

Think of Config entity that store field display information for content entities specific view modes, there a need to have the module that hold the fields / formatters in dependencies but these are dynamic depending on the content entity display.

More information : https://www.drupal.org/node/2235409

Sep 24 2020
Sep 24


Migrate in Drupal 8

Migrate is now included in the Drupal core for making the upgrade path from 6.x and 7.x versions to Drupal 8.

Drupal 8 has two new modules :
Migrate: « Handles migrations »
Migrate Drupal : « Contains migrations from older Drupal versions. »

None of these module have a User Interface.

« Migrate » contains the core framework classes, the destination, source and process plugins schemas and definitions, and at last the migration config entity schema and definition.

« Migrate Drupal » contains implementations of destination, sources and process plugins for Drupal 6 and 7 you can use it or extend it, it's ready to use. But this module doesn't contain the configuration to migrate all you datas from your older Drupal site to Drupal 8.

The core provides templates of migration configuration entity that are located under each module of the core that needs one, under a folder named 'migration_templates' to find all the templates you can use this command in your Drupal 8 site:

To make a Drupal core to core migration, you will find all the infos here : https://www.Drupal.org/node/2257723 there is an UI in progress for upgrading.

A migration framework

Let have a look at each big piece of the migration framework :

Source plugins

Drupal provides an interface and base classes for the migration source plugin :

  • SqlBase : Base class for SQL source, you need to extend this class to use it in your migration.
  • SourcePluginBase : Base class for every custom source plugin.
  • MenuLink: For D6/D7 menu links.
  • EmptySource (id:empty): Plugin source that returns an empty row.
  • ...

Process plugins

There is the equivalent of the D7 MigrateFieldHandler but this is not reduced to fields or to a particular field type.
Its purpose is to transform a raw value into something acceptable by your new site schema.

The method transform() of the plugin is in charge of transforming your $value or skipping the entire row if needed.
If the source property has multiple values, the transform() will happen on each one.

Drupal provides migration process plugin into each module of the core that needs it (for the core upgrade),
To find out which one and where it is located you can use this command :

Destination plugins

Destination plugins are the classes that handle where your data are saved in the new Drupal 8 sites schemas.

Drupal provides a lot of useful destination classes :

  • DestinationBase : Base class for migrate destination classes.
  • Entity (id: entity) : Base class for entity destinations.
  • Config (id: config) : Class for importing configuration entities.
  • EntityBaseFieldOverride (id: entity:base_field_override): Class for importing base field.
  • EntityConfigBase : Base class for importing configuration entities.
  • EntityImageStyle (id: entity:image_style): Class for importing image_style.
  • EntityContentBase (id: entity:%entity_type): The destination class for all content entities lacking a specific class.
  • EntityNodeType: (id: entity:node_type): A class for migrate node type.
  • EntityFile (id: entity:file): Class for migrate files.
  • EntityFieldInstance: Class for migrate field instance.
  • EntityFieldStorageConfig: Class for migrate field storage.
  • EntityRevision, EntityViewMode, EntityUser, Book...
  • And so more…

Builder plugins:

"Builder plugins implement custom logic to generate migration entities from migration templates. For example, a migration may need to be customized based on the data that is present in the source database; such customization is implemented by builders." - doc API

This is used in the user module, the builder create a migration configuration entity based on a migration template and then add fields mapping to the process, based on the data in the source database. (@see /Drupal/user/Plugin/migrate/builder/d7/User)

Id map plugins:

"It creates one map and one message table per migration entity to store the relevant information." - doc API
This is where rollback, update and the map creation are handled.
Drupal provides the Sql plugin (@see /Drupal/migrate/Plugin/migrate/id_map/Sql) based on the core base class PluginBase.

And we are talking only about core from the beginning.
All the examples (That means docs for devs) are in core !

About now :

While there *almost* a simple UI to use migration in Drupal 8 for Drupal to Drupal, Migrate can be used for every kind of data input. The work is in progess for http://Drupal.org/project/migrate_plus to bring an UI and more source plugins, process plugins and examples. There already is the CSV source plugin and a pending patch for the code example. The primary goal of « migrate plus » is to have all the features (UI, Sources, Destinations.. ) of the Drupal 7 version.

Concrete migration

(migration with Drupal 8 are made easy)

I need to migrate some content with image, attached files and categories from custom tables in an external SQL database to Drupal.

To begin shortly :

  • Drush 8 (dev master) and console installed.
  • Create the custom module (in the code, I assume the module name is “example_migrate”):
    $ Drupal generate:module
    or create the module by yourself, you only need the info.yml file.
  • Activate migrate and migrate_plus tools
    $ Drupal module:install migrate_tools
    $ drush en migrate_tools
  • What we have in Drupal for the code example :
    • a taxonomy vocabulary : ‘example_content_category’
    • a content type ‘article’
    • some fields: body, field_image, field_attached_files, field_category
  • Define in settings.php, the connexion to your external database:

We are going to tell migrate source to use this database target. It happens in each migration configuration file, it’s a configuration property used by the SqlBase source plugin:

This is one of the reasons SqlBase has a wrapper for select query and you need to call it in your source plugin, like $this->select(), instead of building the query with bare hands.

N.B. Each time you add a custom yml file in your custom module you need to uninstall/reinstall the module for the config/install files to imports. In order to avoid that, you can import a single migration config file by copy/paste in the admin/config configuration synchronisation section.

The File migration

The content has images and files to migrate, I suppose in this example that the source database has a unique id for each file in a specific table that hold the file path to migrate.

We need a migration for the file to a Drupal 8 file entity, we write the source plugin for the file migration:

File: src/Plugin/migrate/source/ExampleFile.php

We have the source class and our source fields and each row generate a path to the file on my local disk.

But we need to transform our external file path to a local Drupal public file system URI, for that we need a process plugin. In our case the process plugin will take the external filepath and filename as arguments and return the new Drupal URI.

File: src/Plugin/migrate/process/ExampleFileUri.php

We need another process plugin to transform our source date values to timestamp (created, changed), as the date format is the same across the source database, this plugin will be reused in the content migration for the same purpose:

File: src/Plugin/migrate/process/ExampleDate.php

For the destination we use the core plugin: entity:file.

Now we have to define our migration config entity file, this is where the source, destination and process (field mappings) are defined:

File: config/install/migrate.migration.example_file.yml

We are done for the file migration, you can execute it with the migrate_tools (of the migrate_plus project) drush command:

The Term migration

The content has categories to migrate.
We need to import them as taxonomy term, in this example I suppose the categories didn't have unique ids, it is just a column of the article table with the category name…

First we create the source :

File: src/Plugin/migrate/source/ExampleCategory.php

And we can now create the migration config entity file :

File: config/install/migrate.migration.example_category.yml

This is done, to execute it :

The Content migration

The content from the source has an html content, raw excerpt, image, attached files, categories and the creation/updated date in the format Y-m-d H:i:s

We create the source plugin:

File: src/Plugin/migrate/source/ExampleContent.php

Now we can create the content migration config entity file :

File: config/install/migrate.migration.example_content.yml

Finally, execute it :

Group the migration

Thanks to migrate_plus, you can specify a migration group for your migration.
You need a to create a config entity for that :

File: config/install/migrate_plus.migration_group.example.yml

Then in your migration config yaml file, be sure to have the line migration_group next to the label:

So you can use the command to run the migration together, and the order of execution will depend on the migration dependencies:

I hope that you enjoyed our article.

Best regards,

Delta https://www.drupal.org/u/delta

Sep 24 2020
Sep 24

At Studio.gd we love the Drupal ecosystem and it became very important to us to give back and participate.
Today we're proud to announce a new module that we hope will help you !

Inline Entity Display module will help you handle the display of referenced entity fields directly in the parent entity.
For exemple if you reference a taxomony "Tags" to an Article node, you will be able directly in the manage display of the article to display tags' fields. It can become very usefull with more complex referenced entity like field collection for exemple.

VOIR LE MODULE : https://www.drupal.org/project/inline_entity_display


- You can control, for each compatible reference field instances, if the fields from the referenced entities would be available as extra fields. Disabled by default.

- You can manage the visibility of the referenced entities fields on the manage display form. Hidden by default.

- View modes are added to represent this context and manage custom display settings for the referenced entities fields in this context {entity_type}_{view_mode} Example: "Node: Teaser" is used to render referenced entities fields, when you reference an entity into a node, and you view this node as a teaser if there are no custom settings for this view mode, fields are rendered using the default view mode settings.

- Extra data attributes are added on the default fields markup, so the field of the same entity can be identified.

Compatible with Field group on manage display form.

Compatible with Display Suite layouts on manage display form.


- Entity API
- One of the compatible reference fields module.


The simplytest.me install of this module will come automatically with these modules: entity_reference, field_collection, field_group, display suite.

VOIR LE MODULE : https://www.drupal.org/project/inline_entity_display

We are currently developping a similar module for Drupal 8 but more powerful and more flexible, Stay tuned !

Sep 24 2020
Sep 24

The much-awaited Drupal 9 has been out and about for over a month now. Introduced amid a global pandemic, it wasn’t as big a launch as Drupal 8 in 2015.

Like Dries said, “The big deal about Drupal 9 is that... it shouldn’t be a big deal.”

So far, we don’t have much to dissect in the Drupal 9 update, so we’ll take a peek into Drupal 8’s transition over the years, and how it gave way to Drupal 9. Considering how every minor update in Drupal 8 has improved the CMS, we‘ll try to foresee the trajectory of Drupal 9.

Drupal 8 So Far

Drupal 8.0.0 was the first fully supported release of Drupal 8, released in 2015 as the biggest update ever to the Open Source CMS, Drupal. 

Note on semantic versioning

  • A MAJOR version is when incompatible API changes are made, e.g. the launch of Drupal 9 and complete removal of the deprecated code.
  • A MINOR version is when functionality is added in a backward-compatible manner. e.g. Drupal 8.2 to Drupal 8.3. 
  • A PATCH version is when backward-compatible bug fixes are done.

Drupal 8.1 - Drupal 8.4

20 April 2016 to 4 Oct 2017

The BigPipe module was included in Drupal 8 core with the Drupal 8.1 update, and it became stable in Drupal 8.3. We also saw Drupal 8.2.0 adopting coding standards changes.

Drupal 8.4 included major version updates for Symfony, jQuery and jQuery UI, and was no longer compatible with older versions of Drush. Drupal 8.4 also introduced media in the core.

Drupal 8.5 - Drupal 8.7

7 Mar 2018- 1 May 2019

Drupal 8.5 and 8.6 provided new improvements and functionality without breaking backward compatibility (BC) for public APIs.

The in-demand layout builder was launched with Drupal 8.7 and it changed the structure for Drupal editors significantly. 

Note: If you are still on version 8.6.x or older, you can skip directly to 8.8.x and have the upgrade path bug fixes applied.  

Drupal 8.8 and Drupal 8.9

Drupal8.8 launched on 4 Dec 2019

These last two updates paved the way for Drupal 9 to be built within Drupal 8. Drupal 8.8.0 declared a conflict with modules like Pathauto 8.x-1.5 or lower.

Drupal 8.8.0 ends the PHP 5.5 and 5.6 support and updates will now fail if servers are not updated to at least PHP 7.0.8.

Thus, Drupal 8.9, as the final minor release of the 8.x series, is a long-term support (LTS) version and will be supported until November 2021. Though Drupal 8.9 runs on all PHP 7 versions, it is recommended to update to at least PHP 7.3. 

Introducing Drupal 9

A cleaned-up version of Drupal 8, we saw the launch of Drupal 9 with updated dependencies and the removal of deprecated code. Though the vast majority of Drupal 8 migration tutorials will apply to your Drupal 9 sites, there's no one-size-fits-all process for upgrading/migrating. 

Initiatives We Look Forward to in the Drupal 9 Release Cycle

We can expect the theme Olivero, being built in the contributed project for inclusion in Drupal core, to be added as an experimental theme in the impending Drupal 9.1 update. Similarly, the theme Claro could be marked stable as it is already experimental in Drupal 8.8.

Apart from this, we expect to see automated updates in the core, CMI 2.0, and JavaScript modernization.

Here’s a list of various other strategic initiatives:

  1. API-First
  2. Automatic Updates
  3. Composer support in Core
  4. Configuration Management
  5. Documentation and Help
  6. Drupal 10 Readiness
  7. Media 
  8. New frontend theme
  9. Workflow

Migration Pre-requisites

Check out the tasks to be completed before you begin the migration process: 

  • Ensure your hosting environment matches the platform requirements of Drupal 9.
  • Update to the latest release, i.e. Drupal 8.8.x or 8.9.x 
  • Ensure Drupal 9 compatibility by updating contributed projects.
  • Make your custom code Drupal 9 compatible too.
  • Update core codebase to the major version, Drupal 9.
  • Lastly, run update.php.

Should You Migrate Your Drupal 8 Site? 

Migrating to Drupal 9 requires fully updating the Drupal 8 site to the most recent version of both the core and contributed modules and themes. This will ensure your database is Drupal 9-ready and only the code will change with some smaller database updates.

If your site is at any version below Drupal 8.8, then it’s a good time to start investing in upgrading. 

In case you are at either the Drupal 8.8 or Drupal 8.9 versions, then upgrading to Drupal 9 shouldn’t be that big a hassle for your team. Ensure your contributed modules are compatible with the latest release and your site is good to go. 


As a significant introduction, Drupal 8 embarked on a long and exciting journey with the Drupal community. Each minor update brought newer experiences, power-packed features, greater flexibility, and improved the overall outlook of the Open Source CMS. Today, the Drupal 9 version is entirely based on the workings of Drupal 8 itself. And it is only the hard work of the community and all their contributions that have helped Drupal reach this level of scalability and efficiency. 

Sep 24 2020
Sep 24

At the time of this writing, it’s over a month since Drupal 9 was released. While the Drupal community has grown over the last decade, thanks to the innovative release cycle and building bridges to other communities, Drupal 9 release festivities were not as grand as I remember for Drupal 8. A significant reason for this is the COVID-19 pandemic that we all are facing right now (I hope you’re okay reading this in the future). But there’s a bigger point here. Drupal upgrades are not exciting anymore. 

Stay with me for a minute. Drupal 8 will remain the most exciting Drupal release for the foreseeable future. It was an interesting time while we rewrote Drupal (almost) from the ground up. We did that using years of learned best practices and PHP community support. As a result, Drupal is more reliable and dependable now than ever before in its two decades of existence. On the other hand, Drupal 9 release was almost boring. The only thing we did was remove the deprecated code.

Understanding the Drupal release cycle

That’s a big deal here. As a community, we are approaching our tweens and deciding how best to lay our foundations for the long haul ahead. This is reflected in how we release Drupal. Drupal 1 through 4 were the only supported major versions throughout their lifetime. Drupal 5 support lasted well into the Drupal 6 lifecycle and this repeated for Drupal 7, 8, and 9. Due to an interesting combination of circumstances, Drupal 7’s support exceeds even Drupal 8.
Image Source

We are innovating by introducing new features on a schedule. Read more about the release cycle here. At the same time, we are keeping Drupal maintainable for the long-term. It’s of little consequence that not all Drupal 8 code will run on Drupal 9. The important thing is that most of the code will. In fact, with the predictable release schedule of deprecations and new features, a well-maintained site might have had nothing to do when upgrading to Drupal 9. We saw this with a flurry of tweets and other social media updates announcing that people have upgraded their sites to Drupal 9 within hours of release.
Image Source

Understanding major releases

Starting with Drupal 9, all major releases will be the same as the last minor release in the previous version, except for the absence of deprecated code. This means Drupal 9 is identical to Drupal 8.9 to everyone–editors, site builders, and developers (as long as they don’t use deprecated functionality). That will also be the case for Drupal 10 and Drupal 11. And this will go on until we see a significant shift in the PHP programming paradigm that warrants another Drupal 8 style rewrite (will it be generics or async programming or something else we haven’t yet imagined?)

Enough theory, what does this mean for you?

Based on everything we talked about above, let’s get down to business.

  • Are you running Drupal 6 or earlier?
    • Migrate right now.
  • Are you running Drupal 7?
    • You have until Nov 28, 2022, to migrate to Drupal 9. Yes, it would be best if you don’t plan to migrate to Drupal 8 right now*.
  • Are you running Drupal 8.8 or earlier?
    • Upgrade to Drupal 8.9 right now.
  • Are you running Drupal 8.9?
    • You’re good until November 2021. Evaluate your site’s contrib and custom code to plan for Drupal 9 upgrade when possible.
  • Are you running Drupal 9?
    • You have reached your destination.

* There are caveats to every situation. I always try to make sure that I never generalize.

Planning the upgrade to Drupal 9

You are on Drupal 8 and want to upgrade to Drupal 9? There are lots of resources to help, but I suggest you start by installing the Upgrade Status and Upgrade Rector modules. Chances are you won’t need to look elsewhere.

Upgrade Status module can check for Drupal 9 compatibility information for each of the modules you use (including custom modules) and, along with Upgrade Rector, generate patches that you can use on Contrib and custom modules. As we see here, many Contrib modules already have Drupal 9 compatible releases. Most of the remaining modules only need minimal changes to become compatible.

Personally, I have only upgraded one site to Drupal 9 so far. There are a few more sites I can upgrade to Drupal 9 right now if I switched to dev releases of certain modules I use. But there’s no good reason for me to hurry. My Drupal 8.9 site is as good as Drupal 9 in every way, except the amount of code, PHP has to load (and that’s not a major problem thanks to Opcache). We will only see new features in Drupal 9.1 in December 2020, and I can wait until then for the Contrib modules to have proper releases.

Understanding Drupal versioning

If you have used Drupal for some time, you might know that you recognize compatible Contrib modules by their version. For example, Pathauto 7.x-1.0 is for Drupal 7 only. It won’t work on Drupal 6, nor Drupal 8. Similarly, token 8.x-1.2 would not work on Drupal 7.

With Drupal 8, the community adopted semantic versioning for the core. This has now rolled out to even Contrib modules. This means that we would be dropping the familiar versioning system that we have used for over a decade in favor of semantic versioning. Don’t worry, existing major releases are fine. That means you would still see new releases coming out for Pathauto 8.x-1.x branch, but if it were ever to create a new major release, we would probably see Pathauto 2.0. Actually, we might see Pathauto in Core (I hope), but that’s a different story.

Some of the modules have adopted this and see new releases in semantic versioning style (devel comes to mind). Other modules are still on their existing 8.x-y.z release scheme because they don’t need to change anything. And that’s another sign of maturity in how we write code for Drupal.


Drupal has long since moved from being adventurous and made efforts to become more reliable and robust in serving the people, as it should. The Drupal community has long stood by its slogan: Come for the code, stay for the community. This shift in thinking about Drupal’s release cycle is a testament to that fact: Drupal is not built in a vacuum. It is built, foremost, to serve the people who would use it.

Sep 23 2020
Sep 23

Working in digital design and development, you grow accustomed to the rapid pace of technology. For example: After much anticipation, the latest version of Drupal was released this summer. Just months later, the next major version is in progress.

At July’s all-virtual DrupalCon Global, the open-source digital experience conference, platform founder Dries Buytaert announced Drupal 10 is aiming for a June 2022 release. Assuming those plans hold, Drupal 9 would have the shortest release lifetime of any recent major version.

For IT managers, platform changes generate stress and uncertainty. Considering the time-intensive migration process from Drupal 7 to 8, updating your organization’s website can be costly and complicated. Consequently, despite a longtime absence of new features, Drupal 7 still powers more websites than Drupal 8 and 9 combined. And, as technology marches on, the end of its life as a supported platform is approaching.

Fortunately, whatever version your website is running, Drupal is not running away from you. Drupal’s users and site builders may be accustomed to expending significant resources to update their website platform, but the plan for more frequent major releases alleviates the stress of the typical upgrade. And, for those whose websites are still on Drupal 7, Drupal 10 will continue offering a way forward.

The news that Drupal 10 is coming sooner rather than later might have been unexpected, but you still have no reason to panic just yet. However, your organization shouldn’t stand still, either.

Image via Dri.es

The End for Drupal 7 Is Still Coming, but Future Upgrades Will Be Easier

Considering upgrading to Drupal 8 involves the investment of building a new site and migrating its content, it’s no wonder so many organizations have been slow to update their platform. Drupal 7 is solid and has existed for nearly 10 years. And, fortunately, it’s not reaching its end of life just yet.

At the time of Drupal 9’s release, Drupal 7’s planned end of life was set to arrive late next year. This meant the community would no longer release security advisories or bug fixes for that version of the platform. Affected organizations would need to contact third-party vendors for their support needs. With the COVID-19 pandemic upending businesses and their budgets, the platform’s lifespan has been extended to November 28, 2022.

Drupal’s development team has retained its internal migration system through versions 8 and 9, and it remains part of the plan for the upcoming Drupal 10 as well. And the community continues to maintain and improve the system in an effort to make the transition easier. If your organization is still on Drupal 7 now, you can use the migration system to jump directly to version 9, or version 10 upon its release. Drupal has no plans to eliminate that system until Drupal 7 usage numbers drop significantly.

Once Drupal 10 is ready for release, Drupal 7 will finally reach its end of life. However, paid vendors will still offer support options that will allow your organization to maintain a secure website until you’re ready for an upgrade. But make a plan for that migration sooner rather than later. The longer you wait for this migration, the more new platform features you’ll have to integrate into your rebuilt website.

Initiatives for Drupal 10 Focus on Faster Updates, Third-Party Software

In delivering his opening keynote for DrupalCon Global, Dries Buytaert outlined five strategic goals for the next iteration of the platform. Like the work for Drupal 9 that began within the Drupal 8 platform, development of Drupal 10 has begun under the hood of version 9.

A Drupal 10 Readiness initiative focuses on upgrading third-party components that count as technological dependencies. One crucial component is Symfony, which is the PHP framework Drupal is based upon. Symfony operates on a major release schedule every two years, which requires that Drupal is also updated to stay current. The transition from Symfony 2 to Symfony 3 created challenges for core developers in creating the 8.4 release, which introduced changes that impacted many parts of Drupal’s software.

To avoid a repeat of those difficulties, it was determined that the breaking changes involved in a new Symfony major release warranted a new Drupal major release as well. While Drupal 9 is on Symfony 4, the Drupal team hopes to launch 10 on Symfony 6, which is a considerable technical challenge for the platform’s team of contributors. However, once complete, this initiative will extend the lifespan of Drupal 10 to as long as three or four years.

Other announced initiatives included greater ease of use through more out-of-the-box features, a new front-end theme, creating a decoupled menu component written in JavaScript, and, in accordance with its most requested feature, automated security updates that will make it as easy as possible to upgrade from 9 to 10 when the time comes. For those already on Drupal 9, these are some of the new features to anticipate in versions 9.1 through 9.4.

Less Time Between Drupal Versions Means an Easier Upgrade Path

The shift from Drupal 8 to this summer’s release of Drupal 9 was close to five years in the making. Fortunately for website managers, that update was a far cry from the full migration required from version 7. While there are challenges such as ensuring your custom code is updated to use the most recent APIs, the transition was doable with a good tech team at your side.

Still, the work that update required could generate a little anxiety given how comparatively fast another upgrade will arrive. But the shorter time frame will make the move to Drupal 10 easier for everybody. Less time between updates also translates to less deprecated code, especially if you’re already using version 9. But if you’re not there yet, the time to make a plan is now.

Sep 23 2020
Sep 23

Google Summer of Code (GSoC) is a global program focused on bringing more student developers into open source software development. Students work with an open source organization on a 3 month programming project during their break from school or college. In the 16th year of the program, 1106 students from 65 countries have successfully completed Google Summer of Code in 2020, including Drupal!

The Drupal Association’s Community Liaison, Rachel Lawson, caught up with those taking part in GSoC on Drupal related projects this year, to find out how things went, what they learned along the way, and what their future may hold.

You are invited to watch our “Community Chat”, with Vishal Chaudhary, Shawn McCabe, and Ryan Szrama.

Sep 23 2020
Sep 23

The main reason for the global arg() function to be deprecated in Drupal 8 and onwards is that it no longer served any specific need. Besides that, using the arg() function needed some extra care to avoid getting unexpected results. Say that you wanted to load a node on the path 'article/123', executing arg(1) would return '123' with which you could load the node. Using the '123' returned by arg(1) did not in any way guarantee that the path was valid or even that a node with ID 123 existed.

In Drupal 8 and onwards things are done differently. Consider the following:

$node = \Drupal::routeMatch()->getParameter('node');
if ($node instanceof \Drupal\node\NodeInterface) {
  $nid = $node->id();
  // Do whatever you need to do with the node ID here...

Getting the node ID this way is far more robust than doing so the old way using the arg() function. We know for sure the node exists and the path is valid because routeMatch() would not return a node object otherwise. As a bonus you can easily do some extra validation because you already have the node object loaded. You could, for instance, check that the node is of type 'article' by adding:

if ($node->bundle() == 'article') {

Getting the node ID this way may seem like a lot more work than using the deprecated arg() function, but it certainly guarantees a way more robust way of working which in turn will make your code better and more stable.


Need help developing your Drupal website? Our team of expert Drupal developers would be more than happy to help you out!

Sep 23 2020
Sep 23

Drupal keeps evolving in order to give you even more advanced digital capabilities.

We love to share useful content about upgrades with you — like the blog post about Drupal 7 to Drupal 8/9 Module Upgrader.

Time flies fast, and there is already a Drupal 10 release planned. What does all this mean for your website? Let’s take a closer look.

When will Drupal 10 be released?

Drupal creator Dries Buytaert wrote an article, and also gave a State-of-Drupal presentation, announcing the expected Drupal 10 release date should be two years from now — around June 2022. The next year, in 2023, D9 will be end-of-life. This means that website owners will need to upgrade to the 10th version before 2023.

“Hey, what do you mean by upgrading to Drupal 10? I am not even on the 8th version yet,” many of our readers might think at this moment. We are moving on to the answer right now.

Drupal 10 targeted release

Why is the Drupal 10 release planned so soon?

Indeed, the new pace of Drupal releases looks very fast compared to previous years. Both D9 and D10 fly out just two years after their predecessors, while D7 and D8 had a 4-5 year waiting time.

According to Dries, one of the key goals of the Drupal team is to keep the CMS secure. Drupal depends on third-party components that have their own release cycles and end-of-life dates. When they get unsupported, security bugs in them will no longer be fixed, so no one can guarantee website security.

In the case with Drupal, these components include Symfony 4, CKEditor 4, PHP7, and more. Special attention is paid to the Symfony components. Drupal will need to have adopted Symfony 5 (or an even higher version) by November 2023 — Symfony 4 end-of-life.

Updating third-party components for Drupal 10

What does Drupal 10 release mean for Drupal 7/8/9 website owners?

As stated above, everyone will need to upgrade to Drupal 10 by 2023 in order to provide website security and rich functionality according to the latest trends.

Why upgrade Drupal so often?

However, Drupal 10 release certainly does not mean any more cumbersome upgrades. The CMS is quickening its path and at the same time is getting extremely easy to upgrade. Beginning with a D8 to D9 upgrade and further, upgrades are almost instant, with just a few preparations websites should make. Making Drupal upgrades super easy is a big priority for its creators’ team, and they have achieved great success and will continue to work on it.

Drupal upgrades easy

This sounds nice, so let’s sum up what Drupal 7/8/9 owners should do about the future 10th release:

  • D7 website owners will need to make a big leap to the 8th version and then upgrade further very easily. They really need this move because the 7th version is getting technologically outdated. Review your website’s goals and reach out to our Drupal development team to plan your upgrade.
  • D8 and D9 website owners just need to keep their websites updated between the minor releases and clean from deprecated code. This guarantees quick upgrades to D9/10 and further in the future. Ask our Drupal developers to quickly check your website’s state and refresh it so it is ready to upgrade in a few clicks.

Be ready for the Drupal 10 release!

Although you have two years before the D10 release, you can start preparing your website now, especially if it is on D7. The future is around the corner and reaching it is very easy if you work with professionals. Contact our Drupal maintenance and support team and make your website modern, protected, and efficient!

Sep 23 2020
Sep 23

Here at Ny Media we are specialists in developing highly customized Drupal Commerce solutions. One of the recurring themes of a tailor-made e-commerce solution is to integrate some sort of order export towards the ERP solution that the client in question uses. And a very common way for us to do that is to hook into commerce order state transitions.

Typically a subscriber would make sure the actual export is queued through Drupal's queue system (or through Advanced Queue). This makes it possible to have exports that can retry, delay execution and generally be reliable and fault-tolerant.

However, this also involves integration towards third parties. No matter how fault-tolerant your integration is, you can not guard against all kinds of error in a third party application. Which is why from time to time I find myself needing to trigger these transitions again, for example to re-queue the order export. So here is an annotated code example how I achieved this:


// Replace this with the order id in question.
$order_id = 123456;
// If you want to do this within a class, probably use dependency injection
// instead of the Order class directly. The same goes for the services we are
// about to load statically from the service container.
/** @var \Drupal\commerce_order\Entity\OrderInterface $order */
$order = Order::load($order_id);
// This service is the event subscriber. We want to trigger the event
// subscriber only, and not dispatch the event from the event emitter so all
// subscribers can react to it.
/** @var \Drupal\nymedia_order_export\EventSubscriber\NymediaOrderExportSubscriber $order_export_event_subscriber */
$order_export_event_subscriber = \Drupal::service('nymedia_order_export.event_subscriber');
/** @var \Drupal\state_machine\WorkflowManager $workflow_plugin_manager */
$workflow_plugin_manager = \Drupal::service('plugin.manager.workflow');
// The type of order workflow you are using might vary from your site. See
// below for a note on how to find out.
/** @var \Drupal\state_machine\Plugin\Workflow\WorkflowInterface $workflow */
$workflow = $workflow_plugin_manager->createInstance('order_fulfillment');
// The transition in question will also vary based on your site. For a note on
// how to find out, read below.
$transition = $workflow->findTransition('draft', 'fulfillment');
$event = new WorkflowTransitionEvent($transition, $workflow, $order, 'state');
// Now trigger the event. The method here will be the one you have indicated
// will respond to the event. For example, if your event subscriber service
// has this in its public static function getSubscribedEvents:
// 'commerce_order.place.post_transition' => ['onPlace'],
// (the example is taken from this class itself), then you probably want to
// invoke the method ::onPlace, like we are doing here. If you are looking for
// another transition, or your class has a different method as a responder for
// the place transition event, then you probably want to adjust this
// accordingly.

As stated in the code above, there are some things that might not be obvious how you find out. Let's start with the order workflow ID.

How to find the workflow ID of an order type

To find out what kind of workflow you are using, you take a look at the order type for the order in question. On this particular site, there are 2 order types. The one that I had to re-queue is of the type "default". So I edit that order type, which can be found at mysite.com/admin/commerce/config/order-types/default/edit.

In there we can see that you can select the workflow for the order. And in the select dropdown, I can see that the ID for the chosen one is "order_fulfillment":

<option value="order_fulfillment" selected="selected">Fulfillment</option>

Another way to see this is to look at the configuration YML file for the default order type. It will look something like this, and in my case is called "commerce_order.commerce_order_type.default.yml":

uuid: 2a999511-7dbb-4a44-9599-6bad702ff032
# ... Content edited out for clarity.
label: Standard
id: default
# Here is the id of the workflow again:
workflow: order_fulfillment
# ... rest of the file.

How to find state IDs for the workflow transition

In my example, I wanted to get the transition where an order goes from "draft" to "placed". How did I know these IDs, and how did I know which ones to use?

To answer that, we should look up the definition of the workflow we have chosen. A workflow will most often be defined in a file called modulename.workflows.yml. In our case, we are actually using one of the workflows provided out of the box with Drupal Commerce, so the file to look at is commerce_order.workflows.yml. In here our workflow is defined as follows:

  id: order_fulfillment
  group: commerce_order
  label: 'Fulfillment'
      label: Draft
      label: Fulfillment
      label: Completed
      label: Canceled
      label: 'Place order'
      from: [draft]
      to:   fulfillment
      label: 'Fulfill order'
      from: [fulfillment]
      to: completed
      label: 'Cancel order'
      from: [draft, fulfillment]
      to:   canceled

We can see it has 4 states, and 3 transitions. The one we want is the one that is triggered when the user completes their purchase, and this is the transition with the ID "place". To find it, I used the state it was supposed to transition from and the state is was supposed to transition to, which you can see is "draft" and "fulfillment".

As you can see, the framework of Drupal Commerce makes it possible for us to create advanced types of integrations, which are fault-tolerant, flexible and scalable. If you are looking for a partner to develop a Drupal Commerce site with customized integrations, contact our team of experts, ready to create solutions for you, regardless of integration types, order types or workflow types.

Sep 23 2020
Sep 23

'History is important, but what we do today matters the most, and we realize that.'

At OpenSense Labs, we make sure you move on from the old glitches you've faced with your website and its performance and give it better and smoother user experience. We use decoupled Drupal to give your website versatile and structured content that the web experiences need. 

Brands these days communicate with their customers, not only through the websites but also through multiple touchpoints. Decoupled Drupal serves content through an API to be consumed by other mediums like mobile applications, kiosk displays, IoT, wearables, etc. Headless Drupal is not a new phenomenon, but with the rising digital era, it is getting more and more important. You can either go for a progressively decoupled approach or fully decoupled approach based on your project requirements and we have successfully launched websites using both the approaches.

Let me take you through the websites created and revamped by us using decoupled Drupal. 

Paramount software solution

Home page of Paramount software solution

Paramount software solutions, being one of the leading IT Service providers in infrastructure management, application, blockchain, architecture, etc, protects your investments and enhances your productivity. It provides dependable and integrated business solutions for small and large enterprises. 

Paramount Software Solutions wanted to build a portfolio website that would act as the gateway to its impeccable services. We built the site using Drupal’s powerful capabilities keeping in mind, rich user experience, and streamlined content management.

The need for a headless web application for Paramount software solutions was why Drupal was chosen in the first place.

Simplified content workflow, high web performance, high-level security, and SEO were taken into consideration for building the website. After doing a detailed analysis and taking a lot of feedback from the clients, OpenSense Labs decided to develop this website as a fully decoupled application.

With Drupal, we made sure that the security of the website remains top-notch.
JSON:API and JSON:API Extras modules were used to gain a full rest API for the Drupal application and it was ensured that the resource properties like alias fields, API path, etc could be altered easily. 

The RESTful Web services module was used to provide customizable and extensible RESTful API of data governed by Drupal. 

HTTP basic authentication was used to offer the functionality of authenticating username and password.

The full case study of Paramount Software Solutions is available on Drupal.org


Home page of AgWeb

AgWeb is the most influential web-property of Farm journal, which is one of the leading business information and media companies. AgWeb is an online platform for farmers to stay informed about the news of crop and livestock farming, live future trading data, market assessment, ag policy, weather forecast, and more.

AgWeb wanted to enhance its website and needed a solution to keep up with the changing landscape of web technologies. This required a complete migration of their old .NET based legacy website into the state-of-the-art CMS of Drupal and then retain the wonderful search engine rankings gathered by it over the years.

The main objective here was to enhance user engagement and brand identity. In this process, a lot of feature upgrades had to be done to make it simpler for future development.

By choosing Drupal 8, AgWeb could tailor its media solutions. It became easy to create a listing with the assistance of views and enhance speed, scale, and stability. 

We planned the project in sprint-based development cycles and for the successful migration of content from the old .NET website to Drupal 8, the Scrum process was applied. 

Progressively decoupled blocks were used to build features like search and crop comments. We were able to improve the on-site search with the help of React and Elasticsearch

Drupal 8 gave the website a modernized look which resulted in higher user management. Drupal's support assured that the page load time of the website is much lesser than the old one. The website's Google rankings accelerated with the help of SEO enhancements.

The full case study of AgWeb is available on Drupal.org

Produce Market Guide

Home page of Produce Market guide

The PMG is also a product of Farm Journal. It is a resource that produces commodity information, data analysis, and trends. This platform shared information on fresh fruits and vegetables and is also the industry's leading source of information and news.

There were not many features required in the architecture, as the PMG website was already based on Drupal. So, the joint client-vendor system decided to progressively decouple the search functionality. This new search feature was built using React and elastic.

Drupal was chosen because of its flexibility. The customer already had prior experience with Drupal. And the built-in API-first support and easy third-party integration added to the many reasons why Drupal should be used again.

They wanted us to build search applications with facets and track user activities for personalized and smooth user experience.

Elastic backend architecture was developed using the ElasticSearch Connector module. Then, the biggest challenge was to add the SearchKit and React in the same search. SearchKit was used to design and develop the front end, the logic, and the project structure.

The new PMG website now takes less time to load than before. The project did not even take a month to complete. We followed the principles of Scrum and Agile by arranging themselves according to their needs.

The full case study of Produce Market guide is available on Drupal.org


Decoupled Drupal has helped websites in many ways and we love creating and revamping websites using it. It gives a content-rich experience, with a great presentation layer. 

If you love what we have done to these websites, and wish to have the same experience for yours, contact us at [email protected]

Sep 23 2020
Sep 23

Last week, 12 folks (including one brand new face) joined our first MidCamp 2021 planning meeting. The intent of our meeting was to begin discussions for a format for 2021, but almost like clockwork, our discussion quickly came back to the classic existential question: “What are we doing here?”

You might be thinking: “Uh, what? Why is a reliably delivered event now in its seventh year and with a sizable incumbent organizing team questioning their existence?” 

Well, we’d pose to you: “Why not?”

I’ve played various roles on the MidCamp team since our inception at Drupal Camp Fox Valley 2013 and from the beginning our team has been dissatisfied with the status quo. From early efforts—like blind session selection and walking lanes, to early iterations of the Drupal Recording Initiative, to live captions as a service—the MidCamp team is always trying to be one step ahead… “trailblazing” if you will, which was my old Boy Scout troop’s motto.

So after we, hand-in-hand with NERD Summit, set the early standard for virtual Drupal events in March of 2020, of course our team wouldn’t be satisfied with “just another Zoom conference.”

There are lots of interesting ideas floating around in this space now: all new sessions, all BoFs, un-conferences, substituting monthly meetups for a yearly event, virtual sightseeing. This all leads back to: Why should MidCamp exist in 2021? What do we add to the conversation?

Here’s what we know:

  • We will not be hosting a physical event in March of 2021.
  • We are known for the care we take in crafting Drupal events for humans.
  • We are not satisfied with the status quo and seek to continue being pioneers in the events space.
  • Contribution beyond the Drupal space is essential for Drupal’s vitality, now more than ever.
  • While we welcome all, MidCamp’s goal is to serve Midwest-area Drupalists first.

Here’s what we don’t know:

  • Does the world need another virtual conference?
  • What does being a “regional camp” mean when events are globally available?
  • Is it better to have more speaking opportunities or more focused content?
  • How can we (or can we at all) recreate the human-centric experience that we all look forward to each year without being together IRL. 

If you’ve got this far, we’d love for you to share your answers and help shape MidCamp 2021.

Many thanks,

Avi Schwab
MidCamp 2021-2022 Lead

& the MidCamp Organizers

Sep 22 2020
Sep 22

Bay Area Drupal Camp has gone — wait for it — 100% virtual! BADCamp is a community run celebration of open-source software with a keen focus on learning and inclusivity. Every year this event brings Drupal users, developers, marketers, and content specialists together from all over the country for high value talks, summits and trainings.

While you’ll have to forego the trip to beautiful Berkeley, California this year, the good news is that registration is free and the 2020 session lineup is as packed as ever. Mark your calendar for this October 14th - 17th, and get ready to join Aten, the Bay Area Community, and your colleagues and peers from across the country in three major session tracks: Drupal for Beginners, Advanced Drupal, and Marketing & Communications.

Aten is excited to sponsor this year’s Higher Education Summit, and for our team to contribute a few sessions of their own, detailed below. Register for BADCamp 2020 today!

Friday, October 16th

Managing People: The Art & The Science, 1 PM PST

Project Managers are tasked with organizing client schedules, timelines, meetings, internal resources and much, much more. Every one of a PM’s tasks overlap in a central — and often complex — practice: managing people. Join Janice Camacho, Project Manager, as she explores the art of meeting each individual where they’re most comfortable, and the science of why they’re comfortable there. In this session you’ll learn how to get out of your own way and build the healthy, confident project teams that support strong, long-term client relationships.

True Life: I’m an introvert in an extrovert’s world, 2 PM PST

Do you shy away from speaking up in a crowded room? Do you prefer to maintain a carefully guarded bubble of personal space? Does the prospect of addressing an audience make you perspire and/or shake? Introverts exist in the world of Digital Project Management, too. Gasp! And — perhaps contrary to intuition — they bring a unique set of strengths and abilities to the table, much like their extraverted counterparts. Join Kacie Miner, Digital Project Manager, as she shares her experience of being an introvert in the DPM space. In this session you’ll learn:

  • Strengths, abilities, and positive attributes that introverts bring to the table
  • Ways to adapt your personality to the job at hand without changing who you are
  • Strategies that will set you up for success instead of causing you to overthink
  • Tips and tools to know where you lie on the extrovert scale, and knowing how to recover
  • How to develop your own toolkit for being fully prepared when put on the spot

Layout Building in Drupal, 3 PM PST

The Layout Discovery API has dramatically changed the way Drupal 8 websites are designed, built and maintained. Solutions like Layout Builder, Entity Reference with Layout, and Layout Paragraphs have added a new dimension of content presentation on top of traditional content management. With these tools content editors have more control over their online presence than ever before — but this newfound flexibility isn’t without its own challenges. Join James Nettik, Front-end Developer, as he covers the essentials of layout building in Drupal 8. This session will cover:

  • An overview of the tools available today and their pros and cons
  • How to begin working with the new Layout Discovery API
  • Tips to keep the authoring experience as intuitive as possible
  • Solutions to common questions and pitfalls while designing and building

Don’t miss your opportunity to learn the latest in Drupal, network with fellow professionals, and attend in-depth technical and management training. Register for BADCamp 2020 today. We’ll see you there!

Sep 22 2020
Sep 22

At DrupalCon Global 2020, Tag 1 Consulting CEO Jeremy Andrews and Managing Director Michael Meyers talked about the upcoming Drupal 7 and Drupal 8 end of life. In their talk, they discussed:

  • What Drupal “End of Life” (EOL) means
  • When it happens, and how D7 and D8 differ
  • Why widely used versions are retired
  • Practical implications and your options
  • What Drupal vendor Extended Support (ES) Is
  • Why ES only covers D7, and not D8
  • How ES operates, and what it covers

[embedded content]

What Drupal “End of Life” (EOL) means

When a version of Drupal reaches EOL, the Drupal community will no longer work on it or provide free support. Core development stops entirely - no new features are added, no bugs will be fixed. The core issue queues will be locked, you will be prevented from adding anything to Drupal 7 & 8 Core on Drupal.org.

While Drupal 6 Core is locked, contrib is still open. Drupal 7 & 8 will likely do the same, so you can update your modules. Very few 6.x modules were updated after the Drupal 6 EOL, and many maintainers closed their branches as well. Expect that most contrib module owners will close their 7 and 8 branches.

In addition to the issues queue, the testing infrastructure will most likely be decommissioned. The PHP versions supported by these versions of Drupal are also EOL. Each D7ES vendor has a member on the security team, but the Drupal security team will no longer be proactively involved in reviews. This may mean less secure code unless you participate in a D7ES program, or manually track patches as they become available.

When is the EOL date?

Drupal 7 reaches end of life in November of 2022.It was originally scheduled for November of 2021. The date was extended due to the large user base, and the difficulties stemming from the global coronavirus pandemic.

Drupal 8 reaches end of life on November 2, 2021. While it may be confusing that Drupal 8 reaches EOL before Drupal 7, Drupal 8 is dependent on Symfony 3, which reaches the Symfony community’s EOL at that time.

Why widely used versions are retired

There are many reasons to retire older software.

  • Legacy: Drupal 7 is 10 years old, and will be ~12 by EOL in Nov. 2022
  • Bandwidth: Developers can’t support Drupal 7 and 8 while building Drupal 9 and 10
  • Interest: Developers don’t want to focus on 10 year old technology
  • Innovation: Improvement through innovation is the best for Drupal as software

Drupal 7 and 8’s end of life is a challenge. Rebuilding your website on new technologies (which also have their own EOL schedules), can be expensive and time consuming. Drupal 8 to Drupal 9 is an easier upgrade, making its EOL less problematic for users.

Practical implications and your options

Drupal 7 users have several options. The higher cost options are:

  • Don’t migrate. This is a bad choice, because it leaves your website vulnerable to attack, potentially losing data.
  • Migrate to Drupal 9. This is a good choice, keeping your site up to date with a similar ecosystem.
  • Move to a new CMS. Similar in cost to a Drupal 9 migration, with the added cost of training your teams on new technologies.

Lower cost options are:

  • End of life your website.
  • Turn your website into a static website.
  • Keep running Drupal 7, and work with a Drupal 7 vendor in the Extended Support (D7ES) program.

What Drupal vendor Extended Support (ES) is

D7ES ensures Drupal 7 remains secure and safe to run. Companies approved to offer D7ES must provide at least the following services:

  • Security patches for D7 core, including vulnerabilities that are reported for supported versions of Drupal
  • A specific list of contributed modules will be identified, and security patches will be provided for them
  • Vendors must make a commitment to offer these services for at least 3 years; at a minimum, you should receive D7ES through 2025
  • All patches created by D7ES vendors must be open source - if a D7ES vendor fixes any problem with D7, they are obligated to release the fix
  • Vendors must have an active member on the Drupal Security Team

The more the community supports this effort, the more vendors will offer it, and the more fixes they’ll be able to provide. Official vendors are vetted by the Drupal Association and listed on the D7 Vendor Extended Support page. Drupal 7 ES does not follow a formal release schedule, and your website must be on the final EOL version of Drupal 7 in order to participate in the vendor programs.

To learn more about Tag1’s extended support program, see Tag1 Quo - the enterprise security monitoring service.

Photo by Ankhesenamun on Unsplash

Sep 22 2020
Sep 22
Reading time 4 mins clock

The web can be a daunting place for those with a disability.

Digital marketing has become the way that companies of all shapes and sizes reach us as consumers - but are we really reaching everyone who’s out there on the web?

According to Scope, there are 14.1 million disabled people in the UK

Your organisation’s website could be putting up unnecessary barriers to those with visual impairments or disabilities..

Failure to accommodate such a large audience limits the positive impact a website can have on your business and the amount of potential customers you could be working with.

Would you put an a-board right in front of your shop door? Of course not! You remove the barriers that would get in the way of your customers coming in.

Approximately 1 in 8 adult males


1 in 200 adult females have some form of colour blindness...


Why bother?

Your first point of call when looking to make sure your website meets the basics of accessibility is to be compliant with the WCAG ( Web Content Accessibility Guidelines) 

It’s not only a legal requirement for many organisations to meet these standards, it’s also a worthwhile investment because it ultimately opens doors to more customers being able to access your site. 

There are some staggering statistics around the spending power of disabled households, referred to as the ‘purple pound’.

This spending power, in 2017 was estimated to be worth £249 billion per year to UK businesses. When 75% of disabled people and their families have walked away from a UK business because of poor accessibility or customer service, it is clear why being accessible can really pay.

Not to mention the brand damage this could end up causing - we’ve all seen Dominos in the news!

The Guidelines

The guidelines are graded at three different success criteria, levels A, AA, and AAA. 

Level A is the most minimum requirement when making your website accessible. This level addresses the most basic web accessibility features.

Level AA is a mid-range reach in features you apply to your website. It has the most common barriers for disabled users and aligns to the Revised 508 Standards

Level AAA is the highest level you can achieve - but some say you can never really reach it because as you get into it, you can start cancelling out other requirements. A double edge sword if you will. This level addresses the highest level of web accessibility, but is not recommended as a general policy, because it’s not possible to satisfy all criteria for some content. Most will instead work with whatever rules suit their site best. 

man on macbook at desk viewing screen

The higher the level, the more constrictive it is on the design process; you thought having that fancy dropdown would be a good idea? Well, it doesn’t conform to AAA guidelines.

The guidelines are organised under what is considered the four principles of accessibility: Perceivable, Operable, Understandable and Robust (POUR).

Perceivable means that a user can perceive the information being purveyed on the site without any difficulty. 

Operable means that the components and interface of a site are easily navigated. Understandable means that users need to be able to understand the information and interface. 

Robust means that content must be solid enough that it can be interpreted reliably by a range of assistive technologies.

...That represents 300 million people worldwide & equates to around 3 million people in Britain who are colourblind!


Only 25 guidelines need to be met in order to meet a level A standard, as demonstrated by this checklist tool, this is considered the baseline for accessibility and all sites should aim for it. Picking out a guideline at random, 1.3.1 Info and Relationships, an example of success criterion for this is to use labels for checkbox inputs, a label can be related to a checkbox by using a for the attribute in the label’s markup. The for attribute specifies which form element a label is bound to, this is so simple to implement and it greatly benefits users who have to rely on a screen reader - Drupal provides this functionality by default.

As for things that shouldn’t be done when designing for accessibility, there is a blog posted on the UK Government website relating to this exact topic.

blank note pad with colour charts beside it on a pink desk

Tools and Tips

WAVE Evaluation Tool is a great one to have, it produces a concise report on the structure of a web page. I find it particularly useful for the colour contrast report.

NoCoffee simulates what it is like to have some forms of color blindness and blocked visual fields.

ChromeVox is not necessarily built for developers, but it can be quite handy to know what screen readers will say aloud.

Axess Lab has a great article with real world examples of issues experienced by users who rely on assistive technologies. It really illustrates how difficult the web can be to use for many people.

In our recent Global Accessibility Awareness Day blog, we wrote out five tips on how to improve accessibility for your website, to bring in those huge missed out percentages:

1. Add Alt Text to all images you insert into content pages.
2. Choose colours with care.
3. Having the ability to resize the text on your site.
4. Create content with accessibility in mind!
5. Keyboard friendly

In 2018, less than 10% of all websites were meeting web accessibility standards.


Are you struggling to know where to start or are you having trouble ticking all the accessibility boxes? 

Get in touch with our team and we can work with you to make your website more accessible through support and training.

Sep 22 2020
Sep 22

A seasoned web developer would call this a match made in heaven. Drupal and AngularJS together can create rich and dynamic web experiences that might want you to reconsider your web development strategy altogether.

We have already spoken about how Drupal has proven to be one of the best CMS frameworks out there.But what is AngularJS really and how does the combination of Drupal Angular Js work wonders for your website? Read on to also understand headless architecture better with a case study.

Why go the Headless way?

“Each man is capable of doing one thing well. If he attempts several, he will fail to achieve distinction in any” – Plato.

This quote is so relevant today when we talk about CMSs and Headless architectures. Content management systems like Drupal are fantastic at managing content and data. However, with the increasing number of channels, API access points, front-end interactions and many more modern user experience demands that it is required to support, traditional CMS structures often seem inadequate. For more ambitious digital experiences, traditional architectures are now often being replaced with headless architectures. Headless or decoupled websites leverage a JavaScript framework for front-end interactions while maintaining a CMS like Drupal to manage the content. 

CASE STUDY: In one of our recent projects for our client, a leading casual dining restaurant chain, we had implemented Angular to enable API-based communication built on top of Drupal 8. The application required to interact with the web, mobile app, POS front end and other restaurant and customer management modules. Combining Drupal 8 with Angular worked out great because not only did it enable us to support their multiple channels and access points, we also saw a huge improvement in the performance of the application. 

Headless Drupal or Decoupled Drupal

With headless Drupal, the browser does not directly connect to Drupal. Instead of seeing Drupal’s presentation layer/ theme, the user will see pages that have been created by front-end frameworks such as AngularJS. Data is provided in JSON format to the front-end framework. With JSON:API module now in core and moving Drupal 8’s API-First initiative forward, things are even easier now. The idea of implementing a headless Drupal with AngularJS is to use Drupal’s flexible and powerful back-end capabilities to the fullest while letting a more interactive front-end framework do the talking to the browser. It is believed that client-side front-end frameworks like AngularJS are the future of the web, and if you are looking to build a rich and dynamic website with little to no latency, Drupal Angular JS is the answer.


The Super-heroic AngularJS

To put it simply, AngularJS is a JavaScript framework backed up by our very own glorious Google that can let you do really cool things on your user’s browser without having to fetch data from your server. HTML lets you create static pages and is not designed for dynamic views. JavaScript was created to make those static pages more interactive. Here’s some more good-to-know info about AngularJS -

Why The AngularJS And Drupal Combination Will Make You Rethink Your Web Strategy
•    AngularJS is an extremely lightweight and concise framework that is profoundly extensible and lets you do some seriously fascinating things with your website.
•    Web developers and designers love HTML for its simplicity, clarity and intuitivism in its code structure. AngularJS extends HTML to define user interfaces, hence letting you build interactive web applications that are highly functional and hard to break.
•    You can create reusable components with AngularJS code.
•    Its client-side nature keeps those cyber-attacks at bay as any injected data cannot go close to your server.
•    AngularJS implements the MVC (Model-View-Controller) framework which allows for faster development process, multiple views, asynchronous technique, SEO friendly development and many more valuable features.
•    Unit testing is a breeze with AngularJS as it comes setup with it making it fast and easy for developers to test their code.
•    With a mind-blowing functionality like two-way data binding, user actions can immediately trigger application objects and vice-versa, thereby proving to be an extremely interactive framework.

Drupal Meets AngularJS

When an impressive front-end framework meets a super-powerful backend content management framework, there ought to be fireworks! Drupal is a flexible and scalable enterprise-class CMS which can be used to develop powerful web applications that can be designed for small to large scale businesses. Being an open-source CMS, it is highly customizable and can be tailored to fit any business requirements. You can only imagine the extensibility and customizability the combination of the two open- source frameworks, Drupal and AngularJS, can provide. Two is better than one, they say. When put together, let’s look at the goodness Drupal AngularJS can provide.

Power Packed Performance

Drupal on its own can perform effectively even when dumped with heaps of functionality. However, when you offload some of the business logic to the client-side AngularJS, you are remarkably unburdening your Drupal backend. Using AngularJS for theming or presentation and Drupal as the backend data source can substantially boost the performance of your Drupal website. The powerful combination of headless Drupal with Angular Js will allow you to move display logic to the client-side and streamline your backend, thus resulting in a super speedy site.

Reduced Coding for developers

Creating a basic working Drupal website does not take a lot of coding or development work. AngularJS can make these basic Drupal websites more interactive, rich and dynamic without a lot of complex coding. AngularJS uses directives, HTML to define user interfaces, plain objects for data models, etc. which sums up to writing much lesser code. Since it uses HTML to define user interface codes, it makes it takes lesser efforts by the developers to build interactive pages when compared to writing complete Javascript codes.

Isolation of logic

AngularJS implements the MVC framework which lets you separate business, controller and model logic in your web application. Isolating application logic from user interface will result in a cleaner, clearer and non-redundant code structure. Should your most crucial developer leave you mid-way, with this architecture, it won’t be hard for a new one to catch up. This also helps remove a lot of backend logic from Drupal, thereby making it more light-weight and efficient.

Security – Raise the bar

With Drupal you can be assured of your website’s security if you have followed the security protocols diligently. In the huge Drupal community, it is hard to have a security flaw go un-noticed and un-patched thereafter. Headless Drupal with AngularJS adds that extra layer of security to Drupal websites. Since the browser communicates with AngularJS, there’s no direct server-side interaction. This makes it difficult for hackers to inject malicious code into databases.

Sep 21 2020
Sep 21

There are two kinds of instances that we never forget in our lives; one is when we hysterically cry, and the other is when we hysterically laugh. The other moments in our lives are bound to lose their place in our memories, but not these. Have you ever forgotten a time when you laughed like crazy or cried like a baby? You know I am right. 

These moments are not necessarily associated with your personal lives, these can be related to the professional and commercial experiences you witness at any point. Now, I would not be talking about the upsetting consumer encounters you might have had, since I do not want to dampen your day. Instead, I will be talking about the kind of experiences that make you go all smiles.

We smile because we are happy or smile because someone has cracked a funny joke. Jokes do not have to be limited to social gatherings and Whatsapp messages; they can transcend to the world of web design. Yes, you read it right. Today, jokes, or shall I say humour has become an integral part of web design. Humour has the potential of taking an ordinary website and making it extraordinary. 

If you don’t believe me, continue reading, and by the time you will finish, I am sure your opinion would have changed.

The Importance of Humour 

Humour is an element of our lives that makes it brighter and livelier. People look forward to reading jokes, making jokes and laughing at their hilarity. You know you like those PJs as well, they might not make any sense, but they can be funny. Stepping a little up from the PJs, and moving on to web design. Humour has become extremely important in the world of web designers. It can make or break their designs, it is that powerful. Let us understand why.

If someone is funny and quirky, you will instantly like him or may even be drawn to his or her funniness. Am I right? The same is true for web designs. A user experience that is instilled with enlightening as well as humorous elements is going to be a hit. Humour has the potential of contributing to sales by highlighting a product or service’s attractiveness and making you drawn to them. It does so by giving them a genuine personality. Don Norman believes the same and has vocalised his beliefs in his book, Emotional Design - Why We Love (or Hate) Everyday Things.

After a customer is lured in, you have to keep in mind his needs in order to gain his loyalty. These needs start with the functionality of a product, then move onto its reliability, after becoming satiated with the usability of the same, these needs are finally placated with the pleasure factor. If a product is pleasurable to the user, only then can it be deemed as a success. And you must know that pleasure and humour are the best of friends.

The image shows a pyramid with four segments, pleasure, usable, reliable and functional, describing the hierarchy of needs.Aaron Walter's pyramid of emotional design | Source: Treehouse

Humour is bound to create positive emotional stimuli in all of us. When a user experiences such a response from a web design, there is a high likelihood that he will develop a sense of trust in the same. And that is the reason why humour is important in web designs and should be implemented, but with caution. Read more about the link between decision science and web design to understand how to make design decisions. 

The Subjectivity of Humour 

Humour is a kind of quality that is possessed by everyone, yet everyone has a different notion of it. What may be funny to me, can be offensive for you and nobody can say that our notions about it are wrong. We just have a different perspective.

So, the web designers have to keep this in mind, you have to understand your audience before committing to any humorous elements you want in your designs. 

A web developer has to first comprehend the subjectivity of humour. Yes, every joke is not going to be funny for everyone, but it can be funny for the majority of the people and that should be the ultimate aim. Your jokes need to be understood by most people visiting your site, even if you are using innuendos, they should not be indecipherable. 

The image shows a cartoon with a confused expression, to symbolise the subjectivity of humour in web design.The confused expression is not the reaction that the web developer aims for.

Zeroing in on your target audience will help a great deal in this feat. To help you catch my drift, I will tell you something that you must already know. And that is the fact that the eastern and western cultures are vastly different. So, the kind of jokes these two people find funny are also different. You can joke about celibacy in the west and people would laugh, but if you joke about celibacy in the east, where the Buddhist Monks preach it, you will not get the same reaction.

So, identifying your target audience is crucial, as it would decide whether your humour would hold a punch or not. The subjectivity, the cultural intonation and the contextual meaning of a joke are to be mastered before using it into your designs. 

The image shows a stick figure with a sombre expression, depicting the importance of contextualisation in humour.Source: 9GAG

Here the second phrase, when used in different contexts has very different meanings, and this kind of contextual differences cannot happen in your web design.

The Categories of Humour 

Humour is something that is funny, something that makes us smile, laugh and roll on the floor laughing or ROFL, if you please. I like to believe that I have a great sense of humour, I laugh at things that are not even worth laughing at and a person with that kind of humour must know everything about it, right? But that isn’t the case with me, I did not know that there were seven categories of humour. Did you? For me funniness, satire and irony all fall into the same category, being one and only one. 

So, getting to know the seven varying diversifications of humour in web designs was quite enlightening for me. I hope it is the same way for you.

Comparing with comedy 

Humour by comparison is the most commonly used way of making boring elements on a website become interesting and refreshing. Going through a product’s specifications becomes a chore, if you do not find something funny in the never ending description. Making comparisons that are not only funny, but also serve the purpose of highlighting what the web designer wants is a tactic that could never go wrong.

Personifying with cartoons 

Do you remember the early 2000s? Did you use Microsoft Office then? If you did, you must remember Clippit or Clippy. It was a cartoon paper clip that served as an office assistant. I thought it was cute, funny and somewhat useful; however my belief was not very popular. The point I am trying to make here is that the addition of an animated personification can add character to your web content, giving the customer a break from the monotony of the content. A mascot is a great way to do just that.

The image shows an animated paperclip used in web design as humour.Source: Wikipedia 

Exaggerating with hilarity 

With exaggeration, we take a normal incident, magnify it in our minds, and relay the same with a lot of more severeness than it actually had. It is like saying that you were attacked by a mammoth sized dog, when in actuality a pug barked at you. If you know something is being exaggerated, then it becomes quite hilarious. 

Pun with fun 

Pun is something we are all familiar with, and enjoy a great deal. So, why not use it to make your website all the more interesting. The thing about the usage of pun is that it is quite tricky. It can very easily go into the territory of offensive, if it is not used properly. So, tread lightly when using it in your web design.

Silliness with funniness

Have you ever watched the American TV show Friends? If you have, what do you think of Phoebe? Do you find her funny? I personally do, she is the kind of funny that is silly, yet hilarious. You would never be offended by her character. So, taking inspiration from Phoebe’s hilarity and silliness and implementing it into your website could be a genius stroke. 

Surprise with laughs

Getting pranked is the best kind of surprise, at least to me it is. Being ambushed by a horrifying ghost in a funny video is bound to make you laugh until you cry with your heart racing at 100 km an hour. You must have experienced it sometime. Now, you tell me would an unexpected element of humour not be appreciated in a webpage that could otherwise be boring?

Jesting over the Easter Egg

As finding the easter egg amidst bunnies is no easy task, the same way the humour denoting with the same name is also not easy to find. This one is hidden and that is why it is a gem, when you finally get it. Web developers have been increasingly making use of easter eggs as an element of humour in their web designs and the users have been appreciating the hunt. Have you ever searched the meaning of the word askew on Google? Before you get on to the meaning, you would find something that would give you a clue as to the literal meaning of the word. Your beloved Google would become skewed itself. Is this not clever?

The image shows Google's skewed search page.The skewed screen on your computer when searching the term askew.

An amalgamation of all of these with subtly can make your website’s experience a memorable one for every user to come.

The Implementation of Humour in Web Design 

The thing to remember about humour is that if you have to force it, it is bound to lose its intensity over the audience and your joke would fall flat. Under no circumstances, do we want that. Humour has to seem spontaneous and natural, only then can we enjoy its full magnitude. 

To help you do the same, I will tell you some of the insider secrets of web developers and the way they make humour work for them.

Introducing yourself with a flair

Every website is going to have an About Us page, this is one area in a website that the content creator can create any way he wants to. So, if you want the customer to remember everything about you, you have to make yourself interesting enough to be remembered and humour helps in that. You can talk about history with light heartedness, you can talk about your struggles with humour rather than seriousness, and you can present your team in a fun and refreshing way. See the following example from Lessfilms website:

The image shows funny pictures of a company's team on their webpage.This one hit the mark with the introduction of its employees. The red guitar stole the show. | Source: Less Films

Making boring, yet crucial information interesting 

Webpages are supposed to have a lot of information and a lot of information can become quite boring to peruse through. Since the information has to be given to the user, what can be the solution here? The answer is simple, humour. Adding humour, in all of its categories can make your website content speak through and serve its intended purpose.

A web design with a green backdrop is shown with an ongoing chat on the side.A customised chatbot message. | Source: Lazy Gardener 

Covering up your mistakes

There are often times when your users face problems while surfing through the website. More times than not these problems are frustrating and annoying to the point that they think about going back and looking for something else entirely. Can this annoyance be overcome with humour? Let us see if it works for two of the most annoying things.

The 404 error 

When you get to know a page you were looking for does not exist anymore, you will become frustrated. Here a joke is bound to alleviate some of that. Look at the picture below, did it not make you smile just a tad bit?

A crying cartoon is depicted in the image with the 404 error often seen on websites.

Slow loading 

Apart from the page not found error, when a web page takes ages to load, that also becomes quite a nuisance for the user. There might be a genuine reason for the slow loading, but the problem would still be there, so what does the web developer do? You would use humour in a very subtle way to make the user wait a little longer and see what he had intended to.

A snail is shown in the picture to represent the slow loading process.

Narrating a story 

Sometimes storytelling becomes a necessary part of the web design. It is important to make your point come across in a simple, yet comprehensive manner at the same time making it relatable to the audience. Now, when you add a dose of funniness in your story, it would accentuate your point even more.

Creating a mascot 

A mascot is any object, human or otherwise that is bound to bring you luck. And web developers need all the luck they can get, like most of us. So, creating a website with a funny mascot that keeps popping up in regular intervals to let the users know whatever they want is a great way to make your website’s experience a little more eccentric than dull.

An animated boy is shown eating a burger as an innovative and funny web design..The cute kid with that appetising burger is enough to start a craving.

Baiting with humour 

You must be familiar with the term bait, it basically means to lure people in by enticing them with what you have. Have you ever read something like, “If your dog does this, here is what it means.” You might not even have a dog, but you will be inclined to know what the dog actually does. This is what bait means and it can increase the traffic on many websites.

An instruction is written in white on a blue background, often seen in webpages..If it were me hovering over the click button, I would certainly press it and find out what is inside.

The Avoidance of Humour 

Just knowing where and when to use humour is not sufficient, you should also know when to avoid it. Humour can only work its charm when it is used appropriately, incongruous use of humour can lead to devastating effects. You can’t be cracking jokes at a funeral, right? Right!

Here are three ways to avoid humour taking a toll on your website’s traffic.

Unnecessary implementation

You have to assess the right place and time of using comical aspects in your web design. Using comedy in a serious situation can have serious repercussions, one of which is a brutally harsh feedback from a customer and we do not want that. 

A lady can be seen covering a mouth in an oops reaction.

Seeing something like this on a retail website when your transaction failed and money got deducted from your account is bound to make the customer livid. So, to all web designers, do not go this route.


This one is as insulting as it is inappropriate, if you want your website to be user friendly, I would advise to stay away from confirmshaming. This is a form of humour that uses guilt to make the customer do its bidding and that is just wrong. Telling someone that they are fat and should join your 15-day detox program is not the right approach from any perspective. 

There is a white background with information and instructions for a task to be down by the user.This image is a prime example of insulting and goading a customer in clicking, since nobody would want to be unhealthy.

Making it a distraction 

Using humour in a way that it distracts the customer from what you and your website is all about is probably not the aim. So, when you use comedic elements in your design, try to ensure that it is clearly understood by all the audiences or at least your target audience and it aligns with your website’s purpose. You do not want to leave any room for misinterpretation. This is because if a product is misinterpreted and the consumer does not get what he thought he would, he is definitely going to regard you as a liar.

The Backlash of Humour 

After telling you the ways to avoid humour getting in the way of your success, I want to tell you a story about the negative repercussions of the wrong kind of humour.

Pepsi is a world renowned beverage company, second most successful in the world in its arena. Pepsi is also famous for creating inspiring and unique ad campaigns. They are usually a hit, but their 2019 campaign missed its mark by a long shot. The only reason was the fact that they had taken a serious situation and made light of it. 

[embedded content]

As you can see in the video, a bottle of Pepsi was all it took to restore peace in the world. Do you also see the bizarreness in this idea? On top of this, the stark resemblance to the Black Lives Matter campaign did all the more damage to the company, the tweets are proof that. Pepsi had to retract the ad and issue a public apology. 

Therefore, it is advisable to avoid making humorous content on serious topics than making it and apologise later. Although it was a video commercial, the implication will be the same for website design as well. Nobody will tolerate humour on a subject they are sensitive about. The fine between humour and offensiveness has to be made very clear before implementing humour in your designs. Otherwise the backlash is going to be too brutal to bear. Take a look at how diverse design teams can help make better design decisions.

The Bottom Line 

Using humour to make your website’s experience more enjoyable has indeed become a trend; however, content creators and web developers have to understand that humour can just as easily turn deleterious as easily it can turn meritorious. 

Humour in web design is like a flaming ball of fire, the appropriate usage can make it as powerful as Goku’s dragon balls, and inappropriately used humour can turn your design into ashes; metaphorically speaking of course. You have to have a balance, do not go overboard and do not use it so little so that it becomes non-existent. When you attain that balance, your web design would become one to watch out for, trust me.


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