Upgrade Your Drupal Skills

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

See Advanced Courses NAH, I know Enough
Sep 23 2020
Sep 23

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

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

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

When will Drupal 10 be released?

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

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

Drupal 10 targeted release

Why is the Drupal 10 release planned so soon?

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

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

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

Updating third-party components for Drupal 10

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

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

Why upgrade Drupal so often?

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

Drupal upgrades easy

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

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

Be ready for the Drupal 10 release!

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

Aug 19 2020
Aug 19
Drupal 9 release: Q&A about new features, migration, security, and more

When a new product rolls out, it raises a lot of interest. The Drupal 9 release is no exception. This interest is easy to understand because new versions of Drupal bring new digital opportunities. Today, interactions with potential customers have shifted into the virtual sphere, so websites have an especially important mission to perform.

Read more
Aug 03 2020
Aug 03

If you are using shared web hosting for your composer managed Drupal website, you have probably ran into the problem of your server running out of memory for simple commands such as "composer install". Shared web hosting usually have memory limits which are shared across many websites.

This problem becomes quickly apparent if you are trying to install a new Drupal website into your shared hosting account. Because this is probably the first time that you have to run "composer install" for this website. Composer will then have to go and fetch all the files and download them into your vendor directory. The high memory consumption in composer is mostly due to dependency resolution. This process is memory intensive. The end result is your process is abruptly killed without finishing.


A quick and easy solution is to install the site locally whereby you can successfully run "composer install". You would then have the vendor directory locally. Then use a service like FTP to manually upload the vendor folder into the correct directory on your hosting server. Then on your hosting server, try running "composer install" again. 

At this point, composer would not need to fetch all the files again. Composer may or may not have to update some files in the vendor directory. This is OK. But the process should now be able to complete within your memory limitations.

It should be noted that the vendor directory should not be committed to your git directory for a few important reasons. 

There are arguments for and against committing the vendor directory. It is not technically wrong but there some risks associated with it. The recommendation about not committing /vendor to the git repo is mostly related to avoiding headaches with git submodules (duplicated history, etc). The composer docs page shows some ways that you can prevent hitting those.

Jul 16 2020
Jul 16
Expected time and costs of Drupal 7 to Drupal 8/9 migration

Drupal 7 to Drupal 8/9 migration is something that should bring a great value to your business. Numerous Drupal 8 improvements and the fully revamped architecture impressed everyone when the 8th version was released.

Read more
Feb 14 2019
Feb 14

The trend of using JavaScript frameworks with Drupal keeps gaining popularity. It is used for creating rich, fast, and interactive web interfaces. One of the hot use areas is decoupled (headless Drupal 8) architecture, with the front-end part completely entrusted to a JS framework. There are many JS frameworks and libraries that pair well with Drupal 8 — React, Angular, Gatsby, Ember, Elm etc. Today, we will review one of them, Vue.js. Let’s take a closer look at Drupal 8 and Vue.js combination.

Vue.js: candidate for Drupal core

Adopting JavaScript framework in Drupal core would improve the admin UX, according to Drupal creator Dries Buytaert, who spoke at DrupalCon Vienna in 2017. Core committers and developers with the relevant experience agreed they needed to think and choose the optimal JavaScript framework.

The main proposal was to choose React. However, another strong contender soon emerged as a candidate for Drupal core — Vue.js. Let’s take a closer look at this rising star.

Why Vue.js? The framework and its benefits

Vue.js is a progressive open-source JavaScript framework for building interfaces and single-page applications. It is often called a library, but the official version on the Vue.js website is a “framework”.

Vue.js was created by Google employee Evan You when he was working with Angular. Evan says he wanted to take the things he liked about Angular and create “something really lightweight.”

Since its creation in 2014, Vue.js has reached a 127,500+ star rating on GitHub and recently overpassed its counterpart React (122,000+ stars). The top 3 trending JS tools is completed with Angular (59,300+ stars). As we see, Vue demonstrates the most rapid growth.

 vue react and angular star rating

The number of NPM downloads for Vue is 796,700+ each week. The growing popularity of Vue.js is explained by its benefits:

  • lightweight and easy to learn for new developers
  • clear and detailed documentation
  • adoption within the PHP community (for example, Laravel framework has an out-of-box Vue support)
  • active and helpful Vue.js community
  • used by giants (Xiaomi, Netflix, Alibaba, Adobe, GitLab, parts of Facebook, WizzAir, EuroNews, Grammarly, Laracasts, Behance, Codeship, Reuters etc.)
  • high performance due to two-way data binding and virtual DOM (like in Angular and React)
  • even large aps are built with self-contained and often reusable Vue components

Drupal 8 and Vue.js combination

With the Drupal 8 and Vue.js combination, developers can enrich Drupal interfaces with reactive features with no jQuery, use ready Vue components, or build single-page applications that consume Drupal 8 data.

On the Drupal part, we need to prepare the content for REST export. For example, we can create a View, click “provide a REST export” in the View settings, and add a path. It works when the web services set of modules is enabled in Drupal core.

To set up a Vue.js application, we need to make sure we have Node and NPM installed, and then use the Vue CLI 3 tool. It does a lot of work for developers and that speeds up the processes. It automatically plugs in the selected libraries, configures the Webpack to optimize all files, provides app updates live every time you save changes, and so on. Finally, it offers a graphic user interface — Vue Project Manager.

The commands for starting a Vue.js application are:

  • npm install -g @vue/cli
  • vue init webpack projectname
  • cd projectname
  • npm install
  • npm run dev
vuejs application

Then Vue router and Vue resource need to be added to the project. The main.js file is then configured to use Vue routers and Vue resources, the app.js is modified to work with the router, and app components and routers are set up.

Drupal 8 modules for working with Vue.js

There is an ecosystem of contributed Drupal modules for the Drupal 8 and Vue.js combination:

  • Vue.js builds helps connect Drupal and Vue.js. It can be used in a Twig template, attach programmatically, or add as a dependency to a YAML file.
  • Vue Views adds a new format to Drupal views so the results are displayed in Vue.js, which makes it possible to use Vue features like asynchronous loading etc.
  • Webpack Vuejs provides Vue configuration for the Webpack bundler Drupal module, which helps developers bundle Drupal libraries by Webpack
  • Decoupled blocks: Vue.js is the Vue.js version of the Decoupled Blocks module, which adds Vue.js blocks to websites via modules or themes.

Let’s combine Drupal 8 and Vue.js for you

We have taken a glimpse at the possibilities of a Drupal 8 and Vue.js combination. Our Drupal team is always on top of the latest JavaScript technologies. Contact us and we will help you choose the optimal one for you, and bring all your ideas to life.

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

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

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

1. Speed of Lightning

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

2. Drag This and Drop That

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

3. Effortless Workflows

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

4. Manage your Media

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

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

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

5. Sneak Peek – Experience Preview

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


Acquia Lightning Features

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

Jan 31 2019
Jan 31
  • Shriganesh Hegde
  • 31-01-2019

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

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

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

Drupal & Artificial Intelligence

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

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

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

Cloudworks for Multilingual Drupal Module

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

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

Azure Cognitive Services API

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

1. Face API Module

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

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

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

2. Emotion Recognition API Module

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

3. Computer Vision API Module

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

4. Azure Text Analytics API Module

  • Sentiment analysis
  • Key phrase extraction
  • Language detection

Acquia Lift Connector

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

Some of the features of Acquia Lift Connector include:

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

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

Let your website be HUMAN!

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

Better user experience

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

Better targeting

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

Higher ecommerce conversion rates

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

The Future?

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

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

Jan 17 2019
Jan 17

Beauty saves the world, and Drupal helps it in this mission. There are awesome beauty product websites built with Drupal that are not only beautiful but feature-rich and powerful. This is more proof of Drupal’s versatility for websites in any sphere — e-commerce, real estate, law firms, or any other. Our Drupal development team knows this firsthand because they build cool websites for our customers. So let’s now plunge into the world of beauty and enjoy examples of beauty product website designs on Drupal.

Great examples of beauty product websites on Drupal

  • Lush website built with Drupal

Drupal powers the website of the world-famous British handmade cosmetics manufacturer — Lush. The front page engages visitors with full-length video slideshows and offers them a place to watch the “Lush Player” stories.

If users choose to continue into the website, they are invited to their country’s specific version, since lush.com is a multisite with multiple languages that provides tailored experiences to users. The country is autodetected, but users can select another as well.

Lush.com is an e-commerce website with an extensive catalog of products that features user reviews, star ratings, product videos, related content, and more. Users can also shop by price or by popular scents. There also are a product guide, charity pot, wishlist, shopping cart, and integration with famous payment gateways.

The site also promotes offline sales, so it offers the ability to search for brick-and-mortar shops and shows their detailed contacts, including a map.

Lush website built with Drupal
  • Benefit Cosmetics website built with Drupal

The next in our examples of great beauty website designs on Drupal is the site of  Benefit Cosmetics LLC  — a manufacturer of cosmetics from San-Francisco. They sell their beauty products in more than 30 countries. Their multisite Drupal website, using multiple languages, is an awesome assistant to that. By the way, these features are among the famous strengths of Drupal.

The content is presented in a very user-friendly, cheery, and encouraging way — for example, the search bar asks “What are you looking for, gorgeous?”

The Benefit Cosmetics website showcases beauty products and services in many ways — in handy menu categories, special offers, as well as interesting content types like “Dilemma solvers” that offer solutions to customers’ “beauty dilemmas.”

When users get interested in a product, they are shown the available offline shops. They can also make an online reservation for beauty services in their area.

Benefit Cosmetics website built with Drupal
  • Miss Sporty website built with Drupal

Among great examples of beauty product websites built with Drupal, we should also mention the Miss Sporty. It is presented in three languages: English, Czech, and Polish.

The site features a handy catalog of beauty products with reviews and star ratings. When cosmetics are presented in a variety of colors, users can instantly “try” these colors out on the main product image. The search feature helps products be quickly found.

The Miss Sporty website has strong community features. In addition to the handy social sharing options, it features a whole big section called “Community,” which displays photos shared by users via Instagram.

Miss Sporty website built with Drupal
  • Natura website built with Drupal

You could also enjoy the design of the Natura website — a Peruvian beauty product resource. It immediately attracts users with a colorful front-page slider, and invites them to view the beauty content.

Users can browse the products from the catalog and, if they are interested, contact a beauty consultant. The consultant search feature is very precise. Consultants can be found by province, by area, and even by street, or you can use the map. Users also have the option to become consultants themselves, and are directed to the website’s chat for the discussion.

The website features the digital beauty magazine, as well as beauty product videos. It has a newsletter subscription and a search feature.

Natura website built with Drupal
  • Clinique website built with Drupal

Another pearl among the examples of beauty product websites built with Drupal is the site for Clinique Laboratories, LLC. It offers advanced e-commerce features and lets users shop by product category, by price, by most wanted items, by ready holiday looks, and more.

When users have added products to cart, they can check out via Paypal or via a regular checkout. It is possible to sign in via Facebook for shopping.

In addition to online shopping, users can send e-gift cards to anyone they wish to right from the website. They specify the recipient, the sum, the date of delivery, and other details.

There is also a promotional feature that gives points to users, which mean various awards and benefits. Points are calculated for shopping, reviews, social sharing, and so on.

Clinique website built with Drupal
  • MAC Cosmetics website built with Drupal

MAC Cosmetics is another famous beauty product manufacturer that trusts Drupal. Their website lets users view products in various categories and by them online.

Each product description is accompanied with reviews, star ratings, as well as related products that go with the current one. Various colors are applied instantly to the product image.

For those who want to shop offline, there is a search feature for stores. Users also can check the in-store availability of a particular product in the catalog by entering their zip code and distance within which they want to shop.

It is also possible to send gift cards online by specifying the recipient, the gift value, the delivery date, and more.

MAC Cosmetics website built with Drupal
  • “Be Beautiful” website built with Drupal

A whole world of beauty advice can be found on the Be Beautiful website, which is also powered by Drupal. This multilingual website has as many as 10 languages.

Users are presented with useful articles, news, and videos from beauty experts. All the beauty topics are conveniently categorized. The search bar offers additional help in finding the right content. The site also features an Instagram feed for more interactivity.

The website’s content includes links to beauty products with the directions to find them on Amazon or other online retailers.

Be Beautiful website built with Drupal

Love these examples of beauty website designs? Get one for you!

Our collection of examples of beauty product websites built with Drupal is not complete. First of all, it is missing your future website — but we can fix this! ;)

Contact us, and let’s add some beauty to this world together. Your beauty products and our developers’ talent could unite in an amazing Drupal site!

Jan 10 2019
Jan 10



Drupal Mountain Camp brings together experts and newcomers in web development to share their knowledge in creating interactive websites using Drupal and related web technologies. We are committed to unite a diverse crowd from different disciplines such as developers, designers, project managers as well as agency and community leaders.

Drupal Mountain Camp Group Picture


The future of Drupal communities

For the first keynote, Drupal community leaders such as Nick Veenhof and Imre Gmelig Meijling will discuss about successful models to create sustainable open source communities and how we can improve collaboration in the future to ensure even more success for the open web. This keynote panel talk will be moderated by Rachel Lawson.

Drupal Admin UI & JavaScript Modernisation initiative

In the second keynote Matthew Grill, one of the Drupal 8 JavaScript subsystem maintainers, will present about the importance and significance of the Admin UI & JavaScript Modernisation initiative and Drupal’s JavaScript future.

Drupal Mountain Camp Attendee


In sessions, we will share the latest and greatest in Drupal web development as well learn from real world implementation case studies. Workshops will enable you to grow your web development skills in a hands-on setting. Sprints will teach you how contributing to Drupal can teach you a lot while improving the system for everyone.

Swiss Splash Awards

As a highlight, the Swiss Splash Awards will determine the best Swiss Drupal web projects selected by an independent jury in 9 different categories. These projects will also participate in the global Splash Awards at DrupalCon Europe 2019.

Splash Awards 2019


Drupal Mountain Camp takes place at Davos Congress. As tested by various other prominent conferences and by ourselves in 2017, this venue ensures providing a great space for meeting each other. We are glad to be able to offer conference attendees high quality equipment and flawless internet access all in an inspiring setting. Davos is located high up in the Swiss alps, reachable from Zurich airport within a beautiful 2 hours train ride up the mountains.

The camp

The Drupal Mountain Camp is all about creating a unique experience, so prepare for some social fun activities. We’ll make sure you can test the slopes by ski and snowboard or join us for the evening activities available to any skill level such as sledding or ice skating.

Drupal Mountain Camp Davos


Drupal Mountain Camp is committed to be a non-profit event with early bird tickets available for just CHF 80,- covering the 3 day conference including food for attendees. This wouldn't be possible without the generous support of our sponsors. Packages are still available, the following are already confirmed: Gold Sponsors: MD Systems, platform.sh, Amazee Labs. Silver: soul.media, Gridonic, Hostpoint AG, Wondrous, Happy Coding, Previon+. Hosting partner: amazee.io.

Key dates

  • Early bird tickets for CHF 80,- are available until Monday January 14th, 2019

  • Call for sessions and workshops is open until January 21st, 2019

  • Selected program is announced on January 28th, 2019

  • Splash Award submissions is open until February 4th, 2019

  • Regular tickets for CHF 120,- end on February 28th, 2019 after that late bird tickets cost CHF 140,-

  • Drupal Mountain Camp takes place in Davos Switzerland from March 7-10th, 2019

Join us in Davos!

Visit https://drupalmountaincamp.ch or check our promotion slides to find out more about the conference, secure your ticket and join us to create a unique Drupal Mountain Camp 2019 - Open Source on top of the World in Davos, Switzerland March 7-10th, 2019.

Drupal Mountain Camp is brought to you by Drupal Events, the Swiss Drupal Association formed striving to promote and cultivate the Drupal in Switzerland.

Jan 07 2019
Jan 07
  • Shefali Shetty
  • Date: 07-01-2019

Did you know, on an average an adult makes about 35000 decisions each day?! And suddenly, life feels more difficult. Most are mundane but taking the right step towards an important decision can turn you into a winner. Since the release of Drupal 8 in November 2015, Drupal website owners have been in a dilemma. To upgrade or not to upgrade. To migrate to Drupal 8 now or simply wait till Drupal 9 releases and completely skip 8. And to make things more knotty, there are PHP, Symfony and other version upgrades to keep track of too.

