Feb 05 2020
Feb 05

ADA Compliance with Web Content Accessibility Guidelines has not traditionally been a top-of-mind consideration for the writers, editors, and subject matter experts who populate websites with content. Then again, the same can be said for developers, designers, site architects, and everyone involved in creating and maintaining websites.

That’s changing quickly as expectations for online experiences that are accessible for people of all abilities are emerging as the new normal. More so than ever before, organizations that cut corners or lack a sense of urgency to ensure that their websites are compliant with WCAG 2.1 are at risk for legal action and all sorts of possible setbacks. 

So let’s take a quick look at a few of the key issues that content editors need to keep in mind to ensure that websites are ADA accessibility compliant and aligned with the big picture of what may be required in 2020.

Register NOW for a FREE Webinar: Web Accessibility for Content Editors: What You Need to Know Now

 

Page Titles

Paying attention to page titles is important for a lot of reasons. The page title appears at the top of the screen and it’s the first thing that a visually impaired person hears from the screen reader when a page is loaded. As such, the page title should be accurate and informative, additionally every page on the site needs to have a unique title. 

Beyond accessibility considerations, the page title is also what appears in search results, and that’s, of course, a huge factor in search engine optimization (SEO). Good user experience (UX) is yet another reason to apply best practices to the page titles on a site. When users have multiple tabs open, a distinct, descriptive title helps with efficient navigation among multiple tabs.

Headings

As is the case with page titles, there are big ancillary benefits to an ADA compliant hierarchy for headings.

The primary issue to keep in mind concerning headings is that people who rely on screen readers, often navigate a page by scanning headings before determining what they want to read -- just as sighted users do. HTML coding for headings in the right descending order is required for screen readers to effectively interpret the content structure and this means logically structuring content headings and the content under them within the <h1> to <h6> page hierarchy. Simply bolding text or switching up font sizes should not stand in as headings.

Button Text and CTAs

Compliance issues concerning calls to action are possibly the most often overlooked or misunderstood component of content editing. It’s all too common for a page to have multiple CTAs with the same generic text such as: “LEARN MORE” or “CLICK HERE.”  To understand why this practice is not accessibility compliant, imagine a visually impaired person who is trying to navigate a page with a screen reader, and the frustrations that they would have in trying to efficiently navigate a page that has CTAs or buttons that all have the same text.

Accessible CTA text needs to make sense when it stands alone. Instead of “LEARN MORE,” for example, an accessible link would read, “Longhorn 2020 football schedule,” or  “10 most kid friendly dog breeds.” 

Much More to Learn!

Content editors play a distinct role in the creation and maintenance of an accessible site. 

WCAG 2.1 provides clear accessibility guidelines that are not difficult to implement. They just need to be learned, remain top of mind, and get built into the process flow.

Looking for a deeper dive to fast track your knowledge and know-how of accessible content editing? 

Join Promet’s Denise Erazmus and Mindy League for a free webinar:  Web Accessibility for Content Editors: What You Need to Know Now, where you will learn:

  • 7 things for content editors to keep in mind to ensure ADA compliance
  • The red flags that tend to spark accessibility lawsuits and how to avoid them
  • How to educate your team concerning both the WHY and the HOW of ADA Accessibility Compliant content editing

Tuesday, March 3, 12-1 p.m. Central

Register NOW!
 

Feb 05 2020
Feb 05

What happens when you have a connection that isn't working, but you have a mission-critical document that you need to collaborate on with others around the world? The problem of peer-to-peer collaboration in an offline environment is becoming an increasingly pressing issue for editorial organizations and enterprises. As we continue to work on documents together on flights, trains, and buses, offline-first shared editing is now a base-level requirement rather than a pipe dream.

Yjs, an open-source framework for real-time collaboration, integrates gracefully with IndexedDB, the local offline-first database available in browsers, to help developers easily implement offline shared editing for their organization's needs. Paired in turn with other technologies like WebRTC, a peer-to-peer communication protocol, and Yjs connectors, a graceful architecture is possible that not only enables offline shared editing for a variety of use cases beyond textual content but also makes the developer experience as straightforward as possible.

In this technical and topical deep dive into how Yjs and IndexedDB make offline shared editing possible, join Kevin Jahns (creator of Yjs and Real-Time Collaboration Systems Lead at Tag1), Fabian Franz (Senior Technical Architect and Performance Lead at Tag1), Michael Meyers (Managing Editor at Tag1), and your host Preston So (Editor in Chief at Tag1 and author of Decoupled Drupal in Practice) for a Tag1 Team Talks episode you don't want to miss about how to enable offline shared editing for web applications and even CMSs like Drupal.

[embedded content]

Feb 05 2020
Feb 05

Authored by AmyJune Hineline, Community Ambassador at Kanopi Studios, with support of the Community Summit Leads 

DrupalCon is our annual stomping ground... Sure, local and regional camps and meetups are fun, but where else can more than 3,000 Drupalists get together and reunite, socialize, share knowledge, set goals and move the Drupal project forward for a whole week?

Feb 04 2020
Feb 04

Drupal 8 Live migration YouTube series image for JeffGeerling.com

This website is currently (as of February 2020) running on Drupal 7. Drupal 8 was released in November 2015—half a decade ago. Drupal 7 support has been extremely long-lived, as it will not be end-of-life'd until November 2021. As with all software, once it is out of date, and security patches are no longer provided, it becomes harder to ensure the software is secure, much less running well on the latest servers and PHP versions!

Therefore, I decided it was time to start migrating JeffGeerling.com to Drupal 8. And I figured instead of fumbling through the process all by myself, and maybe posting a couple blog posts about the process at the end, I'd adopt a new mantra: Let's fail together! (Just kidding—sorta.)

So for this migration, I'm going to be live-streaming the entire process, end-to-end! Every Tuesday (starting today, February 4, 2020), at 10 a.m. US Central time (4 p.m. UTC), I will be live streaming part of the migration process for one hour. The videos will all be visible after the fact on my YouTube account.

There are a few caveats to get out of the way going into this project:

  • This is the first time doing any Drupal 8 migration work since Drupal 8.2, in 2016. A lot has changed in Drupal 8 since then, so I'll be learning some of this as I go—I figure some people might enjoy seeing how I learn new processes and techniques (hint: lots of Google).
  • This is the first Drupal 8 work I've worked on since upgrading the theme of the Raspberry Pi Dramble website in late 2018, so my Drupal 8 is a little rusty as well.
  • This is the first time I've ever tried live-streaming, and I'm doing it on a four year old 13" MacBook Pro; the CPU might not be up to the task at times, but we'll see how it holds up!

If you want to follow along as it happens, please subscribe to my YouTube channel and sign up for notifications—that way YouTube can notify you when a live stream is about to begin (I will try to remember to have them pre-scheduled every Tuesday). Otherwise, I will also be embedding all the live streams after the fact on this blog post (so check back again later to see them if you miss a week!).

Supporting this project

I'm not being paid or sponsored for any of the work involved in producing these videos; if you like them, and have the ability, please consider sponsoring my work on one of the following platforms:

If I get enough, maybe I can afford a faster computer and stream with a better frame rate :-)

Episode 1 - Setting up a new Drupal project, installing Drupal the first time

Streamed on: February 4, 2020

[embedded content]

Summary: I created a new GitHub repository called jeffgeerling-com, then I created a new Drupal 8 codebase. I added a .gitignore file since Drupal's composer template doesn't currently ship with one, and made sure to not add the vendor directory or other Composer-managed files to the Git codebase. I committed all the code, and pushed it to the master branch of the jeffgeerling-com repository on GitHub. Then I created a simple Docker image for local development, brought up a local environment using Docker Compose (with a Drupal/Apache/PHP container and a MySQL container), and finally installed Drupal using drush site:install. I logged in and verified the site is working correctly (if a bit sparse—I installed the minimal profile!).

Resources:

Episode 2 - Getting the Configuration and Content Migration Ready

Streamed on: February 11, 2020

[embedded content]

Summary: I downloaded the Upgrade Status module and went through which modules did or did not have upgrade paths for Drupal 8. I found that most modules I use are now in Drupal core, and most of the contributed modules I use have a stable Drupal 8 version available. There are a couple modules that might need some special tweaks to make sure I don't lose data—like making sure Redirects are migrated correctly from Drupal 7 to Drupal 8—but most things should just work in Drupal 8 without much effort. I then read through the Upgrading from Drupal 6 or 7 to Drupal 8 documentation guide, and chose to use Drush for the migration. So I installed the appropriate modules, and tried connecting my site to the legacy Drupal 7 database by adding a database to the $databases array in the Drupal 8 site's settings.php file. Unfortunately, I was unable to get the Drupal 8 site to see the Drupal 7 database before the episode's time ran out, so we'll get that working in the next episode, and run the drush migrate-upgrade command for the first time!

Resources:

Episode 3 - Fixing bugs, exporting configuration, and running the first migrations

Streamed on: February 18, 2020

[embedded content]

Summary: After figuring out we had to use docker.for.mac.localhost as the hostname to connect our new Drupal 8 site to the old Drupal 7 site's MySQL database, we were able to run the drush migrate-upgrade command! But then it failed, because Drush 10 is currently incompatible with migrate-upgrade. So we downgraded to Drush 9, then got migrate-upgrade to work! Once it was done, we were able to see all the available Drupal 7 to 8 migrations, and run them, but we ran into a few errors. We used these instructions to export the site's configuration to the codebase, and pushed the changes to the site's git repository. Then we reinstalled the site from scratch, to prove the configuration export and import worked well, and ran the migrations again, running into a new error, "Field discovery failed for Drupal core version 7," which we'll debug on next week's episode!

Episode 4 - Setting up CI with GitHub Actions and Overcoming Field Migration Issues

Streamed on: February 25, 2020

[embedded content]

Summary: We started off by setting up GitHub Actions for some basic Continuous Integration (CI) tests for Drupal, but quickly ran into a wall as GitHub experienced an outage and the Issue queue and Actions stopped working. So we switched back over to the migrations and found that all the issues like Attempt to create a field storage field_project_images with no type. meant that a field-related module was not enabled in Drupal 8. So we enabled the right modules (e.g. Date, Link, Taxonomy, Comment, Options, etc.), and ran the migrate-upgrade command again... which started generating duplicate migration entities, named like upgrade_upgrade_upgrade_d7_thing.yml. So to prevent confusion, I deleted all migration configuration, reinstalled the site, re-exported the configuration, then ran migrate-upgrade yet again. It now created the migration entities with a single upgrade_ prefix, which is much nicer to manage. I kicked off the migrations, and it got further along, and started migrating images (which took some time, as it had to download each image, save it to the Docker shared filesystem (which is slow) and create the file entity in the database (which is slow). So we cut off the episode there and will get back into running the migration again next week!

Episode 5 - Migrations (mostly) working, setting up CI on GitHub Actions

Streamed on: March 3, 2020

[embedded content]

Summary: We installed a few new modules and re-ran a few migrations to try to get content to work correctly in the Drupal 8 site after it was migrated. GitHub was actually working today, so we were able to work on the CI process to install the site from configuration on every commit, and we now have some content ready for theming next week! Tune in next week to see how we start upgrading the theme from Drupal 7 to 8 with Twig, and see if Jeff could ever figure out what was causing the Drupal install to fail on GitHub Actions!

Resources:

Episode 6 - Setting up admin theme and jeffgeerling theme

Streamed on: March 10, 2020

[embedded content]

Summary: We set up an admin theme after discussing Seven and Claro. We added the Admin Toolbar module for a nicer admin UI experience. Then we copied the 'jeffgeerling' theme over from my Drupal 7 site to Drupal 8, and started updating the theme components like the .info.yml and CSS libraries to work with Drupal 8! GitHub Actions is running now, so every time we push a new commit it is tested in a CI environment, yay!

Resources:

Episode 7 - TBD

Streaming on: March 17, 2020

[embedded content]

Summary: TBD.

Feb 04 2020
Feb 04

The Central NJ Drupal Group hosts one of my favorite Drupal camps in the northeast, and this year’s DrupalCamp NJ was no exception.

Location, Location, Location

Princeton University uses Drupal heavily, and gives back to the community by hosting the monthly Web Developers Central NJ Meetup and the annual camp.

This year’s camp was held in a new location, which will give us room to grow in the future. It is also closer to Princeton’s beautiful main campus.

I have a personal connection to the new venue. The three buildings we used are very close to Fine Hall, where I spent five years earning my Ph.D. (That is the “Looking Back” part of my title.) I know I am at my alma mater when I see this color scheme:

conference tables with orange table cloths and black chairs

Another thing I like about the venue is that I can stay in a reasonably priced hotel on the not-so-beautiful Route 1, then walk to campus along the D&R Canal. A two-mile walk is a great way to start the day, and it makes my new FitBit so happy!

Training: The Great Gatsby

Last year at BADCamp, I helped Ryan Bateman with an all-day training session on using Gatsby and Drupal’s Umami installation profile to create a decoupled site. On Thursday, I was the primary presenter for this training, and Adam Bergstein generously offered to assist.

I wanted to rearrange the slides, and for technical reasons I had a lot of work to do updating the presentation to work with Drupal 8.8. I think the session went well, but I also have ideas for doing a better job the next time I have a chance to present it.

Sessions and BoFs and Migrate API, oh my!

Handling HTML Markup with Drupal’s Migrate API

During the first session slot, I talked about wrangling HTML markup with regular expressions vs. proper parsing and some work that Marco Villegas and I did to make proper parsing easier in the context of Drupal’s Migrate API. The session page has a link to the recording and the slides. I had a pretty good-sized audience, and they asked good questions.

room showing about 25 training attendees smiling

The first time I presented this material was last year at New England Drupal Camp. That was extra fun, since Marco and I gave the presentation together. He lives in South America, so that was the first time that we met in person.

On the plus side, I got some help from Lindsey Gemmill, so my slides for this session look great. This is the first presentation using reveal.js that has Hook 42 branding, and I think we will see a lot more of these in the future!

For the rest of the day, I went to a mix of regular and Birds of a Feather (BoF) sessions. I did my best to take notes at all of these, and I save these to my Conference Notes repository on GitLab.

Using Machine Learning to Help with Daily Workflows

First was a session on Machine Learning (ML). Danny Teng and Neha Bhomia gave some background on ML.

Danny Teng and Neha Bhomia standing in front of presentation title screen

Then they talked about two Drupal modules.

The first is Drupal Rekognition, which will get alt text for images using the AWS Rekognition service. Thanks to my colorful hat, I was the subject of a live demo:

Drupal backend displaying ai generated alt text for picture of me at camp

It is nice to know that AWS Rekog-nizes me as a Person, but what is this about Home Decor?

The second module is still in development. Its goal is to recognize malicious IP addresses. In order to do this, they need to train their ML model. They already have a database of GET requests from several large Drupal sites. They need help identifying which requests are legitimate. For example, there are several legitimate bots (search engines, uptime monitoring services) as well as actual people. Then there are the 404 errors because someone is trying to access wp-login.php on a Drupal site.

If you would like to help train the model, then contact [email protected].

All things HAX

After lunch, I went to a BoF on Headless Authoring eXperience (HAX). I had not heard of this before, and the description got me curious. I have still not had a chance to try it out, but it seems to be a system for editing web components. I will have to check with the front-end specialists at Hook 42 to see whether they are interested. From the description of the session, I thought it might be a sort of content editor that works through the front end of decoupled Drupal sites; maybe it also does that.

Securing Drupal’s Auto-Update Infrastructure

In an attempt to combat the post-lunch blahs, the organizers scheduled a coffee break after the first afternoon session. After that, I went to a BoF that was basically a working session among five members of the Drupal Security Team.

There is an initiative to enable automatic updates of Drupal sites. Most of the work so far is available in the contrib Automatic Updates module. The goal is to make it easier to keep a Drupal site up to date, especially when a security update is released.

This BoF was about the infrastructure behind that initiative. The nightmare scenario is that someone might hack the automatic-update process. Then, instead of making sites more secure by keeping them up to date, the system would install hacked code on every site that was set up for automatic updates.

To avoid this, the Security Team is working on protocols and infrastructure to prevent such hacking. At this BoF, the team discussed adopting The Update Framework (TUF) as the basis for Drupal’s system of automatic updates. This is a standard already adopted by many large companies, and the protocol is very similar to what the Security Team already designed on its own.

Progressively Decoupled Drupal, for everyone!

For my last session, I chose one on web components and HAX, a follow-up to the BoF I attended after lunch.

The four presenters made the case for concentrating front-end development on web components.

  • This technology has been under development for years but has only recently been adopted by all the major browsers.
  • You can use the components that you develop in your current theme, without the headaches of switching to a fully decoupled site all at once.
  • When you are ready to decouple, you will be able to use those components in whichever front-end framework you choose.
  • You can also use your web components on completely different systems: WordPress, Gatsby, Jekyll, etc.
  • Since the web component lives in its own repository, you can update it in one place and see the effect in hundreds of sites that use the component.

I am not sure exactly how that last point works. Updating to the new component has to be automatic, but not too automatic, since there is a danger that the new version of a web component will break existing sites.

Mentoring & Collaboration

The last day of the camp was devoted to contributing back to Drupal.

I started the day by sitting in on the workshop for first-time contributors, in case AmyJune Hineline, the presenter, had technical questions that a back-end developer and core contributor could answer.

I spent the rest of the day reviewing two issues.

The first issue is one that I have been following for some time: Drupal core should inform the user of the security coverage for the site’s installed minor version including final 8.x LTS releases. The problem is that, with Drupal 9 around the corner, we want to make sure that the site status report advises site administrators to upgrade to that and not to a non-existent version 8.10 when the time comes. The other problem is that the existing code in the core Update module is a bit of a mess, so working with it is a challenge.

Ted Bowman has been the primary developer for this issue. I have taken on the reviewer role, which means:

  • I should not contribute patches myself, and
  • My aim is to help Ted and others get their patches to a point where the core committers like what they see.

The second issue was Add more strict checking of hook_update_last_removed() and better explanation. This issue was tagged for usability review, in order to get some advice on the wording of a new error message. As a member of the Drupal Usability team, I often do such reviews, either on my own or at one of our weekly meetings. I am not an expert at UX design in general, but I am pretty good at word-smithing, and I think I was able to suggest an improvement for this issue.

I’ll Be Back!

With a full three-day schedule, DrupalCamp NJ is one of my favorite camps, up there with BADCamp and MidCamp. Since I was giving a training session, this was the first year I participated in all three days.

I got to spend time with some friends like Adam Bergstein and AmyJune Hineline, and I met several new (to me) people: the people who attended my training and my session, and @mixologic, who I have previously only known through issues on drupal.org and on Slack.

I also had a chance to revisit the town and the campus where I spent five years, which brought back some fond (and amusing) memories.

I expect that DrupalCamp NJ will also be my first Drupal camp of 2021.

Feb 04 2020
Feb 04

Reference issue on Drupal.org: https://www.drupal.org/project/diversity/issues/3067603

The Drupal community aims to be a welcoming, safe, respectful and inclusive space for all participants.  The language we use in our day-to-day interactions with each other is an important factor which contributes to creating these conditions.

Language is ever-evolving, nuanced and subjective.  Words and phrases that were acceptable and in common use only 50 years ago may no longer be appropriate today.  This can be particularly challenging when English is not your first language, but even for those who are native speakers, changing our habits takes awareness and practice.

As we become increasingly aware of gender identities which don’t fit into the binary categories of ‘man’ or ‘woman,’ we’re bumping into an issue: Many languages were created with the gender binary in mind.

People who are transgender, non-binary and gender non-conforming experience frequent misgendering (referring to them using a word, especially a pronoun or form of address, that does not correctly reflect the gender with which they identify), which can be devastating to their sense of safety, self-esteem and mental health.  

The language we use in the Drupal community is a way of signalling to everybody “you belong here” or conversely “you don’t belong here.”  Everybody in our community should expect to hear the former, and not the latter.

The phrase ‘you guys’ or ‘hey guys’ can be a strong “you don’t belong here” signal to members of our community, because culturally this term is used in reference to those who identify as men.  We know this. People in our community have told us this.  

We, as a community, have an opportunity to change this.  

We have the opportunity to ensure that everybody in our community feels that “I belong here.”  

We can do this by bringing awareness to this phrase, and making a small change to the way we use language to include, rather than exclude, members of our community.

There are a lot of different phrases you could choose to use instead:

  • Folks
  • People
  • Peeps
  • Y’all
  • Humans
  • They/Them
  • Everyone/Everybody

We won’t be perfect every time, it will feel clunky at first, and we might make mistakes.  

That’s normal when we’re learning to change a habit. 

What is important is that we try to raise our collective and personal awareness of how the language we use can impact others.   

When it becomes clear that some aspect of our language is harming people in our community, it is our responsibility to do all we can to address this in a positive way, and change the way we communicate so that everybody in our community feels that they belong here.

Resources:

https://www.hotjar.com/blog/gender-inclusive-language-workplace

https://www.theatlantic.com/family/archive/2018/08/guys-gender-neutral/5...

https://www.abc.net.au/life/is-it-time-to-stop-saying-you-guys-at-work/1...

https://www.dictionary.com/e/you-guys/

https://brainsoverblonde.com/you-guys/

https://dev.to/kmelve/the-problem-with-you-guys-51h7

https://atlascorps.org/gender-inclusive-language-tips-respect-diversity/

https://www.vox.com/2015/6/11/8761227/you-guys-sexism-language

Feb 04 2020
Feb 04

Meta tags are often underrated. Sure, they are not visible on your page up front but they are those hidden ninjas that can elevate your SEO game. These modest snippets of text that describe what your page is about can turn out to be very useful. The Drupal 8 Metatag module helps site builders to dynamically create and manage these meta tags for each of their web pages through an interactive admin interface (and no code!).

With the Drupal 8 Metatag module, you can not only provide structured metadata about a web page but can also customize meta tag elements. Meta elements are tags used in HTML or XHTML documents to provide structured metadata about a web page. They are part of a web page's head section. Multiple Meta elements with different attributes can be used on the same page. Lets learn more on improving SEO with the Metatag module. 

Setting-up the Drupal 8 Metatag Module

Meta elements can be used to specify page description, keywords and any other metadata not provided through the other head elements and attributes.You need to add  meta tags in the head section of your Drupal 8 pages for title, description, keywords, twitter card, facebook open-graph - to make your website SEO friendly. Download and install the module here.

With the Drupal Metatag module, we can configure the following -

  • Configuring Meta tags for home page(front page).
  • Configuring Meta tags for a Content type.
  • Configuring Meta tags for view pages.

1) Configuring Drupal 8 Meta tags for home page/front page.