At this point, you might wonder why choose or stick with Drupal at all when everything seems so complex and tedious. Why shouldn’t I just switch to a rather simpler CMS where I can sit back and just let my content work its magic, you ask? Here’s the thing – Drupal is an open-source content management framework that is best known for the security, robustness and flexibility it offers. Without constant and consistent updates and patches, Drupal wouldn’t have been the relevant, dependable and trusted CMS that it is today. This continuous innovation approach has helped Drupal in offering new Drupal features, advanced functionalities and security patches with every minor release.

Drupal’s Plan of Action

Few months ago, during his keynote, Dries announced (and wrote) about Drupal’s structured release schedule. Although this clarity gave much relief to many, it also sent some of our Drupal 7 clients in a frenzy.

Taken from https://dri.es/drupal-7-8-and-9

Optimistically, Drupal 9 releases in June 2020. The initial plan, however, was to release it in December 2020 but that would give website owners only 12 months to migrate to Drupal 9. Hence it was decided that it would be best to have an 18-month window at the least or a smooth migration. Drupal 8 support will end in November 2021.

Drupal 7 was expected to reach end-of-life by November 2020 initially but since several websites might still be running on Drupal 7 even by 2020, the community has decided to extend support to Drupal 7 till November 2021. Which means that both - Drupal 7 and Drupal 8, will reach end-of-life at the same time!

The Dependence

I believe PHP and Symfony are the heart and soul of Drupal. Every move Drupal makes depends on the release cycles of these two significant elements. Symfony releases a new minor version every six months and a major version every two years. In order to be compatible with Symfony’s releases, Drupal has timed its minor releases one month after every Symfony release. Because Drupal 8 depends on Symfony 3, which has an end-of-life in Nov 2021, Drupal 8 HAS TO end-of-life by Nov 2021.

Security Support for PHP version 5.x and 7.0 have ended in December 2018. While Drupal websites can still continue to run on older PHP versions, upgrading the PHP version will not only receive active community support but also immensely improve site performance. Dries recommends updating the website’s PHP version to at least PHP 7.1 and ideally to PHP 7.2 (supported by Drupal 8.5). The latest PHP version 7.3 will be supported by Drupal 8.7 which is scheduled to be released by May 2019.

So, why migrate my Drupal 7 websites to Drupal 8 now instead of simply migrating to Drupal 9?

I concur. This is an extremely valid query which makes total sense. Yes, you can completely skip Drupal 8 and migrate to Drupal 9 before Drupal 7’s end-of-life (Nov 2021). If you plan to hang on to Drupal 7 till then, you have to make sure you update your PHP versions for better support and optimized performance. You could also hire a vendor who will provide you with a Long Term Support (LTS) for your Drupal 7 website beyond its end-of-life.

Although, there are a few advantages of migrating to Drupal 8 now.

Mark your calendars!

Like everything else, Drupal too has evolved over the years and now has an extremely structured roadmap that can help tackle most of its obvious obstacles. With every release, Drupal is getting better while embracing its past and deprecating those outdated/unsecure elements. Drupal isn’t competing with anyone but itself – trying to outdo its past with every minor/major upgrade release. To upgrade to Drupal 8 now from Drupal 7 or to wait till Drupal 9 is out, is really a choice site owners need to make depending on their business goals, website complexities, budget and time constraints. Specbee is a Drupal development company and our Drupal experts can help you make a better decision.


Huge shout out to @malavya88 for his very insightful inputs!

Dec 26 2018
Dec 26

There is often a need to import and export content to and from your Drupal 8 website. The ability to do that lets you use the power of content in Drupal 8 more fully. One of the most popular content sources is a CSV file. Drupal 8 has a number of useful contributed modules for getting data from it, and many cases also need customization. Our Drupal team provides smooth CSV import for even for the most complex cases. Today we would like to share a simple way to import data from a CSV file to Drupal 8 with you.

For a start, what is CSV?

CSV, which stands for comma-separated values, is a popular format for data storage. A CSV file stores data as a table where values are separated by commas. CSV is compatible with any spreadsheet programs such as Google Spreadsheets, Microsoft Excel, and so on. Each value uses a cell in the table.

CSV files are incredibly lightweight, easy to organize, and awesome for manipulating large amounts of data. Huge tables with data can be quickly edited by website administrators and sent to Drupal when ready.

Some ways to import data from a CSV file to Drupal 8

Among the popular solutions for CSV import to Drupal 8 websites, there are contributed modules like Migrate Source CSV, Migrate Plus, and Migrate Tools. The CSV import process with these modules includes the creation of the migration configuration and the use of the “migrate-import” Drush command.

And there also is one very simple solution called the Content Import contributed module, which we would like to show in action.

An example of CSV import via the Content Import module

The Content Import module lets website administrators import data from a CSV file to a specific Drupal 8 content type. A content type has fields, and a table has columns, and this is where they should match. Remember, we can always save a CSV file as a table.

Each CSV file column should list the values of a particular field of the content type. The first cell of each column should match the field’s machine name.

Some special supported Drupal fields include:

  • Entity Reference for Taxonomy, Users, and Content
  • Geolocation, Timestamp, Boolean, and Date

There also are two columns announced as mandatory.

  • The first column should be called “title.”
  • There is also a “langcode” column that does not match a specific field of the content type. The default is “en” for English, and you can use other language codes.

In our example below, we are not using the langcode column, and still everything works. So it looks like using only one of these two is mandatory.

If your data has images, there will be a little more hassle — you will need an additional IMCE module for uploading images into the “public” folder.

Of course, our example will include images! ;) So let’s create a sample Drupal 8 content type and import CSV data into it. We have a tasty content type on our Drupal 8 website — “Menu item.” It has the following fields.

Drupal content type fields

In the settings of the image field, we specify the directory to which we will upload images like this: [content_type_name/images].

 Specifying the image upload directory in the field settings

The “Available for delivery” field is of “Boolean” type, and we put the options as “Yes” or “No.”

The Boolean type field in Drupal

Then we download the IMCE module that will help us put images in this directory. We go to site_name/imce, open the “public” directory, create the folder with our content type name, and within it, create the folder “images” so that the path is public/content_type_name/images. Then we upload our images there. A bulk upload works well for this.

 Uploding images with IMCE

Then let’s prepare our CSV file. We can create it as a Spreadsheet first, so it’s more handy to work with the cells. We put the machine names of the fields into the first row. Then we fill in the values for each field. The values for the images are their file names.

Data as a spreadsheet

When the spreadsheet is ready, we download the file as CSV.

Data as CSV

It’s time to import the CSV data to the Drupal 8 website. With the Content Import module installed and enabled, we go to Configuration — Content Authoring — Content Import and select the content type to import the CSV data to.

When we do so, we also see sample CSV file available for download. We are not interested in the sample right now, so let’s choose our CSV file from the computer and click “Import.”

Content import from CSV to Drupal 8

In a few seconds, we see the content is imported. All items are listed in Content, and each of them has all the field values imported from our CSV.

 Drupal content listedDrupal content item with fields

Our menu deserves to be created as a view on our Drupal 8 website, so it represents all our items in an attractive way.

Drupal content in a view

Your perfect CSV import

We have shown you how to import data from a CSV file to Drupal 8. Please keep in mind that this simple example will not fit on just any website. Especially if you have plenty of customizations, or need complex mapping between the CSV columns and Drupal fields, you will need custom migration solutions.

Contact our Drupal experts — and we will advise you the optimal CSV import scenario. And, of course, they will implement everything for you. Get the best from the efficient data formats and smart data exchange!

Dec 07 2018
Dec 07

Online stores opens unlimited opportunities with no geographical boundaries. Behind their lines of code are successful purchases, great profits, and happy customers. So online stores should be reliable, efficient, and attractive in everything — from product catalog to e-commerce checkout. An awesome choice for building an online store is Drupal 8, particularly with one of its greatest treasures — Drupal Commerce 2.x. Let’s explore Drupal Commerce 2.x features for your Drupal 8 online store in more detail.

Why choose Drupal 8 for e-commerce websites?

Before we move on to describing the features of Drupal Commerce 2.x, we will start with mentioning at least a couple of Drupal 8 characteristics that form a great support for your Drupal 8 e-commerce website.

  • Content + e-commerce = more conversions. Drupal is a powerful content management system, which means you are getting more than just an online store. You will have a website full of diverse content types to support your store with good content. The approach of content-driven commerce is a sure way to get engaged customers, better SEO, and increased conversions.
  • Mobile responsiveness. Since mobile sales are headed to overtake desktop sales soon, it is awesome that Drupal 8 is mobile responsive out-of-box. Drupal 8 has everything you need to make any theme responsive, so its elements magically adjust to mobile device screens. Let your mobile users shop with pleasure!
  • ​​​​​​Better performance. Loading speed is especially important for online stores. Users want to browse your website, compare various products, and place orders without delay. Drupal 8 has powerful caching techniques for faster loading. One of them is the innovative BigPipe, which lets you serve static website elements to users instantly and load dynamic ones next.
  • ​​​​​​Third-party integration. An e-commerce website usually relies on third-party services for payments, marketing analytics, online customer support, CRMs, and so on. Drupal 8 has built-in web services that make integrations incredibly smooth.
  • Multi-language. Customers are more willing to buy when they see information in their native language. Drupal 8 has awesome multi-language support. It is very easy to add languages to websites and translate exactly what you need. Interface translations are ready for a hundred languages.

Drupal Commerce 2.x for your Drupal 8 online store

Drupal Commerce is a solution for creating e-commerce sites from scratch or adding e-commerce features of any complexity to existing sites. It is free and open-source, like any other contributed Drupal module. However, it works like a full-fledged e-commerce framework that covers all the needs of an online store: product catalog, cart, checkout, shipping, orders, and so on.

Drupal Commerce 2 is the version for Drupal 8, and it has recently issued a new update — Drupal Commerce 2.10, which shows great advancements in product administration, third-party integration, and more.

There is also an ocean of add-on free contributed modules the extend Drupal Commerce 2.x features endlessly. However, Drupal Commerce 2.x out-of-box comes with an impressive pack of submodules that show its comprehensive capabilities:

Drupal Commerce 2-x - submodules

So let’s see what your online store can enjoy!

Why use Drupal Commerce 2.x for your online store

  • Single or multi-stores available

One of the awesome Drupal Commerce 2.x features is that, instead of having one store, you can use multiple stores in Drupal 8. Each of them can have its own product types, currencies, taxes, contact information, cart, checkout, and everything else.

  • Smart support for multiple currencies 

Drupal 8 lets you add multiple currencies out of the list, as well as custom ones by providing the currency code.

Here, the true multilingual soul of Drupal 8 shows perfectly! Drupal Commerce 2.x takes into account the names of each currency in each language, their formatting, and other important details.

This extensive information is provided by the commerceguys/intl library. It works in accordance with the internationally recognized CLDR standard.

Drupal Commerce - adding custom currency
  • Awesome product handling 

Your Drupal 8 online store can have whatever products you wish — from simple ones to products with attributes. Each unique combination of attributes is a product variation in Drupal Commerce 2.x, and it has its own SKU, or machine-readable ID. This is very convenient for managing your orders and stocks.

Thanks to the Fancy Attributes module now included out-of-box, creative selectors like color swatch are available for product attributes. Multilingual products are also easy to set up.

  • 70+ payment gateways & flexible payments features

Customers are more likely to buy when they have their preferred payment gateways. One of the great Drupal Commerce 2.x features is the support for 70+ payment gateways! Authorize.Net, Braintree, PayPal, Square, Stripe, Vantiv are just the beginning of the list. There are add-on contributed modules for any provider you wish. Custom modules can be created for all others.

Drupal Commerce 2-x - adding payment gateway

The flexibility in payment types is also awesome:

  1. On-site payment gateways let customers enter credit card details directly on your site, and tokenization can be applied for data protection.
  2. Off-site (redirect) gateways redirect customers to the third-party payment service and back to your site upon successfully completing the operation.
  3. Off-site (iframe) gateways do not redirect customers to the third-party service and handle the checkout process in an embedded frame.
  4. There is also a built-in “Manual” gateway option for such payment methods as Cash on Delivery, Card on Delivery, Cheque, Bank Transfer, and so on. They are marked as pending payments and are moved to complete by your store admin.
  5. It is also possible to set up an IPN (Instant Payment Notification) service and be instantly notified about events related to PayPal transactions.

Your Drupal 8 online store will have handy interfaces that let you authorize, void, or refund the payments.

  • Flexible promotions and discounts

Engage your customers with promotions! Your Drupal 8 online store will offer you a number of built-in offer types for fixed or percentage amounts. This can work in accordance with conditions that you set.

Drupal Commerce 2-x - adding promition
  • Smart handling for taxes

There is no need to bother about specifying the product price with taxes. Drupal 8 can automatically calculate the taxes for you. It has predefined taxes for countries, as well as letting every merchant choose special taxes. The system knows taxing specifics, for example, the difference in VAT calculation for physical and digital products in the EU.

  • Multiple order types

Your Drupal 8 onlines store can have not one but multiple orders types with special workflows for each. This allows for creating fine-tuned experiences for various product types. For example, selling tickets will need a different workflow than selling T-shirts. Order receipt emails are also very customizable.

  • Flexible checkout options

Checkouts are incredibly handy. They offer progress indication bars, the ability for users to checkout as a returning customer and reuse the previously entered information, the option for you to allow or not guest checkout, and so on.

Moreover, there can be different checkout flows for different product types. They may vary in the number of steps to take, which customer information to require, and so on.

Drupal Commerce 2-x - checkout flows
  • Great shipping options

With Drupal Commerce 2.x. you can configure the shipping methods, define which products are shippable, and manage the shipments.

The basic features are handled by an add-on module called Commerce Shipping. It lets you set up such shipping methods as flat rate-per-order and flat rate-per-item.

For more specific and advanced shipping integrations, there is a plugin-based system. There are existing plugins for famous shippers, and developers can create any other for you — whatever your favorite shipper is. It is also possible to provide shipping rates based on conditions.

Create an online store with Commerce 2.x on Drupal 8

This has been just a brief overview of Drupal Commerce 2.x features. This box of treasures can offer much more in good hands. In addition, customization miracles can fine-tune your e-commerce website in every detail to your liking.

Entrust your Drupal 8 e-commerce website to our Drupal development team. Our guys have a lot of experience with e-commerce and know how to use the benefits of Drupal Commerce 2.x in the best ways for you.

Nov 16 2018
Nov 16

In February 2017 the Drupal Mountain Camp in Davos was held for the first time. More than 120 experts from 17 countries came to the Swiss mountains and experienced a unique weekend. The event was a huge success with many highlights.


Both Laura Gaetano's (Travis Foundation) keynote about the open source community in general and Preston So's (Acquia) keynote about the future of Drupal with API first were well attended, very interesting and led to lively discussions.

Drupal Mountain Camp Davos

Discussions in the venue

Laura Gaetano on stage

Preston So on stage


There were sessions by more than 30 different speakers with topics from the Drupal world from different areas like sitebuilding, frontend & design, business & showcases, coding & development. Drupal Mountain Camp featured presentations on Drupal 8 in general, Commerce, Translation Management, GraphQL, Media, Paragraphs and much more.

Session at the Mountain Camp

Sessions in Davos


Sprints were organised in several rooms, where both beginners and experts met to code and develop ideas together.

Developers sprinting

Sprinting at the Mountain Camp in Davos

Social Events

After the varied, interesting and intensive daily program, various events took place in the evening at which the "campers" could experience a great time. They joined the skating rink, sled down the mountain, attended a game of the local ice hockey team, ate a cheese fondue and/or enjoyed the slopes on skis or snowboard.

Sledging in Davos

Fondue in Davos

Also, the venue and its food were amazing.

All in all it was a great weekend! Thanks to all our great sponsors that made this possible!

Read more reports from camp participants:

Alle Bilder von Josef Dabernig @dasjo

Nov 13 2018
Nov 13

By adminadmin | November 13, 2018

By adminadmin | November 13, 2018

As a fully distributed company, weKnow supports remote working; a form of management and daily routine that may not be for everyone but, we prove all bumps on the road can be successfully sorted out and made our organization even surpass productivity metrics compared to the in-office style.

Having a career outside of a traditional office setting comes with unique challenges, getting to know them beforehand will allow you to be more productive and happier. Read further to learn some tips to help you and your team excel.

Remote work challenges plus how to overcome them

  • Health Habits: If no one is on your shoulder telling you when or not to take your breaks or it is easy to postpone lunch time or breaks, it could lead to the point where you might forget to eat. Tip: Enter lunch and breaks in your schedule each day, serving as an incentive to finish tasks before eating or just taking time walking around to stretch or clear your mind.
  • You might ditch exercising altogether: Many stay in a single position most day or forget to go outside enough. Tip: The human body is wired for movement, try adjusting your desk to also be able to type standing up some portion of the day or make a pause every twenty to forty-five minutes and just stand up to drink some water and come back to your chair to continue on.
  • Diet: You are as productive as what you eat or drink. Tip: Try having a healthy diet that keeps you awake, energized and hydrated naturally with a variety of vegetables, grains, protein and monitoring white sugar consumption. 
  • Home Adjustments: Working at home is an adjustment for everyone in the house, including kids, roommates or family. A great advice is to be consistent and reasonable, therefore trying to accomplish work and quality time simultaneously is not advised. Set up a morning routine that allows everyone to be self-sufficient and allows you to have a fluid workflow too.  
  • Isolation: the opposite problem. Here is where working from a cafe, coworking with friends or just signing up for an afternoon hobby activity is crucial. 
  • Overworking: a recent report from the United Nations International Labour Organization found that productiveness is the greatest metric achieved by remote employees but they are more vulnerable to working longer hours. Work smart instead, by setting appointments on your calendar, set up reminders to take breaks, be clear with your team on when you are leaving, create physical boundaries between you and your workspace (have a dedicated office space) and as tempting as it is: never work from bed, it will only slow you down.
  • Time management: Prioritize; first thing of each day: eat that frog! Work on the hardest task to get it out of the way, some people procrastinate by working on minor tasks first, stating “if I get the little issues first then I will have time for the more complicated one” and by the end of the day end up having little time and energy to dedicate the main issue. Basically, remote workers need to be time management experts by monitoring their energy peaks.
  • Connectivity: the greatest fear of all is when internet goes down. Well… this is the remote worker problem to solve, have a mobile hotspot device or a great cell phone plan, if possible a backup computer or even a tablet can be of help.

weKnow´s Secrets to Remote Work Success

Trust keeps building up when everyone stays on task while feeling equally represented and present. 

We promote a company culture that embraces remote work to talented nearshore developers, weKnow keeps information and conversations open to everyone, any actions or plans are documented keeping them available to asynchronous team members in order for everyone to have a clear understanding and feel supported, therefore; making everyone feel connected. 

Embracing the remote model has given us access to the best talent in the region, regardless of their location.

A way we switch the regular mindset is by thinking on delivering results rather than time… 
In-office jobs are based on a clock-in and clock-out dynamic, instead; we have a mindset of productiveness that laser focus employees, who will actively try to avoid procrastination because their goal is to deliver great products and services but also to have time for their own means. Jointly this is done by having clear processes, structures and agendas while promoting a healthy system of meetings, events, and habits that keep people communicating, providing the right tools to achieve it.

Communication is key. Every member logs into our instant messaging tool, and every project has its own dedicated "space" within this tool, which enables the team to interact in real time. This also allows our Technical Leadership to be easily reachable to assist with any blockers or technical guidance.

We are an organization that understands the best talent is seeking to apply its knowledge and experience where creativity is encouraged, as well as where meaningful work experiences are provided. Each aspect is meant to facilitate not only the internal process in our company but also swift communication with our partners and customers regardless of location. By sharing these set pieces of advice, our hope is to edify and promote how really useful working remotely can be. 

Each year many more are realizing an office facility is not absolutely necessary, on the 2015 Global Leadership Summit in London 34% replied to a survey stating that more than half their company’s full-time workforce would be working remotely by 2020, we can definitely see it is now a fact that disrupting the regular working environment provides more positive outcomes, definitely provides more convenient perks for all: organizations, clients and workforce personnel.

You can read Part 1 of: “weKnow’s remote working guide to success”, indulge with more benefits of remote working here.

Nov 13 2018
Nov 13
  • By: Shefali
  • Date: 13-11-2018

Digitalization has opened doors that nobody imagined even existed. Opportunities did not just come knocking, they exploded their way in. Digital evolution has taken the world of professional publishing by storm. However, this evolution brought along a whole new set of challenges that publishers are still trying to cope up with. Many publishers of physical magazines had to shut shop as most of their readers had now shifted to e-magazines but the ones who saw the silver lining in the cloud, went online! And now the whole world is their audience.

Consumers are altering their preferences of consuming content ever so often and publishers have to make sure they reach their audience through more than just one medium. Plain text is passé – content that’s not enriched with any media (images/videos/gifs) are blindly rejected.

As our attention-spans are evolving (for the worse), it has become crucial for content to be fresh, relevant, interactive and alluring. Which means, publishers need to work even faster and find efficient ways to exhibit their content for better consumer engagement. A good Content Management System will let publishers to create and publish fresh content fast and efficaciously. Thunder - a Drupal 8 distribution – aims to resolve the problems faced by professional publishers and make their lives much easier.

Feel the Thunder

Originally designed for and by Hubert Burda Media, Thunder was later released as an open-source software in 2016. This community-driven CMS is based on Drupal 8 and consists of varieties of hand-picked modules meant solely for the publishing sector. Because it is open-source and completely non-profit, a Thunder Coalition was shaped where publishers, industry partners, core team and developers share their code/modules/extensions. So everyone benefits from the coalition while giving back at the same time.

With Drupal 8 already providing a vast collection of modules that are valuable for professional publishers, it was the most obvious choice of CMS to backup Thunder. Custom modules developed for Thunder are also contributed back to the Drupal community which encourages a strong circle-of-life.

So why reinvent the wheel when you can just realign it? – Said Anthony J. D’Angelo. And with Thunder, you don’t even need to realign it most times.

Get launched – quick and easy

A Drupal distribution is a complete package that comprises of installation profiles, modules, themes, libraries that are industry-centric and easily downloadable. Thunder distribution is an all-in-one package focused on professional publishers that is stable, extremely scalable and customizable. It consists of all the bare-necessities needed for a publisher to get up and running in the market faster. Installation is easy and quick and allows you to set-up your website faster than you think. Because it is open-source and free, it cuts down development efforts helping you save on time and money!

The Out-of-the-box Experience

Unless you want a feature that is very specific and bespoke, you are good to go with the core features Thunder has to offer. Responsiveness comes out-of-the-box not only for site visitors but for the editors and administrators too. The Paragraph module lets you create, modify and play around with content. It lets you drag and drop content and multimedia making it really flexible and easy to create beautiful stories.

Scheduling your content to be published is as easy as 1-2-3! Modules like Media Entity and Entity Browser make media handling more effective. Content Lock comes handy especially when many editors work together. It lets an editor lock a node they are working on and notifies the other(s) that the content is being edited. When you want to instantly check if your content looks alright on different devices, use the Responsive Preview module. Embedding videos from Youtube or Vimeo just got easier with the Video Embed Field module.

The Extra-Ordinary Extras

The little extras are what makes the ordinary, extra-ordinary. Thunder provides some optional modules that promise to give professional publishers that extra boost. Have you seen those articles on your Facebook app that load up in a jiffy and makes you feel like you haven’t even left the app? Yes, I’m talking about Facebook Instant Articles. With this module, editors can easily add content from their Drupal website to Facebook and drastically reduce load time on mobile devices.

The Google AMP (Accelerated Mobile Pages) module lets you deliver content like text, images, videos, Instagram and Twitter cards in a flash. If you need to cover an event as it occurs, the LiveBlog feature is your best friend. When you want to add content like surveys, polls, quizzes or top 10 lists, the Riddle Interactive Content plugin is precious. The Nexx.tv video player integration allows efficient distribution and flexible streaming of videos across various platforms.

The Drupal Advantage

Being a free and open-source content management framework, Drupal was the most obvious choice and Hubert Burda Media had to look no further. They had already had a great experience with Drupal and the release of Drupal 8 just made things better. Core Drupal features like Menu Management, User Management, Taxonomy, RSS feeds, system administration and page layout customization helped Thunder in building a strong foundation. A foundation that has been further enhanced with many more publisher-centric modules.

The Drupal community is constantly evolving, thereby adding more features, beefing up security and giving you all the support you need. The Thunder and Drupal Community are so closely-knit, you can’t tell the difference. Thunder makes it easy for organizations to share their customized modules with other industry-partners and the Drupal community so everyone benefits from their contribution.

Thunder has been built for publishers by publishers and just cannot be ignored if you are a professional publisher. It addresses all the pain-points of a publisher and helps accelerate the process of getting to market. Top publishers like Marie Claire, BUNTE, ELLE, Playboy, InStyle and many more trust Thunder. “Don’t give to get. Give to inspire others to give”. This seems to be the thought motivating the Thunder Coalition and the Drupal community to share the power of innovation. The advantages of being open-source are abundant but the most significant is the fact that you can give back to the community. It is like this amazing cycle of life that runs on trust and goodwill.

Oct 29 2018
Oct 29
  • By: Shriganesh
  • Date: 29-10-2018

One of the most important aspects of technology in education is its ability to level the field of opportunity for students. --- John King, U.S. Secretary of Education

How many of you were aware of the fact that the very first instance of what became of the internet, was a communication link between UCLA and Stanford in October 1969?! At that time, more than half of the eventual nodes on the ARPANET - the precursor to today's Internet - were universities. To be fair, the internet was literally born in universities.

In the 80s and the 90s, most of these organizations had a significant online usage penetration and were amongst the first ones to have a digital presence and develop a website of their own.

With the faculty members and the administrators of the education organisation having better access to the internet in much larger numbers, this was viewed not as a potential source of revenue, but as an educational imperative. Unlike their corporate counterparts, higher ed organisations had fewer restrictions, thus making this less about profits and more about the mission.

Today's Scenario?

Over the past 2 decades, the advancements in technology have been tremendous and these changes have played a major role in allowing educational institutions to move into a teaching and learning method inspired and driven by technology.

However, the changes while creating new opportunities for students, have brought upon new obstacles for colleges and universities to overcome.

Today's technology driven higher education is rich and also in tangles. With almost zero editorial governance, most of the universities are caught up in a heap of long trail of microsites, internal portals, mismatched designs, and patchwork integrations.

In the present scenario, from textbooks to exercises, from software simulations to data sets containing educational data, it is necessary to rethink the way these educational resources or “learning objects” are managed.

Though this is all exciting to begin with, it is not just tiny web presence that is the issue. Let us discuss about some of the common problems that higher education institutions face when it comes to content management.

Diverse Audience

In an ideal condition, a website is crafted for a specific audience. However, think of an higher ed institution and the website of its own which will be serving multiple audiences from all the possible corners of the world with a diverse background of their own. Apart from the main set of audience, serving dozens of smaller sub-audiences, the higher education institutions faces the daunting task of serving more people with more complexity in a more challenging web environment.

When we talk about the challenging environment, it is just not about different people needing different information. For example, students might want to access a class video on their mobile device. However, this is driven by various other factors such as students with different economic backgrounds and financial conditions, different broadband speeds, different internet access regulations and many more.

This clearly implies that the requirements for a higher education universities with respect to content, design and development need to be broad, drastically broad!

Contributor Base

With a long tradition of direct web publishing with little or no oversight whatsoever, the higher education projects are always present with larger numbers of content contributors from various departments and wings of the organisation than any other type of industry. They have their own independent departments, each with their own stake, audiences and outcomes, resulting in the faculty members publishing their content in the form of research to public websites under the university banner without clearing this with the central governing body.

To add to the complication, even if the higher education body has a centralized editorial board, the departments often come up with their own editorial teams, making it difficult task for the central governing body to maintain the vision of each individual team.

With all this going on, the most affected are the permissions and the security features under the high number of users and student population. A streamlined user management driven by a central management for permissions and supported by a user database for the website independent of the rest of the organization is a rare sight in the higher education institutions.

Too Many Units, Websites

Most of the large higher ed websites are actually several (in some cases even hundreds) of loosely associated microsites, department websites, external applications and more. Consisting of a number of semi-autonomous departments, the organizational structure is completely paralleled in their website management and governance. This results in a major architectural issue, struggling to keep consistency between the various different groups and their content.

With so many microsites, it often appears as though there is a seperate website for each department. In some cases these websites might differ in terms of visual appearance, architecture of the information, and also the editorial tone. Some extreme cases can also have the micro sites running on seperate servers, powered by their own CMS and operated as complete separate entities!

System Integrations

A great university does more than just handle a bunch of students and teach them a few subjects. Similarly, a great website does more than just show a text page or two. An average higher education institution is quite complex, involving lot of people, departments, students and more. Thus the average website of this average institution is bound to be complex system of interlocking technologies.

A typical website for a higher education institution is a complex world of system integrations with functionalities bolted onto the main content management systems. With multiple portals and support systems to service the academic needs of the student population, there lies a huge challenge in how to balance the specific needs of their diverse audience and also manage the technology constraints with respect to standards of integrations.

The Solution

When we think from the perspective of an educational institution there is a lot of data that is travelling among the teachers, students and the administrators. Comprising of worksheets, homework, reports, assignments and so on, most of this content is not managed and maintained by the educational institution but by the teachers themselves, making it entirely dependent on context and the learning goals to be achieved.

Quoting Wiley, in his “content is infrastructure,” the learning process must be created on top of such infrastructure, and there is a real need for managing all those contents available on the Web.

This fact combined with the concept of open educational resources, enables a new environment for learners that view the web as a learning space with many possibilities, with no time or space barriers. While content management has traditionally been related to content producers such as news and media agencies, publishers and other portals, the higher education institutions are a major contender (courtesy of their methods to churn out their own content on a regular basis) to use a CMS effectively.

A CMS is basically defined as a combination of three distinct concepts: content, process and technology.

Content usually refers to the text, graphics, videos, animations and other media that comprise the base of a system.

Process is more concerned about the users and the actions performed by the users. Defined as the set of actions that produce a notable outcome, process refers to the ways integrated into the system for the users to perform certain tasks such as publish, share or download.

Technology is the driving force to perform the process and control content over the internet.

Content Management System & The Concept of Compound Learning

The basic purpose of any CMS in any industry is to manage the information workflow in a database and publish the content onto the web environment. However, even when the purpose is standard for any user, the process and the way to present it to many other users differs according to the user requirements that can range from a simple task to a complex one.

In the case of educational purposes, a CMS can be used to submit various assignments or publish research papers or update information on the student portal etc. Furthermore, using the CMS as a support for classroom instruction results in a structure for Compound Learning.

Compound Learning is the combination of both the traditional instructions and e-learning with the support of an effective CMS like Drupal. This ensures that the students are not deprived of the interactivity in the classroom and also are exposed to technology that eases their workload.

From the teacher's point of view, this integration of a CMS like Drupal helps them effectively manage their online information such as audios, videos, animation, interactive applications and more. Providing an effective usage to control processes for managing content and its users, some of the features that Drupal CMS offers are,

  • Easy navigation
  • Effective information management
  • Ease of access and usage
  • Architectural organization
  • Different interfaces and functions for different user groups
  • Robustness & Scalability

Furthermore, by using a CMS like Drupal, higher education institutions can develop up-to-date information on a regular basis, improve their system administration and also lower their expenses at the same time. Also, achieving following goals with a Drupal CMS becomes much easier.

  • Ease of use with security and permissions
  • Creating workflow administration
  • Separating content from design and view
  • Managing and controlling content
  • Handling structures for metadata
  • Creating depository for reusable content and more...

When education systems find it hard to maintain knowledge acquisition, management and publishing process because of their complexity, web based content management systems like Drupal makes things easier irrespective of the amount of content owned and the amount of updates and modifications required.

In any higher education institution, it is very important to understand how a CMS impacts a number of people and the departments concerned. While analyzing the current website of the institution and using the input from some of the key individuals helps in understanding how a CMS fits into the environment, the decision is still based on an extensive process and open communication. In the field of educational technology, it is an often repeated motto to emphasize teaching with technology rather than teaching the technology itself.