After installing the module, you can edit global configurations at /admin/config/search/metatags and set the global configuration for the front page. Click on Edit to get into the details.

meta tag configuration                      Drupal 8 Metatag - Configuration for Front page

Enter Page title, Description, Abstract, and Keywords.

meta tag config module              Drupal 8 Metatag - Configuration for Front page

Page Title

This snippet is not only useful to search engines but also to your users. It appears in the title bar of your web page and should not exceed 55 characters. It also acts as a title for when your web page is bookmarked.


Description:

Enter a brief description of your website. Make sure that the description does not exceed 150 characters because search engines won't display more than that on a results page. If you don't have either field filled out, Google will decide what to display without any input from you. It can be very helpful to write up a snappy description for your content here.

Abstract

Enter a brief Abstract (Optional). Again, keep it to fewer than 150 characters but instead of something snappy, try to be as plainly descriptive as possible.

Keywords

Enter a comma separated list of keywords related to your website.

Advanced Settings and Custom Meta tags

There are some important things here that were previously handled by code. 

Drupal 8 Metatag - Advanced Settings             Drupal 8 Metatag - Advanced Settings

Robots

Normally, if you want to block or allow search engines from indexing a page or disallow search engines to display cached copies or descriptions of your page, you would edit the site-wide Robots.txt file. Here, you can control all of it and more with the Robots meta tag by checking/unchecking the various indexing options it provides.

News Keywords

This Meta tag is exclusively used by Google News that takes in comma-separated keywords as inputs. 

Rights

Any details about a copyright or trademarks that you might have, should go here.


Image

This one is also relatively new and can be handy for telling social networks which image they should use with a post.

Canonical URL

Canonical URLs are very useful for dealing with duplicate content issues. This is something that is often a problem on e-commerce sites where product listings are duplicated on multiple pages. Metatag does a good job of handling this by default.

Shortlink URL

This element acts as an alternative to link shorteners. In Drupal they usually come out looking something like this:

<link rel="shortlink" href="https://www.specbee.com/blogs/node/12" />

Original Source

This tag is also something that Google came up with, this time to help identify the original source of content. This one may be particularly useful for news sites, but can be safely ignored by most.
Save your settings.

2) Configuring Drupal 8 Meta tags for a Content type


Edit global configurations at  /admin/config/search/metatags, set the global configuration for Content. Click on Edit to get into the details. If you want to add different metatags for different content types, then click on the “Add default Meta tags” link on the top left corner of the page. Select the content type you wish to add metatag to and click on Save and configure.

Drupal Metatag - Configuration for Content types                    Drupal Metatag - Configuration for Content typesmeta tag ccongif for content type article      Drupal 8 Metatag - Configuration for Content type : Article

The content type will be listed in the Meta tags screen. The above screenshot shows the content type ‘Article’. Click on edit to add metatags.

Enter Page Title, Description, Abstract, and other necessary settings. Follow the same procedure as mentioned above in configuring metatags for the ‘front-page’.

3) Configuring Drupal 8 Meta tags for View pages


Enable “metatag: views” module which is a sub-module of the metatag module.

Drupal Metatag - Configuration for Views                  Drupal Metatag - Configuration for Views

Edit global configurations at /admin/config/search/metatags. Click on override to get into the details.
To add the meta tags in view go to the views edit screen and click on the meta tags link.

meta tag setting viewsmeta tag view

The above setting is the default setting for the view page.

Feb 03 2020
Feb 03

The Paragraph module allows, among other uses, to propose various and varied structured layouts according to the needs of a project, directly accessible and manageable by a content editor, without any particular administration rights.

One of the major drawbacks I have encountered with Paragraph, for the design of complex landing pages, is the impossibility to change the parent of a paragraph in the case of paragraphs (picto or image/text type, etc. for example) embedded in other paragraphs (container type for example, allowing to control the layout). And in this case it was necessary to delete and then redo the paragraph at the level of the correct parent to make structural modifications to the layout of this type of page (landing page, home page, etc.).

As a user of the Paragraph module for many years, I may not have read all the release notes of the module. And that's probably why I'm only now discovering that the Paragraph module now natively offers a drag and drop function that allows you to completely reorder the layout of paragraphs, whether or not they are nested in other paragraphs. In one click it is now possible to modify the parent of a paragraph.

And I just (re)-read the README of the module. This is probably something you don't do very often when you think you know a module well.

Drag & drop
-------------

The experimental widget offers a separate mode that allows to re-sort paragraphs
not just within the same level but it is also possible to change the hierarchy
and move paragraphs including their children around and into other paragraphs.

During drag & drop mode, paragraphs are also displayed as a summary only, which
results in a very compact display that makes it easier to move them around.

To use this, an additional library is necessary, which needs to be put in the
/libraries folder. Download from https://github.com/RubaXa/Sortable/releases,
make sure that the folder name is Sortable (with uppercase S) so that the path
to the javascript file is /libraries/Sortable/Sortable.min.js.

Use the version 1.10+ as it's tested and approved. Older versions may introduce
bugs with nested drag & drop functionality.

If the file exists, the feature will automatically be available.

So by installing the jQuery Sortable library as shown, this feature is enabled automatically. We then have a Drag and Drop action button in the Paragraph field itself.

Drag and drop

And once enabled all the paragraphs of the field switch to a Drag and Drop mode and this allows us to reorder at will all the paragraphs of the page and in particular to change their parent if necessary.

paragaphs in mode drag and drop

In conclusion, at each module update, remember to read the release note, but also to browse its README file, even briefly, and even for the modules you think you know well. This may save you from missing major and extremely useful new features for many months, as it could happen to me.

Edit: and since Drupal Core 8.8 and Paragraphs 8.x-1.11, it's not necessary anymore to install the Sortable library. It's available out of the box. 

Feb 03 2020
Feb 03

I've been working on a personal site that I've maintained since before I even got involved with Drupal. It's been iteratively migrated and upgraded from those early days on pmachine to its current iteration on Drupal 7. Obviously, I've been planning to upgrade it to the newest Drupal 8. All in all, this has gone pretty well, but as a big contributor to Layout Builder, I really wanted to use it on the site as much as possible. This hasn't gone anywhere close to how I would have liked. :-(

What's wrong with Layout Builder?

In a word: "nothing". Layout Builder does exactly what it says on the label and it does it well. At first, most of my issues were easily solved by building new field formatter plugins. I built a "Heading" formatter so that string data (like titles) could be turned into h1s or h2s via the user interface. I built an SVG formatter for displaying dates. I was rocking and rolling, and really enjoying the process. However, once I stopped to look critically at my ACTUAL layouts, I wasn't very happy. Layout Builder, like page_manager/panels/display_suite before it, is limited to the pre-existing layout plugins in the system. While the 33/66 & 66/33 layouts had been great for roughing in the site, they were falling desperately short of what I actually wanted. This left me with 3 options:

  1. Abandon Layout Builder in these cases, and use old school css to style my entities.
  2. Build custom layout plugins for each use case (and I have a bunch).
  3. Build a single custom layout plugin that could be configured however I might need situationally.

Initially, I did a lot of 1. As the site stands right now in my local development environment, this is the choice I've taken. It really rankles me. I KNEW I wasn't going to do 2. I've been down that road before, and while Layout Builder has a bunch of great options for limiting how users might experience a situation like that, I really didn't want to write and maintain that many new layouts and control when they are or aren't available.

Option 3:

While adopting option 1, I made myself familiar with css grid. Full disclosure, it doesn't work in IE 11. Also full disclosure... I couldn't care less. CSS grid is GREAT! I think most of us got into web development at the front end. At some point we've all been the one-stop-shop for everything we wanted to get done. So, as page layout tools have evolved, doing the sort of CSS I used to spend hours on has become a simpler and more elegant process. Elegant enough to attempt building a tool around. Now, I'm certainly not the first to do something like this. Both inside and outside of Drupal, other tools have and do exist. Merlinofchaos built a flexible layout plugin builder in Drupal 6/7 for panels, but things like flex & grid were a distant dream at that time and so the implementation was much more difficult, and had some interesting side effects for deeply nested regions. Having a new version of that idea built on new standards has been a personal goal for quite some time.

So with that small introduction, I give to you the Grid Layout module. This is a first pass at building the most basic version of what I wanted. Grid Layout provides a new configurable layout plugin with two form elements. These form elements conform to the grid-template-columns and the grid-template-areas css properties. By implementing these two properties as configuration, we can extrapolate how many layout regions to create, and we use the raw css to style the divs.

Stuff to do NOW!

I have form errors in my code, but they aren't showing, and even I got confused a couple times when I did the css wrong and it wouldn't submit. Clearly, something changed since the last time I did this, so I should square that away sooner rather than later. Patches welcome :-)

Also, there's very little validation on the user input... the danger is probably pretty mitigated by the fact that most sites wouldn't allow untrusted users to build layouts, but if you are doing that, consider this a warning.

Stuff to do LATER...

Currently, I'm writing the css directly into the inline styles of the divs. CSS grid is simple enough that I'm actually ok with doing this, however in the long term it might be nice to dynamically generate css library definitions for Drupal. It seems very doable, I just haven't double checked that all the on-screen events have some programatic API I can use for doing things like cleaning up libraries that are no longer used.

Better css grid spec integration... What I did here is SUPER basic. It communicates the possibilities I think, but grid can do a lot.

This thing could also use a really awesome UI. Initially I tried to build an ajax-y solution for this, and while I find Drupal's form ajax system super aggravating (a blog for another day perhaps), building a UI that communicated what we were ACTUALLY doing proved a much more difficult and abstract problem than I wanted to solve (seeing as how I do have a site I'm in the middle of upgrading).

And now... a quick demo:

Interested in any feedback you might have.

Feb 01 2020
Feb 01

Working with custom datetime elements in Drupal can sometimes be a bit tricky when you need a very specific date format to render. Even trickier can be date ranges that span multiple days. Add on top of that, date ranges that span over 2 different months and you might have your work cut out for you.

I am currently working on theming a Drupal 8 site that will feature events and event dates in a prominent way. In this article, I will create a recipe for how I am coding this within a Twig template. The context here is a landing page view where we show a listing of events with a basic date - month, day, and year.

The format I want to achieve in the end is:

  • Multi-Day Event - e.g. Jan 29 - 31 2020
  • Multi-Day Event (spanning over 2 different months) e.g. Jan 29 - Feb 03 2020
  • One Day Event - e.g. Jan 29 2020

We'll be using Twig's date formatter so if you need a worldwide date format, i.e. non-American, it will be a case of just re-arranging when we code up our custom formats. For example:

format_date('custom', 'M d Y') 

would be:

format_date('custom', 'd M Y') 

Getting started

For this project, I am using Drupal 8, a few core modules, and one contrib module. This article assumes the following knowledge:

  • Installing Drupal modules with Composer
  • Setting up a local development environment (I use Docksal)
  • Using Xdebug in your IDE (I use PHPStorm)
  • Knowledge of writing Twig code
  • Knowledge of basic Drupal 8 site building

Core

  • Drupal core 8.7.11
  • Datetime
  • Datetime Range

Contrib

  • Twig Xdebug (Optional)

As you can see, we have Datetime as well as Datetime Range which allows us to have a field formatter for event dates that span over multiple days. Once you're up and running, get twig_xdebug module with composer:

composer require drupal/twig_xdebug

Now, enable the modules:

drush en datetime datetime_range twig_xdebug -y

Create an event content type with date field

The next step is to create an event content type, Events, with a date field using Date range as the type. We don't need to be concerned with the display settings here as we will be doing our formatting in our Twig template.

The image above shows the datetime range formatter in the Drupal 8 UI. The image above shows the datetime range formatter in the Drupal 8 UI.

Create a custom view mode / events view

The next step is to create a custom view mode for our events landing page. I'll call it "Event List." That custom view modes are now a part of D8 core is a nice plus here. Now create a basic view for the event content type and set the format to Content > Event List, whereby we use the new view mode just created. For the view, we can choose either a page or block display depending on the use case.

Create a custom Twig template

The next step is to create a few event nodes so we can load up our new events list landing page and start to debug. The first thing is to make sure you have Twig template debugging enabled in your local development environment. Since we want a custom template for theming, I look at the twig template suggestion debugging output and see this:

<!-- FILE NAME SUGGESTIONS:
   * node--view--events--block-1.html.twig
   * node--view--events.html.twig
   * node--3--event-list.html.twig
   * node--3.html.twig
   * node--events--event-list.html.twig
   * node--events.html.twig
   * node--event-list.html.twig
   x node.html.twig
-->

As you can see from the debug output above, we have a nice variety of template suggestions to choose from. I'll use node--events--event-list.html.twig which is specific to the content type, view, and view mode we are using.

Note that a huge advantage of theming views in this manner using view modes is that you can theme as if it were a regular node template. In that regard, I grab Classy's basic node.html.twig file and place it in my custom theme's templates folder using the custom name as above. Now run drush cr and re-check the Twig template output and ensure that the new template has taken effect.

Debug with Twig Xdebug

For debugging with Twig, I like to use Twig Xdebug as mentioned above, which piggybacks on top of Xdebug so you can debug right in your Twig template with one line of code, {{ breakpoint() }}.

When I start to debug, the output provides me with a wealth of information that we can leverage to create some custom date variables right within our twig template. (Note that you could also use standard Xdebug within a .theme or .module file via a preprocess function.)

$context["content"]["field_event_date"][0]["start_date"]["#attributes"]["datetime"] = 2020-02-19T12:00:00Z

The image above shows Twig Xdebug printing out variables in PHPStorm. The image above shows Twig Xdebug printing out variables in PHPStorm.

From the above debugging output, we have the date and time in what's known as UTC Time ISO-8601 Format. We'll be converting that later to a Unix timestamp with Twig so that in turn, we can create custom, nicely formatted dates.

Setting variables in Twig

Now that we have debugging info, we can set some variables right in Twig like this:


 {# Define event start / end dates. #}
    {% set event_start_date = content.field_event_date.0.start_date["#attributes"]["datetime"] %}
    {% set event_end_date = content.field_event_date.0.end_date["#attributes"]["datetime"] %}


Now we will do some comparisons to check if the event is a single day, muti-day, or a muti-day event that takes place in two different months.

First we will check for a single day event by comparing the start and end day.


{% if event_start_date | date('U') | format_date('custom', 'd') == event_end_date | date('U') | format_date('custom', 'd') %}


From the above code, we are doing a few things. First, we convert the UTC ISO formatted date into a Unix timestamp and then from there, we leverage a custom format to compare the event start and end day using Twig's comparison operator, ==.

If this is true, then we write the twig code as:


{# Check for and render a single day date. #}
  {{ event_start_date | date('U') | format_date('custom', 'M d Y') }}


… which will render like this Feb 29 2020. Next, we will add some logic if the event is muti-day and takes place within the same month:


{# If the start date month and end date month match. #}
{% elseif event_start_date | date('U') | format_date('custom', 'M') == event_end_date | date('U') | format_date('custom', 'M') %}
  {{ event_start_date | date('U') | format_date('custom', 'M d - ') }}
  {{ event_end_date | date('U') | format_date('custom', 'd Y') }}


For the above code, we once again use a comparison operator to check if the month start and end date is the same. If so, then the date renders within here as Jan 12 - 16 2020. Finally, if the event takes place within two different months, we add the end date month to our custom date formatter:


{# If the start date month and end date month DO NOT match. #}
    {% elseif event_start_date | date('U') | format_date('custom', 'M') != event_end_date | date('U') | format_date('custom', 'M') %}
      {{ event_start_date | date('U') | format_date('custom', 'M d - ') }}
      {{ event_end_date | date('U') | format_date('custom', 'M d Y') }}


This will render as Jan 29 - Feb 03 2020. And there you have it, nicely formatted custom event dates all within a Twig template.

The image above shows the finished event listing The image above shows the finished event listing

Summary

I should note that Twig's custom date formats draw from PHP datetime so when you see something like format_date('custom', 'M d Y'), those time formats might seem familiar. Coding up dates in Twig in this manner was a great learning experiment for me. As with all things Drupal, there are so many different ways to achieve the same end result so I am sure there are no doubt other ways to do this. In fact, probably the Date and time UI within Drupal would probably suffice in most cases as you can create custom date formats in there as well. In the end, this was a great learning experience for me.

Resouces

Tags

Jan 31 2020
Jan 31

For this article, we enlisted front end developer, Abby Milberg, to give us a little inspiration for Drupal 8 theme building. Abby is the expert here, so I'll let her take it away.

What is a preprocess function?

A preprocess function creates or modifies variables and render arrays (arrays of data structured in specific ways that Drupal knows how to render as HTML) before they’re rendered and/or passed to a template.

Why not just use Twig?

In many cases, it's possible to achieve the same final output by using either a preprocess function or putting logic directly in the relevant Twig template. For many themers like myself, especially those coming from a front-end background unrelated to Drupal and PHP, the latter can seem like the path of least resistance. It's important to consider the pros and cons of each approach for each use case, though. While Twig has an important role to play, preprocess functions offer a wide range of advantages: they're easily reusable, performant, and by separating programmatic logic from your templates, you can easily access the full power of the Drupal API. Furthermore, the data structures you modify or create will remain intact and accessible from other parts of your Drupal project, such as custom modules.

Example #1:

Adding bundle and view-mode classes to entities

If you're using a base theme, whether a core option like Classy or contrib option like Bootstrap, these classes probably exist out of the box. I prefer to start with a blank slate (no base theme), though, which means that most entities have no classes unless I add them. On the downside, I have to spend a few minutes adding them myself. On the upside, though, these functions are completely reusable from project to project and let me set up the classes precisely how I choose.

/**
 * Implements hook_preprocess_node().
 */
function mytheme_preprocess_node(&$variables) {
  // Get the node's content type
  $type = $variables['node']->getType();

  // Get its view mode
  $mode = $variables['view_mode'];

  // Make sure we have a class array
  if (!isset($variables['attributes']['class'])) {
    $variables['attributes']['class'] = [];
  }

  // Add our classes
  $variables['attributes']['class'][] = 'node--type-' . $type; // ex: node--type-article
  $variables['attributes']['class'][] = 'node--mode-' . $mode; // ex: node--mode-teaser
  $variables['attributes']['class'][] = 'node--type-' . $type . '--mode-' . $mode; // ex: node--type-article--mode-teaser
}

This isn't only useful for nodes. We can follow this same basic model for any type of entity: media, taxonomy terms, bricks, paragraphs, custom entities, you name it. Here are two more examples:

/**
 * Implements hook_preprocess_media().
 */
function mytheme_preprocess_media(&$variables) {
  // Get the media entity's bundle (such as video, image, etc.)
  $mediaType = $variables['media']->bundle();

  // Make sure we have a class array, just like with the nodes
  if (!isset($variables['attributes']['class'])) {
    $variables['attributes']['class'] = [];
  }

  // Add a class
  $variables['attributes']['class'][] = 'media--type-' . $mediaType; // ex: media--type-video
}

/**
 * Implements template_preprocess_block().
 */
function mytheme_preprocess_block(&$variables) {
  // Custom block type helper classes.
  if (!isset($variables['elements']['content']['#block_content'])) {
    // This checks whether we actually have a custom, fielded block type, or if
    // we're working with a generic out-of-the-box block.
    return;
  }

  // Get the block type name
  $bundle = $variables['elements']['content']['#block_content']->bundle();

  // Make sure we have a class array
  if (!isset($variables['attributes']['class'])) {
    $variables['attributes']['class'] = [];
  }

  // Add our class
  $variables['attributes']['class'][] = 'block--bundle-' . $bundle;
}

Example #2:

Building a link (the "Drupal way")

The Drupal API has its own ways of handling lots of data structures, including links. Why would we want to preprocess a link? The following example builds a link using hard-coded values, but the real value of preprocessing links comes from pulling in values from various fields on your node (text, link, images, etc.) and building the exact markup that suits your use case. These fields and how you wish to combine them will likely be different on every project.

// These are required at the top of your file in order to use Link and Url later
// in the preprocess function.
use Drupal\Core\Link;
use Drupal\Core\Url;

/**
 * Implements hook_preprocess_node().
 */
function mytheme_preprocess_node(&$variables) {
  // Use URL::fromUri to turn a plain uri into a Drupal URL object.
  // It might need another URL::fromXYZ function, depending on input.
  // See https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/class/Url/8.9.x
  // for more possibilities.
  // If you pull your URL from a Drupal link field, it will probably be a URL object already.
  $my_url = URL::fromUri('https://www.some-url.com/');

  // Set the text or markup you want inside the link. Note the use of t() to
  // ensure that Drupal's multilingual functionality recognizes the text.
  $my_text = t('Click Me!');

  // Set any attributes you want as an array.
  $link_options = [
    'attributes' => [
      'target' => '_blank',
      'class' => ['btn', 'btn--large'],
    ],
  ];

  // Apply the options to the URL
  $my_url->setOptions($link_options);

  // Build the final link.
  // See https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Link.php/function/Link%3A%3AfromTextAndUrl/8.9.x
  $variables['my_full_link'] = Link::fromTextAndUrl($my_text, $my_url)->toString();
  // You can now render this link in a Twig template by calling {{ my_full_link }}
}

Example #3:

Adding placeholder text to the Drupal search block

I find myself using this one on every project - when's the last time you got a design that didn't call for the search bar to have placeholder text? Luckily, it's short and usually requires no modifications.

/**
 * Implements hook_form_FORM_ID_alter().
 */
function mytheme_form_search_block_form_alter(&$form, $form_state) {
  // Adds placeholder text to the search field.
  $form['keys']['#attributes']['placeholder'] = t('Search');
}

Example #4:

Changing field template suggestions

Out of the box, Drupal gives us lots of options for templates that each field can use. Sometimes, though, you may want to point multiple different (programmatically unrelated) fields to the same Twig template. A common use case that I personally employ on most projects is something like field__bare - a field template I create that has no wrapper divs, labels, or classes, but simply renders the field's contents. There are plenty of other design reasons that you might want different fields to point to the same template, though.

/**
 * Implements hook_theme_suggestions_HOOK_alter().
 */
function mytheme_theme_suggestions_field_alter(array &$suggestions, array $variables) {
  // Set custom template suggestions for fields.
  // Switch based on field names
  switch ($variables['element']['#field_name']) {
    case 'field_something':
    case 'field_something_else':
      // Add this to the list of templates that those fields will look for
      // The file field--bare.html.twig would go in
      // mytheme/templates/field
      $suggestions[] = 'field__bare';
      break;
    case 'field_another_one':
      // The file field--another-template.html.twig would go in
      // mytheme/templates/field
      $suggestions[] = 'field__another_template';
      break;
  }
}

Example #5:

Helpful page-level classes

Last but not least, by using hook_preprocess_html, we can apply a variety of useful classes to a page's <body> element This can be particularly useful if we need to change something in global elements, like the header and footer, based on a page's content or a user's role. Here are a few examples:

/**
 * Implements hook_preprocess_html().
 */
function mytheme_preprocess_html(&$variables) {
  // Apply a special class to the homepage, which often has no distinct content
  // type but often needs special design treatment.
  $variables['attributes']['class'][] = \Drupal::service('path.matcher')->isFrontPage() ? 'frontpage' : '';

  // Apply a class at the page level based on content type if we're on a node
  // page. Also helpful when you need to modify global elements that appear
  // outside the node itself.
  $variables['attributes']['class'][] = isset($variables['node_type']) ? 'page-node-type--' . $variables['node_type'] : '';

  // Check whether the viewer is logged in.
  $variables['attributes']['class'][] = $variables['logged_in'] ? 'logged-in' : 'logged-out';
}

Jan 31 2020
Jan 31

The reason is that in most cases the optimal choice of technologies was

  • to use React, where the UI experience could not be achieved equally good with Drupal only,
  • and to use standard Drupal, where there was little benefit of using a decoupled solution.

For us the main advantage of using React is that we can build far more engaging user interfaces. The most obvious reason is that you do not have full page reloads, which gives you a much better perceived performance. We like to call this UI snappyness or app feeling.

If you compare standard server side rendering using a CMS system with a headless application you can observer the following things:

  • Building a website with a CMS is relatively easy, because the technology is so mature (Drupal was first launched in the year 2000!), and most of the functionality you could ever want is already included.
  • Building a completely headless website is more complex, because you have to implement many things yourself, or assemble them from an extremly fast growing and changing eco system (checkout the NPM packages for React and the number of weekly installs!).

Therefore we perceive the sweetspot of decoupling somewhere between going fully headless and using standard CMS technology. The following image illustrates this sweetspot.

Sweet spot of headless applications with Drupal in 2020

Building a website with CMS technology has limited complexity, but does not provide the best possible user interface (UI). Building a fully headless website (also referred to a single page application - SPA) provides the best UI experience but comes at high cost.

For us the sweetspot is using client side apps for some parts of the website, and to leave the rest to the server based application.

This approach provides almost the same UI experience, but at a much lower cost.

Please note, that we destinguish between user experience (UX) and user interface (UI) experience. The experience for a user can also be great with a server side application and become clunky with a client side application. But nonetheless you can build better user interfaces with client side applications.

Let's look at a couple of solutions we built last year:

We built a fully headless commerce solution with React that uses SAP Commerce Cloud (formerly known as SAP Hybris) as backend and integrates with Drupal for content management. In this project we chose to built the application fully headless, because the application driver is Commerce Cloud. Commerce cloud does not come with a frontent that was meeting the requirements of the client. The content in this application is provided by Drupal. As soon as the project is out of private beta we will publish a case study about it.

eldum rett appAnother exiting application from last year is the solution for Eldum Rétt built with Drupal Commerce. This project is a nice example of using both standard serverside rendering in combination with client side apps for parts of the website. Examples of such parts are the user interfaces for the shopping cart or for complex order customisations. As part of the project we also built a React Native app to bring recurring and interactive functionality to the users' Android and IOs devices. You can read the case study here. With this website we won the international Splash awards for the best commerce solution with Drupal in 2019.

A project that we are very proud is Senec, that won the international Splash awards 2019 in the category corporate websites. The project was chosen, because of the optimal selection of technologies for the purpose of the website. Parts of the websites were built as React apps to create the best possible user experience. The most noticable is a complex application process, that could not have been easily built with Drupal only. Here you can read the the case study about this project.

In other projects we have built decoupled searches with Reactivesearch, integrated third party applications with React, and replaced user facing Drupal views with client side React applications. A good example for this is Bodensee Schiffsbetriebe. On this page you find a a number of React apps: The ticket search, the full page search, and the tour search. The tour search could have also been built with Drupal views, but since we had the other searches in place it was a small step to also replace views with React apps.

Building websites like this has work out really good for us at 1xINTERNET, and we will continue using this approach in 2020.

Jan 31 2020
Jan 31

For the first time, Acquia has been recognized as a leader in the Gartner MQ for Digital Experience Platforms.

Today, for the first time in our company's history, Acquia was named a Leader in Gartner's new Magic Quadrant for Digital Experience Platforms (DXPs). This is an incredible milestone for us.

Gartner Magic Quadrant for Digital Experience Platforms

In 2014, I declared that companies would need more than a website or a CMS to deliver great customer experiences. Instead, they would need a DXP that could integrate lots of different marketing and customer success technologies, and operate across more digital channels (e.g. mobile, chat, voice, and more).

For five years, Acquia has diligently been building towards an "open DXP". As part of that, we expanded our product portfolio with solutions like Lift (website personalization), and acquired two marketing companies: Mautic (marketing automation + email marketing), and AgilOne (Customer Data Platform).

Being named a Leader by Gartner in the Digital Experience Platforms Magic Quadrant validates years and years of hard work, including last year's acquisitions. We also join an amazing cohort of leaders, like Salesforce and Adobe, who are among the very best software companies in the world. All of this makes me incredibly proud of the Acquia team.

This recognition comes after six years as a Leader in the Gartner Magic Quadrant for Web Content Management (WCM). We learned recently that Gartner is deprecating its Web Content Management Magic Quadrant as Gartner clients' demand has been shifting to the broader scope of DXPs. We also see growing interest in DXPs from our clients, though we believe WCM and content will continue to play a foundational and critical role.

You can read the full Gartner report on Acquia's website. Thank you to the entire Acquia team who made this incredible accomplishment possible!

Mandatory disclaimer from Gartner

Gartner, Magic Quadrant for Digital Experience Platforms, Irina Guseva, Gene Phifer, Mike Lowndes, 29 January 2020.

This graphic was published by Gartner, Inc. as part of a larger research document and should be evaluated in the context of the entire document. The Gartner document is available upon request from Acquia.

Gartner does not endorse any vendor, product or service depicted in its research publications, and does not advise technology users to select only those vendors with the highest ratings or other designation. Gartner research publications consist of the opinions of Gartner's research organization and should not be construed as statements of fact. Gartner disclaims all warranties, expressed or implied, with respect to this research, including any warranties of merchantability or fitness for a particular purpose.

January 31, 2020

1 min read time

Jan 31 2020
Jan 31

Regardless of the extra-ordinary design, captivating content, and right product illustration on a company’s website, how bad would it be if it fails to engage users most of the times. A Google report unveils that a new visitor will stay and come back only if the app or page loads content within 3 seconds. Having said that, the online brands only get 3 seconds to hook the new visitor to their site or application. 

Though developers pull out all the stops to optimize the performance and improve the speed of the websites/apps, however, the results do not align with the efforts put into it. 

In such a scenario, web caching comes into existence, where the shared page elements, such as JavaScript, CSS, images, etc. are downloaded and stored closer to the user so that the browser can extract this data instantly from the stored location, instead of querying the web server again.

This blog will run you through a Drupal module, Clear Cache Tag - the only existing Drupal module that helps in clearing the cache of particular tags, and not of the whole site. You can learn about the benefits and installation process.

What is Drupal Clear Cache Tag Module?

Cache tags are essential for a content management system like Drupal, which, otherwise become difficult to determine the places where content is being used as well as cached, that too ahead of time. Taking this into account, a question that pops up is, “how can one invalidate all cache items where the content is in use”?

How can one invalidate all cache items where the content is in use?

To address this given issue, the Clear Cache Tag module ensures that the cached data from different bins is invalidated once it becomes old and defunct, apart from accommodating the latest changes to it. The objective is to accurately target multiple cache bins that contain identical data about the same object, page, etc.

In Drupal 7, there were 3 methods of invalidating cache items but none of them allowed users to invalidate the cache items that contained a modified entity as it was impossible to know about it.

But now, the clear cache tag module can invalidate a particular node (cache item(s)), irrespective of its visibility on three blocks or for say, twelve pages.

Thus, this module helps website developers economize on time and effort, which earlier were devoted to maintaining information. Besides, the other advantage is that the whole site doesn’t need to be cached now over and again, thereby enhancing user-experience extensively.

How Caching is Useful In Improving Customer Experience?

Among multiple components responsible for delivering rich user experience, Caching is one of the most important factors. It offers the following advantages-

  1. Reduced latency

As per this report, 51% of online shoppers in the US prefer to abandon a site or purchase if a site takes longer than usual time to load.

Thus, the speed at which the webpage loads is crucial in ensuring a good digital experience. Caching comes as a handy option for the same as it serves content from a location nearest to the users- either on the users’ hard disk or a nearby server. Thereby, reducing the latency in the roundtrip time & recovering the content much faster.

The time taken to retrieve the resource from the cache will be lower than the time it takes from the origin server and thus speeds up the content delivery process significantly.

  1. Content availability

While users access information online across the globe, content availability becomes a major problem to enhanced user experience. There can be many reasons behind poor website speed such as- frequent interruptions in the network or irregular disturbance on the site. In such cases, caching saves the day by serving end-users with the cached content.

2. Avoids network congestion

The internet handles huge amounts of data throughout the day and so, has to manage heavy traffic as well; thus congestion in the bandwidth can be an issue on major networks.

However, network congestion can be greatly reduced with caching as the path covered in fetching the content is reduced when it is cached. 

Now that all the user requests won’t be redirected to the origin, it will free up the network and reduce the load on the origin server, thereby serving non-cached content faster.

Challenges With Caching

There are some challenges as well that are associated with caching-

  • Keeping Cache Up-to-date

Cached data may not necessarily be the most accurate, especially that information which is time-critical. Therefore, volatile data should not be cached.

  • Personalization and Caching aren’t Always Compatible

Caching and personalization might not go hand-in-hand. This is because if you’ll try to cache one million users’ personalized responses, it would be quite similar to them just requesting the information from the backend directly anyway- so there is no tangible benefit there.

How To Set Up the Clear Cache Tag Module? 

Following steps will help you in easy setup of Clear cache tag module-

Step 1: Enable the Clear cache tag module

Step 2: Go to Admin > Configuration > Development > Clear cache 

tag (/admin/config/development/clear-cache-tag)

Step 3: Enter the tag name you want to invalidate.

Step 4: Click on the submit button to invalidate it.

clear cache tag_scrreenshot

Setting up clear cache tags module

You can also install this module via Drush and the composer. Below are the commands for each respectively-

Drush en clear_cache_tag 
composer require 'drupal/ctc:1.x-dev'

Here is the video for the same showcasing the usage of the module-

 

Clear Cache Tag_trimmed video

 

Summing up

Implementing caching techniques is a vital cog to help your business grow and prosper but it is equally important to understand that tailored solutions are the way to go. Since one-size-does not -fit all, enterprises must formulate optimal caching policies as per your business requirements.

Ultimately, it’s crucial to understand that caching may not be the amulet of luck, but it will ensure that your business stays on foot and well-off with minimal endeavors.

Jan 31 2020
Jan 31

Regardless of the extra-ordinary design, captivating content, and right product illustration on a company’s website, how bad would it be if it fails to engage users most of the times. A Google report unveils that a new visitor will stay and come back only if the app or page loads content within 3 seconds. Having said that, the online brands only get 3 seconds to hook the new visitor to their site or application. 

Though developers pull out all the stops to optimize the performance and improve the speed of the websites/apps, however, the results do not align with the efforts put into it. 

In such a scenario, web caching comes into existence, where the shared page elements, such as JavaScript, CSS, images, etc. are downloaded and stored closer to the user so that the browser can extract this data instantly from the stored location, instead of querying the web server again.

This blog will run you through a Drupal module, Clear Cache Tag - the only existing Drupal module that helps in clearing the cache of particular tags, and not of the whole site. You can learn about the benefits and installation process.

What is Drupal Clear Cache Tag Module?

Cache tags are essential for a content management system like Drupal, which, otherwise become difficult to determine the places where content is being used as well as cached, that too ahead of time. Taking this into account, a question that pops up is, “how can one invalidate all cache items where the content is in use”?

How can one invalidate all cache items where the content is in use?

To address this given issue, the Clear Cache Tag module ensures that the cached data from different bins is invalidated once it becomes old and defunct, apart from accommodating the latest changes to it. The objective is to accurately target multiple cache bins that contain identical data about the same object, page, etc.

In Drupal 7, there were 3 methods of invalidating cache items but none of them allowed users to invalidate the cache items that contained a modified entity as it was impossible to know about it.

But now, the clear cache tag module can invalidate a particular node (cache item(s)), irrespective of its visibility on three blocks or for say, twelve pages.

Thus, this module helps website developers economize on time and effort, which earlier were devoted to maintaining information. Besides, the other advantage is that the whole site doesn’t need to be cached now over and again, thereby enhancing user-experience extensively.

How Caching is Useful In Improving Customer Experience?

Among multiple components responsible for delivering rich user experience, Caching is one of the most important factors. It offers the following advantages-

  1. Reduced latency

As per this report, 51% of online shoppers in the US prefer to abandon a site or purchase if a site takes longer than usual time to load.

Thus, the speed at which the webpage loads is crucial in ensuring a good digital experience. Caching comes as a handy option for the same as it serves content from a location nearest to the users- either on the users’ hard disk or a nearby server. Thereby, reducing the latency in the roundtrip time & recovering the content much faster.

The time taken to retrieve the resource from the cache will be lower than the time it takes from the origin server and thus speeds up the content delivery process significantly.

2.  Content availability

While users access information online across the globe, content availability becomes a major problem to enhanced user experience. There can be many reasons behind poor website speed such as- frequent interruptions in the network or irregular disturbance on the site. In such cases, caching saves the day by serving end-users with the cached content.

3.  Avoids network congestion

The internet handles huge amounts of data throughout the day and so, has to manage heavy traffic as well; thus congestion in the bandwidth can be an issue on major networks.

However, network congestion can be greatly reduced with caching as the path covered in fetching the content is reduced when it is cached. 

Now that all the user requests won’t be redirected to the origin, it will free up the network and reduce the load on the origin server, thereby serving non-cached content faster.

Challenges With Caching

There are some challenges as well that are associated with caching-

  • Keeping Cache Up-to-date

Cached data may not necessarily be the most accurate, especially that information which is time-critical. Therefore, volatile data should not be cached.

  • Personalization and Caching aren’t Always Compatible

Caching and personalization might not go hand-in-hand. This is because if you’ll try to cache one million users’ personalized responses, it would be quite similar to them just requesting the information from the backend directly anyway- so there is no tangible benefit there.

How To Set Up the Clear Cache Tag Module? 

Following steps will help you in easy setup of Clear cache tag module-

Step 1: Enable the Clear cache tag module

Step 2: Go to Admin > Configuration > Development > Clear cache 

tag (/admin/config/development/clear-cache-tag)

Step 3: Enter the tag name you want to invalidate.

Step 4: Click on the submit button to invalidate it.

clear cache tag_scrreenshot

Setting up clear cache tags module

You can also install this module via Drush and the composer. Below are the commands for each respectively-

Drush en clear_cache_tag 
composer require 'drupal/ctc:1.x-dev'

Here is the video for the same showcasing the usage of the module-

 

Clear Cache Tag_trimmed video

 

Summing up

Implementing caching techniques is a vital cog to help your business grow and prosper but it is equally important to understand that tailored solutions are the way to go. Since one-size-does not -fit all, enterprises must formulate optimal caching policies as per your business requirements.

Ultimately, it’s crucial to understand that caching may not be the amulet of luck, but it will ensure that your business stays on foot and well-off with minimal endeavors.

Jan 31 2020
Jan 31

After a successful DrupalCamp Pune 2019 last September, the Pune Drupal community did not hold any meetups. Global Contribution Weekend was scheduled in January 2020, and I thought this would be a great opportunity for the Drupal Pune community to have a meetup as well. 

Core members of the Pune community had a meeting, where we decided the event format and location. QED42 which always volunteers and encourages people to participate in the opensource events decided to host the Drupal Global Contribution Weekend.

| Drupal communities began uniting in India

Drupal Delhi community had already planned for GCW on the 25th January. Jaideep, Senior Engineer at QED42, who is one of the active members of the Drupal Community in India connected with us and shared the idea of collaborating with the Pune community. We had an initial meeting about the type of issues that should be targeted in the GCW 2020. Later it came to our knowledge that other communities are also planning to have the GCW 2020 event. We contacted other communities and proposed the idea of carrying out the GCW 2020  unitedly all over India.

The following Indian Local Drupal communities were planning to host the Global Contribution Weekend: 

  1. Pune

  2. Delhi 

  3. Bangalore

  4. Kolkata 

  5. Chennai 

  6. Kochi 

  7. Mumbai 

| Sprint Planning

We decided to focus on the Drupal 9 readiness, Olivero theme and contrib modules issue queue. Olivero, one of the Drupal core initiatives, seeks to create a new default front-end theme for Drupal with a modern look and feel. The Community started triaging the issues. Hardik Patel shared a large number of issues which he had prepared for the Global Contribution Weekend and needed to be review. Sonal Sangale triaged several frontend issues from the Drupal issue queue. Similarly, the other communities were triaging the issue queue.

| Event Day 

The code sprint in India started at 10 AM. Prasad Shirgaonkar presented a session about Drupal India Association and its vision. This was the first time we saw different local communities from India collaborating at a global event. Approximately 150+ people from different Indian Drupal communities were connected via video conferencing. 

Drupal Global Contribution Weekend 2020

Following Prasad’s session, VijayaChandran Mani delivered a session on the State of Drupal 9 from London. He spoke about various tools which can be used to check  Drupal 9 compatibility. Vijaya presented tools like drupal-cheker, drupalstan, etc. which make upgrading the existing Drupal 8 modules to Drupal 9 a super easy task. This fueled our determination on contributing to the forthcoming Drupal 9. VijayaChandran Mani incorporated Gabor Hojtsy slides on State of Drupal 9 in his session.

We then had a lightning session presented by Rangaswini Khandare on ‘Automatic Updates in Drupal core’. This is a recent Drupal initiative which is gaining traction and was featured in DrupalCon Amsterdam as well. Rangaswini introduced us to the goals & objectives of Automatic Updates and explained the amount of work done in Phase 1 and the progress of phase 2. She also encouraged people to join this initiative and contribute to the core.

Drupal 9 Automatic Updates

| Code Sprint

After Rangaswini’s session, the Global Contribution Weekend participants at QED42’s Pune office geared up to begin the code sprint! Find the list of issues we worked on here - https://www.drupal.org/project/issues/search?projects=&project_issue_followers=&issue_tags_op=%3D&issue_tags=GCWIndia2020

Here are a few glimpses of Drupalers contributing toward making Drupal better.

Code Sprint GCW2020

QED42 also sponsored a scrumptious lunch for the contributors in Pune.

QED42 Sponsored lunch at GCW2020

| Pune Drupal Community Contribution Highlight

Total 38 issues were picked for the contribution.

Drupal Global Contribution weekend 2020

| Statistics for GCW 2020 all over India

Total 67 issues were picked for the contribution.
Drupal Global Contribution Weekend 2020

After 5+ hours of code sprint, we concluded the Drupal Global contribution weekend with a group photo and contentment in our hearts.

Drupal Global Contribution weekend 2020 Pune QED42

Jan 31 2020
Jan 31

Kickstarting the year with a contribution weekend globally from 24 January - 26 January, Drupal Association was able to gather participants from over 30 cities in 17 countries.  Among the 7 locations the contribution sprint happened in India, Srijan Technologies led the Delhi NCR sprint from its Gurgaon office on 25 January 2020.

The one-day session witnessed more than 25 people coming together from various organizations like Mckinsey, TCS, BirlaSoft, QED42, and JBi Digital coming together to not just fix issues but also to share their experiences with Drupal. Our crowd a perfect mix of site builders, testers, designers, project managers, marketers, writers, and, of course, developers contribute to the open-source project. 

The schedule for  DGCW encompassed engaging sessions at length from Drupal India Association on introduction to Drupal 9 to individual sessions from contributors, fixing of patches, and their evaluation. The objective was to provide attendees with an opportunity to showcase their recent work, module or contribution, besides discussing their experiences with Drupal related tools.

By the end of the sprint, we resolved 28 issues and fixing 17 patches, which were later evaluated as well to discuss and make learning, fun for all.

drupal-contribution-weekend-7

group of people standing

drupal-contribution-weekend-9

drupal-contribution-weekend-2In addition, three individual sessions were delivered on topics ranging from the latest update, architecture, and user activity

  1. Introduction to Drupal 9, by Vaibhav Jain, Srijan Technologies
  2. Progressive Decoupled App on Drupal 8, by Pradeep Kumar Jha, Rajiv Patel, and Siddharth Sharma, Srijan Technologies
  3. User Activity and Log Management, by Vernit Gupta, BirlaSoft

man standing in front of a blue tv screen Vernit Gupta from BirlaSoft presenting a session on User Activity and Log Management


The idea behind conducting the DGCW is to make Drupal attendees cognizant of the latest developments in the community and the project across the globe and encourage contribution, involvement in strategic initiatives and get the support for the imminent release of Drupal 9.

Srijan, being a persistent Drupal contributor with nearly 60 plus certified developers and more than 1000 plus D7 and D8 commits, aims at motivating masses to contribute or give back to the growing community by sharing the information  & expertise on the same.

A Signature supporting partner, we always strive to provide a platform for Drupal enthusiasts to meet, network and innovate.

Srijan looks forward to sponsoring many more upcoming events in the near future, like DrupalCon Minneapolis, DrupalCamp Manila, Kubernetes Day, and Decoupled Days, similar to the ones it has sponsored in the past both locally and internationally.

**With inputs from Vaibhav Jain

Jan 31 2020
Jan 31

Access and security are collateral concerns born out of the world of the internet. When a website is under development, a major chunk of time and effort goes into making it secure from all sorts of malicious activities. Taking the threats and data breaching affairs into account, every platform has a protocol to follow. For the security and usability purpose, every website has certain permissions granted to view, edit, or delete the content on the site. For example, open source CMS like Drupal provisions various modules that let you configure the user access. 

a man sitting in front of multiple screens

What is user access?

Every website has a tech team working on the development of the site while they assign certain roles in the process to each individual. Similarly, user access is the possession of a particular role on the website that allows the user with specific permissions. The user access is determined by the site owners who assign the roles to the users with a login Id and password

In this blog, we will be talking about the user access permissions in Drupal 8 and understand how it works with the available modules. 

Permissions management in Drupal 8

With a lot of different functions and features, the permissions in Drupal 8 work in a little different way. From viewing published content to changing the state of functions and features, permission control access in Drupal is assigned as a role. There are 3 default roles as follows:

  • Anonymous: Visitors who are not logged into your site.
  • Authenticated: User with an account who’s login is authenticated with a minimum set of permissions that are given to all logged-in users. 
  • Administrator: Users who can do everything on the site and change the functionalities.

Limitations of permissions management in Drupal 8

These default roles are quite limited in themselves. They do not define the access in detail and require modules to further strengthen the access control. Following are the limitations:

  • The roles you create yourself or the authenticated user role do not receive the permissions given to anonymous users.
  • There’s no granular control at various level.
  • In case of a lot of custom modules where the contributed modules introduce important functionality, the piece of code requires more hold of access levels which isn’t available.

Thus, we need user access modules that will grant broader access control and permissions.  

Top Drupal 8 user access modules

Here is a list of the most popular user access modules for Drupal 8 depending on the functionality you want for your website:

#1 Node View Permissions

Apart from allowing the combining of other user access modules, the Node View Permission module adds two types of permissions to all content type, namely, "View own content" and "View any content".

#2 Menu Admin per Menu

As the name suggests, the Menu Admin per Menu module permits and restricts access to only Administer menus and menu items to add, modify or delete menu items. It gives access to certain sections of the menu without giving access to the full admin panel.

#3 Block Content Permissions

You can gain the control access to administer block content types (custom block types), administer block content (custom block library) that lets you create, update, or delete specific types of block content with this module. However, the Block Content Permissions module doesn’t remove the block permissions from "Custom block library - Blocks" views page

#4 Protected Pages

Every website has multiple pages with different types of content and not every information can be shared with every user with a role. Thus, the Protected pages module allows the admin to protect certain web pages with a protection password. Further, you can also ser session expiry time, bypass permission and global password settings to strengthen the security feature. 

#5 Permissions by Term

Based on the taxonomy terms, you can restrict the access to specific content on the website. The permissions are applied to the user roles and work well for nodes, views, menus, etc. The Permissions by Term module also aids in linking the taxonomy terms with specific accounts. 

#6 Vocabulary Permissions Per Role

Within the taxonomy access, you can set up permits only for content editors to work with a particular taxonomy vocabulary without hampering the “administer taxonomy” permissions. The Vocabulary Permissions Per Role module gives you control over the number of users with permissions and access. 

#7 Override Node Options

You can now set permissions for each field on the node form within the Authoring information and Publishing options fieldsets. The Override Node Options module can also let your make certain fieldsets collapsible.

#8 Block Region Permissions

Control access to block management within each region of your website’s theme with the Block Region Permissions module. The module grants access to see the following:

  • Region's header, message, and blocks on block layout page
  • Region in region selector fields on block layout page
  • Region in region selector field on configure and place block pages
  • Can update or delete blocks placed in region

#9 Workflow

A contributed module, Workflow allows you to create workflow states for various node types. Further, it allows transitions between states like updating from “Draft” to “Published” and similar per role. It enables you to set up the Workflow to alter states from form, page, comment, a special block, and a special workflow tab.

#10 Content Access

As per the role and author, the content access module lets you manage the permissions for content types. You can specify custom view, edit and delete permissions for each content type or enable the content access settings. Thus, it allows customization of access for each content node. 

Conclusion

These modules are more than a boon for your Drupal website. They impart the highest of security walls for the users and helps your website remain safe from third-party users. The modules are designed to make sure that the user roles and permissions are not misused by the users and they optimize the development process for the team. 

To know more about the power of Drupal, drop us a line at [email protected]

Jan 30 2020
Jan 30

A chef can make a great meal with a few basic ingredients. But when offered a massive pantry full of options, the result can be a work of art.

The same principle applies when it comes to website CMS software. A basic template-style CMS can result in something that hits the spot. But Drupal’s staggering degree of flexibility and modular options has allowed the developers of some of the world’s most prominent websites to create gorgeous and highly functional sites that inspire, inform, and elevate.

Here are our top 10 picks for Drupal websites that we think have raised the bar:

  • Tesla
  • PGAL
  • University of Texas at Austin
  • Children’s Hospital of Los Angeles
  • Mint
  • National Baseball Hall of Fame
  • The Australian Government
  • Rethinking Picasso’s Guernica
  • The Emmy Awards
  • NASA

Let’s examine these in more detail:

10. TeslaTesla

A rare day passes by without Tesla making headlines. The brand and its founder, Elon Musk, are renowned for big, audacious ideas that have potential to change the world. The beautiful photography and design make every section look like a high-end editorial page in a magazine, while the simple, intuitive navigation and call-to-action features are clean and unobtrusive. It all combines to create a website that’s aspirational yet attainable.

9. PGALPGAL

PGAL is an international design firm focusing on interiors, architecture, planning, and engineering. Their challenge is to show and tell, so that potential clients are dazzled by the site’s visuals while still being able to find enough solid information to want to take the next step. The site, which uses imagery as the gateway to project stories, is a delightful rabbit-hole that we could spend hours exploring. Make sure to check out their Projects page, as it is an excellent example of how to show off a portfolio in a clean but comprehensive way.

8. University of Texas at AustinUniversity of Texas at Austin 

University websites can often be an overstuffed nightmare to navigate, but the team behind UT Austin’s website got it right: Their menu navigation is clean, well-organized, and enticing. Add to it a home page that evokes the fresh excitement of starting the post-secondary journey, while peppering in well-organized data that invites the reader to learn more, and you have a website that gets students and their families off to the perfect start.

7. Children’s Hospital of Los AngelesChildren’s Hospital of Los Angeles

160,000 visitors go to CHLA.org every month, making it vital for the site to present clear, accurate, easily navigated information in a way that builds and maintains trust. It’s a tall order, but CHLA.org delivers. The design is clean but far from cold, while the most frequentlysearched information is put front and center instead of being hidden in the navigation bars, making it easy for frazzled parents to find out what they need to know. The sheer volume of information on the “Patients and Families” page could easily be overwhelming but is organized beautifully and intuitively.

6. Mint

Mint’s value statement: “We help you effortlessly manage your finances in one place.” They offer clean and simple financial management, using a clean and simple sentence to describe what they do. A cluttered or complicated website would completely undermine their brand. Fortunately, Mint.com is anything but cluttered or complicated. The simple and soothing colors and minimalist text are reassuring to visitors who want straightforward information, while the navigation and iconography make navigation a breeze.

5. National Baseball Hall of FameNational Baseball Hall of Fame

For any website to be successful, it has to give the end-users what they’re looking for, and the BHoF delivers. After extensive user research, the site was designed to showcase the incredible stories and artifacts in BHoF’s collection, bringing it all to life for the site’s visitors. Fortunately, it also does so in a way that’s easy to navigate, inviting visitors to spend plenty of time exploring.

4. The Australian GovernmentThe Australian Government

As with universities and colleges, government websites can often be an impenetrable labyrinth to navigate. Australia.gov.au does things differently, living up to their header, “Helping you find government information and services.” The site is incredibly well-organized, with virtually no clutter. And even though it has not one photo to speak of, it still manages to be attractive, through a judicious use of color and minimalistic icons.

3. Rethinking Picasso’s GuernicaRethinking Picasso’s Guernica

The Museo Nacional Centro de Arte Reina Sofía created an ambitious project around one of Picasso’s most famous works of art, and the results were groundbreaking: The project has been recognized with a Webby as the best 2018 Cultural Institutions Website. The storytelling and imagery on this site are captivating, while the user experience is smooth and unobtrusive.

2.  The Emmy AwardsThe Emmy Awards

The Emmy Awards are splashy and glamorous on the outside, while requiring meticulous planning and organization behind the scenes. Their website is no different. With a plethora of content, rich color choices, and high-quality images, the site is as immersive an experience as the awards show is. But thoughtful, intuitive navigation, exciting features, and well-curated content demonstrate expertise.

1. NASANASA

NASA.gov is a massive resource on space, astronomy, and the universe, offering detailed information on present and past missions, gorgeous photography, educational resources, and information about the organization in general, to name but a few features. Organizing such a wealth of information in a coherent and clear way shows what is possible with Drupal.

Full disclosure: We’re the team behind NASA.gov, so it’s understandable that we might have a soft spot for this site. However, we’re far from alone in loving the finished product. Our friends at Vardot.com call it “a shining example of Drupal CMS used to present stunning information, and elevate the user’s experience,” and NASA.gov has made the top of more than one “Best Drupal Websites” list.

Want to see the possibilities that Drupal can hold for your organization’s website? Contact us today!

Jan 30 2020
Jan 30

Every year, the last weekend in January is reserved for a global Drupal contribution weekend. Community members and contributing organizations from over 30 world cities volunteered to organize a local Drupal contribution weekend. Zurich was one of these cities and the full team of MD Systems was there.

Global Contribution Weekend 2020 - Zurich happened from Friday, 24th January to Sunday, 26th and took place at Unic offices. The contributors joined the event already at 9 AM on Friday and outlined plans for the next 2 days on how we can contribute and collaborate. 

Since Drupal 9 is getting closer, one of our main goals for this weekend was to push forward core issues and contrib modules that we use in Primer distribution and get them ready for Drupal 9. We started the weekend by making a spreadsheet with contrib modules we use and assess their Drupal 9 status.

Additionally, Paragraphs, one of the most used Drupal modules, received several accessibility and user experience improvements. The team collaborated with other contributors and made progress towards making Paragraphs compatible with the Claro theme. 

The Swiss community leads finalized the constitution for Drupal Switzerland and reviewed the well progressed proposal from the Splash Awards 2020 from the project team. Both important pieces for the Swiss Drupal Community.

From Friday 24th January 2020 to Sunday 26th January 2020 during Global Contribution Weekend 2020 - Zurich there was a total of 24 people who contributed to 66 issues in 27 projects with 67 patches posted out of total 261 comments. Together with the rest of the local community, we were involved in fixing 26 issues!

The aggregated numbers above show how big impact the Swiss community has on the Drupal ecosystem since our contributions made almost 20% of total world contributions during the last weekend. A very impressive result!

As part of our weekend goals, we were also working on pushing forward Drupal 9 core issues in order to reduce the number of deprecated APIs. The progress during the sprint can be seen on the Drupal core 9.x-dev @deprecated mentions graph below.

We continued to work on Drupal 9 issues during the week and 30 projects used by our install profiles are now fully compatible with current Drupal 9 codebase. Another 25 modules have patches prepared to make them ready. 

To wrap it up, we really enjoyed the Global Contribution Weekend 2020 - Zurich and looking forward to the next Drupal contribution event! 

We would like to thank Josef Dabernig for organizing the contribution weekend, Unic for hosting the event, MD Systems for allowing us to spend two full days on Friday and Saturday working on contributions and all the people who joined the contribution weekend!

Drupal.org contributors at the #ContributionWeekendCH: mbovan, Berdir, znerol, sasanikolic, dasjo, miro_dietiker, saschaeggi, grahl, pivica, fhaeberle, mathilde_dumond, Siegrist, isabrenner, spitzialist, roy.voggenberger, signalwerk, waluigi, sarahsarah, jzech, malte.koelle, dermario, lsmith77, Jos Doekbrijder, Primsi.

* Statistics covers contributions made on Drupal.org between Friday 24th January 2020 and Sunday 26th January 2020 tagged with #ContributionWeekendCH and #ContributionWeekend2020 issue tags.

Jan 30 2020
Jan 30

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

For our first interview of 2020, Marloes Bosch, accessibility-focused front-end developer at LimoenGroen, spoke to us about her career switch to Drupal, the awesome people from the Dutch Drupal community who have helped her along her journey, and why Drupal's commitment to accessibility is so important.

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

I work as a front-end developer with a focus on accessibility at LimoenGroen, a Dutch agency based in Amsterdam. As a community member, I try to share knowledge in every way I can, for instance by speaking at events, organizing conferences, supervising colleagues and just answering their questions.

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

Well, actually, I made a career switch only 3 years ago. Before I started developing, I worked in health care for about 10 years, I was a mentor to elderly people with psychiatric issues. Back then I had a colleague, Marga, who motivated me to learn Drupal, because she’s married to a Drupal developer Dirk Bazuin, and he encouraged me to learn Drupal.

So I bought this book, Kickstart Drupal 7, and I was really optimistic about it; I had that feeling of “Yeah, I’m learning Drupal!”

And I had to learn it in the evening hours because I worked full-time. It was really hard to learn it from scratch in your room on your own, you know, so I was ready to give up when Dirk, the husband of the colleague, asked me to go to DrupalCamp Ghent in 2016.

I was a bit unsure, because all the sessions were really technical, but in the end, I just bought a ticket and went. When I was there, I really had a hard time understanding all the sessions because I didn’t know a thing about Drupal. 

I ended up staying with Drupal because of the community - in Ghent, there was a social event and I had a really great time, I was drinking really good Belgian beers and I met my current manager Baris who is one of the owners of LimoenGroen. 

He asked me if I was eager to learn Drupal, and I said of course I want to learn it, and he gave me an opportunity to learn Drupal at his company, and I’m really glad and grateful for that. He offered me a job in January 2017 and I’m still working here - so, that’s definitely a good thing!

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

That would be at DrupalCamp Ghent as well, but in 2018 - the Ghent edition of the ‘Camp is really special to me, of course. So I went back there in 2018 as a first-time speaker and I was really proud of being invited to come and speak about accessibility.

Before the keynote started, Nick Veenhof came to me and he said: “I know your story, that it started 2 years ago at our DrupalCamp. Are you willing to motivate the students who are present at the event by talking briefly about your career switch to get them excited about moving into Drupal?” And I was really honored that he asked me to do that. 

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

Well, that’s quite hard - it really depends on who’s asking. If someone has no technical background, I try to keep it simple and just give examples of websites that are made in Drupal. 

I always try to emphasize that it’s open source, it’s free for everyone, and everyone’s able to learn it and to use it. If someone has more technical experience, I try to explain the possibilities that Drupal has to offer and the strength of the community behind it.

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

I started my Drupal career when Drupal 8 just came out, so I’m not really familiar with Drupal 7, and I think a lot of people say that’s a huge improvement. But the thing I see evolving, or at least my hope is, that Drupal will be fully compliant to the web accessibility guidelines.

I understand that it’s not possible to give every user an equal experience, but I think we should at least try to give as many users a very good experience in every way we can. I think we are socially responsible for that as developers; and, of course, we’re also legally obliged because of the accessibility act and all the new rules in Europe that are implemented right now. 

I think Drupal 8, and Drupal 7 of course, still have a lot of accessibility issues, but I’m really excited about the Accessibility initiative; a couple of weeks ago Mike Gifford came by our office to explain a lot about it, and it’s just really cool that they’re doing this. 

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

I think that would be organizing Frontend United - it is a non-profit and developer-first conference and it travels from country to country every year. Its origins lie in the Drupal community, because a lot of events like ‘Camps and ‘Cons are really focused on the backend, and Frontend United is really focused on - of course - the frontend. 

I’m organizing it for 3 editions now, starting in 2018. For two years it was in Utrecht and this year it will be in Minsk in Belarus. What we try to do is to make it a really pleasant experience for everyone. 

So as a team we did a workshop about inclusion and diversity, we updated our code of conduct, we tried to invite a very diverse group of speakers, and we also hoped to unite more people with very different backgrounds, for example, by keeping the ticket costs very very low if you compare them with other frontend conferences.

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

Similarly to Frontend United - the initiative I want to highlight is Frontend Re-United, that’s a new concept we tried in 2018, initiated by Mathieu Spillebeen

The idea was to invite a lot of front-end experts of the world to Utrecht back then for our Frontend United conference, and we streamed all those sessions to other parts of the world, to make it more accessible for people who don’t have the financial status to come to Europe. 

So the “re” in “re-united” is referring to “remote”, and the idea was that local communities in Africa or Asia created a kind of meetup with local sponsors and the local community, and, no matter the time difference, we just live streamed the sessions, so they could watch them as the same time as we did in Utrecht back then. Or, if the timezones didn’t match at all, they could watch a recording and add local speakers to the line-up to create a schedule that did suit them.

We started out in 2018 with 4 locations, and last year we tried it again and we tried to improve it a little bit and we ended up with 14 remote locations. A lot of them have now updated their local communities and they organize meetups on a regular basis .

We helped strengthen their local communities and that’s a really good thing; we built bridges between multiple cultures and shared knowledge worldwide. All credit goes to Mathieu, it was his idea! 

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

Beyond Drupal? That’s really hard! I used to make websites in my spare time when I was younger, and somehow I stopped doing that when I went to college. 

But since I turned my hobby into a career I spend a lot of time behind the computer, and I’m building websites during office hours, I’m building websites in my personal time, so I want to make sure that I exercise a lot and stay healthy. 

So, I joined a local women’s soccer team a couple of months ago. I’ve not been notified by the FIFA yet, but, you know, I’ll keep dreaming. 

That has been a really good thing for my health. I also met a lot of interesting people that are not developers, and there are a lot of interesting insights into websites and design and just into the work on the web other than from the developer perspective, and it was really really nice.

I would also like to take advantage of this moment to put my LimoenGroen colleagues in the spotlight. A big thank you to you all, teammates, for helping me grow as a developer as well as a person! 

Photo credit goes to Peter Lieverdink (cafuego)

Jan 30 2020
Jan 30

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

For our first interview of 2020, Marloes Bosch, accessibility-focused front-end developer at LimoenGroen, spoke to us about her career switch to Drupal, the awesome people from the Dutch Drupal community who have helped her along her journey, and why Drupal's commitment to accessibility is so important.

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

I work as a front-end developer with a focus on accessibility at LimoenGroen, a Dutch agency based in Amsterdam. As a community member, I try to share knowledge in every way I can, for instance by speaking at events, organizing conferences, supervising colleagues and just answering their questions.

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

Well, actually, I made a career switch only 3 years ago. Before I started developing, I worked in health care for about 10 years, I was a mentor to elderly people with psychiatric issues. Back then I had a colleague, Marga, who motivated me to learn Drupal, because she’s married to a Drupal developer Dirk Bazuin, and he encouraged me to learn Drupal.

So I bought this book, Kickstart Drupal 7, and I was really optimistic about it; I had that feeling of “Yeah, I’m learning Drupal!”

And I had to learn it in the evening hours because I worked full-time. It was really hard to learn it from scratch in your room on your own, you know, so I was ready to give up when Dirk, the husband of the colleague, asked me to go to DrupalCamp Ghent in 2016.

I was a bit unsure, because all the sessions were really technical, but in the end, I just bought a ticket and went. When I was there, I really had a hard time understanding all the sessions because I didn’t know a thing about Drupal. 

I ended up staying with Drupal because of the community - in Ghent, there was a social event and I had a really great time, I was drinking really good Belgian beers and I met my current manager Baris who is one of the owners of LimoenGroen. 

He asked me if I was eager to learn Drupal, and I said of course I want to learn it, and he gave me an opportunity to learn Drupal at his company, and I’m really glad and grateful for that. He offered me a job in January 2017 and I’m still working here - so, that’s definitely a good thing!

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

That would be at DrupalCamp Ghent as well, but in 2018 - the Ghent edition of the ‘Camp is really special to me, of course. So I went back there in 2018 as a first-time speaker and I was really proud of being invited to come and speak about accessibility.

Before the keynote started, Nick Veenhof came to me and he said: “I know your story, that it started 2 years ago at our DrupalCamp. Are you willing to motivate the students who are present at the event by talking briefly about your career switch to get them excited about moving into Drupal?” And I was really honored that he asked me to do that. 

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

Well, that’s quite hard - it really depends on who’s asking. If someone has no technical background, I try to keep it simple and just give examples of websites that are made in Drupal. 

I always try to emphasize that it’s open source, it’s free for everyone, and everyone’s able to learn it and to use it. If someone has more technical experience, I try to explain the possibilities that Drupal has to offer and the strength of the community behind it.

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

I started my Drupal career when Drupal 8 just came out, so I’m not really familiar with Drupal 7, and I think a lot of people say that’s a huge improvement. But the thing I see evolving, or at least my hope is, that Drupal will be fully compliant to the web accessibility guidelines.

I understand that it’s not possible to give every user an equal experience, but I think we should at least try to give as many users a very good experience in every way we can. I think we are socially responsible for that as developers; and, of course, we’re also legally obliged because of the accessibility act and all the new rules in Europe that are implemented right now. 

I think Drupal 8, and Drupal 7 of course, still have a lot of accessibility issues, but I’m really excited about the Accessibility initiative; a couple of weeks ago Mike Gifford came by our office to explain a lot about it, and it’s just really cool that they’re doing this. 

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

I think that would be organizing Frontend United - it is a non-profit and developer-first conference and it travels from country to country every year. Its origins lie in the Drupal community, because a lot of events like ‘Camps and ‘Cons are really focused on the backend, and Frontend United is really focused on - of course - the frontend. 

I’m organizing it for 3 editions now, starting in 2018. For two years it was in Utrecht and this year it will be in Minsk in Belarus. What we try to do is to make it a really pleasant experience for everyone. 

So as a team we did a workshop about inclusion and diversity, we updated our code of conduct, we tried to invite a very diverse group of speakers, and we also hoped to unite more people with very different backgrounds, for example, by keeping the ticket costs very very low if you compare them with other front-end conferences.

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

Similarly to Frontend United - the initiative I want to highlight is Frontend Re-United, that’s a new concept we tried in 2018, initiated by Mathieu Spillebeen

The idea was to invite a lot of front-end experts of the world to Utrecht back then for our Frontend United conference, and we streamed all those sessions to other parts of the world, to make it more accessible for people who don’t have the financial status to come to Europe. 

So the “re” in “re-united” is referring to “remote”, and the idea was that local communities in Africa or Asia created a kind of meetup with local sponsors and the local community, and, no matter the time difference, we just live streamed the sessions, so they could watch them as the same time as we did in Utrecht back then. Or, if the timezones didn’t match at all, they could watch a recording and add local speakers to the line-up to create a schedule that did suit them.

We started out in 2018 with 4 locations, and last year we tried it again and we tried to improve it a little bit and we ended up with 14 remote locations. A lot of them have now updated their local communities and they organize meetups on a regular basis .

We helped strengthen their local communities and that’s a really good thing; we built bridges between multiple cultures and shared knowledge worldwide. All credit goes to Mathieu, it was his idea! 

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

Beyond Drupal? That’s really hard! I used to make websites in my spare time when I was younger, and somehow I stopped doing that when I went to college. 

But since I turned my hobby into a career I spend a lot of time behind the computer, and I’m building websites during office hours, I’m building websites in my personal time, so I want to make sure that I exercise a lot and stay healthy. 

So, I joined a local women’s soccer team a couple of months ago. I’ve not been notified by the FIFA yet, but, you know, I’ll keep dreaming. 

That has been a really good thing for my health. I also met a lot of interesting people that are not developers, and there are a lot of interesting insights into websites and design and just into the work on the web other than from the developer perspective, and it was really really nice.

I would also like to take advantage of this moment to put my LimoenGroen colleagues in the spotlight. A big thank you to you all, teammates, for helping me grow as a developer as well as a person! 

Photo credit goes to Peter Lieverdink (cafuego)

Jan 30 2020
Jan 30

Recently, we were asked if we could integrate some small, one-page websites into an existing Drupal website. This would not only make it easier to manage those different websites and their content, but also reduce the hosting and maintenance costs.In this article, I will discuss how we tackled this problem, improved the content management experience and implemented this using the best Drupal practices.

First, some background information: America’s Promise is an organization that launches many national campaigns that focus on improving the lives and futures of America’s youth. Besides their main website (www.americaspromise.org), they also had separate websites and domain names for some of these campaigns, e.g. www.everyschoolhealthy.org.

We came up with a Drupal solution where they could easily configure and manage their campaigns. Next to having the convenience of managing all these campaigns from one admin panel, they could also reference content items easily from their main website or other campaigns by tagging the content with specific taxonomy terms (keywords).

We created a new content type “Campaign” with many custom paragraph types as the building blocks for creating a new campaign. We wanted this to be as easy as possible for the content editors, but also give enough freedom where every campaign can have their own branding, by selecting a font color, background image/color/video.

Below are some of the paragraph types we created: - Hero - Column Layout - WYSIWYG - Latest News - Newsletter Signup - Twitter Feed - Video Popup - Community Partners - Latest Resources - Grantee Spotlight - Statistics Map - Partner Spotlight - Media Mentions

These paragraphs offer lots of flexibility to create unique and interactive campaigns. By drag and drop, these paragraphs can be ordered however you’d like.

Below is a screenshot of some of these paragraph types in action, and how easy they can be configured on the backend.

Every School Healthy paragraphs

Below you can see how the “Hero” paragraph looks like in the admin panel. The editor enters a tagline, chooses a font color, uploads a logo, an optional background image or video, and a background overlay color with optional opacity.

Campaign Builder Hero Backend

As you can see in the above screenshot, this is a very basic paragraph type, but it shows the flexibility in customizing the building blocks for the campaign. We also created more complex paragraph types that required quite some custom development.

One of the more complicated paragraph types we created is a statistics map. America’s Promise uses national and state statistics to educate and strengthen its campaign causes.

Campaign Builder Statistics Map

The data for this map comes from a Google Sheet. All necessary settings can be configured in the backend system. Users can then view these state statistics by hovering over the map or see even more details by clicking on an individual state.

Campaign Builder Statistics Map Backend

Some other interesting paragraph types we created are: - Twitter Feed, where the editors can specify a certain #hashtag and the tweets will display in a nice masonry layout - Newsletter Signup, editors can select what newsletter campaign the user signs up for - Latest News/Resources, editors can select the taxonomy term they want to use to filter the content on

Time to dive into some of the more technical approaches we took. The campaign builder we developed for America’s Promise depends on several Drupal contrib modules: - paragraphs - bg_image_formatter - color_field - video - masonry (used for the Twitter Feed)

Font color and background image/color/video don’t need any custom code, those can be accomplished using the above modules and configuring the correct CSS selectors on the paragraph display:

Campaign Builder Hero Display

In our custom campaign builder module, we have several custom Entities, Controllers, Services, Forms, REST resources and many twig template files. Still, the module mainly consists of custom field formatters and custom theme functions.

Example: the “Latest News” paragraph only has one field where the editor can select a taxonomy term. With a custom field formatter, we will display this field as a rendered view instead. We pass the selected term as an argument to the Latest News view, execute the view and display it with a custom #theme function.

Conclusion

By leveraging the strength of paragraphs, other contrib modules and some custom code, we were able to create a reusable and intuitive campaign builder. Where the ease of content management was a priority without limiting the design or branding of each campaign.

Several campaigns that are currently live and built with our campaign builder: - Every School Healthy - The YES project - How Learning Happens

Could your organization benefit from having your own custom campaign builder and want to see more? Contact us for a demo.

Jan 29 2020
Jan 29

As I prepare to begin the year of recording ahead of me, I realize I haven't published an official 2019 year-end report, so here are last year's highlights:

  • 769 sessions were captured by the initiative, with an overall capture rate of 94.46% (down from 96.12% last year)
  • Of those, 93 were captured by others with either rented kits or a new equipment hub, for an overall capture rate of 79.49% (down from 83.33% last year)
  • Total session captures to date: 2,093 (and every one of them on drupal.tv)
  • Kits were shipped to 5 events (up from only 2 last year)
  • The list of trained recording volunteers is up to 26 people with varying levels of experience
  • I learned of at least two non-Drupal events that used the github docs to successfully record their content
  • I traveled to an all-time high of 15 events
  • I recorded DrupalCon Amsterdam...I'll just stop right there

I hope to publish a more in-depth update soon, specifically tracking against the roadmap as well as what's in store for 2020.

Thanks for all your support!

(Photo credit: Illek Petr)

Jan 29 2020
Jan 29

There’s much to reflect on from 2019 as the Drupal Association (DA) accomplished many organizational goals while also welcoming big leadership changes and supporting the evolution of Drupal as a product and project. 

We draw our strength from a global community of Drupal enthusiasts and are proud of the progress, innovation and momentum that encompassed 2019.

“We are grateful to have a wide variety of Drupal Association members and advocates — government, nonprofit, education, corporate, and individuals — who support our mission, and in turn the Drupal project,” says Heather Rocker, Executive Director of the Drupal Association. “We spent a great deal of time in 2019 focused on how we can best collaborate with current and potential stakeholders. Partnerships and collaborations create an atmosphere where Drupal is growing and better recognized, which is a win-win situation.”

Last year, the DA continued to support the global Drupal ecosystem via special events, marketing and outreach, engineering, technical and corporate partnerships, and open source advocacy.

This is an overview of these bodies of work, as well as a glimpse of the roadmap for the continuation of projects, goals, outreach and involvement. 

High-level accomplishments 

Much of our time and resources were allocated to producing multiple DrupalCons. First, in an unprecedented fashion, we announced the next four years of DrupalCon North America locations and dates.  

all attendees at DrupalCon Seattle
DrupalCon Seattle 2019. Photo by Rob Shea. 

In April, we hosted DrupalCon Seattle, which included tailored experiences for Content & Digital Marketers, Agency Leaders and Drupal End Users. High attendance reflected the interest in this approach of uniting those who use Drupal in different capacities. We awarded 10 scholarships and 12 grants — more than ever before — in order to have a cross-section of contributors in attendance, from nearly every continent. In conjunction with DrupalCon Seattle and DrupalCon Amsterdam was the International Splash Awards, recognizing the best uses of Drupal. The Splash Awards were spearheaded by a steering committee out of Europe. This Committee continues to share thought leadership and expand the reach of Splash Awards to local events and camps throughout the world.

The DA, to better support the international community, established a partnership with the European firm Kuoni Congress and together — with a powerhouse team of volunteers — hosted DrupalCon Europe in Amsterdam, with 1,500 attendees October 29-31, 2019. The DA team was onsite attending sessions, connecting with the community, and signing up new members! Following the success of the event, the partnership with Kuoni was renewed. 2020 will feature DrupalCon Europe in Barcelona, September 14-17.

Before looking to September, mark your calendars and buy tickets for DrupalCon Minneapolis, May 18-22, 2020. It’s a robust event in the making, with record-setting scholarship applications and awards; more than 750 session proposal submissions, more than 90 volunteers assisting with program development, industry summits, trainings to assist with migrations, and access to content not often found at local camps. Register before the rate increase on March 31, 2020.   

DrupalCon is one of the more visible activities the Drupal Association champions each year, but it is far from the only. Another key responsibility is to maintain the home of the community: Drupal.org — and to keep it thriving. 

We achieved a major 2019 milestone in our partnership with GitLab, migrating all of the backend git repository and code viewing tools. We know the community has been waiting on merge requests, a feature which should be coming in the first half of 2020. 

To serve our community, we have to have insight and understanding, which is why we undertook several initiatives to improve our data and visualization. At DrupalCon Seattle we shared demographic information about our community, which we use to track our success on diversity, equity and inclusion efforts. We also updated the project usage visualizations on Drupal.org to provide more insight about versions of Drupal core and contrib modules.

At the DA, we can't forget that the vast majority of users we serve are the anonymous visitors to Drupal.org who aren't yet fully engaged with our community, and might be learning about and evaluating Drupal for the first time. As such, we spent some time refreshing the tools for Drupal case studies, and created new Drupal Feature pages to tell the best stories of Drupal's successes. All this content, and the tremendous content created by the community participants in the Promote Drupal initiative, helps evaluators understand how Drupal can solve their unique business needs, and grows our community.

Drupal.org Case Study page

Throughout 2019, we worked with the Drupal core maintainers. Each month we meet to collaborate on infrastructural needs and key initiatives, and to support outreach for programs like the Minor Release Beta Testing program. As Drupal itself becomes more tightly integrated with cloud services that the Drupal Association maintains — like the updates system, the translation service, and Composer endpoints — our collaboration with the Drupal core team has been closer than ever. This culminated in the completion of the Composer Initiative, improving Composer-readiness for all users of Drupal in version 8.8 and above.

In fact, it's not just collaboration with Core, but with the whole Drupal community and beyond that drives our work. 

With the contributions of the community we were able to make small but powerful enhancements to the tools the community uses every day: from automatically generating a table of contents on each Documentation Page to allowing users to specify their pronouns, primary language, and location next to their issue comments — promoting greater empathy and understanding. That gave us something to be proud of, when the Drupal Association celebrated Pride Month with a rainbow logo, blog post and social media posts.

Drupal Association rainbow pride month logo

In collaboration with the Security Working Group and the Drupal Security Team, we continued to build out the structure of the new Drupal Steward program, an initiative we hope to see come to fruition in 2020. 

Perhaps our most significant collaboration of the year was with the European Commission. Because the EC is a major user of Drupal to serve the member states of the European Union, and a strong contributor to the Drupal project already, we were thrilled they chose to sponsor the Automatic Updates Initiative for Drupal. Phase one of that initiative was completed in December, and we're excited to see who we can collaborate with on the next phase in 2020.

Drupal has always been a community-driven project, and the work above illustrates how Drupal Association initiatives are no different. That's partly why we ended 2019 by announcing the formation of a Contribution Recognition Committee; to help us improve the ways we recognize both individual and organizational contributions to the project. 

Changes to Drupal Association Leadership

In 2019 the Board of Directors took the important step of appointing a new DA Executive Director, Heather Rocker, who began in May. The annual community election resulted in appointment of Leslie Glynn as at-large member of the board, and four additional board members were appointed: Grace Francisco, Lo Li, Owen Lansbury, and Ryan Szrama
“We’re excited to have these individuals join us in our efforts to broaden our reach into diverse communities and to grow Drupal adoption. They bring a range of experiences and expertise to the Association that will enhance our opportunities to reach new audiences, support the Drupal community, and elevate the Drupal project around the world,” said Adam Goodman, DA Board Chair.  We also thank board members completing their board service in 2019, including Jacob Redding, Mike Lamb, and Annie Miller. 

Achievements and “Firsts” 

Community outreach is a cornerstone of the DA. In 2019, the DA supported creation of the Event Organizers’ Working Group, with the mission of supporting community-led teams to grow Drupal through local events.  Local Drupal Associations around the world formed, including: Colombia, Burkina Faso, India and the beginnings of one in the United Kingdom. DA staff led meetings at Drupal events to unite volunteer groups, such as the resulting Drupal Pitch Deck team.
The DA also awarded member-funded grants to facilitate events, including the inaugural Flyover Camp 2019 and DrupalCamp Goa.

tweet about flyover camp with group photo

Drupal Association staff members were featured speakers at multiple events, including: Rachel Lawson at DrupalCamp Goa - India, hosting the keynote panel at Drupal Mountain Camp in Switzerland, and Heart of Clojure in Belgium; Neil Drumm at DrupalSouth in Australia; and Heather Rocker at DrupalCamp Atlanta. Staff also engaged with attendees at GovCon and OSCON.

The Drupal Association expanded its network of Supporting Partners, adding 15 new organizations and renewing 110 annual supporting organizations. As Supporting Partners, organizations that benefit from Drupal have the opportunity to financially support the ongoing maintenance and acceleration of the project. Not only do they fund the work mentioned above, they receive exclusive benefits that increase their visibility and support their bottom line.  Benefits include: DrupalCon discounts, featured content on Drupal.org, access to exclusive roundtables/summits, and positioning as trusted thought leaders and good citizens of the Drupal community. In 2019, Drupal Association Supporting Partners stayed up to date on important project news and collaborated with the DA and peers through quarterly informative webcasts, as well as roundtable meetings at DrupalCons.

2019 also saw a refreshed focus on Individual Membership in the Association—and pride in membership, as seen in the interactive campaign:

multiple drupal association members with photos and quotes

Drupal Jobs is the official jobs site of the Drupal Project and Drupal.org. In 2019, the DA added more value for employers looking to hire Drupal Talent; in addition to the listing on the Drupal Jobs site, we began maximizing visibility with job posts across our social media channels — a combined audience of 100,000+ followers. 
There were several DA promotional “firsts” as well: 

  • First participation in National Digital Inclusion Week Social Media campaign
  • First ‘Giving Tuesday’ participation & custom trivia challenge
  • First Educational Opportunities newsletter delivered quarterly

Looking ahead

The journey continues with much of the DA’s focus in 2020 on the release of Drupal 9. Now that Drupal itself is 19 years old(!), we are uniquely positioned to celebrate this release as a significant step forward in the CMS landscape for Drupal.  

The last 5 years of Drupal 8 have been transformative to the project, and the risks taken and the changes made in how Drupal is built have all culminated in what is shaping up to be an incredible Drupal 9 release. 

With Drupal 8, the project switched to semantic versioning and a rapid, six-month cycle of new feature releases. Our new guidelines around backwards compatibility and code deprecations have made Drupal continually relevant, yet ensured that it remains stable and well-supported. And best of all, these changes together mean that the upgrade to Drupal 9 will be a simple one. 

That's the story we’re telling in 2020; the best way to get ready for Drupal 9 is simply to keep up with the latest releases of Drupal 8. This next major release will be easier for every stakeholder — and for site owners, upgrading to Drupal 9 will require far less effort than upgrading to Drupal 8, which is the true celebration!

There are other engineering initiatives underway in 2020 as well. We want to enable merge requests for Drupal code repositories. We're also hoping to continue the work we did on the Automatic Updates Initiative, and are seeking new partners to help move that forward. And we're always collaborating with the community, making small tweaks and usability improvements. 

In 2020 the DA is striving to make diversity, equity, and inclusion a focus in our work. Staff will participate in an internal equity assessment of our systems and programs resulting in a DE+I workplan, as well as ongoing education on diversity, equity, and inclusion. Additionally, DA’s leadership team will begin to develop external programs with the goal of welcoming more people from underrepresented groups into the Drupalsphere.

stickers promoting Drupal 9
Let's publicize Drupal 9 together! Please share your ideas about promoting Drupal 9

Thanks to so many individuals & organizations

We extend a hearty thanks worldwide to all the volunteers who work with us in so many capacities, and to the Drupal Association Supporters, who make it possible for us to work on all the aforementioned projects and plans. We are grateful to have a community centered around education, collaboration, and action.

Thank you all for being an essential part of our collective journey! Dries recently said this about the DA, and we believe it extends to our members:

“I've been impressed with how the Drupal Association keeps growing in its role and its impact on the Drupal project. You're working on so many important projects at the same time, and you do it with such passion, commitment and a big heart.” 

Jan 29 2020
Jan 29

Aesthetic and engaging website navigation menus largely define your site’s success. They help your visitors easily get from point A to point B and finally reach point C — a conversion!

If your site is built with Drupal, you are in luck. There are plenty of modules to build modern navigation menus and improve your website navigation. We will see how to create a very attractive website navigation design with one of them — the Menu Item Extras Drupal module.

Best practices for website navigation design

Website navigation menus bring you the most value if they are built in accordance with the best design practices. Here are some of them.

  • Make the purpose of the menu links clear

It should be obvious to your website’s visitors at a glance what they will get when they follow a particular menu link. To achieve this, you can use descriptive labels written in simple, user-friendly language, or use icons and similar design elements to enhance the visual effect.

Example of good website navigation design

  • Limit the primary menu to 7 options

Avoid clutter in your links so your users do not get overwhelmed by choices. Of course, it depends on your website, but the optimal UX design recommendation is keeping the primary navigation under seven items.

  • Make the navigation menu stand out visually

Your website’s primary menu should have a design that captures your users’ attention. Use good contrasts, clear fonts, visually enhancing icons and images, and more to achieve this.

Example of engaging website navigation design

  • Put the navigation menu in an expected place

The main navigation menu should be located in a visible and obvious place where visitors expect to see it. This is usually the top or left or right top of your website’s pages. Footer navigation is popular as well.

  • Take care of mobile navigation

Make sure your navigation is designed to be as easy-to-use on mobile devices as it is on desktops. With limited screen space, they usually have a design of a hamburger, flyout, off-canvas menu, etc. It’s best to use responsive navigation menus that adapt to different device screens.

Better website navigation design with Menu Item Extras Drupal module

At least some of the above best practices for navigation menu design can be fulfilled by the Menu Item Extras module in Drupal. With it, the purpose of your links can be made clearer, and your navigation can stand out and catch your Drupal website visitors’ eye.

The Menu Item Extras enables you to add extra fields to your menu items. This means that ordinary navigation links can have a richer design thanks to adding other elements as Drupal fields (related images, icons, background images, etc.)

Drupal Menu Extras module

Enabling the Menu Item Extras Drupal module

When installed, the Menu Item Extras module also brings with it another module — the Menu Item Extras Demo Base. So while enabling the main module, you can optionally the additional one, too, if you need an illustrative sample for your Drupal website navigation design.

Enabling the Drupal Menu Extras module

Adding an image field to a navigation menu

We can now add any field to any desired menu that we can select in “Structure — Menus” (Main navigation, Footer, User account menu, some custom menu, etc.). Field management works the same way as in Drupal content types. Let's add an image field.

Creating an image field for a menu link in Drupal

We can also manage its display to configure how it will look to our users — for example, hide its label and choose a special image style to give a consistent design to all images.

Configuring an image field for a menu link in Drupal 8

Adding menu links with images

And now, when we add a menu link, it will have a new field for an image. Let’s add a few links like this to our Drupal website’s Main Navigation. We specify the link title, existing content URL, make sure the parent link is the one we need (Main Navigation), and add an image.

Adding menu links with images

Let’s check the website’s front page now and see how our main navigation design looks. Now it is enriched with images and is much more enticing for visitors. It’s hard to resist clicking!

Navigation link with images thanks to the Menu Item Extras Drupal module

Of course, this is just a rough sketch that will look better after the navigation design is brushed up with good front-end experts.

See a video about adding images to navigation menu items with the help of the Menu Item Extras Drupal 8 module.

[embedded content]

Order a professional website navigation design

The options for site navigation designs are endless. Let our Drupal development and UX design experts create the website navigation design that will attract your potential customers and lead them confidently throughout your website. Contact us!

Jan 29 2020
Jan 29

tl;dr: Subscribe to my YouTube Channel; I'm going to start migrating this website to Drupal 8 on a livestream every Tuesday at 10 a.m. US Central (3 p.m. UTC).

Ever since Drupal 8 was released, I've been waffling on the decision to migrate/upgrade this website (JeffGeerling.com) to Drupal 8. The site started off years ago as a static HTML site generated by Thingamablog, a really old Java-based static blog generator.

In the years since, I migrated from Thingamablog to Drupal 6, and from Drupal 6 to Drupal 7. Each of these migrations also incorporated a complete redesign, and I did another semi-redesign halfway through the Drupal 7 lifecycle, to the design you see today:

JeffGeerling.com - dark mode in 2020 in Drupal 7
Dark mode ftw!

I've written a bit about Drupal 8's successes and failures on this blog, and I'm still undecided about how I see Drupal's long-term success as a platform—especially for simpler sites like mine, which are not über-huge monstrosities with hundreds of content types, taxonomies, media styles, etc.

But I do see this site as a decent fit for Drupal 8's content model, and there is an upgrade path for every feature I currently use—though some might be a little different in implementation than Drupal 7!

Starting on Tuesday, February 4th, at 10 a.m. US Central (3 p.m. UTC), I will be live-streaming the migration of JeffGeerling.com from Drupal 7 to Drupal 8. Make sure you subscribe to my YouTube channel so you can get notified when the streams begin. I don't know how long the whole process will take, but hopefully after a couple months of hour-long sessions I'll have something to show for it :)

The first stream, my plan is to get the new Drupal 8 project set up on GitHub, build out the very rough initial Drupal 8 site, set up some form of CI so I can have at least basic tests for the migration, and then see where to go from there. Future streams will work on building the new site's structure (content types, mostly), writing and testing the content migrations, upgrading the theme from PHPTemplate to Twig, and incorporating Hosted Apache Solr for site search.

The first live stream will be on YouTube, or you can watch it here:

[embedded content]

Jan 29 2020
Jan 29

Preston is a product strategist, developer advocate, speaker, and author of Decoupled Drupal in Practice (Apress, 2018).

A globally recognized voice on decoupled Drupal and subject matter expert in the decentralized web and conversational design, Preston is Editor in Chief at Tag1 Consulting and Principal Product Manager at Gatsby, where he works on improving the Gatsby developer experience and driving product development.

Having spoken at over 50 conferences, Preston is a sought-after presenter with keynotes on five continents and in three languages.

Jan 29 2020
Jan 29

Preston is a product strategist, developer advocate, speaker, and author of Decoupled Drupal in Practice (Apress, 2018).

A globally recognized voice on decoupled Drupal and subject matter expert in the decentralized web and conversational design, Preston is Editor in Chief at Tag1 Consulting and Principal Product Manager at Gatsby, where he works on improving the Gatsby developer experience and driving product development.

Having spoken at over 50 conferences, Preston is a sought-after presenter with keynotes on five continents and in three languages.

Jan 28 2020
Jan 28

The DrupalCon Minneapolis registration system was configured to include all information provided by the registrant in the confirmation message to both the billing and registrant contact in the system.

Jan 28 2020
Jan 28

No wonder, the proliferation in the number of websites surfacing on the internet has stimulated the industrial groups to look out for alternatives to grab users' attention. In fact, a survey by Forrester stated in one of its reports that enterprises, on average, have to handle 268 customer-facing websites; which is enormous!

Consider a situation where several thousands of people are scattered over various geographical locations, working relentlessly to manage sites and deliver exceptional user experience.  

However, to manage even a small website change, a team of technically-sound people is required to oversee each of the alterations across its entire portfolio of sites, which with all probablity can turn disastrous!

Thus, to address these needs, Drupal offers its multisite configuration feature. Out of many benefits that multisite architecture offers, one of them is probably its easy configuration to set up and maintain.

The amalgamation of added features and simplified administration would be a winsome move for anyone wanting to set up and administer a multisite arrangement. This blog will help you understand the reasons for choosing Drupal multisite functionality-

Benefits of Using Drupal Multisite Architecture

Drupal’s multisite feature makes it a propitious pick for enterprises. Here’s why-

1. Maintenance and Security

With the proliferation in the variety of technologies or setup implemented, the complexity of maintenance and security has also seen an unanticipated upsurge. Given that, the Total Cost of Ownership (TCO) of maintaining an online marketing presence and communication tools goes up to the whole other level. In such scenarios, keeping up a single CMS to ensure its security and maintenance is advantageous.

2. Content Management

The time-saving benefit of Drupal multisite functionality applies to content management also. In a multisite setup, a single content editing interface can update multiple websites and content pieces with just one update.

Content management can be aligned and made easier by publishing content to many domains or across sites with one content entry or modification. 

3. Easily Create and Configure New Websites

Within Drupal multisite solutions, there are features implemented specifically for admins, by which, without the need of developers and their support, they can create and configure new websites. Admins can now, for instance, style these websites also via custom themes or drag and drop page elements.

Capitalizing on such tools makes the return on investment for multisite setup more attractive since those tools make creating a large diversity of website types easier while decreasing the need for technical IT development services.

A multisite setup can, therefore, reduce both the cost (maintenance, development) and the time-to-market and content management efforts of websites and their content.

4. Standardization

Multisite systems can also prove beneficial for marketing departments and management, who struggle every day to get everyone on the same page and adhere to the brand guidelines in the organization. 

Contrary to the above scenario, a multisite environment enforces everyone across the organization to work within the structured tools and templates, thus making sure all content management takes place within the defined limits, and also the corporate branding guidelines specified in the theme templates are met. If done right- these decentralized departments may even gain more and better features than they would have developed on their own.

5. Each Site Can Have Its Own Theme & Features

A multisite using the same codebase does not imply that you are restricted to choose the same layout, design, and features. Rather you can install a unique theme and add whatever plugins you’d like to implement as per your requirements.

Simply put, all the sites are built using a single codebase which naturally gives users access to all of the themes and modules deployed. They can also turn them on/off depending on the needs of the particular site. 

Thus, dev teams can focus on building components and features for a community of sites. As a result, it will give an organization a powerful shared library of reusable integrations, functionality, UI components, and workflows.

The Domain Access Module

Managing a database of every single site that has been created (say 11) without the multisite feature can prove to be an exhausting task.

That’s why Drupal has developed the Domain Access module which helps in consolidating all the individual databases to a single central database. The centralized database enables users to share content, tools, and site features across all sites while simultaneously being able to change the appearance of each site. 

Besides, a single database is easier to manage, upgrade, and makes the perfect solution if all sites serve a similar function.

 

But as there are pros and cons of everything, so does Drupal multisite have. Below mentioned are the challenges of using Drupal Multisite-

1. Heavy Maintenance Required

Using Drupal for multiple sites with each serving different purposes and functions means you’ll have to manage and update each database separately. The Domain Access module won’t be helpful in such a case as every site is different and so their databases would. 

Further, running websites with different functions and different versions of Drupal is a veil of tears when it comes to updates and general site management from a single dashboard. 

In fact, Drupal multisite poses as a hindrance rather than a help.

2. Restricted Innovation and Flexibility

Deploying a single codebase makes maintenance a bit easier for developers, however, it also restricts innovation. For instance, if marketing teams want to develop an interactive microsite, then the developers would have to make a lot of adjustments to the single codebase (a time-consuming process) just to allow your marketing team to create one microsite that has the desired interactive features.

3. Single Point Of Failure

The sole responsibility and dependence on a single codebase to operate multiple sites can cost you exorbitantly on the failure of the code due to even a single flaw. If your Drupal platform is not regularly kept up-to-date, then your multisite is extremely vulnerable to cyber-attacks.

4. Traffic Handling

If one of your Drupal sites experiences a huge spike in web traffic, then it can potentially impact the performance of other sites. That’s because of the hosting resources which would be hogged by the site attracting a lot of traffic.

 

Know more about Drupal multisite functionality from here

Is Drupal Multisite Right For Your Business?

Follow this golden rule to know whether your enterprise should use Drupal multisite platform or not-

  1. If the sites have similar functionality (for instance, if they use the same modules or same Drupal distributions) do it.
  2. If the functionality (across sites) differs, don’t use multisite

Generally, all modern enterprises and even most of the medium-scaled companies fall into the second category as each site is bound to vary in functionality in one way or another.

If your organization wants to deliver innovative marketing solutions and campaigns (interactive microsites), then Drupal’s multisite feature will enforce a lot of bottlenecks on your marketing team.

However, if most of your sites are composed of static pages that perform similar functions, then Drupal could prove a viable option.

From an IT and development perspective, maintaining Drupal multisite is quite difficult. The question that enterprises need to ask themselves is, does their organization possess enough resources to regularly update and maintain the system- as well as preparing for the inevitable migration process for every single one of your sites?

While there are several different issues that should be considered before opting Drupal’s multisite feature, here are some common reasons why site builders choose it-

  1. Users use multisite to create clone sites for others. (Single codebase, same features, and functionality except for the theme which varies site to site.
  2. Multisite is used by enterprises to host various interrelated sites, like a university with umpteen departments that all mostly need the same features, apart from some who need special things (shared core, shared module profile, with different sites having different custom modules).
  3. Sometimes multisite is used to upgrade a module on just one of the multiple sites to test out the upgrade so that one site has a newer version of the module than the other sites.
  4. Multisite is also used to economizing per-codebase hosting expenses either via upfront provider costs or because of difficulties provisioning and managing the hosting-in house.
  5. Multisite also decreases resource usage. Running the multiple sites that all share a single opcode cache is comparatively efficient.
  6. Multisite allows enterprises to quickly spin up a new sub site to work on a specific issue.

Summing Up

The primary function of any enterprise should be to find out whether they can leverage Drupal’s multisite feature or not, based on their requisites.

Multisite is an advanced proven site architecture that might not be as troublesome as it seems. Embracing the multisite platform can assist enterprises in delivering better and faster digital experiences. 

Contact us to learn more about the best multisite platform that can work wonders in your business environment.

Jan 28 2020
Jan 28

Testing is becoming an essential keyword and toolkit for developers and development teams who seek to architect and implement successful and performant websites. Thanks to the unprecedented growth in automated testing tools and continuous integration (CI) solutions for all manner of web projects, testing is now table stakes for any implementation. That said, many developers find automated testing to be an altogether intimidating area of exploration. Fortunately, when paired with a development culture that values quality assurance (QA), you can focus on adding business value instead of fixing issues day in and day out.

Three years ago, Yuriy Gerasimov (Senior Back-End Engineer at Tag1 Consulting) gave a talk at DrupalCon New Orleans about some of the key ideas that Drupal developers need to understand in order to implement robust testing infrastructures and to foster a testing-oriented development culture that yields unforeseen business dividends across a range of projects. In this four-part blog series, we summarize some of the most important conclusions from Yuriy’s talk. And in this third installment, we’ll take a closer look at two of the most essential parts of any testing toolkit: unit testing and functional testing.

Unit testing

Unit testing is a particularly fascinating topic, not only because many developers already know what user testing entails, but also because it enjoys a range of possible technologies that are readily available and that development teams can easily leverage. After all, unit testing is a commonly taught concept in universities. In its most reduced form, unit testing refers to the verification of a feature’s robustness by feeding it a variety of arguments, all of which test the limits of what is possible within the feature. Drupal developers, for instance, have access to a variety of unit tests for both core and contributed modules. And the best part of unit testing is that you can test functions and classes in isolation rather than evaluating large parts of the code.

The most optimal locations for unit tests are functions that are responsible for calculating some result. For instance, if you have a function that receives a set of arguments and that performs a series of calculations based on those arguments, you can feed unit tests arguments that evaluate whether the function works for a variety of possible inputs.

Unit tests as documentation

This also reveals one of the most interesting characteristics of unit tests. Because unit tests are focused on stretching the outer limits of what functions are capable of, they are also a convenient source of robust documentation. Yuriy admits that when he downloads external libraries for the first time in order to integrate them with his existing code, he often scrutinizes the unit tests, because they indicate what the code expects as input. When documentation is challenging to read or nonexistent, unit tests can be an ideal replacement for developers seeking to comprehend the purpose of certain code, because the unit tests are where developers ensure that logic operates correctly.

As an illustration of how unit tests can yield outsized benefits when it comes to well-documented code, consider the case of Drupal’s regular expressions. In Drupal 7, the regular expressions responsible for parsing .info files, which are used across both modules and themes, are extremely lengthy owing to the myriad demands on the files. Regular expressions, after all, are easy to write but difficult to understand. Though we are privileged as Drupal developers in that Drupal breaks regular expressions into separate, assiduously commented lines, many developers in the contributed ecosystem will avoid taking this additional step. For this reason, Yuriy recommends that all developers write unit tests for regular expressions that parse critical input.

Writing testable code is difficult but useful

Unit tests help developers think in a very different way about how to write software in a legible and understandable way. In Drupal 8, for instance, the new dependency injection container is particularly well-suited for unit tests, because we can swap services in and out of it. If you work with a database as an external service, for example, you can easily mock objects and ensure that your services work for those mock objects successfully.

To illustrate this, Yuriy cites the real-world example of the Services module in Drupal 7, which originally consisted of classical Drupal code but was subsequently coupled with unit tests. Yuriy witnessed through his addition of unit tests that he was able to parse different arguments entering certain Services functionality or inspect how routing functioned. With unit tests, ensuring the security of functions is much easier, because they can help you determine all of the arguments necessary to the code so that a call to globals or static variables is rendered unnecessary. Though unit testing requires considerable effort, Drupal 8 makes the process much easier for developers.

And now, with the introduction of PHPUnit into Drupal testing infrastructures, it is now even easier to test your code. The biggest part that was added is the capability to use mock objects that are presently the industry standard for unit testing.

Functional testing

As the name suggests, functional testing analyzes how actual users will interact with your software from a concrete rather than abstract standpoint. If you have an unlimited budget for your project, you can test every single last page on your website, but this is seldom—if ever—feasible from the perspective of project budgets. Whereas unit testing only requires perhaps ten to twenty percent of your development time, functional tests will require several days to write and noticeably more effort to implement.

Selling functional testing

In many of Yuriy’s previous projects, he was able to sell functional testing to customers by justifying the need to ensure that the software would be functional irrespective of the time of day or night. His teams had particular success selling functional testing in commerce projects, because stakeholders in commerce implementations are strongly invested in consumers successfully checking out at all times.

Often, the most challenging aspect of functional testing in commerce projects is the credit card details that customers must inevitably provide to the commerce platform. If you have a testing environment with all possible payment providers, however, customers no longer need to check to make sure that the checkout functions properly while they are at home or at the office. Your clients can simply click a single button in the continuous integration (CI) server and witness for themselves that the user flow is functional or configure notifications so that they are issued solely when that process breaks.

Maintenance costs of functional testing

Functional testing requires considerable maintenance, because it is primarily based on the document object model (DOM) of your website rather than abstract code. If you modify something on the website, you will need to revise your functional tests accordingly, including the selectors that you are targeting with functional tests. Yuriy warns that many may operate under the misconception that functional tests only require a mere twelve hours of implementation, but due to the unique attributes of each project, functional tests may require several days to implement.

As such, automating the process of functional testing is of paramount importance. Yuriy suggests that functional tests should not be made difficult for developers and especially project managers who are concerned about project quality. And as with other types of tests, if functional tests are not run on a regular basis, they are of limited usefulness.

Tools for functional testing

Luckily, there are many tools available for functional testing, the most notable among them being Behat. The Behat ecosystem makes a variety of extensions available, but it is by no means the only functional testing solution available in the landscape. Other solutions exist in the software-as-a-service (SaaS) space, including Selenium, which records clicks and provides a more visual representation of functional tests. For this reason, Yuriy recommends Selenium for junior developers with less exposure to functional testing.

Nevertheless, functional testing can fall victim to the vagaries of project budgets, and prospective expense remains among the most important considerations for customers interested in functional testing. To account for this, it is essential to consider which user flows are the most critical to the success of your implementation and to provide the appropriate level of coverage for those components. It is also a good idea to discuss at length with your customer what outcomes they would like to see and to ensure that the user flows they consider most crucial enjoy adequate coverage.

Conclusion

Thanks to the dual innovations engendered by unit testing and functional testing, you can have both an abstract and concrete view into how your code is performing in terms of quality with little to no overhead. With unit testing, which ensures that each designated function works properly with a variety of inputs that stretch the limits of what it can do, you can protect yourself from potential security vulnerabilities such as a lack of input sanitization. Functional testing, meanwhile, allows you to perform automated trials of your implementation to guarantee that your users are traversing the experience you intend.

In this blog post, we explored the boundaries of what unit testing and functional testing can offer you when it comes to a modern testing infrastructure and test-oriented development culture. In the fourth and final installment of this four-part blog series, we turn our attention to two of the areas of testing experiencing some of the most innovation as of late: visual regression testing and performance testing. As demands on our implementations shift, it is increasingly more important that we understand not only when changes impact user experiences but also how they perform under realistic loads.

Special thanks to Yuriy Gerasimov and Michael Meyers for their feedback during the writing process.

Please check out Part 1 and Part 2!

Jan 28 2020
Jan 28

Due to the nature of B2B sales, one of my roles is cold outreach. Most of the time my first method of outreach garners no replies. However, every so often I will receive a prompt email message or reply over the phone. It usually goes something along the lines of: “We already have a web development agency.” or “We are not interested.” I often wish I was at a sit-down meeting when these situations arise. This is because I simply cannot describe the multi-faceted solutions Drupal can provide, far and above a typical web development agency. “You should absolutely stay with them” is my typical response to prospects that have an agency they are happy with. I say this because there is so much more Drupal, as a business solution, can provide without even interacting with the frontend of their website. What we often promote with Drupal is its capability to create a more complete digital experience platform (DXP), not just a website.

What Gartner has to say about the DXP

In a 2019 report, Gartner has this analysis about DXPs:

“Driven by digital transformation efforts, organizations are moving beyond the traditional audience engagement resources of websites and mobile apps. There is a growing acceptance of the idea of digital experience platforms as vital to these efforts. DXPs provide a scalable foundation for creating, optimizing, integrating, delivering and managing a range of digital experiences for different audiences, both internal and external.1”

So let me unpack that a little bit in my own words. Essentially, your website and mobile apps are still very much at the forefront of digital marketing. Moving forward, though, more organizations have and will continue to create a more cohesive, single platform (DXP) in order to cater to all stakeholders of the company. This not only includes said organizations’ customers but also their teams and employees, allowing for a more comprehensive snapshot of the company from the outside and inside. In the same report, Gartner estimates that:

“Through 2021, 85% of the effort and cost involved in a digital experience platform (DXP) program will be spent on integrations with internal and external systems, including the DXP’s own, built-in capabilities.1”

In my opinion, this assumption by Gartner indicates that organizations are already well aware of the advantages a DXP can provide. If you're interested, click on the banner below to read the report.

Click to access the Gartner report today

An imaginary business case for a DXP

Imagine you started a business selling gadgets. Your gadgets were better for target market X because they were less complicated than the gadgets that were available on the market at the time. So first off, you rented a storefront and sold the gadgets in your store, but you also realized you could scale your business by selling the same gadgets online. So in addition to your point of sale system (POS), you now had to adopt an appropriate ecommerce platform and build a website to sell the gadgets online.

Now that you were selling gadgets online you also had to have a shipping channel and a returns channel for replacing defective gadgets. As demand for your product began to grow you needed more gadgets on hand at any given time. The obvious solution was a warehouse, but you also needed a product information management (PIM) system to keep on top of your inventory and distribution channels.

As your product created a name for itself you opened a few more gadget stores and to satisfy demand across the globe you began selling your product through Amazon. With increased demand came competition, so in response, you invested in marketing software to stay on top of the industry trends. You began to diversify in order to make your business more resilient to market volatility. The diversification led to custom gadgets in addition to a gadget service and repair business.

In order to keep track of what your customers had purchased and to identify opportunities for cross-selling and up-selling, you invested in a customer relationship management (CRM) system. Finally, just under a year ago you invested in a new enterprise resource planning (ERP) system. This way all of your new departments had the information they needed to operate efficiently.

So we are now in the present day. Like many other businesses that grew at a rapid pace, you find yourself in a situation where all of your technology has become siloed. In this analogy, your data and information all exist, but it is locked away in separate silos. Each silo represents a piece of software, a distribution channel, a legacy POS system, or that missing Amazon integration that can only be accessed from one place. You can run a business this way, and many organizations do just that, without realizing that there is actually a more efficient way to do things. This is where the DXP comes into play. What you would prefer rather than individual silos would be a horizontal technology architecture with open lines of communication between everything. This, as one could imagine, can save a tremendous amount of time and manual workflows, eliminating what we call swivel-chair processes. Simply stated it is a more efficient way of doing business. The problem is many business owners and decision makers may not even realize this is happening because they live in their own silos and no one has pointed it out to them.

How does Drupal come into play?

Drupal is a content management system (CMS), but at the same time, Drupal can do so much more than a traditional CMS. Through API integrations, also known as API hooks, Drupal has the ability to be used as middleware. As middleware, Drupal can act as a modular engine that connects all the data from the aforementioned gadget business’ technology. Data can flow forwards and backward between the various pieces of technology and even integrate into legacy systems like the POS in the gadget example. Furthermore, the modular nature of Drupal middleware essentially future proofs your business allowing for business scalability.

Drupal as middleware example

To give an analogy, you can think of Drupal middleware as a computer with unlimited USB ports. The computer acts as the brain passing information back and forth between systems and the USB ports are the API hooks. USB ports are non-proprietary and you can, therefore, unplug cables you no longer need and replace them with new cables. You can also add or remove cables as necessary and the computer keeps on functioning as long as you configure the drivers. So as you outgrow software systems or you decide to replace that legacy POS, no problem because you can just plug in the new software, install the drivers, and you are back up and running again.

Connecting it all together

Read the full Gartner reportSo to return to my statement at the beginning of this blog post, the reason I wish I could sit down with those who respond so quickly to my first cold outreach is that I do not want to be typecast as just another web development agency. In actual fact, because our expertise lies in Drupal we are far better positioned to provide solutions that lay beyond the scope of the traditional idea of a website. Sure we can develop an incredibly robust frontend experience and, likewise, a flexible scalable ecommerce engine. But, we can also use Drupal as middleware that allows for seamless flow of information between systems.

If you've read this and would like to have a quick chat, let us know! We're happy to help. I also mentioned a Gartner report from 2019 that is a great introduction for anyone trying to nail down their digital experience platform. Gartner has made this report available to us to share with our readers for a limited time, so check it out now while you still can.

1 - Gartner, "Don’t Wreck Digital Engagement With Bad Deployment Decisions for Your Digital Experience Platform,” 31 July 2019, Gene Phifer.

Gartner does not endorse any vendor, product or service depicted in its research publications, and does not advise technology users to select only those vendors with the highest ratings or other designation. Gartner research publications consist of the opinions of Gartner’s research organization and should not be construed as statements of fact. Gartner disclaims all warranties, expressed or implied, with respect to this research, including any warranties of merchantability or fitness for a particular purpose.

Jan 28 2020
Jan 28

Almost all sites have some terrible content that needs to be migrated. As a lot has changed since the 90s, HTML is a thing of the past. Now, we require more than just a static site to win the online world. 

A huge portion of the content has been vested in the power of the internet. Studies show how a major chunk of revenue in terms of traffic is gained via sites and the quality of content on the sites. While we were focusing on the workings of the site, the game is in the court of ‘How well you present the content’ now. Addressing these changes, migrating your static site to a CMS is the best option. 

Often viewed as a complex and time-consuming task, migration is the real devil. However, there’s light at the end of the tunnel. Once executed, migration woes reap greater business benefits.   

Let’s understand how. 

two women amid discussion against office background

Static Content

When a site uses HTML, CSS and a little bit of JavaScript/jQuery for development, it becomes a static site in technical terms. The content on static sites remain the same across pages and seems more like a database than being of representative value to an organization. It does not take into account factors like the inputs of the visitors or user experience.

Dynamic Content

As the name suggests, a dynamic site is more complex yet user-friendly. It has elements like product pages, descriptions and more that helps in fetching the valuable feedback from the users. It has more elements to interact with and gives a visually better experience to the viewers. 

Difficulties with static content

Often we are suggested of using static content for smaller projects and depending on the requirements, it makes sense too. However, there are a few complications that can arise with it:

  • The initial workings of an HTML were not meant to manage complex arrangements of files. It was only for small budget websites with limited content. 
  • Making edits to the project like adding a new item to a navigation bar requires shuffling between too many HTML files. 
  • Similarly, if you want to make any change to the static content, you need to go through an entire process of the HTML files. 

Things to consider while moving the static site to a CMS 

In order to make sure that the transition to dynamic content is manageable, mobile-responsive, and accessible, consider these pointers beforehand: 

  • The amount of content (pages, images, posts, JavaScript files) you want to migrate 
  • If you want to retain the existing domain name 
  • The current URL structure 
  • Compatibility of modules of CMS with external services 

With these are in check, the next part is taking care of the requirements of migration: 

  • Evaluate the current website 
  • Import the structure, content and design from the static site 
  • Set up the CMS environment 
  • Back up of both the HTML and CMS 
  • Deal with broken links and other migration issues 

Why Migrate?

The subsequent important question to answer is - why at all should you take the pain of migrating your static site? 

Here’s why: 

  • You can easily manage the ever-growing content with a CMS and do away with the HTML pages. 
  • The two elements - Content and presentation - get separated and thus can be dealt with individually. 
  • The SEO gets sorted with a CMS as it addresses Meta Tags, URL Patterns and Sitemap.
  • The site owners and editors have full control over the display and architecture and do not remain dependent on developers 
  • The workflow of the content becomes better 
  • Uniformity for the entire site can be maintained 
  • Open Source CMSs like Drupal are more scalable for your business

Why switch to a CMS? 

Even if we are convinced that we should migrate, why CMS is a wise choice for it? Here’s why:

Your website, your terms 

Elements like uploading an image or content on a web page is a task with static sites built on HTML. Having a CMS like Drupal allows you to update and edit the content of your website without requiring a web developer. It will empower you to build a dynamic site with a better user experience that you can customise easily. 

HTML not required

Drupal as a CMS comes with a WYSIWYG editor (What You See Is What You Get). Thus, using a CMS to create blog posts, content on a new web page or make changes in the placement becomes super fun and easy.  

Easy redesigning of the website

The workings of the CMS separates the design from the content. In case you want to change the look and feel of the site, the old design can be replaced without hampering the content. 

User-friendly 

Even for the end-user, a site on CMS is much organized. It generates more traffic, thus more revenue from the audience. As a user-friendly platform, it gives easy access to the users for customizing the site. 

Drupal Migration Tools that can help

  • Core migrate API: Provides a framework for migration from Drupal 7 to Drupal 8 only.
  • Migrate Plus and Migrate Tool: Provides an option to migrate content from CSV, JSON, Excel and XML Files.
  • Migrate File: Movement of media resources to Drupal.

Conclusion

With these issues in mind, moving to a CMS seems to be a wise option. If you are planning to build a site majorly based on content or design, choose a CMS to have a hassle-free site and enjoy the editor experience for yourself. Open source CMS like Drupal gives you the freedom to design your own content without the hindrances from the development team. 

Still, confused? Reach out to our experts at [email protected] and know more about the CMS services.  

Jan 28 2020
Jan 28

Communicating with Google services is simple and effortless with a wealth of API’s to choose from. With Drupal 8’s powerful API-first capabilities, interacting with these services are now easier and more effective. The API in focus is the Google Directions API. Drupal 8 offers a Google Directions module that integrates with the Google Directions API. 

What does the Google Directions Module do?

The Drupal Google Directions module allows you to create and add a block to your content where users can add two locations and find directions between the two points. Also displayed are suggested routes based on modes of transport (public transit, cycling, walking or driving) and the time it will take to get there. This block can be positioned via the Block layout and customized to fit any website’s style guidelines.

Getting Started with Google Directions Module

Let’s get started with implementing the Google Directions module.

Get the Google API Key 

A Google API Key is required to access the Google Directions Service.
To get a key, visit https://developers.google.com/maps/documentation/directions/start with your Google account and follow the Guide.
To get an API key:

  • Visit the Google Cloud Platform Console.
  • Click on the project drop-down and select or create the project for which you want to add an API key.
     Google-maps
  • Click on the menu button and select APIs & Services  -> Credentials
Google-direction-module
  • On the Credentials page, click on Create credentials -> API key.
api key
  • The “API key created” dialog displays your newly created API key. Copy the API key as it must be configured in your Drupal Project.google-direction-module-api-key
  •   Select Close. The new API key is listed on the Credentials page under API keys.Google-direction-module-api-key

Enable the required APIs

  • In the Google Developer Console Dashboard, click on the menu button, select APIs & Services -> Librarygoogle cloud form
  • Search for and enable the following APIs

                   ○ Google Directions API

                   ○ Google Maps JavaScript API

                   ○ Google Places API

                   ○ Google Geocoding API

Installing

Install and enable the Google Directions module as you would normally install a contributed Drupal module. Use your preferred method to download the modules. I’m using the Composer to install since it automatically takes care of all the necessary dependencies and Drush command to enable the module.

[email protected]:/var/www/html/drupal_php$ composer require drupal/google_directions

[email protected]:/var/www/html/drupal_php$ drush en google_directions


Configuration

  • Configure user permissions as required in Administration -> People -> Permissions:       
               ○  Administer Google Directionsadminister google directions
  • Once Google Directions is installed and enabled and permissions are granted:
               ○ Visit /admin/config/services/google-directions to enter your Google API Key that we copied earlier.google-direction-setting
  • ○ Use the Block layout page (/admin/structure/block) to position the block in one or more regions to suit your use case for the Google Directions module.direction-module-visibility
  •             ○ For each block placement, configure Visibility and other block settings to suit your use case.
                ○ Click on Save Block and visit the page. The following Google Directions block appears in the region it was placed.
google module block

Good to Note : 


If the menu does not display, flush cache and try again.

  • In the block enter the locations in “From” and “To” fields and hit “Go”.
google direction blocks
Jan 28 2020
Jan 28

Load-testing is an essential best practice for Drupal 8 development. Quantifying how much traffic a site can sustain is critical information both during development and prior to launch. 

The reasons for doing so are significant and wide-ranging:

  • Determine hosting needs
  • Identify under-performing code
  • Test the efficiency of candidate contributed modules
  • Quantify how performance is impacted as content grows
  • Document pre-launch performance to facilitate future troubleshooting

 

Locust as a Load-testing Solution

Locust is a web-based, open-source tool. It was created to be easy-to-use via its user interface, while also being customizable via Python test scripts. For example, it allows for the ability to simulate multiple users concurrently submitting a Drupal webform multiple times. It can also run distributed tests with instances running on multiple machines.

 

Installing Locust

python3 -m pip install locustio

Install the "Beautiful Soup" python library to facilitate user login

python3 -m pip install bs4

 

Example Test Script

from locust import HttpLocust, TaskSet, between
from bs4 import BeautifulSoup

def index(self):
    self.client.get("/")

def about(self):
    self.client.get("/about")

def drupalLogin(self):
    # Get form build ID to pass back to Drupal on login.
    response = self.client.get("/user")
    content = BeautifulSoup(response.content)
    build_id = content.body.find('input', {'name': 'form_build_id'})['value']
    self.client.post("/user/login", {
        "name": "testusername",
        "pass": "testpassword",
        "form_id": "user_login_form",
        "form_build_id": build_id,
        "op": "Log in"
    })

def drupalLogout(self):
    self.client.get("/user/logout")

class UserBehavior(TaskSet):
    tasks = {index: 1, about: 1}

    def on_start(self):
        drupalLogin(self);

    def on_stop(self):
        drupalLogout(self)

class WebsiteUser(HttpLocust):
    task_set = UserBehavior
    wait_time = between(5.0, 9.0)

In this example, 5 users log in to Drupal and then each user accesses either the front page or the / about page every 5-9 seconds. The "Hatch rate" of 1 adds an additional use each second until a total of 5 concurrent users are actively running the script. This helps to simulate a more natural increase in traffic.  Finally, all users log out of Drupal when testing ends.

 

Running a Test

locust -f ./locust_test.py

Here is the UI form for initializing the test:

The UI form for initializing the test

Here is a screenshot of the data table this test produced:

Screen shot of the data the test produced

Here are PNG graph images generated by Locust during this test:

Graph showing the number of requests per second.

Graph showing response times.

PNG graph images generated by Locust during the test

Tests can also be run without the UI. This is useful for automation or for running tests in a remote environment:

locust -f ./locust_test.py --no-web -c 5 -r 1 -H https://target.domain

This approach has successfully been tested in a CentOS 7 environment.

 

Load-Testing in the Development Cycle

Since tests are fairly straightforward to write and run, it is feasible to perform load-testing throughout the development process.

Early in the development phase, tests could be more simple and generic. For example, visiting the front page, logging in, and logging out. These initial tests could be site-agnostic for reuse across multiple projects. Then, more site-specific tests can be added as the project takes shape,.

An approach for this might include load-testing directions within pull requests or, potentially, automation could kick off tests following a PR merge so a snapshot of performance is captured with each code change.

Next Steps

Locust is a simple yet flexible open-source tool for quantifying performance throughout the development cycle. Interested in load-testing or test-driven development for your Drupal 8 site?  Contact us today.

Resources

Jan 27 2020
Jan 27

The Drupal Association is proud to announce the 14 recipients of our 2020 community development scholarships and contributor grants.

Jan 27 2020
Jan 27

Using migrate in Drupal is a very powerful way to bring data into a Drupal application. I talked and wrote extensively on this matter here and elsewhere. Most of my examples use the CSV source plugin to illustrate migrations from CSV-formatted data. And if you are familiar with this source plugin, you know you have “configure” it by specifying all the file’s column names. Kind of like this (a very simple YAML array):

  column_names:
    0:
      id: 'Unique Id'
    1:
      column one: 'What this column is about'
    2:
      column two: 'Another column'

I wrote many many migrations from CSV files, of various sizes, but it took me years to finally utter the following out loud:

Can’t I just generate these stupid column names automatically instead of manually writing them every time?

As you can imagine, there can be files with 30 columns. And a given migration effort can even contain 20 migration files. So, a pain. I’m not the sharpest tool in the shed but finally my laziness got the best of me and decided to write a Drush command I want to share with you today. Also, I have not written anything in such a long time and I feel proper shame.

So what I wanted was simple: a command that I can run, point it to a file and it would print me the column names I just paste into the migration file. No fuss, no muss. Or is it the other way around?

So this is what I came up with.

First, in the module’s composer file, we have to add an extra bit to inform Drush about the services file used for Drush commands. Apparently this will be mandatory in Drush 10.

    "extra": {
        "drush": {
            "services": {
                "drush.services.yml": "^9"
            }
        }
    }

Then, we have the actual drush.services.yml file where we declare the command service:

services:
  my_module.commands:
    class: Drupal\my_module\Commands\MigrationCommands
    tags:
      - { name: drush.command }

It’s a simple tagged service that says that it should be treated by Drush as a command class that can contain multiple commands.

And finally, the interesting bit, the command class:

<?php

namespace Drupal\my_module\Commands;

use Drupal\Core\Serialization\Yaml;
use Drush\Commands\DrushCommands;

class MigrationCommands extends DrushCommands {

  /**
   * Generates the YAML representation of the CSV headers.
   *
   * @param $file
   *   The relative path to the file
   *
   * @command generate-migration-column-headers
   */
  public function generateYaml($file) {
    $spl = new \SplFileObject($this->getConfig()->cwd() . DIRECTORY_SEPARATOR . $file, 'r');
    $spl->next();
    $headers = $spl->fgetcsv();

    $source_headers = [];
    foreach ($headers as $header) {
      $source_headers[] = [$header => $header];
    }

    $yml = Yaml::encode($source_headers);
    $this->output()->write($yml);
  }

}

What happens here is very simple. We first read the file whose path is the first and only mandatory argument of the command. This path needs to be relative from where the Drush command is called from because we concatenate it with that location using $this->getConfig()->cwd(). Then we take the values from the first row of the CSV (the header) and we build an array that is in the format expected by the CSV source plugin. Finally, we output a YAML-encoded version of that array.

Do note, however, that the column description is just the column name again since we don’t have data for that. So if you wanna add descriptions, you’ll have to add them manually in the migration file. Run the command, copy and paste and bill your client less.

Hope this helps. Can’t believe I’ve been writing CSV based migrations since like the beginning and I just came up with this thing now.

Jan 27 2020
Jan 27

A ton of great sessions were submitted for consideration for MidCamp 2020, more than our schedule could accommodate. After reviewing all of the sessions and selecting our schedule we couldn’t be happier with the result. There is going to be something for everyone at this year’s MidCamp.

Training day kicks off the camp covering topics including Composer, A/B Testing, Drupal’s Migrate API, and Decoupling Drupal with Gatsby. Our two session days will include over 50 session slots covering (takes a deep breath) introductory topics, site building, layout builder, debugging, migration, accessibility, project management, case studies, design systems, prototyping, decoupling Drupal, and preparing for both Drupal 9 and the end of life for Drupal 7.

And if that isn’t enough, if you look closely you might find science fiction, legendary young wizards, and text based adventures sprinkled throughout. And that isn’t even including the wide-ranging and yet to be determined topics that will be part of the lightning talks that close out each session day.

We can’t wait to see these sessions in person and look forward to learning along with you at this year’s MidCamp. Get your training and session tickets now!

Jan 26 2020
Jan 26

We need you!

Want to give back to the Drupal Community without writing a line of code? Volunteer to help out at MidCamp.  We’re looking for amazing people to help with all kinds of tasks throughout the event including: 

Setup/Teardown

  • For setup, we need help making sure registration is ready to roll, getting hats ready to move, and getting the rooms and walkways prepped for our amazing sessions.

  • For teardown, we need to undo all the setup including packing up all the rooms, the registration desk, cleaning signage, and making it look like we were never there.

Registration and Ticketing

Room Monitors

  • Pick your sessions and count heads, intro the speakers and make sure they have what they need to survive, and help with the in-room A/V (by calling our Fearless Leader / A/V Genius)

Choose Your Own Adventure

  • We won't turn away any help, so if there's something you'd like to suggest to do to help out, go right ahead!

This year we're going to be giving every volunteer credit on Drupal.org, so be sure to include your profile name when you sign up to volunteer.

If you’re interested in volunteering or would like to find out more, please reach out to JD on Slack where he goes by the name "Dorf".

There will be a brief, online orientation leading up to the event to go over the volunteer opportunities more in detail. 

Sign up to Volunteer!

Pages

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