Drupalcamp Oslo is coming up, and it is going to be awesome!

Oct 29 2018
Oct 29
Oct 26 2018
Oct 26

Drupal has a great way to provide your website with the latest features and make it more protected against new cyber threats. To achieve this, it constantly evolves to keep up with the pulse of the times. All you need is to regularly update to newly released Drupal versions, and your Drupal support provider could help you with that. However, there is an idea floating in the air about how great it would be to have automatic Drupal core updates. We will explore this issue, with its benefits and challenges, in our blog post.

The need for automatic Drupal core updates

The Drupal community fully understands the wishes of website owners. At DrupalCon Vienna in September 2017, Drupal founder Dries Buytaert gave a presentation about the state of Drupal. He emphasized that complicated updates are one of the things that pushes people away from Drupal, and that users are asking for auto-updates. The need to automate Drupal core updates became clear — and grew into the special initiative.

Automatic Updates Initiative for Drupal core & its benefits

Automatic Updates Initiative for Drupal core & its benefits

So the Automatic Updates Initiative was created with the main aim to build a secure system that would install core updates automatically. The Initiative is meant to:

  • reduce website maintenance costs and time
  • immediately respond to critical security issues and apply patches
  • free users from possible hassle and the complexities all website owners who do updates without a development expert face
  • and, finally, give the answer to all customers who keep asking why, despite all Drupal’s awesome strengths, it still has no automatic updates.

The challenges of automatic Drupal core updates

So the idea of automatic updates sounds very lucrative indeed. However, despite the unquestionable benefits, the community also understands that implementing automatic updates for Drupal core meets a number of challenges:

  • automatic updates without human supervision may involve great risks — up to and including websites crashing
  • there is no testing pipeline
  • automatic updates may open opportunities to hackers for mass dependency injections
  • there is no GIT version control, so it’s impossible to roll back if something goes wrong
  • automatic updates will mostly benefit simple websites with no custom modules, otherwise they will require much more developer attention anyway
  • this idea requires a comprehensive restructuring of Drupal codebase, which means it’s not a near-future innovation
The challenges of automatic Drupal core updates

Considering that Drupal is a very powerful CMS able to handle extremely feature-rich and complex websites, such thing as automatic updates should be approached with caution.

When it comes to core updates, nothing can replace a developer’s hands at the moment. However, the future may change this, because great work is being done in this realm.

Quick core updates already a reality in Drupal 8!

Luckily, automation is not the only way to facilitate core updates. When it comes to Drupal 8, they are already a snap.

A lot of work has been put into making Drupal updates and even Drupal upgrades easy forever (upgrades are transfers, for example, from Drupal 8 to 9 in the future). This article by Dries Buytaert explains that this is achieved, in particular, thanks to backwards compatibility between the versions and semantic versioning.

Let’s say updating an average website from Drupal 8.5.x to 8.6.x will only take half an hour for our Drupal maintenance team. Smaller updates (like Drupal 8.6.0 to 8.6.1) can be done with the snap of a finger. Overall, it will depends on the amount of custom modules.

By the way, this is yet another reason for Drupal 7 website owners to upgrade to Drupal 8 — for which you can rely on our Drupal website support. Easy upgrades are listed among numerous Drupal 8’s benefits for your business

So your wish for easy Drupal core updates can come true right now!

Do you regard automatic updates as the way to forget about everything and have a good night’s sleep? This wish can come true right now! But you don’t have to wait until the Drupal automatic update feature is finally here and well-tested.

Rather, this dream will come true if you apply to our Drupal support firm. All our maintenance packages include watching out for security updates and running them. We can agree the on following not only security, but any other kinds of updates.

Let our experts run all Drupal core updates for you — manually, safely, and reliably!

Oct 19 2018
Oct 19

The magnetic power of beautifully arranged content is really huge. Using it is one of the surest ways to keep your visitors on your website, spike their interest, bring your message across, and create the best impression of your business. There are plenty of attractive ways to display content on your Drupal 8 website. Let’s consider a few of them right now, as well as nice Drupal modules that are helpful.

Interesting ways to display content on your Drupal 8 website

Content presented in views

First of all, when it comes to content presentation in Drupal 8, we cannot help but mention Views — the powerful tool that is now built-in and that lets you display your data in absolutely any way you wish. A grid, a table, a list, and other formats are ready to hold your articles, news, photos, and so on. The results can be filtered and sorted by various criteria, and these filters can be exposed to website users.

There are plenty of additional modules that enhance content presentation in Views. For example, creating a simple photo gallery with Drupal 8 Views is a very nice option, but you could use a special responsive grid provided by the Views Photo Grid module. It arranges the photos so that each row height remains the same, while photos fill in the available width.

Photos presented by Views Photo Grid module in Drupal

Content in a stylish overlay

One of the popular and creative ways to display content on your Drupal 8 website is to make it open in a stylish overlay above the current page. This can be done with modules like the Colorbox, which is great for images, as well as iframed or inline content. Colorbox works like the image field formatter in Drupal 8.

Photos in a stylish overlay by Colorbox modules

Slideshows and carousels of your content

Various slideshows and carousels are incredibly engaging for users. They show content items one at a time — not only images, but also texts, videos, social media posts, or a combination of elements, including nested sliders. Various options for animation, touch-enabled or keyboard navigation, transition effects, and many more features are available to you.

All this is possible with Drupal 8 modules like Views Slideshow, Owl Carousel, Slick Paragraphs, Slick Media, Slick Carousel, Imagefield Slideshow, jCarousel, Flex Slider, BxSlider, Juicebox HTML5 Responsive Image Galleries, Views FractionSlider, Jssor Slider, and many more.

carousels of your contentin Drupal 8carousels of your contentin DrupalSlideshows of your content in Drupal 8Slideshows of your content in Drupal

Data presented as charts

Charts are great for data visualization. They look informative, professional, and convincing. Drupal 8 offers some nice modules for creating charts like the Charts, the Easychart, and others. They support charting libraries like the Google Charts and the Highcharts, and so on. You can present your data as a pie, column, or bar chart, and more.

Data presented as charts in Drupal

Special effects for your website’s images

Please your users’ eyes with interesting image effects. They can be added with special Drupal 8 modules, for example, the Image Effects module. It enriches Drupal image styles with great choices of of additional effects — Watermark, Text overlay, Set transparent color, Gaussian blur, Interlace, Mirror, Aspect switcher, ImageMagick arguments, Color shift, and so on.

Special effects for your website%E2%80%99s images in Drupal 8

Videos or other media embedded into content

A great idea to make your content will look much richer and more attractive is to embed media into it. As of Drupal 8.6.0, media opportunities let you embed videos, audios, images, files, as well as remote videos from YouTube and Vimeo with just a URL.

There are no extra modules to install — the built-in Drupal 8.6’s Media and the Media Library modules just need to be enabled. Then add the Media field to your content type (e.g. blog) and you will be able to fetch the media, previously saved to your media library.

Videos or other media embedded into content in Drupal

Content put into an accordion

Accordions are one of the handiest structures to display your content in Drupal 8. Your users can click on the menu items and extend them to reveal the content inside. A great way to implement it is the Views Accordion module, which presents the results of the views as a JQuery accordion.

Content put into a views accordion in Drupal 8

To recap

We have shown you a few nice examples of ways to present content on your Drupal 8 website. Drupal’s capabilities in this sphere are like an endless sea — even a million articles will not be enough to describe them.

And we have just touched on what contributed modules can do. However, in the hands of expert Drupal developers, absolutely any amazing results are possible with custom coding.

So the attractive, convenient, and engaging ways to display content on your Drupal 8 website are unlimited. For implementing any of them on your website, contact our Drupal help desk!

Oct 18 2018
Oct 18

We love to say your Drupal website capabilities are unlimited, but even more than that we love to provide examples. One of them is the Drupal Rules module. It can be compared to a whole team of smart and tireless robot assistants that do necessary things at right moment on your website. They welcome your guests in, deliver important messages, remind you of events, and much more — from the simple to the most complicated scenarios. So let’s take a closer look at how the Drupal Rules module works to make Drupal’s strengths even greater.

The fundamentals of the Drupal Rules module

The Rules contributed module lets you set up automated workflows on your website based on so-called reactive rules, aka ECA rules. ECA stands for “event-condition-action.” So, you can create your reaction rules, each of which consists of:

  • an event
  • a condition
  • an action

The principle is: when some event takes place, and a certain condition is met, then a particular action is automatically triggered. For example:

  • Event: content is viewed by a user
  • Condition: the user role is Anonymous
  • Action: a message is shown on the site asking the user to log in to post comments

First, an event is created, and then the conditions and actions are added. In many cases, just an action is enough and the condition can be skipped — for example, users have logged in, irrespective of conditions, they can be shown a “welcome” message.

drupal rules module
drupal rules module
drupal rules module

The Rules module provides impressive lists of default events, conditions, and actions to select from. The lists depend on other modules that you also have installed. In addition, custom ones can be created by coding and added to your Drupal website.

Rules components are reusable, which means they can be added to other rules and even used by other modules.

To categorize your rules, you can use tags, which is very helpful when you have plenty of them on your website.

A few use cases of the Drupal Rules module

With the Drupal Rules, you can, for example:

  • remind a user to fill in the required fields before saving a node
  • thank a user for posting content
  • tell a user that the content is pending the moderator’s approval
  • notify the moderator about the newly posted content or comments
  • notify a user when someone comments on their content
  • notify a user when someone adds their content to bookmarks
  • remind a user about calendar events a certain time in advance
  • notify the administrators about emergency log entries
  • block a user for spamming or other bad behaviour
  • notify a user that a desired product is in stock
  • apply a discount on a product when it is applicable

and much more — as stated above, the sky is the limit to the possible workflows!

Cooperation with other Drupal modules

The Rules work closely with Drupal Commerce, Ubercart, Content Access, Flag, Organic Groups, Features, Token, Rules Link, Rules list conditions, Views Rules, Rules Forms, Conditional Rules, and many other modules, so the most interesting scenarios are provided.

The Rules module in Drupal 7 and Drupal 8

In Drupal 7, the Rules module requires the Entity API contributed module, while in Drupal 8, it needs the Typed Data to work with.

Its UI has also changed considerably. One of the main changes is that in Drupal 8 you do not see the traditional Drupal 7’s “Replacement patterns” link when specifying the Condition and Action values. You can put the values in either by data selection mode (which shows hints upon clicks on the field) or by direct input mode.

The Rules module in Drupal 7 and Drupal 8

The Rules in Drupal 8 is still in its alpha state, so it is not 100% ready for production sites. This is a complex module, so porting it to Drupal 8 is a cumbersome task.

To recap

The Rules module requires careful use and experience, especially when it comes to complex cases. That’s why it is better to entrust the Rules creation to a solid Drupal team.

They can also advise you what kinds of workflows can be created for your particular business goals. Whatever you need that might be missing in the default Rules features can be added by custom code.

For all this, you are welcome to contact our expert Drupal support firm!

Oct 18 2018
Oct 18

Various media, like videos, audios, or images, make your website really engaging. They fill it with colors, music, vivid impressions, and exciting experiences. And Drupal 8 offers new great options for media handling, which make it a leading CMS in 2018. The latest version, Drupal 8.6.0, brings especially interesting media features. We will start exploring the new media opportunities in Drupal 8 right now.

New Drupal 8.6.0 media handling features

Thanks to the Drupal Media Initiative, Drupal 8 now has new modules in core — the Media and the Media Library, which have inherited the best capabilities from a number of contributed modules. They introduce new and awesome concepts like media types, media fields, reusable media, and more.

So what can you do with them? First of all, you can:

  • add media of various types to your site
  • save and reuse media in your Media Library
  • place media inside your content
  • embed remote YouTube and Vimeo videos via an URL

and much more. Let’s consider these options in more detail.

Adding media of various media types to your site

To add media to your website, you can use the ready media types provided by Drupal. In Drupal 8.5.x, there were four media types — Image, File, Video, and Audio.

But Drupal 8.6.0 has prepared a new one — Remote Video, which lets you add third-party videos from YouTube and Vimeo. We will discuss it in more detail later in this post.

remote video media type

In addition to the default media types, you can create custom ones, and specify their media source.

Thanks to the media types, adding media is as easy as adding content, and can be done in Content — Add Media.

add media

Saving and reusing media in the Media Library

As of Drupal 8.6.0, all media can be conveniently stored in your Media Library for further reuse. You can easily access, publish, unpublish, save or delete all the media items in Content — Media.

For your convenience, media can be filtered by media type, publishing status, and name, as well as sorted by newest or oldest and descending or ascending alphabetical order.

One of the greatest things is that you can fetch media from the Media Library while creating your content — for example, to place video inside your blog post. We are moving on to this topic right now.

media library

Placing media inside your content via media fields

Media can be embedded into your content in the most natural way for Drupal — via fields. There is now a special new field type called Media that you can add to your content type (article, blog post, news etc.). When adding this field, you need to specify whether it will be Audio, Video, Remote Video, File, or Image.

the media field

the media field type

After that, on the content creation form, you will see the media embed option. The “Browse” button brings your Media Library to choose your media from.

adding media to content

Embedding remote YouTube and Vimeo videos with oEmbed

Here is one of the most exciting new options for media management in Drupal 8.6.0. It lets you embed remote videos from YouTube or Vimeo with just a URL.

Just add the Media field to your content type, specify it as “Remote Video,” arrange the fields to your liking — and remote videos will be ready to jump inside your content! Just as we described in the previous example, the videos can be fetched from the Media Library during content creation.

add remote video

add remote video to article

remote video embedded into article

Final thoughts

This is just a glimpse at media handling opportunities in Drupal 8 — particularly, Drupal 8.6.0. There are more additional settings for formatting your media, creating custom fields to pull more special data from the source, and many more.

The sky is the limit on your options, and the Media features are hot off the press and constantly developing.

To enjoy all these new features, you need to update your website to the innovative Drupal 8.6.0. For this, as well as for creating the perfect media setup, feel free to contact our Drupal support firm!

Oct 18 2018
Oct 18

Having a map integrated into a website is a huge advantage for business owners, especially for those with brick-and-mortar locations. This helps your customers to find you easily. Google Maps is probably the most popular mapping service and having it embedded into your website will definitely be an advantage for your business.

Drupal has amazing possibilities to help you solve this issue. Whether you do this by using Drupal 8 modules or find other alternative technique, the process is going to be simple and easy. We’ve prepared a guide for you on how to implement Google Maps Data into your Drupal 8 website in different ways.

Methods to integrate Google maps into your Drupal 8 site

Embed Maps

The first way to include Google Maps on your website is to embed them. It is maybe the easiest and the least time consuming way to have Google Map Data shown on your website.

How to embed Google Maps to your Drupal 8 website

The first step is to choose a location you want to show on your website. To do this, you should visit Google maps and find a place you’d like to provide.

How to embed Google Maps to your Drupal 8 website

After a searched location appears, press the Share button. In the opened window choose “Embed Map” and copy the whole <iframe> code.

How to embed Google Maps to your Drupal 8 website

Then you should create a basic page and give it a title.

How to embed Google Maps to your Drupal 8 website

The next thing to do is to insert a copied code into a created page. Note that it will work properly only if you choose Full HTML in the drop down Text format. After that, don’t forget to save changes.

How to embed Google Maps to your Drupal 8 website

The Map will be shown on your website as soon as the page is published.

How to embed Google Maps to your Drupal 8 website

Simple Google Maps Module

Simple Google Maps module is really easy to manage. The main advantage is that you only need to give the address of a place and a map will appear on your website. The module may be installed in different ways. Let’s look at how to downlaod and install it.

How to integrate Google Maps to your Drupal 8 website with Google Maps Module

Log in into your Drupal website as an admin. Go to Modules and click on Install new module.

integrate Google Maps to your Drupal 8 website with Google Maps Module

Find Simple Google Maps module on Drupal.org and copy the link for download tar.gz for Drupal 8.

integrate Google Maps to your Drupal 8 website with Google Maps Module

Go to Install new module page and enter the copied link to Install from URL field and press the Install button.

integrate Google Maps to your Drupal 8 website with Google Maps Module

After module installation, find this one, enable it and save changes.

integrate Google Maps to your Drupal 8 website with Google Maps Module

The module is enabled and the next step is to create a new field to show a map. Go to Structure → Content type. After that, add a new content type, and give it a name.

integrate Google Maps to your Drupal 8 website with Google Maps Module

As soon as a content type is created, go to Manage fields and add a new field with type Text (plain). Then save changes.

integrate Google Maps to your Drupal 8 website with Google Maps Module

After the settings are saved, go to Manage fields, click Manage display and check whether it is displayed on your page. Select Google Map on the one-line format from a drop-down.

integrate Google Maps to your Drupal 8 website with Google Maps Module

To manage the sizes of the map and addresses shown on your page by default, go to the config area (press the button on the right).

integrate Google Maps to your Drupal 8 website with Google Maps Module

The next step is to add a node. Click on Content → Add content and choose the content type you’ve added. Insert the title for your page. After that, in the newly created field enter an address you’d like to show on your map and save changes.

integrate Google Maps to your Drupal 8 website with Google Maps Module

After the page is created, Google Maps will be displayed on it.

integrate Google Maps to your Drupal 8 website with Google Maps Module

Geolocation Field module

Geolocation Field module is probably the most frequently used module when we talk about Google Maps integration. In short, it brings special field types for storing information about geolocation. Moreover, it has extended possibilities and enables mapping, connecting it with the desired content types.

How to integrate Google Maps to your Drupal 8 website with Geolocation Field module

The first step is to install a module. You can use the method described above.

After installing it, all you need to do is to add the Geolocation field to the content type. For this, go to Manage fields while creating a new content type and choose the Geolocation field type.

integrate Google Maps to your Drupal 8 website with Geolocation Field module

The next thing to manage is how the map will be viewed. Go to Manage from display page and choose the Geolocation Google Geocoder from the drop-down menu.

integrate Google Maps to your Drupal 8 website with Geolocation Field module

After that, go to Manage display and choose Geolocation Google Maps API - Map from a drop-down in address field. Then a map will be displayed on your page.

integrate Google Maps to your Drupal 8 website with Geolocation Field module

After a node is created, the map will be shown.

We’ve described 3 ways to integrate Google Maps Data into your Drupal 8 website. Thanks to the simplicity and flexibility of Drupal CMF, it is quite easy to perform. In case you don’t want to do it on your own or have troubles with Google Map Data integration into your Drupal 8 website, let us know and our Drupal maintenance company will assist you.

Oct 18 2018
Oct 18

As a CMS, Drupal has always been basking in compliments. It is the most powerful, the most secure, the most flexible — the list of Drupal strengths could go on. However, all this is not enough to stay current. After all, time moves fast. So what makes a truly cool CMS in 2018, loved by customers, site admins, and developers? Does Drupal fulfil this, and how? It’s time for a little investigation!

What lets Drupal remain a major CMS in 2018?

“The reason Drupal has been successful is because we always made big, forward-looking changes.” This quote is from Drupal founder Dries Buytaert.

The future-oriented changes in Drupal’s latest version, Drupal 8, really left everyone speechless ‑ so much that, when discussing them, you simply do not know where to start.

The particular quote by Dries was part of his article about Drupal’s new architecture, so let’s start with that.

Brand-new architecture and modern concepts

A successful CMS in 2018 must be in line with the most modern programming concepts, have a highly consistent, clean, and reusable code.

To achieve all this and more, Drupal adopts OOP (object-oriented programming), Symphony components, and Twig template engine, as well as polished its APIs, rebuilt its core, and more. Developers applaud, and customers enjoy more efficient processes!

Mobile perfection

According to Statista, the share of mobile phone website traffic jumped from 0.7% in 2009 to 52.2% in 2018. The mobile audience is key already! Modern CMSs cannot ignore that.

Dries Buytaert said that if he built Drupal from scratch again, he would build it for mobile experiences first. “Mobile-first” — that’s the philosophy of Drupal 8.

Responsive core themes, responsive admin interfaces, awesome built-in modules for responsive development are just some points of Drupal 8’s mobile perfection. Your users will enjoy their mobile experiences on any device.

The era of dynamic features and JavaScript

In 2018 and beyond, websites with rich, dynamic, and real-time features are ahead of others. And anywhere you find all these features together, you will also find some representatives of the JavaScript “family.”

React, Vue, Angular, Node, Ember, and other tools are more and more often mentioned in connection with Drupal. It cooperates perfectly with them, and it even planning to adopt of them in the near future. We are likely to see ReactJS as part of the Drupal family!

Beyond the shape of a website

In 2018 and beyond, you can have more than just a website. You can output your content to any imaginable applications, so your users stay with you in their natural environments.

Drupal 8 has an awesome ecosystem of third-party integration modules that provides the data exchange of your Drupal website with any other system. They also magically convert the data to the right format.

High speed with modern caching

For making websites fast enough to fly towards the future, Drupal 8 has excellent caching tools. Users will enjoy the flight!

The novel tool BigPipe uses an especially interesting approach to quick content delivery. The static elements come first, the dynamic ones come second, and the perceived loading speed is awesome.

Usability for editors

Drupal’s reputation as a developer-oriented CMS used to scare customer away a little. It was the other side of the “most powerful CMS” medal.

But now it’s time for editors to enjoy it as well!  Drupal 8’s new level of editor usability impressed even the most sceptical critics.

It is now very easy to apply quick edits right on the page, change block layout, enjoy handy content previews, drag and drop images, shape your toolbar to your liking, embed multimedia from various sources, and so much more.

Truly international

2018 is high time to overcome geographical boundaries! Millions of customers in different countries will be closer to you if your website speaks their language.

Drupal 8 offers a hundred languages, and a very smooth procedure for adding them to websites. Their interface translations are ready for you. And you can also translate every inch of your website — absolutely anything from configuration to content.

High level security

In 2018, cybercriminals have become more ingenious, so CMSs have to be stronger. Drupal is considered the most secure CMS.

This is achieved by continuous security updates that quickly catch any vulnerabilities, the “collective intelligence” of a watchful community, an especially vigilant Security Team, strict standards for submitting contributed code, refined user roles and permissions, great possibilities for data encryption, strong security modules, and more.

Accessibility for everyone

In 2018, it’s a must to provide a smooth experiences for users with visual or other impairments. There are important WCAG 2.0 and ATAG 2.0 accessibility guidelines, and Drupal 8 adheres to them. In particular, the website structure and content are more understandable to screen readers and other assistive technologies.

Semantic HTML5 with WAL-ARIA properties, useful alerts, more convenient forms, compulsory ALT tags that describe images, high contrasts, and other techniques enhance web accessibility.

To recap

That said, 2018 has a CMS that follows all the trends. And, knowing Drupal, we understand it’s just the beginning. Many groundbreaking changes are very close.

Would you like to enjoy all awesome novelties with Drupal? Contact our web development team!

Sep 07 2018
Sep 07
  • By: Malabya
  • Date: 07-09-2018

On September 6th the Drupal team shipped Drupal 8.6.0, a huge update to the Drupal project. Packed with powerful features shipped with Drupal, the release is a significant one for content editors, site builders, developers and evaluators.

With a rapid year-on-year adoption of Drupal 8, the release is set to be the leading choice for many big organisations. Known for constantly improving itself with every release, the features of Drupal 8.6.0 are quite interesting.

The new features of Drupal 8.6.0

As mentioned, Drupal 8.6.0 ships with a lot of new features out of the box which will help business leaders to showcase the potential of Drupal as a platform. The notable features added in Drupal 8.6.0 are:

Media library for Ease access to Media

One of the major features of Drupal 8.6.0, this addresses the media support provided by Drupal. While Drupal had basic files & image support, it was still far behind from what a modern web system should ideally support out of the box, for media handling. The media initiative was taken to include a rich media support system which enabled the content editors to reuse the existing media, and also have more control and meta information of the site media. In the latest version of Drupal, the rich media library is added which not only provides a quick access to the existing media entities, but also uploads new media entities out of the box.


Apart from this, a more significant improvement was the ability to add remote media types. Now content editors can easily embed YouTube or Vimeo videos into the content. This approach makes it very easy to add videos from a remote source to your content with ease. Drupal in its latest release will also provide a library for the remote media type, to easily attach a media in your content.

3D object

New Experimental Workspace Module

Drupal at its core, is a Content Management System which is all about managing your content. The experimental workspace module will change the way content authors and site maintainers work and review their content before publishing it to the end users. This will enable the creation of environments like Staging and Production, allowing content to move from one environment to another with ease. The approach will drastically relax the tiresome effort of reviewing the content, and editors can have a full site preview of how the site appears once the content gets published.

3D object

Improvements in the Layout Builder

As a site builder, it is really important to create pages of different layouts quick and with ease. In Drupal 7, this was done by contributed modules like Panelizer & Display Suite. But now, Drupal 8 has this capability in its core. Using the Layout Discovery module, site builders can easily create new layouts which will be used by Layout Builder module to build beautiful landing pages.

The features of Drupal 8.6.0 bring something new for each user, whether you are a content editor or a developer.

tweet this

3D object

Quick Installation of Drupal

One of the biggest problem for evaluators was setting up a new Drupal site which was quite a task. In this modern and fast paced world, evaluators and first time users would like to quickly set a fresh Drupal instance and review it. To tackle this issue, a new “quick-start” command was added in Drupal 8.6.0 , with only one dependency i.e PHP, enabling a new user to quickly launch a new Drupal site from scratch without the need of setting up a webserver and database.

3D object

Umami Demo environment

Apart from the “quick-start” command to launch a fresh Drupal site, the team has worked relentlessly to build a demo profile for the evaluator. The Umami demonstration will quickly exhibit the powerful features of Drupal 8 like data modelling, content listing, blocks and content moderation. This will not only help a new user to come onboard, but also help the service providers to demo, thus harnessing the capabilities of Drupal to potential customers.

3D object

Drupal has been evolving rapidly and bringing in a lot of modern functionalities which are out of the box while improving the usability and robustness of the system. The features of Drupal 8.6.0 bring something new for each user, whether you are a content editor or a developer. With releases like this, it proves the potential and the enthusiasm of the contributors to make Drupal a better product with every release.

Aug 24 2018
Aug 24

Drupal 8 will actively complain when your site does not have a hash_salt configured, which usually gets generated when installing the site. (The complaint, mind you, might be fairly obscure; your site might just say "The website encountered an unexpected error. Please try again later." Depending on your error reporting settings, the message might be a bit more helpful). If, for example, you "install" a site by copying over a database and files, you will not have this.

When you need a fresh site hash, you can use the following Drush command.

drush php-eval 'echo \Drupal\Component\Utility\Crypt::randomBytesBase64(55) . "\n";'

Alternatively, if you would like to put it in a file, so that you can read the file from somewhere outside your webroot, you could do:

drush php-eval 'echo \Drupal\Component\Utility\Crypt::randomBytesBase64(55)' > salt.txt

To quote the comment from default.settings.php:

 * Example:
 * @code
 *   $settings['hash_salt'] = file_get_contents('/home/example/salt.txt');
 * @endcode

Aug 24 2018
Aug 24

Drupal 8 will actively complain when your site does not have a hash_salt configured, which usually gets generated when installing the site. (The complaint, mind you, might be fairly obscure; your site might just say "The website encountered an unexpected error. Please try again later." Depending on your error reporting settings, the message might be a bit more helpful). If, for example, you "install" a site by copying over a database and files, you will not have this.

When you need a fresh site hash, you can use the following Drush command.

drush php-eval 'echo \Drupal\Component\Utility\Crypt::randomBytesBase64(55) . "\n";'

Alternatively, if you would like to put it in a file, so that you can read the file from somewhere outside your webroot, you could do:

drush php-eval 'echo \Drupal\Component\Utility\Crypt::randomBytesBase64(55)' > salt.txt

To quote the comment from default.settings.php:

 * Example:
 * @code
 *   $settings['hash_salt'] = file_get_contents('/home/example/salt.txt');
 * @endcode

Jul 04 2018
Jul 04

Who is allowed to view, edit, or delete particular information on your website? Details like this are vital for the site’s security and usability. Many website also need special access scenarios. Luckily, we have Drupal — fine-grained user access is a breeze with it! First, one of Drupal’s benefits is that it has built-in user roles and lets you create custom ones, as well as give them granular permissions. Second, there are many useful add-on contributed modules in this area as well. So today, we are reviewing user access modules in the latest Drupal version — Drupal 8.

User access modules in Drupal 8

Permissions by Term

With the help of the Permissions by Term module, you can restrict or allow access to specific website content on the basis of taxonomy terms. These permissions can apply to user roles or to individual users. They work for nodes, views, search, menus etc. The Permissions by Term module had a fresh release in May 2018. It is a lightweight alternative to the Organic Groups and Group modules, which are just getting ready for Drupal 8. We have already dedicated a blog post to the Permissions by Term module that you can check out.

Protected Pages

Here is a fresh module right from the development “oven.” Drupal 8’s version of the Protected Pages module has come out in June 2018. It allows you to protect certain website pages with a password. In Drupal 8 version, you can also protect private files. Interesting features include global password setting, session expiry time, protection bypass permission to free certain users from this procedure, and more.

Node View Permissions

This simple module adds two types of permissions to every content type. Namely, these are “View own content” and “View any content.” The permissions can be found on the website’s Permissions tab. The Node View Permissions module easily combines with any other user access modules.

Vocabulary Permissions Per Role

Thanks to the Vocabulary Permissions Per Role module, you can allow content editors to work with a particular taxonomy vocabulary. They will be able to add new taxonomy terms, edit or reorder them, and more. This is possible without granting them the “administer taxonomy” permission, which would give them too much responsibility.

Menu Admin per Menu

Sometimes, it is necessary to allow certain users to add, edit, or delete particular menus. At the same time, they do not have permissions for other menus. With all its flexibility, Drupal will let you arrange this with the help of the Menu Admin per Menu module. Keep in mind that users without full admin permissions may not, by default, see the menus, so you need to place them within their visibility.

Override Node Options

Here is another user access module with a fresh Drupal 8 release in spring of 2018. The Override Node Options module lets you set permissions for each field on the node form. These permissions refer to “Authoring information” and “Publishing options.” The module also lets you make certain field sets collapsible.

Block Content Permissions

Fine-grained access to block management is offered by the Block Content Permissions module in Drupal 8. It adds the permissions to administer custom block types, view restricted block content, as well as create, edit, and delete the content of specific block types. The permissions are assigned to user roles.

Block Region Permissions

Another great example of flexibility it the Block Region Permissions module. It lets you control access to block management within each region of your website’s theme. For this, the special “administer” permission can be granted to specific user roles. Users with this permission will be able to see the region on the block layout page, update or delete its blocks, and more.


In addition to new and exciting workflow management features in Drupal 8 core, there are contributed modules like Workflow. Its Drupal 8 version is also a novelty of 2018. The module lets you create workflow states for various node types and allow certain user roles to change these states (or example, from “Draft” to “Published”). To the change of state, you can attach particular actions — nodes get published, emails are sent, and so on.

Taxonomy Access Control Lite

Here is another module that works via taxonomy. The Taxonomy Access Control Lite module manages access to nodes on the basis of taxonomy terms that are applied to them. It grants permissions based on user roles and can also assign them to particular users in addition to what their roles allow. The module supports the permissions to view, update, and delete the nodes.

Nodeaccess (beta)

With the Nodeaccess module, it will be possible to give certain users the “grant node permissions” permission. These users will have a “grant” tab on their node pages. Form there, they will grant the permissions to view, edit, or delete the node to particular user roles or to individual users. Administrators can decide which roles are available to grant these permissions to, as well as make default access settings for content types.

Custom Permissions (beta)

The Custom Permissions module (formerly known as Site Configuration Permissions) allows for creating and managing additional permissions on the administration page. A permission gets a name and a route (which used to be a path in Drupal 7). The permissions can then be assigned to user roles. In Drupal 8, custom permissions are configuration entities that can easily be exported and imported.

Final thoughts

This is just a brief overview of Drupal 8 user access modules. There are many other very good modules, some of which are in the beta or alpha stage, getting ready for Drupal 8. In any case, the choice is great!

Our Drupal team is always ready to choose the most relevant modules for your website and configure them in optimal ways. If necessary, we will create custom modules for you.

Everything can be done to provide your Drupal 8 site with user access scenarios that you need — just contact Drudesk!

Creating services with optional dependencies in Drupal 8

Jun 07 2018
Jun 07
May 09 2018
May 09

Some operations are time consuming, really heavy memory and/or CPU intensive. By performing an operation one time, and then caching the output, the next requests could be executed faster. Drupal provides an easy cache API in order to store, retrieve and invalidate cache data. I did this tutorial because I couldn’t find a step by step tutorial in order to add cache metadata to render arrays easily!

In this tutorial we'll:

  • Get an overview of the render array caches and how to use them properly.
  • We are going to get our hands dirty on code.


  • Familiarity with custom module development.
  • How to create a custom controller to process incoming requests.
  • Some knowledge of render arrays.

Overview of Render array

Drupal uses render arrays to generate HTML that is presented to the end user. While render arrays are a complex topic, let’s cover the basics.  A render array is an associative array that represents a one or more HTML elements, properties and values.  If you’re interested in more about render arrays, see Render arrays from official Drupal docs.

Cache metadata to render array

When we have a render array, instructing Drupal to cache the results is easy, we only need to use the #cache property. But what kind of caching? Drupal 8 provides several kinds out of the box:

  • max-age stores cache data by defining its time in integer format and seconds
  • tags is an array of one or more cache tags identifying the data this element depends on.
  • contexts specifies one or more cache context IDs. These are converted to a final value depending on the request. For instance, 'user' is mapped to the current user's ID.

Creating the module and controller

$ drupal generate:module --machine-name=d8_cache

A module alone isn’t enough. We also need a controller to respond to incoming requests. We can use Drupal Console to generate the controller too:

$ drupal generate:controller --module=d8_cache --class=DefaultController

When creating the controller, you’ll enter into a loop where you can enter three pieces of information necessary for the controller to define a route: The title, method name, and the path. Let’s make one route for each of the cache types:

Title Method Name Path cacheMaxAge cacheMaxAge /d8_cache/max-age cacheContextsByUrl cacheContextsByUrl /d8_cache/contexts cacheTags cacheTags /d8_cache/tags

Now we should have an *.info.yml, *.routing.yml and our controller class.inally, let’s enable our custom module:

 $ drupal module:install d8_cache

Cache “max-age”

With the module and routes created, we can now start playing with Drupal caching.In DefaultController.php, locate the cacheMaxAge() method and add the following:

public function cacheMaxAge() {
 return [
   '#markup' => t('Temporary by 10 seconds @time', ['@time' => time()]),
   '#cache' => [
     'max-age' => 10,

If we open a web browser and navigate to http://your_drupal_site.test/d8_cache/max-age, we see a “Temporary by 10 seconds timestamp” where timestamp is the current time as a UNIX timestamp. 
“What good is that!?” you might ask. Well, if you refresh the page you’ll notice something interesting.  The first time the page will say something like  “Temporary by 10 seconds 1520173774”. If we hit refresh immediately, we’ll see:

“Temporary by 10 seconds 1520173780” (the first second)

“Temporary by 10 seconds 1520173780” (in the next second)

“Temporary by 10 seconds 1520173780” (and so on)

The timestamp doesn’t change! If we wait for the whole 10 seconds we specified in max-age, the cache invalidates/expires and and is replaced with a new timestamp: “Temporary by 10 seconds 1520173790” 

Great, this worked like a charm!

What if we want to make it so the page never expires? Drupal provides a special constant for this, \Drupal\core\cache\Cache::PERMANENT exactly for this case. We’d only need to change the value of max-age:

public function cacheMaxAge() {
  return [
    '#markup' => t('WeKnow is the coolest @time', ['@time' => time()]),
    '#cache' => [
      'max-age' => \Drupal\Core\Cache\Cache::PERMANENT,

And the message for instance “weKnow is the coolest 1520173780” will never change! Well, not “never”. We can force the page to update by clearing the Drupal cache. This can be done under Admin > Config > Development > Performance, or using Drupal Console:

$ drupal cr all

So that was max-age, one of the simplest caching strategies. What if we need something more...nuanced?

Cache “contexts”

Caching by contexts let us specify a condition by which something remains cached. A simple example is the URL Query, or any part after the ? in a URL. We already defined the route earlier, so we open DefaultController.php and edit the cacheContextByUrl() method:

public function cacheContextsByUrl() {
  return [
    '#markup' => t('WeKnow is the coolest @time', ['@time' => time()]),
    '#cache' => [
      'contexts' => ['url.query_args'],

The above piece of code will display a message such as “weKnow is the coolest 1520173780”, and invalidate cache when a new query parameter from url is set or gets updated.

If we visit for instance http://your_drupal_site.test/d8_cache/contexts the first time, we’ll see something like:  “weKnow is the coolest 1520173780”. If we hit again the same message is displayed. But, if we do add a query parameter like http://your_drupal_site.test/d8_cache/contexts?query_a=value, then the cache is invalidated and the page updates with a new timestamp: “weKnow is the coolest 1520173909”.

Sometimes, we only want to invalidate the cache based on a specific argument in the URL query. We can do that too:

public function cacheContextsByUrlParam() {
  return [
    '#markup' => t('WeKnow is the coolest @time', ['@time' => time()]),
    '#cache' => [
      'contexts' => ['url.query_args:your_query_param'],

Now if we visit the following URL:


Only then does the message change:“weKnow is the coolest 1520173909” If we visit the same URL with the same query parameter set (your_query_param), the cache is invalidated and we get a new timestamp once again:

“weKnow is the coolest 1520173910”
And so on…

The url.query_args:your_query_param value we passed to contexts in our render array instructs Drupal to only invalidate the cache if a certain URL query parameter is set. 

If we visit:


The message is “weKnow is the coolest 1520173910” (first second)
“weKnow is the coolest 1520173910” (next second)
“weKnow is the coolest 1520173910” (after few minutes)

And so on!

Notice the message doesn’t change. This is because we set to invalidate cache on the query param “your_query_param” and above is another query param. Since your_query_param is not in our URL, Drupal will never invalidate the cache. 

Caching by the URL query isn’t the only context available in Drupal. There are several others:

  • theme (vary by negotiated theme)
  • user.roles (vary by the combination of roles)
  • user.roles:anonymous (vary by whether the current user has the 'anonymous' role or not, i.e. "is anonymous user")
  • languages (vary by all language types: interface, content …)
  • languages:language_interface (vary by interface language — LanguageInterface::TYPE_INTERFACE)
  • languages:language_content (vary by content language — LanguageInterface::TYPE_CONTENT)
  • url (vary by the entire URL)
  • url.query_args (vary by the entire given query string)
  • url.query_args:foo (vary by the ?foo query argument

Refer to drupal 8 contexts official documentation for more details about cache “contexts”.

Cache “tags” 

The contexts cache type is really versatile, but sometimes we need more complete control over what is and isn’t cached. For that, there’s tags. Open the controller and modify the cacheTags() method to be the following:

public function cacheTags() {
  $userName = \Drupal::currentUser()->getAccountName();
  $cacheTags =   User::load(\Drupal::currentUser()->id())->getCacheTags();
  return [
    '#markup' => t('WeKnow is the coolest! Do you agree @userName ?', ['@userName' => $userName]),
    '#cache' => [
     // We need to use entity->getCacheTags() instead of hardcoding "user:2"(where 2 is uid) or trying to memorize each pattern.
      'tags' => $cacheTags,

Ok, now let’s login with our username  -- this post uses “Eduardo” -- and visit:


Above code prints “weKnow is the coolest! Do you agree Eduardo?” If we hit the page again it will say “weKnow is the coolest! Do you agree Eduardo?” and subsequent requests will say the same.

If we edit our own username to “EduardoTelaya” and hit save our tag cached page changes:

“weKnow is the coolest! Do you agree EduardoTelaya?”

Why is that?

If you look closely at the method, you’ll notice we get a list of cache tags for the current user. If we use a debugger to see the value of $cacheTags, it will say “user:userID” where userID is the user’s unique ID number. When we updated our user account, Drupal invalidated any cached content associated with that tag. Cache tags let us build a dependency into our cache on another entity or entities in the site. We can even define our own tags to have full control!

Tips and tricks

In the above examples we only had one #cache in each render array. Drupal allows us to specify the caching at different levels in the tree depending on need. Let’s suppose we have the following, a tree of render array:

public function cacheTree() {

   return [
     'permanent' => [
       '#markup' => 'PERMANENT: weKnow is the coolest ' . time() . '<br>',
        '#cache' => [
          'max-age' => Cache::PERMANENT,
     'message' => [
       '#markup' => 'Just a message! <br>',
       '#cache' => [
     'parent' => [
         'child_a' => [
           '#markup' => '--->Temporary by 20 seconds ' . time() . '<br>',

         '#cache' => [
           'max-age' => 20,
      'child_b' => [
        '#markup' => '--->Temporary by 10 seconds ' . time() . '<br>',
        '#cache' => [
          'max-age' => 10,
    'contexts_url' => [
      '#markup' => 'Contexts url - ' . time(),
      '#cache' => [
        'contexts' => ['url.query_args'],

If we visit the first time http://your_drupal_site.test/d8_cache/tree:

We get this:

PERMANENT: weKnow is the coolest 1520261602
Just a message! 
--->Temporary by 20 seconds 1520261602
--->Temporary by 10 seconds 1520261602
Contexts url - 1520261602

(Please refer to timestamp above for example purposes)

In the next second, if we visit the same page again, we get the same message. But once it reaches 10 seconds, the cache is invalidated thanks to the render array element “child_b” (which was set to expire/invalidate to 10 seconds) and we are going to have a different message:

PERMANENT: weKnow is the coolest 1520261612
Just a message! 
--->Temporary by 20 seconds 1520261612
--->Temporary by 10 seconds 1520261612
Contexts url - 1520261612

Notice how not only “child_b” was updated but also the rest of render array elements. The same will happen if you wait 20 seconds or visit /d8_cache/tree?query=value, which invalidates cache according to url query contexts.

This is called  “bubbling up cache”. This can affect the response cache you can see as a whole! In order to avoid that you should use “keys” attribute in order to cache individual elements. By adding “keys” you protect from cache invalidation from siblings array elements and children array elements. Let’s add a new method and path to our code in order to add keys:

public function cacheTreeKeys() {

 return [
   'permanent' => [
     '#markup' => 'PERMANENT: weKnow is the coolest ' . time() . '<br>',
     '#cache' => [
       'max-age' => Cache::PERMANENT,
       'keys' => ['d8_cache_permament']
   'message' => [
     '#markup' => 'Just a message! <br>',
     '#cache' => [
       'keys' => ['d8_cache_time']
   'parent' => [
     'child_a' => [
       '#markup' => '--->Temporary by 20 seconds ' . time() . '<br>',
       '#cache' => [
         'max-age' => 20,
         'keys' => ['d8_cache_child_a']
     'child_b' => [
       '#markup' => '--->Temporary by 10 seconds ' . time() . '<br>',
       '#cache' => [
         'max-age' => 10,
         'keys' => ['d8_cache_child_b']
   'contexts_url' => [
     '#markup' => 'Contexts url - ' . time(),
     '#cache' => [
       'contexts' => ['url.query_args'],
      'keys' => ['d8_cache_contexts_url']

If we visit now /d8_cache/tree-keys

We will get:

PERMANENT: weKnow is the coolest 1520261612
Just a message! 
--->Temporary by 20 seconds 1520261612
--->Temporary by 10 seconds 1520261612
Contexts url - 1520261612

And if we wait for 10 seconds we are going to see:

PERMANENT: weKnow is the coolest 1520261612
Just a message! 
--->Temporary by 20 seconds 1520261612
--->Temporary by 10 seconds 1520261622
Contexts url - 1520261612

Notice how just “--->Temporary by 10 seconds 1520261622” gets updated but the rest of the output doesn’t get updated (this is thanks to keys attribute that prevent cache invalidation to the rest of array elements).


You can download full source code for this post on Github.


In this post, we saw an overview of render arrays, how to use three different cache types. We used max-age for simple, time-based caching. Cache contexts provides a caching strategy based on a variety of dynamic conditions. The tags cache type lets us invalidate caches based on the activity on other entities or full control via custom tag names. Finally, we used  “cache keys” to protect against other cache invalidation in a render array tree.

This is it! I hope you enjoyed this tutorial! Stay tuned for more!

This post was contributed by Eduardo Telaya, a former member of the weKnow team. You can find him on Twitter at @Edutrul, or speaking at Drupal events in Latin America such as Drupalcamp Costa Rica.

May 09 2018
May 09

Here's how the ideal decoupling Drupal scenario looks like:

Stripping Drupal to its essential role, that of a robust and flexible content repository, no Drupal expertise needed. Then using it to back your front-end with; one that you'd be free to build by leveraging any modern (JavaScript) technology of your choice.

… a Drupal back-end content store that would still preserve all its content editing and managing functionalities, needless to add.

Luckily, this is no longer “daydreaming”. Not since Reservoir, the headless Drupal distribution, has been available. 

Here are some of its “promises” or well-known challenges, if you prefer, that this distribution's geared at solving:

  1. to make Drupal far more accessible (cutting the intimidating Drupal setting up and configuration out of the equation) to developers of all stripes
  2. to empower developers with all the best practices for building their Drupal-backed front-ends quick and easy
  3. to provide an opinionated starting point enabling any developer to build a Drupal content repository backing his non-Drupal application with... no Drupal knowledge needed, actually

Your Current Situation: Why Would You (Even) Consider “Headless” Drupal?

Here you are now, dealing with the pressure of:

  • having to deliver content agnostically across any given channel and device: single-page JS apps, mobile apps, digital signage, AR and VR-driven content, IoT apps etc...
  • … all while storing it (content) in one single place 
  • providing your editorial team with a... way to edit, manage and overall administrate content conveniently easy, via an editor-friendly UI
  • … independently of the development team, of course
  • finding a way to enable your developers to easily send content across this entire “ecosystem” of channels, devices and platforms

In other words: you're grappling with the challenge of making Drupal ideally accessible to your (non-Drupal) developers; so they can easily build their Drupal-based content store enabling them to deliver content to any given device.

… to serve it to any given app/site.

And this definitely calls for a decoupling Drupal approach.

Decoupling Drupal: The Most Discouraging Challenges You Must Be Facing 

Let's assume that you're already considering headless Drupal as a solution for your current challenge, that of delivering content to multiple channels, devices, platforms.

Whether you're planning to decouple Drupal for:

  1. building a Drupal-backed front-end, leveraging one of your modern JavaScript frameworks of choice
  2. or using it as a content store for your non-Drupal app

Then, it's these specific challenges that you must be facing right now:

  1. your non-Drupal developers are having trouble maneuvering Drupal content; they're not familiar with all the dials and knobs needed for making the most of Drupal's REST API 
  2. Drupal's serialization format is... alien to them 
  3. there's no starting point or well-defined best practices for non-Drupalists, that would ease their way to turning Drupal into a content repository
  4. … one that they could back their front-ends with

True story!

And still, there is hope...

5 Reasons For Being “Skeptical” About Distributions

You must be legitimately cautious right now when it comes to using an API-first distribution for Drupal. And that's due to some bad experiences with... distributions.

Now let me try and guess some of your “fears” regarding Reservoir:

  1. that it might turn out to be overly complex 
  2. that you risk getting “stuck with” architectural debt
  3. that its maintainers might someday lose interest in it
  4. that it's built primarily for other use cases, for scenarios different from your own decoupled Drupal implementation project
  5. that you risk “inheriting” bugs in features that you haven't even used 

And the list of reasons why you're not yet jumping on this decoupling Drupal trend could go on...

Introducing Reservoir: The Headless Drupal 8 Distribution! How Is It Different?

Before putting it into the spotlight and giving it a “full scan”, let me try to read your mind and identify the questions that you must be asking yourself right now:

  1. “How precisely do I use Reservoir as a content store backing my front-end website or app?”
  2. “Which are the bare essential Drupal modules and core functionality that this distribution comes packed with?”
  3. “How can I leverage these ready-to-use components for decoupling Drupal?”

And now that we've put your valid queries into words, let me try and define Reservoir for you:

  • 1st definition: a distribution for decoupling Drupal
  • 2nd definition: an ideally flexible and minimalist tool empowering developers of all backgrounds to build content repositories for their apps to “consume”
  • 3rd definition: the headless Drupal 8 distribution “specialized” in manipulating content and interacting with it via HTTP APIs
  • 4th definition: a Drupal-based content store with all the web service APIs backed into, so that any developer can jump straight to building his front-end app
  • 5th definition: simply a... content repository; one that just happens to be Drupal-based, as the Reservoir project's maintainers admitted.

Now the 4 key goals behind this distribution for decoupling Drupal —  besides that of providing a simple way of building a content repository enabling you to use any technology for your front-end —  are:

  1. on-boarding developers or all stripes, making Drupal ideally accessible to... anyone
  2. providing a much-needed opinionated starting point for any type of decoupled Drupal implementation; no Drupal knowledge required 
  3. keeping itself away from the scope creep that end-user facing products risk falling into
  4. serving a specific decoupled use case

Decoupling Drupal Made Easy & Accessible: Key Reservoir Features 

“But how does Reservoir make building Drupal-based content repositories so much easier than other... distributions?” 

“How precisely does it make Drupal accessible to non-Drupal developers, as well?”

You're more than entitled to ask yourself that...

Therefore, let me outline here the out-of-the-box Reservoir features geared at speeding up any decoupled Drupal implementation. Regardless of the developer's background:

  • an opinionated selection of API-first/ web services modules — Reservoir offers each developer a much-needed starting point/”push” so that he can ramp up and have his content stores built in no time: Simple OAuth modules here included
  • quick and easy access to the content back-end via JSON API 
  • auto-generated documentation (API documentation), that gets automatically updated, as well, as you're browsing it, as your content model changes
  • OpenAPI format export, that supports hundreds of tools integrating with the OpenAPI specification 
  • easy-boarding/tailored UI —  expect a “welcoming tour” once you've installed Reservoir, one focused on getting you familiar with modeling and managing content, web service APIs, mapping out new content models etc.
  • a permission system and content editing UI empowering your editorial team to easily manage content 
  • SDKs, libraries and references —  included in the Waterwheel ecosystem —  so that your development team can skip the time-consuming API learning phase and jump straight to “attaching” Drupal back-end content to their front-end apps

Note: Reservoir, the distribution for decoupling Drupal, deliberately shakes off some of Drupal's functionality that's irrelevant for content repositories (modules such as Breakpoint, Views, Content, the user-facing front-end etc.)

For we couldn't even talk about speeding up your decoupled Drupal project when there's an unnecessarily heavy weight of Drupal modules and features “dragging down” the whole implementation process, right?

Wrapping Up: What Reservoir Aims At Is...

... enabling your developers to jumpstart building self-hosted content repositories capable to serve any given front-ends.

Front-ends that they get to build independently, tapping into the technologies they prefer, on a project-by-project basis.

Pretty convenient, don't you agree? 

How to find the route name in Drupal 8?

Apr 19 2018
Apr 19
Apr 09 2018
Apr 09

drupal securityHere is a brief account of how we applied the most critical Drupal security update in the past couple of years to web projects we support and monitor.

As you probably know, our company supports and monitors the performance of several dozen Drupal-powered sites. On 2018.03.21 it was announced that on 28.03, around 22:00 +0300, a critical Drupal security update will be released. Of course, it was absolutely necessary to apply it to all sites for which we are responsible, and do that within the shortest time possible.

As you understand, the web projects we support are not uniform, they are in fact quite different from each other, run different versions of Drupal and occupy different servers. Many sites endured radical changes in their development teams before we undertook their support and performance monitoring.

We tasked our DevOps engineers with developing a solution that allows:
1) applying the security update to all supported and monitored projects within one (1) hour;
2) updating the Drupal core or applying the patches available;
3) backing up sites before applying the updates.

Within a week we developed and tested the solution. We used Ansible, git, and bash. Also, we integrated the solution with our monitoring system.

The critical update was released on schedule. Our specialists checked the changes made to the kernel and greenlighted the automated update solution we have developed. Nevertheless, to avoid any problems with operation of our clients' websites, we did a test first: run the automated update for a small group of sites, which included our projects and test sites. The test run returned a number of issues that were remedied promptly. After that, we run the update solution for all the supported web projects.

The results:
1) All sites continued to work as usual, our monitoring tools never reported any problems;
2) The entire update procedure took 1 hour, as we have planned (issues remedying included);
3) We now have an excellent solution that automates the uncomplicated but labor-intensive process of applying security updates.

From now on, this automated Drupal update solution will be used for all projects and servers that we support.

Mar 22 2018
Mar 22

Last weekend, the DrupalCamp Ruhr was held in Essen, Germany. I was fortunate enough to have been selected as a speaker. I've now made the slides available online.

The slides are at Drupal 8 Configuration Management, Workflows for site development. It is an evolution of the talk I did last year at the Dutch DrupalJam.

The presentation uses Reveal.js, which means it has some neat tricks up its sleeve. You can have a look at the speaker notes bij pressing 's' (they're no secret) and zoom out to an overview of slides by pressing 'o' or esc. Should you want a print version, you can pass ?print-pdf as a GET-argument in the URL, provided you use Chrome or Chromium to do this (the presentation itself should work fine in any browser, although I've only really tested it in Safari on the Mac). I recommend tweaking the styling a little in your browser to set text color to black and not printing backgrounds, or it will take a lot of ink.

Mar 09 2018
Mar 09

Hey all! Today, we shall show you some examples of master-slave replication setups.

A bit of theory first

Why do you need replication in the first place? There are at least two reasons to set it up. First off, it is your insurance that helps avoid downtime when/if your master MySQL server goes down: with replication, slave server picks up and fills for the master. Secondly, replication allows decreasing load suffered by the master server: you use it for writing only and pass read queries to slave.

The replication process

Nothing really complicated here. Master server writes binlogs that contain operations performed on the DB(s) and keeps tabs on journal records of shifts from the start to the current record. Slave connects to master, compares positions and reads changes found in the journal starting from its own position and finishing with the master’s position, and then applies the changes (commands) found to the DBs it hosts.

Master server setup

First off, we change my.cnf on the master server:

#server’s ID goes here
server-id = 1
#and this is where you specify the log’s name and path to it.
log_bin = /var/log/mysql/mysql-bin.log

A comment is due here: by default, master writes binlogs for all DBs, but you can change that with the help of binlog-do-db. The command tells the server to fill logs only when the specified DB is touched, and changes made to other DBs never make it to that log. You could also set logs expiration time and max size (expire_logs_days and max_binlog_size parameters).

Now, we grant a MySQL user permission to do replication:

GRANT replication slave ON *.* TO [email protected]_server_ip IDENTIFIED BY "password";

replication slave - allows user to read binlogs.
slave_server_ip -ip of the server the user will connect from.

Next, we restart our MySQL server:

/etc/init.d/mysql restart

and check the master’s status:

show master status;

The reply should contain the binlog’s name and position record it has. When you run queries to DB, the position will change.

Slave server setup

my.cnf should receive the following:

#slave’s ID, must be different from master’s ID.
server-id = 2
#same as the binary log,it is a list of numbered files that contain events describing changes made to the DB
relay-log = /var/lib/mysql/mysql-relay-bin
#index file containing names of all used relay journal files.
relay-log-index = /var/lib/mysql/mysql-relay-bin.index
replicate-do-db = [the DB to be replicated]. 

Important! When you cross DBs, i.e. use one DB but update the data in another, you don’t need to add binlog-do-db to the master’s setting. You want binlogs written for all DBs. Slave’s settings should receive replicate-wild-do-table=db_name.%, (db_name - name of the replicated DB) instead of replicate-do-db.

Restart MySQL server:

/etc/init.d/mysql restart

Switching on the replication

Now, we need to backup master’s DB while keeping the position in the binlog intact. The trick is to first block DB, make it read-only:

SET GLOBAL read_only = ON;

Check the master’s status:

show master status;

Write down File and Position values. The Position should not change now.

Next, we create a master’s dump:

mysqldump -uname -ppassword db_master_name > dump_db 

The parameters are pretty obvious here:

  • name - username,
  • password - password (obviously),
  • db_master_name - name of the DB,
  • dump_db - name for the dump.

Once the dump is done, we need to make the DB writable again:

SET GLOBAL read_only = OFF;

Next, we move the dump to the slave server and restore it there:

mysql -uname -ppassword db_slave_name < dump_db

Replication setup:

CHANGE MASTER TO MASTER_HOST = “master’s ip”, MASTER_USER = "username", MASTER_PASSWORD = "password ", MASTER_LOG_FILE = "log’s name", MASTER_LOG_POS = position;

Again, everything is just what it seems here:

  • master’s ip is the ip of the server that host the master,
  • username is the name of the user created on the master server,
  • log’s name is the File value on the master server as of the moment the dump was made,
  • position is the Position value on the master server as of the aforementioned moment.

Now we start the slave:

start slave;

We can monitor the replication status:


Security setup for master server

bind-address in /etc/mysql/my.cnf specifies the IP address MySQL server should listen to waiting for connection.

Typically, the value is bind-address = However, once we have the slave server set up, we need to allow connection from that server and keep local connections functioning. Bind-address does not allow to specify more than one IP address, so we comment it to allow connections from all IPs. This is a very dangerous situation, which we can remedy with the help of iptables:

#first, we allow connection from the slave’s IP
iptables -I INPUT -p tcp -s ip_slave_server-a --dport 3306 -j ACCEPT
#secondly, we disallow connections from all other IP addresses.
iptables -I INPUT -p tcp --dport 3306 -j DROP

And that is how you do it: we now have two MySQL servers operating as master and slave, which makes the site much more resilient and even speeds up some Drupal-powered sites. One of the next pieces will cover switching between master and slave modes when the master is down. Stay tuned!

Updating to Drupal 8.5 with composer

Mar 02 2018
Mar 02
Feb 15 2018
Feb 15

In an effort to better understand each team member’s unique contribution to iterate, we have begun monthly sessions where each team member gives a 5 minute presentation educating the rest of the team about a specific aspect of their work. It is a great opportunity to not only work on our presentation skills, but it also allows us to learn from each other. We don't take ourselves too seriously so the presentations were fun and informative. Below is a brief overview explaining what each team member spoke about last month.

To kick off 2018 we had our first round of these 5 minute presentations in January. We learned about Why Typography Matters, competing at SEO, Drupal 8 templates, Mental Fitness for Business, and When to Apologise.

Mark started off the presentations with a look at why typography matters. The goal of the presentation was to introduce the team to the basics of typography by discussing the characteristics of different type classifications. We took a look at the anatomy of letterforms in order to be able to identify and discuss different fonts. We also looked at how we read type by looking at negative space, line length and saccadic eye movement. If you didn’t know and we sure didn’t, saccades are rapid, ballistic movements of the eyes that abruptly change the point of fixation. We finished with some practical tips on web typography and advanced typesetting options in text editor tools.

Next, Dale gave us a live demonstration of a Drupal 8 template and discussed the pros and cons of using a template as a basis for a development project. As a company who has spent years discussing the downfalls of using templates, this was an eye opener!

Colin gave us a brief overview of how to compete at SEO. We looked at the consideration to bid on competitor branded keywords in adwords and at related searches to help identify competitor keywords. He also analysed the nature of keywords or phrases and how they can indicate where a searcher may be in their purchase and if they are someone that should be targeted. Lastly, he spoke about crafting content that delivers a superior experience.

Lyndsey and Karen had just come back from a seminar with Neil O’Brien who spoke about the importance of Mental Fitness, specifically when its applied to business performance. Their presentation detailed the three factors that contribute to Mental Fitness:

  • Mood
  • Self Discipline and Habit
  • Resilience and Recovery

While they discussed the details and insights involved with all three of these contributing factors to mental fitness, in the end the steps and exercises taken to improve on each ultimately lead to this conclusion:

“The key to your mental fitness is the ability to do what you don’t want to do when you don’t want to do it”

and the understanding that your potential is on the edge of your comfort zone and that is where mental fitness is. A follow up post will go into this in more detail.

Finally, Gary spoke about the importance of apologising and specifically, knowing when and how to apologise. And on that note, we’re sorry that it’s been so long since we wrote a blog post… we’ve been very busy working on client projects! FYI, you’re not meant to make excuses after you apologise but we're still learning.

Jan 20 2018
Jan 20

If you have the Media module for Drupal 8 installed (not a requirement to use media with Drupal 8, so this post may not apply to you), you need to remove it before you can upgrade to the latest core version (8.4). Unfortunately, there are a few gotchas involved with the process. This blog post is about getting rid of the old contrib Media module, so the site can be updated to Drupal 8.4 in a subsequent step. This is based on my personal experience. YMMV, as they say.

Originally I published this post on december 25th of 2017. Merry Christmas! Since this blog was added to Planet Drupal yesterday, I thought it would benefit others to re-date this to today, so it would appear in the Planet feed.

Having to maintain this site in my spare time, it has been far too long for me to upgrade it to Drupal 8.4 (it actually went live on Drupal 8.3 when 8.4 was already final, because the platform had been running for a while for another site and frankly, I just wanted it live—something about a plumber and leaky pipes). The site had been built with the contrib Media module, which turns out to be a bit of a mistake (just because of the problems I outline below, not because there was anything wrong with the module), but that's water under the bridge.

Where the Media module for Drupal 7 is the core for a (the?) leading Media solution, for Drupal 8 that responsibility moved to the new media_entity module, as well as a bunch of extension modules that add specific media types. In short, Media in Drupal 8 is much more modular. The Media module itself still existed, but it was basically a quick start suite of configuration and a few tweaks to how things worked out of the box.

The reason removing the contrib Media module is needed is that from 8.4 on, media_entity was integrated into core, except that is is now called... Media module. This means the contrib Media module would have a name collision with the new Media module in core. So, it needs to be disabled. Which is mostly OK (you can retain most of the configuration it adds), except for a new nasty gotchas.

Note that this is not about moving your site to the core media entity type. That is something that will have to happen eventually. You will have to wait for all extension modules (image, video, maybe gallery, Twitter or Instagram, etc.) to have versions that work with the core entity type, as well as for the upgrade path to be complete. This needs to happen, though, if you currently have Media module and you need to move to Drupal 8.4 (and you do need to; 8.3 stopped being supported when 8.4 came out).

Gotcha #1: Route "view.media.media_page_list" does not exist

When I first tried disabling the contrib Media module (which I will simply call Media module for the remainder of this blog post), I was greeted by this lovely error message. In full, it read:

Symfony\Component\Routing\Exception\RouteNotFoundException: Route "view.media.media_page_list" does not exist. in Drupal\Core\Routing\RouteProvider->getRouteByName() (line 190 of core/lib/Drupal/Core/Routing/RouteProvider.php).

It went along with the dreaded "An unexpected error occurred" as well as a giant stack trace, but that's just due to my development environment settings.

The View is what the Media module added in place of the View that's also added by media_entity module. I haven't quite figured out how this situation came to be, but there is still a View in the exported configuration, presumably the one added by media_entity. However, as far as I can tell, there were no actual changes to the exported configuration, so it is still a bit puzzling. Luckily, the solution turned out to be fairly straightforward; the View had its status key set to false in the exported configuration yml-file (views.view.media.yml):

langcode: nl
status: false
    - core.entity_view_mode.media.media_library
    - media_entity.bundle.gallery
    - entity_browser
    - media_entity
    - user

Changing it to true and re-importing configuration got rid of this problem (don't forget to remove media in core.extension.yml if you do this; chances are you didn't get a chance to actually export the configuration after disabling the Media module, so re-importing your exported configuration would happily re-enable it again—in fact, you could skip the step of disabling the module through the interface and simply remove its line from core.extension.yml).

Gotcha #2: Media module contains some tweaks

The Media module contains some useful tidbits (mostly tweaks to standard core or contrib functionality). If you are getting ready to update a site to the next minor core version, you are not in the state of mind to deal with functional regressions and/or changes (especially to find out how to turn regressions into changes). At least, I wasn't. That's why I created the Media Glue sandbox module, that basically just contains the css, javascript and hook implementations that Media did, except under a different name space so it does not collide with the new core Media module. It does contain one little change, which involves the styling for the entity browser. The Media module contained a small bug that caused the items to jump around in the browser when hovering over them (at least in my browser of choice, Safari). The css for the new module has been tweaked so the elements are the same size for both regular and hover states.

I will probably want to figure out how I want to get rid of this module at some point, as I usually prefer to stay closer to base functionality as opposed to install all sorts of little modules that may add small niceties; extra modules can break and also add a slight performance penalty. There also apparently are various modules that do something similar, which would appear to be better starting points. But that's stuff for another blog post.

Gotcha #3: When you decide you don't need Media entity slideshow

As said, Media module came with a bunch of configuration. It added all that configuration as install configuration (not optional), so it had dependencies on extension modules that were required for all that configuration. As I previously mentioned, I'm no great fan of stuff I don't really need; all it can do is break. So I figured I could remove some of the extras that came with Media. Mostly, this is no problem. You can disable the Document, Instagram and Twitter modules if you don't need them. Any configuration dependent on them, like media entity bundles and display settings, will be removed. (The same likely goes for the video embed module, but I haven't tried).

However, when you elect to remove the Media Entity Slideshow module, Drupal will make an odd report about configuration that will be removed; in addition to the usual suspects (the media bundle and all its derived configuration like fields and displays) it will want to remove the Media Embed and Media Library entity browsers as well as the Media library View. The last one is the key here. The other two depend on it, because they use it as their browser view. The View itself contains two displays that are used for the Entity Browser that is meant for creating galleries (which, oddly, does not get removed, in my experience). These displays contain a filter option to exclude galleries (in order to avoid gallery inception). Thus, the View depends on its existence and if we wish to remove the bundle, we need to remove the View. 

At this point, the safest option is to abort the uninstalling of the module and go and edit the troublesome View. You need to remove the two displays:

  1. Gallery media select modal
  2. Gallery User Media select modal

Save the View and export the configuration.

Unfortunately, this did not remove the actual dependency from the View, only the displays that are the reason for having the dependency. Open the views.view.media_libary.yml file in your editor and look for all values containing gallery. This will turn up everything that had to do with the media bundle. Remove the lines you find. Save the file and re-import configuration. 

Go and uninstall the module again. If the View and entity browsers are still being listed, try and clear the cache. Finally, remove the gallery_media_library entity browser (admin/config/content/entity_browser).

After the module is uninstalled, do another config export.

Next steps

That's basically it. At this point, you will have to release your changes through your DTAP street (if that doesn't mean anything to you, don't worry; it simply means you have to get these changes into production) to prepare your site for the actual move to Drupal 8.4. You can not remove the Media module before getting it disabled (if you have a clever release process, you might be able to do removals at the very end, which would allow you to do things in one go).

If you use a composer-based build process, you will need to remove drupal/media from your composer.json. At the same time, you will need to add back any modules that were previously dependencies of Media that you wish to keep. The full list of dependencies for (from its .info.yml file) Media looks like this:

  - media_entity:media_entity
  - media_entity_image:media_entity_image
  - video_embed_field:video_embed_field
  - video_embed_field:video_embed_media
  - media_entity_slideshow:media_entity_slideshow
  - media_entity_instagram:media_entity_instagram
  - media_entity_twitter:media_entity_twitter
  - media_entity_document:media_entity_document
  - slick_media:slick_media
  - entity_browser:entity_browser
  - entity_browser:entity_browser_entity_form
  - entity_embed:entity_embed
  - dropzonejs:dropzonejs_eb_widget
  - image_widget_crop:image_widget_crop
  - drupal:link
  - drupal:editor
  - inline_entity_form:inline_entity_form
  - media_entity:media_entity
  - media_entity_image:media_entity_image
  - video_embed_field:video_embed_field
  - video_embed_field:video_embed_media
  - media_entity_slideshow:media_entity_slideshow
  - media_entity_instagram:media_entity_instagram
  - media_entity_twitter:media_entity_twitter
  - media_entity_document:media_entity_document
  - slick_media:slick_media
  - entity_browser:entity_browser
  - entity_browser:entity_browser_entity_form
  - entity_embed:entity_embed
  - dropzonejs:dropzonejs_eb_widget
  - image_widget_crop:image_widget_crop
  - drupal:link
  - drupal:editor
  - inline_entity_form:inline_entity_form

Find out the versions you have installed currently and require them explicitly in your composer.json. If you added everything you need to keep, you can go ahead and remove media itself. Rebuild the site and make sure everything still works. You are now ready to actually take the step and update to Drupal 8.4.

Jan 12 2018
Jan 12

In the previous article, we covered How to stay out of SPAM folder? and today we will learn how to secure our Drupal web server.

Setting up Firewall

So, we have Debian OS powering our Drupal web server, and we need to make it secure, adjust everything so as to minimize all risks. First of, we want to configure the firewall. Basic stuff. Our "weapon of choice" here is IPTables.

Initially, the firewall is open, all traffic passes through it unimpeded. We check the list of IPTables rules with the following command:

# iptables -L -v -n

Chain INPUT (policy ACCEPT 5851 packets, 7522K bytes)
pkts bytes target prot opt in out source destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 320M packets, 19G bytes)
pkts bytes target prot opt in out source destination

All clear. To remove all IPTables rules, we use the following command:

iptables -F

Default IPTables rules

Default rules are useful and convenient. In IPTables, they are set with the help of policies (-P). It is a common practice to drop all packets and have a series of permission rules for specific cases.

The following rule allows dropping all packets:

iptables -P INPUT DROP

Additionally, you can up the security by outlawing forwarded packets, that is, packets routed by firewall to their destination. To do that, introduce the following rule:

iptables -P FORWARD DROP

For loopback, we allow local traffic:

iptables -A INPUT -i lo -j ACCEPT

The following rule makes use of the state (-m) module. It allows checking the state of the connection, which can be RELATED or ESTABLISHED. The connection is made only when it meets the rule. ESTABLISHED means there were packets already sent through the connection, and RELATED indicates it is a new connection made by forwarding a packet, but this new connection is associated with an existing connection.

The following rule allows operation of all previously initiated connections (ESTABLISHED) and connections related to them:

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

And this rule allows new connections too:

iptables -A OUTPUT -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT

This rule below allows forwarding new, established and related connections:

iptables -A FORWARD -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT

The following couple of rules says all packets that cannot be identified (and given a status) should be dropped.

iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

iptables -A FORWARD -m conntrack --ctstate INVALID -j DROP

Allowing what needs to be allowed

The next step we make implies setting up rules that allow this and that and thus ensure correct operation of our web server. We arrange those rules in a separate chain.

First, we create custom chains:

iptables -N my_packets

The following command makes the switch to a user-defined chain:

iptables -A INPUT -p tcp -j my_packets

There is a number of restrictions imposed on going through the chains

  1. the chain must be created before it is switched to;

  2. the chain must be in the same table as the chain from which the switch is made.

Next, we open the port for SSH. Important: be sure to specify your port if it was changed!

iptables -A my_packets -p tcp -m tcp --dport 22 -j ACCEPT

If SSH is only available to a number of persons using static IPs, it makes sense to set up IP-based restrictions. To do this, we run the following command instead of the previous one:

iptables -A my_packets -s х.х.х.х -p tcp -m tcp --dport 22 -j ACCEPT

with х.х.х.х being the IP from which the connection is made.

Since we have a web server running, we need to allow firewall listening on ports 80 and 443. We do this with the following commands:

iptables -A my_packets -p tcp -m tcp --dport 80 -j ACCEPT

iptables -A my_packets -p tcp -m tcp --dport 443 -j ACCEPT

To complete all these rules, we can set up a some more for specific cases.

Remote connections to MySQL server

If such is possible, it is better to have the connections restricted by IP:

iptables -A my_packets -s х.х.х.х -p tcp -m tcp --dport 3306 -j ACCEPT

Server receives mail

The following set of rules helps in such a case:

iptables -A my_packets -p tcp -m tcp --dport 110 -j ACCEPT

iptables -A my_packets -p tcp -m tcp --dport 143 -j ACCEPT

iptables -A my_packets -p tcp -m tcp --dport 993 -j ACCEPT

iptables -A my_packets -p tcp -m tcp --dport 995 -j ACCEPT

That is all. These rules are sufficient for our web server to work correctly. Other ports and protocols follow the REJECT rule we set up for them, i.e. they do not accept anything:

iptables -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable

iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset

iptables -A INPUT -j REJECT --reject-with icmp-proto-unreachable

Compared to DROP, REJECT implies sending the "Port unreachable" ICMP message to the sender. --reject-with option allows changing type of ICMP message; its args are as follows:

  • icmp-net-unreachable — network unreachable;

  • icmp-host-unreachable — host unreachable;

  • icmp-port-unreachable — port unreachable;

  • icmp-proto-unreachable — protocol unreachable;

  • icmp-net-prohibited — network prohibited;

  • icmp-host-prohibited — host prohibited.

    By default, the message has the port-unreachable arg.

You can reject TCP packets with tcp-reset arg, which implies sending an RST message. In terms of security, this is the best way. TCP RST packets are used to close TCP connections.

Setting up fail2ban

Fail2ban is a simple local service that keeps track of log files of running programs. Guided by the rules, the service blocks IPs from which attacks come.

Fail2ban successfully protects all popular *NIX setups (Apache, Nginx, ProFTPD, vsftpd, Exim, Postfix, named, etc.), but its main advantage is the SSH server brute-force protection enabled right after you launch it.

Installing fail2ban

Fail2ban is listed in the repository, so it is very easy to install it:

apt-get install fail2ban

That's it, your SSH is now protected from brute-force attacks.

Setting up fail2ban

First of all, we need to configure SSH protocol protection. It takes finding the [ssh] section in jail.conf file and ensuring the enabled parameter is set to true.

Next, we set up monitoring with fail2ban:

  • filter - used filter used. The default is /etc/fail2ban/filter.d/sshd.conf;

  • action - actions performed by fail2ban when detecting an ip the attack comes from; the response rules are listed in /etc/fail2ban/action.d., so the value of this parameter cannot be something that is not there;

  • logpath - full path to the file storing data on attempts to access VPS;

  • findtime - time (in seconds) the suspicious activity lasted;

  • maxretry - maximum allowed number of attempts to connect to the server;

  • bantime - the time the blacklisted ip is banned for.

Important: it is not necessary to provide values for all settings, if you skip anything, the main [DEFAULT] settings (found in the namesake section) will be applied. The most important thing here is to make sure the setting's enabled, i.e. the value for enabled is true.

Making SSH protocol secure

Let's look into details of response settings. Below is an example of fail2ban configuration on the SSH port:

enabled = true
port     = ssh
filter = sshd
action = iptables[name=sshd, port=ssh, protocol=tcp]
    sendmail-whois[name=ssh, dest=****@yandex.ru, [email protected]***.ru]
logpath = /var/log/auth.log
maxretry = 3
bantime = 600

All these lines mean the following: If there were more than 3 failed attempts to connect to the server through the main SSH ports, the ip used for authorization is blocked for 10 minutes. The ban rule is added to IPTables, and the server owner receives a notification to the address specified in the dest variable. In the notification contains the blocked ip, WHOIS-data about this ip and the ban reason.

An extra measure to protect SSH implies activating the following section:

enabled = true
port     = ssh
filter = sshd-ddos
logpath = /var/log/auth.log
maxretry = 2

Configuring site files access permissions

A server cannot be considered safe if files access permissions were not configured. The following example is one of the ways to change owner and permissions on files/directories of a Drupal-powered site. Here:

Permissions setup routine:

#cd /path_to_drupal_installation
#chown -R webmaster:www-data .
#find . -type d -exec chmod u=rwx,g=rx,o= '{}' \;
#find . -type f -exec chmod u=rw,g=r,o= '{}' \;

www-data user must have write permissions for the directory, so the "files" directory in the sites/default (and any other site directories if we have a multi-site setup) has different permissions. The owner group's s bit applies to the directory, too, since we need all files created there by the web server to have the identifier of the webmaster directory group and not that of the group of owner that created the file in this directory.

#cd /path_to_drupal_installation/sites

#find . -type d -name files -exec chown -R www-data:webmaster '{}' \;
#find . -type d -name files -exec chmod ug=rwx,o=,g+s '{}' \;
#for d in ./*/files
  find $d -type d -exec chmod ug=rwx,o=,g+s '{}' \;
  find $d -type f -exec chmod ug=rw,o= '{}' \;

Temp directory here also takes on different permissions since we need web server writing into this directory.

#cd /path_to_drupal_installation
#chown -R www-data:webmaster tmp
#chmod ug=rwx,o=,g+s tmp

settings.php and .htaccess: special permissions

settings.php file contains database password and user name, and they are plain text there. To avoid problems, we want to allow just some users read it and nothing else. Typically, it means banning "other" out:

#chmod 440 './sites/*/settings.php'
#chmod 440 './sites/*/default.settings.php'

.htaccess is the Apache configuration file, which gives power over operation of the web server and site settings. Accordingly, only a handful of users should have permission to read the file's contents:

#chmod 440 ./.htaccess
#chmod 440 ./tmp/.htaccess
#chmod 440 ./sites/*/files/.htaccess

Secure configuration of the web server

To make the system as secure as possible, we want to make some changes to the SSH server settings. It is best to run it on a non-standard port, otherwise it will be constantly attacked by bruteforcing bots picking passwords. Same as other Linux distributions, Debian has SSH on port 22. We can change it to, say, 2223. In addition, it would be wise to change the setup so as to allow root's connection with ssh key only. By default, in Debian, root cannot be authorized with only a password over SSH.

It's better to change SSH port before configuring the firewall. If you forgot that, you need to do the following:

  1. Add the rule allowing connection on a new port to IPTables before changing it:

iptables -A my_packets -p tcp -m tcp --dport 2223 -j ACCEPT
  1. Change the SSH server port in # nano /etc/ssh/sshd_config. Find the relevant lines and make them look like this:

Port 2223
PermitRootLogin prohibit-password

PubkeyAuthentication yes
ChallengeResponseAuthentication no

Do not forget to save the changes! Then restart the SSH server:

# service sshd restart

Now, we want to check the changes:

# netstat -tulnp | grep ssh

tcp 0 0* LISTEN 640/sshd
tcp6 0 0 :::2223 :::* LISTEN 640/sshd

Everything is fine. The SSH server listens on port 2223, from now on, new connections will go through this port only, and after restarting SSH the old connection will not be dropped.

Attention! Before disabling password authorization for the root user, make sure you have your public key in the /root/.ssh/authorized_keys file. Also, it is wise to have another account to connect to the server with a password.

Dec 30 2017
Dec 30

In response to regular requests for trial accounts, we've added a free trial tier.

Since launching Entity Pilot almost two years ago, we've had regular requests for a free option to allow users to try our painless content staging solution for Drupal 8 before they sign up.

In response to this, we've added a trial tier.

The trial tier gives you three (3) free flights, enough to evaluate Entity Pilot against your content staging and syndication requirements.

As these are trial accounts, we've also introduced time-limited storage.

So whilst our regular accounts retain your sent content indefinitely, flights sent using the trial tier will only be retained for three (3) days.

So if you're looking for a painless content staging solution for Drupal 8 and want to evaluate Entity Pilot, visit our pricing page and sign up for the trial tier.

Dec 30 2017
Dec 30

I presented at the first Drupal NYC Meetup of the year!

I've been hard at work building a new Provision: the command-line interface for Aegir. We are moving off Drush commands into our own CLI built in Symfony. The tool is finally a working MVP, so I figured it's time to spread the word! 

First I give a bit of background on the Aegir project and my goals for the project which can be summed up in one word: easy.

Then, I dive into the code that makes this system possible. If this project has any chance of surviving, I must win over developers to help grow and maintain it! Developer Experience is a high priority.

In the next few weeks, I'll be posting a series of blog posts about the new Provision 4.x, both for end users and developers.

Provision 4.x: Developer Sneak Peak

Aegir's back-end is getting an overhaul after 10 years of service. We're developing a brand new Symfony console based CLI for all of your website management needs: Provision 4.x.

With the power of Symfony console we've completely re-written Provision to be as easy and clear as possible, and flexible enough to work anywhere: cloud or workstation.

Can this new CLI become the defacto dev-test-production website management tool? Is it wrong to write DevOps tools in PHP? Can we keep Aegir going for another 10 years? 

Slides and Video are available.

*Photo credit: https://www.meetup.com/drupalnyc/photos/28451193/467353793/ 


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