Upgrade Your Drupal Skills

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

See Advanced Courses NAH, I know Enough
Oct 29 2023
Oct 29

This year's DrupalCon Europe was hosted between the 17th and 20th of October, in the French city of Lille. My DrupalCon adventure began early on Monday morning when Chris Maiden picked me up to drive to France via the EuroStar train. We arrived in Lille a little after 4pm, which was really good going for a nearly 400+ mile trip.

The DrupalCon Lille Logo

DrupalCon Lillie was a first for me as I was there representing a company and so spent some time on the conference floor talking about services. Code Enigma, who I work for full time, had sponsored the event and organised a booth (well, a table). The booth wasn't so that we could sell anything, it was more more because we wanted to support Drupal and the sponsorship came with a booth. Driving to Lille allowed us to fill the car with 200 coffee cups, which we gave out at the event.

Once we had found a parking spot we wondered through Lillie, found our hotel, and met up with the rest of the Code Enigma group for a dinner of "Le Welsh"; a local favourite dish.

Tuesday

The first session I managed to attend on Tuesday was the Driesnote, where Drupal founder, Dries Buytaert, talked us through some of the headline initiatives being worked on in Drupal at the moment and why these are important. The presentation started with a very highly produced story, with some fantastic artwork depicting the "Drupal fairy" and the village of Drupal, as well as some surrounding villages like Rectopia and Contentville. This was an interesting way of showing how Drupal is different from other major players in the content management sphere in the form of an analogy.

The talk soon went onto show some of the main initiatives being worked on in Drupal currently, including the project browser, the new field UI and the new administration menu. These initiatives are not only to aid people used to working with Drupal, but also to help newcomers to the platform find their way around. This is especially the case with the project browser since it is difficult to know what are the best modules available for your needs.

Dries's final message was advancing the marketing surrounding Drupal and the creation of a Drupal marketing committee. He invited some representatives of the Drupal marketing committee onto the stage for a quick question and answer. In my opinion this is a sorely needed aspect of Drupal and something the community will really benefit from.

It can't be escaped that there's a bit of negative press surrounding Drupal, which I think is mainly from the complexity of the platform in previous years. The marketing committee will help the Drupal community by generating assets that can be used to argue the use of Drupal in projects, which I'm sure many companies are creating independently.

If you are interested in watching the whole Driesnote, Dries recently uploaded a video of his DrupalCon Lille keynote to YouTube.

The Driesnote from DrupalCon Lille 2023

Due to transporting the cups and performing various booth related activities I did end up missing the Women in Drupal Awards, which was held just before the Driesnote. Congratulations to the well deserved winners Tiffany Farriss, Marine Gandy, and Lenny Moskalyk. I will make sure to catch up with this session video later (if possible).

After the Driesnote was the first proper session with Oliver Davies and TDD - Test-Driven Drupal: an introduction to automated testing and test-driven development in Drupal. I have seen variations of Oliver's TDD talk over the years and I always seem to learn something new from it, and this time was no exception. I've been writing unit tests in Drupal for years, but Oliver gave me a new technique that I will certainly be employing going forwards.

Next up was Designing for Privacy: Balancing User Needs and Data Security, with Tarkesh Deva. This was a look at some techniques and decisions to make when creating privacy focused sites. After which Tarkesh looked at the site https://iq.laaha.org/, which is a UNICEF site created by women for women. Due to the nature of the information being shared the site makes privacy the central tenet of the site. This includes doing things like creating random usernames and not requiring any personal information to make an account so that women don't need to share data to register.

Sven Van Uytfanghe and Building Engaging Communities with Gamification, Commerce, and Integrations: A Success Story was next, which was a case study on a (not yet launched) Drupal site where users could earn "coins" by commenting, posting, liking or otherwise interacting with the site. These coins could then be used to get discounts on products on the shop. An interesting case study, that got me thinking about how to create this sort of system in Drupal.

The final talk on Tuesday was Translation management strategy for editors in Drupal 10 with Jeremy Chinquist. Jeremy focused on some strategies that can be used to aid in the translation of a Drupal 10 site, including asymmetric and symmetric translation. Perhaps most importantly was the tactic of hiding anything that couldn't be translated so that user's would get confused trying to translate something that wasn't needed. Really important lessons that were clearly gained from experience.

A picture of the TDD talk from DrupalCon Lille, showing a full audience.

Wednesday

Wednesday's first session for me was a Technical Writing Workshop with AmyJune Hineline. This was a 2 hour workshop that went over how to write articles, what to write about, who to submit articles to and even a quick look at markdown. The 2 hours went very quickly and I came away with lots of ideas and thoughts about the future of this site. I think I wrote continuously for the entire workshop and need some time to go over my notes and make sense of everything. It was also great to meet AmyJune in person and she has encouraged me and supported the site in the past, so I was chuffed I got the chance to thank her.

After this I attended Akhil Bhandari's talk called Design in Figma and deploy a pixel perfect Drupal website in days, not weeks! The talk looked at the tools that him and his team had put together to simplify the process of taking a Figma design and converting it to Drupal templates, using the Civic theme. A lot of work had clearly gone into this process, and that showed in how they were able to take work from conception to implementation.

Thursday

Thursday started with Single Directory Components in Core with Mike Herchel. It's always good to see Mike talk, and I'm glad I got the opportunity at Lille. Single directory components are indented to abstract away certain parts of the site theme into separate directories in order to make it easier to find everything that is connected to that component in one place. They are currently in Drupal 10.1.0 as an experimental module and should be stable in 10.3.0, although Mike doesn't think the API's will change much (or at all) before then. Unfortunately, Mike's presentation was interrupted twice by his computer hard locking when attempting to play a video. This was heartbreaking to watch, but Mike rallied and handled it really well. I don't think he managed to say everything he wanted to say, but I'll be looking into single directory components soon.

Next up was Hosted login: The future of the login with Raul Jimenez Morales. This talk looked at an unnamed IDaaS (IDentity as a Service) provider and how it could benefit a Drupal site. The essential premise was that the Drupal site (or sites) would only need to know the essential information to perform it's duties, and that if it was hacked then the identity and security of the user wouldn't be effected (at least not much). An interesting talk, although somewhat light on the details.

After lunch I attended the Drupal Core Initiative Leads update, hosted by Gábor Hojtsy. There's some amazing work being done in Drupal at the moment and this was just a quick showcase of some of the initiatives being worked on. There was config validation, the update of localist.drupal.org (which started just last year and is going well), the UI improvements, the administration toolbar, the GitLab improvements, the project browser work, as well as the promote Drupal initiative. Sascha Eggenberger took a closer look at some of the improvements in the Drupal administration UI there were hinted at in the Driesnote, which look really nice. The changes they are proposing look like really obviously good ideas, which is the hallmark of a good design change.

The final session of the conference for me was Björn Brala talking about How JSON:API 1.1 will make Drupal better. The JSON:API specification exists outside of Drupal, but Drupal will soon be taking advantage of the new version of the specification to leverage some useful features like extensions, error objects and link objects that follow RFC8288. Ultimately, these improvements will get better JSON:API clients for Drupal and allow some neat things like exploring with links to be built into the service layer.

Thursday night was the Drupal trivia night. I formed a team with the rest of the Code Enigma people and although we didn't come last (we think) we also didn't come anywhere near first. Really good questions with an awesome host who made the evening flow really quickly. Well done to the winners, I really don't know how you scored that many points!

Conclusion

Overall, DrupalCon Lille was a great conference. This year I didn't go to as many talks and sessions as I would normally go to and instead spent quite a lot of time chatting with people in the main conference hallway. It was good seeing old friends and making some new ones. I have lots of notes from the sessions I attended and will be sure to look into incorporating some aspects of them into my day-to-day tasks in the near future.

The food at the venue wasn't particularity amazing, but it was warm and nutritious so I was happy to eat it. The food in Lille itself was really nice. As I mentioned earlier, we went out for a local dish called "Le Welsh", which is more or less a take on Welsh Rarebit. In fact, looking into the dish after the conference I found that it was imported to the region in 1544 by a Welshman, so it clearly has some Welsh influence and is a popular dish nearly 500 years later.

It was nice to hand out cups and umbrellas and see people making good use of them at the event. The rain came to Lille in earnest on the Wednesday and so the umbrellas suddenly became really popular! We were happy to give them out as that was the main reason we had bought them. As long as people make good use of them Code Enigma were happy to supply them.

See you next year at DrupalCon Europe Barcelona!

A collage of images from my time at DrupalCon Lille 2023
Oct 27 2023
Oct 27

As artificial intelligence (AI) is steadily seeping into nearly every aspect of modern life, government website stakeholders are sorting through what’s new and next to explore possibilities, embrace advantages, and avoid pitfalls. 

AI refers to a multifaceted mix of technologies, that draw upon advanced computer systems and algorithms to simulate human intelligence and reasoning.

AI is essentially an umbrella term that incorporates machine learning and deep learning, both of which are designed to continuously learn from data – functioning far beyond the types of outcomes that can result from explicit programming.

What are the top applications for AI in local government websites?

The potential for AI to enhance the functionality, efficiency, and user experience of county and municipal government websites is huge. The top five AI applications are currently: 

  1. Language translation,
  2. Content personalization,
  3. Search enhancements,
  4. Chat for customer support, and
  5. Predictive analytics.

Language translation

It's now the norm, not the exception, for counties and municipalities to serve diverse populations that speak a wide variety of languages.

AI language translation tools, such as the Drupal OpenAI Translation Toolbox, can automatically translate website content into multiple languages, making information accessible to a broader audience.

As websites increasingly serve as the front door from which local governments serve and interact with all constituents, robust translation capabilities that can serve a multilingual population, are helping to break down language barriers and ensure inclusive, efficient government services and outreach.

Content personalization

Content personalization capabilities have the potential to transform user experience.

By analyzing user behavior and preferences, AI powered applications can recommend relevant information and services, making an individual’s experience on the site more efficient and tailored to their needs.

One example of content personalization for a user that frequently searches for for children-related activities and events, would be a prioritization of this type of content, by highlighting or efficiently directing them to topics that are likely to be of interest.

Search enhancements

With the intention of efficiently delivering relevant search results, machine learning and natural language processing capabilities are managing to more accurately understand the intent behind search queries, based on user behavior and search patterns.

Traditionally, text entered in a search box produced the same results, regardless of the user. AI enhancements are making it possible to produce more relevant results that are adjusted in real time based on factors such as a user’s browsing history and the intent commonly associated with the words used.  

Chat for instant support

AI-powered chat is currently the most common form of AI on county and municipal government websites.

Chat can provide immediate responses to frequently asked questions, guide users through complex processes, and offer assistance 24/7. The potential benefits of chat functionality are deep and far reaching, and include:

  • Cost savings. By reducing the need for support staff to respond directly to routine inquiries, chatbots cut operational costs and free up staff to focus on more complex tasks.
  • Efficiency and consistency. Chatbots can provide quick and consistent responses to frequently asked questions, making it easier for users to find information and access services without waiting on hold or for calls or emails to be returned. 
  • Availability: 24/7 availability combined with multilingual capabilities broadens access to a diverse population. 
  • Scalability. The ability to handle a high volume of citizen inquiries simultaneously, is a critical for government websites that experience varying levels of traffic. 
  • Data collection and analysis: Chatbots’ ability to collect data pertaining to citizen inquiries provides valuable data concerning citizen needs and concerns.

Predictive analytics

AI-driven predictive analytics can help local governments optimize resource allocation.

By analyzing historical data and web usage activity or inquiries, AI models can help inform decision-making on issues that range from improvements to web navigation and content, to usage patterns, to primary sources of complaints and concerns. 

How is AI currently being used in county and municipal government websites?

With chat currently serving as the most prevalent form of AI on county and municipal government websites, new possibilities for AI are a top-of-mind consideration among public sector website stakeholders looking to enhance user experiences and streamline government operations.

Here are a four examples of municipal websites are making excellent use of AI applications:

Chat functions

Top navigation icons for the City of Los Angeles website, begin with a “Chat with Chip” option, followed by Language Translation, Accessibility, and Search.

When clicked, “Chat with Chip” opens into an inviting window for inquiries – versus the typical chat user experience, which appears as a small speech bubble in the lower right of the screen.

As Los Angeles been hit particularly hard with the Covid-19 pandemic, the chat function encourages residents to seek accurate and up-to-date information and resources.


The chat function for the San Jose, Calif., website appears in the more traditional location. It explicitly encourages inquiries.


And the level of functionality is clearly robust — suggestions of multiple options for inquiries, along with an open-ended question box.


Language options

With a drop down in the upper right for language options that include English, Suomi, and Svenski, Finland’s capital city of Helsinki’s website, consistently leverages AI to encourage citizen engagement and to filter analytics concerning how citizens are using the site, in order to improve city services, as well as the user experience of the site itself.


Personalized content

The website for the City of Barcelona in Spain is utilizing AI to provide personalized content to users. Information and services are tailored for individual users based on their behaviors and preferences.  


What are some pitfalls of relying on AI for government websites?

In the words of former President Ronald Reagan, “Trust but verify.”

AI-generated information tends to be surface-level. While information can be amazingly on target, there is the possibility of nuanced inaccuracies or true misinformation.

Here’s an example of how AI can miss the mark:

Reasons to be cautious of AI

A ChatGPT query concerning examples of AI applications currently deployed on county and municipal government websites resulted in the following response: 

“San Francisco implemented a chatbot on its website to assist residents with common inquiries, report issues, and find information about city services. This chatbot aimed to provide quick and efficient customer support.”

A review of the website for the City of San Francisco reveals that this is not the case. What was likely being referenced was an entirely separate site, San Francisco GPT. This site, however, is still very much in its beta form, and is not integrated into the official website for the city. 

In addition to widely reported inaccuracies, here are six additional reasons to exercise caution before diving too deep or too fast into AI at this point.  

  • Accessibility. AI applications, if not designed and tested with Web Content Accessibility Guidelines in mind, can result in accessibility issues for people with disabilities. 
  • Privacy and Data Security. AI applications often involve collecting and processing user data. Robust systems need to be in place to protect this information. Data breaches or misuse can have serious legal and reputational consequences.
  • Bias and Fairness. AI models can inherit biases from the data they are trained on. If these biases are not properly addressed, they can lead to unfair or discriminatory outcomes, which is especially problematic for government services.
  • Transparency and Accountability: Transparency in decision-making is a fundamental principle in government. AI systems can be complex, making it challenging to explain their decisions, which can erode public trust. 
  • Resource Allocation. Developing and maintaining AI applications can be a resource-intensive use of taxpayer dollars. Costs need to be justified. 
  • Vendor Dependence. Many governments rely on third-party vendors to provide AI solutions. As open-source enthusiasts, we at Promet Source vigorously caution against the potential perils of vendor lock-in and data ownership. 

While each of the above six factors are significant, this is not to say that we at Promet are not 100% on board with the possibilities and potential of AI for county and municipal government websites. New challenges are inherent to new technology.

What’s important is to be aware of issues as they emerge and ensure that they are addressed ethically and efficiently.

Drupal AI modules that can be worked into public sector sites right now

As was perceptively anticipated in an AI applications for Drupal blog published on this site earlier this year by Sonal Bendle, 2023 has shaped up to be the year that AI catapulted past the hype and into the mainstream of life and work – as well as Drupal development

Here are some exciting new Drupal AI module developments can be deployed right now to leverage the potential of AI within government websites:

  • Open AI Metadata uses Open AI to generate meta description for different content types. 
  • The AI Interpolator module is an API enabler to aid in the transformation or interpolation of one field into something else – such as descriptive text into an image. 
  • The AI Interpolator Open AI module is a plugin for the AI Interpolator module that makes it possible to use the power of AI to manipulate nodes, entities, blocks, and other content types. 
  • The Open AI Translation Toolbox is a module designed for to provide an efficient means to produce translations for multilingual websites. It leverages the capabilities of the OpenAI platform, including Azure OpenAI, to generate accurate translations for all enabled languages on a Drupal site. 
  • Open AI / Chat GPT / AI Search Integration. OpenAI is the company behind artificial generational intelligence products that power applications such as ChatGPT, GPT-3, and GitHub CoPilot. The Open AI / Chat GPT / AI Search Integration module aims to provide a suite of modules and an API foundation for OpenAI integration in Drupal for generating text content, images, content analysis and more, with a goal of augmenting and adding assistive AI tech and leveraging OpenAI API services in Drupal. 
  • Open AI Images is a Drupal module that leverages the OpenAI API to generate images from text descriptions. This module enables the effortless transformation of textual content into images. Using the OpenAI API's advanced natural language processing capabilities, the module interprets the provided text and generates corresponding images that capture the essence of the description. The generated images can then be saved as media entities on a Drupal site’s media library, ensuring easy access and management.
  • The Artificial intelligence Image Generator module provides a CKEditor 5 plugin to generate images using artificial intelligence.
  • The Leap AI module enables the remote generation images via the Leap AI (https://tryleap.ai/). It provides a media source plugin that allows for the creation, configuration, and management AI-generated images directly within a Drupal site – allowing for dynamic and customizable visual content. 
  • Augmentor AI is an AI framework for Drupal which allows for the easy integration of disparate AI systems into Drupal, providing a pluggable ecosystem for managing a variety of AI services such as GPT3, ChatGPT, NLP Cloud, Google Cloud Vision and many more.
  • AI Connect is a powerful Drupal module that serves as a bridge between Drupal and AI-powered services, and is designed to fast track content creation by seamlessly integrating with cutting-edge AI technology. 
  • AI Work is a backend module that end users will not interact with directly. It serves as a flexible system and data structure creation tool for building AI apps and agents. The AI chat user interface will be first module to use AI Work as a default backend.
  • Search API AI is a cutting-edge module that provides a collection of tools to integrate artificial intelligence and advanced search capabilities into a Drupal site. By leveraging the OpenAI Embedding API and storing vectors in Pinecone, this module enables the creation of powerful, AI-driven search experiences.

This is a short list and a start concerning Drupal’s depth and breadth of potential within AI. 

Interested in pulling it all together – leveraging the power of Drupal alongside the potential of innovations in AI module development? That’s what we do. Let’s talk right now about AI features and functions that can take your website to the next level and beyond.

Oct 27 2023
Oct 27

Website migration is, for many people, changing to a new website. However, it’s worth understanding what this activity actually entails. It's not just switching or updating a CMS but also a process that can significantly affect the web page's performance, security, and alignment with modern standards. In this article, we’ll focus on the general approach to migration, but we’ll use Drupal as an example to provide a comprehensive perspective on the topic.

What is a website migration?

Website migration is the process of moving a website to a newer version of a CMS or another platform. In practice, this means, for example, upgrading Drupal 7, whose support is about to end, to the latest Drupal 10. It also includes changing from one system (such as WordPress or Joomla) or a less popular and no longer supported CMS to an entirely different system. 

During the migration, we consider data, functionalities, and integrations with external systems. We rewrite the website's frontend, taking advantage of the latest technical capabilities and taking care to maintain the page speed (for example, looking at the score in Page Speed Insights). From the perspective of the owner or editor of the web page, we really gain a lot, which we write about later.

Why you should migrate your website?

The migration process brings numerous benefits. It improves the website performance, increases its security, and aligns it with current programming standards. We’ll look at this process's advantages using a specific example – Drupal migration. 

Improving the website security and functionality 

Moving to a newer version of this system can significantly improve the functionality and security of the web page. We must remember that regular security updates are crucial, as they fix vulnerabilities, minimizing the risk of attacks and data loss or leakage. By choosing to migrate the website, we thus ensure protection against new threats. 

Changing the website design to a more modern one

Migration is an excellent opportunity to perform a website redesign, that is, to refresh its appearance. We can craft and apply modern design patterns at this stage and even change the entire visual concept of our web page. 

A design update not only attracts users' attention but can also improve the functionality and readability of the website, which is essential for the overall satisfaction of visitors. A refreshed layout is the most visible element to the end user, making the website no longer look outdated. 

Modification and possible archiving of data

During the migration, it’s possible to thoroughly review and modify the data. Outdated or redundant information can be archived to keep the database in order. During such a revision, we may conclude that some fields are unused, they can be merged with others, or the issue can be resolved in another way. This could include removing a separate field for an article summary or using a dictionary for tags. 

At the same time, adjustments can be made to the data, adapting it to the newer version of the CMS and Drupal modules. For example, since Drupal 8 we have had to deal with the Media module, which has changed the approach to images, documents, or videos placed on the website. 

Changing the way of data storage

Migration allows not only efficient modification or archiving but also thoughtful adjustment of data storage. Changing the system to a higher version of Drupal with all the new modules can allow you to store information optimally using content types, groups, or taxonomies. 

Content types, entities or taxonomies in Drupal allow you to organize the stored data in the system


Examples of entities (groups), taxonomies and content types in Drupal 

Thoughtful management of entities and data allows for optimized website performance and the ability to make changes easier in the future, reducing costs over the website’s life.

Rewriting existing integrations and functionalities

When migrating a website, it’s worth re-evaluating existing integrations and features. Sometimes, at this stage, it turns out that certain elements are practically unused, and moving them is not justified. This may be, for example, a contact form that is no longer on the web page or a disabled integration with an external service whose subscription has long expired. They can be strictly housekeeping issues, such as pages whose content has been moved or deleted in the past.

At this point, we can also look for new, more efficient solutions to increase the website's functionality. We can write elements that are key to the web page’s operation more thoughtfully, thus increasing security, performance, and future extensibility with new features. 

How to perform website migration?

The process of migrating a site is relatively universal, regardless of the system. The most important thing is to think it through before creating a new look or writing the first lines of code. You should plan a migration, as it can save time in later changes. We must keep in mind that with higher versions of the system, such as Drupal 10, many modules have changed from previous ones, and some aren’t even supported anymore. 

So, we migrate the web page's content, which we need to test decently for any errors. We are keen to catch, first of all, incorrectly migrated or empty fields where data has not migrated. We deploy the website with the newly written functionalities in place of the old website, and it's done. But is it actually that simple? Yes and no. Let's look at the process in more detail.

Step 1. Planning the website migration

In the first step of migration planning, especially for Drupal 7, it’s important to determine exactly what will be moved and from where. Sometimes, it happens, for example, that the website owners no longer need old news items over 10 years old. Migration is, therefore, an opportunity to optimize the data structure and eliminate redundant information, making it easier to manage content later.

If the website uses an external integration, such as Mautic, it’s necessary to consider this in the migration process. This element can be implemented on the new website in accordance with current standards, which will positively affect security and ease of subsequent administration. 

Planning a proper list of tasks, breaking them down, prioritizing them, and indicating the relationships between them supports the development of the website. This not only facilitates effective task management but also provides clarity in the project's direction, allowing flexible responses to possible changes during the website migration.

Step 2. Preparing for website migration

The next step is to prepare for website migration, including creating a local environment and developing a suitable data structure. By creating groups, content types, or taxonomies with appropriate fields, we prepare a target environment to transfer data from the old website to the new one in an orderly manner. 

At this point, backup is also crucial. We make a backup of the previous version of the website, especially the database, because it’s from there that we will transfer the content. 

Step 3. Migrating website content

Regardless of the system, try to move the website's content even before implementing new features. This will enable us to detect early the so-called edge cases, i.e., specific situations that can disrupt the website. By following this sequence, we can address them immediately at a relatively early stage of the website's development. Thus, we minimize the number of errors before implementation. 

For Drupal, the critical aspect is to use migration modules and modify data using migration plugins. This allows you to adapt your data structure to the new version of Drupal. Migration from other systems can be more complex and requires an understanding of how the previous CMS, or rather its database, worked. 

Step 4. Testing website migration

Testing is key to verifying that all data has been migrated correctly. We prove that the data in the new database matches the previous one, which can help avoid problems down the road. After all, we don't want some articles to have any tags or authors assigned, for example.

A very important issue is the files that, after migration from the previous website, should also be available in the new one. It’s not only copying from one place to another, but also interfering with their paths. Therefore, we need to pay special attention when testing them. For example, PDF files that have a preview should be available with it, and images must have a migrated box with alternative text. There are a lot of these kinds of small elements that we need to take care of to minimize later adjustments. 

Step 5. Styling the web page

If we wish to change the design of our website during the migration, the initial styling of the website also takes place before the next step. 

This is the process by which we arrange the content on the web page, give it the right look, add the necessary animations, and so on. With this activity, we try to bring the website as close as possible to the design prepared earlier, keeping in mind its responsiveness. 

Website styling is the process of arranging the website’s content according to the intended design. 


Example of a website with and without styling, source: Droopler Demo

The order here may vary depending on the complexity of the web page, but usually this process is already done when we have the data ready on the website. This saves us time because of the lack of need to add temporary or test content. This way, we can see how the new website, already with migrated data, looks in a completely new "outfit".

Step 6. Migrating the functionalities

The next step will be to move the more complex business logic that exists on the previous website. 

In the case of Drupal, at this stage, we’ll encounter challenges due to the differences between PHP versions, but it's also a great opportunity to refresh the code. In Drupal 10 using PHP 8, we write object-oriented code that is much more readable and open to new functionality. So we can't copy the old code to the new website in most cases, because it won't work. We can, however, model the old code, adapt it to the modern approach, and, on occasion, modify it to meet the additional business logic that was approved at the planning stage.

Functionality migration is also an ideal time to perform code refactoring. We can then optimize it, and refresh it to make it more readable. Often, during this process, we remove redundant parts of the code and use tools that take care of its quality from the beginning.

Many modules used on the old version of the website may no longer be available. Sometimes, however, it turns out that we don't need to write them on our own but just look for a similar one that performs similar tasks. This can save a lot of time and provide new features to the website. 

Step 7. Deploying the website

The final stage is the so-called deployment, which is implementing the website on the new platform. We test whether the functionalities work according to expectations and our assumptions. Here, we also have a reference point in the form of the previous website, and the test scenarios may look similar. 

We can take care of the separation of configurations so that after deployment, all API access keys are correct and all integrations are active. In addition, we activate file minification, enhancing website performance by reducing file size. This will make the website load faster, improving SEO performance

Migrating a Drupal website 

Website migration is a complex process of moving data, functionalities, and integrations, affecting performance, security, and alignment with modern standards. These include using the latest versions of programming languages and frameworks or writing object-oriented, secure code. Such code refreshes minimize the risk of errors or possible attacks. 

We've gone through this complex topic step by step to give you a better idea of how to prepare for the migration and what to expect during the process. Every phase of it – from planning to implementation – is necessary and incredibly important in creating a properly functioning website. The process looks quite similar regardless of the CMS. 

If you need support in transferring the web page, we can help. In carrying out such implementations, we have gained experience, what to pay attention to, and how to approach this topic. We’ll be happy to share our knowledge, and plan and carry out the migration of your Drupal website

Oct 25 2023
Oct 25

Scary Migrations Benji | Scary Migrations Janez |

In this Halloween-themed episode of Tag1 TeamTalks, Benji Fisher, a top contributor to Drupal, shares two chilling platform migration stories. In the first tale, set in 2019, Benji tackled a government website project with a tight deadline. The initial plan to use the unstable feeds module for Drupal 8 was alarming, given the project's complexity. Benji opted for the more reliable Migrate API to handle the intricate XML data structure, a decision that ultimately paid off.

The second hair-raising story occurred in 2013-2014 during the implementation of HTTPS on a Learning Management System (LMS). Benji had to persuade the client that HTTPS wouldn't harm performance and deal with hardcoded HTTP URLs in JavaScript activities. He devised a clever shell script to convert and edit the URLs, swiftly resolving the issue.

Both stories exemplify the unpredictability and challenges of platform and data migration. They underscore the importance of selecting the right tools and techniques. These experiences, though harrowing at the time, now serve as reminders of successful problem-solving and resilience in the tech world.

Please let us know if you have specific migration-related topics you'd like to see us cover. Or, reach out and let us know if we can be an active part of ensuring your migration is a success!

[embedded content]


For a transcript of this video, see Transcript: Scary Drupal Migrations with Benji Fisher.

Photo by Anna Sullivan on Unsplash

Oct 24 2023
Oct 24
Published on Tuesday 24, October 2023

Retrofit for Drupal now has documentation to explain what Drupal 7 hooks and APIs are supported. Retrofit for Drupal provides backward compatibility layers to run legacy Drupal 7 code in your sites using Drupal 10 and beyond. The problem, however, is anyone evaluating Retrofit for Drupal has had to take time to give it a test run and "see what happens." The documentation explains the various backward compatibility layers.

Documentation is critical for open source projects. Especially for a project that doesn't add functionality but ensures functionality for existing code continues to work. I hit some decision paralysis on how to set up documentation. The point of Retrofit for Drupal is to avoid having to configure our change code. However, the common question was, "But what hooks does it support?" Now, there is documentation within the repository to document the following:

Unfortunately, this doesn't cover the fact certain functions are supported, such as all database functions or variable_get and variable_set. I'll be adding more information shortly.

It isn't a perfect solution. I need to solicit feedback on checking "Is this hook supported?" I assume it would involve some search feature, like Drupal's API reference. The problem is that I don't want to build API documentation about Retrofit for Drupal and its internals. One idea I had was a mapping file somewhere that would allow mapping a component of Drupal 7 (functions, hooks, concepts) to its backward compatibility layer components in Drupal 7. Maybe there could be a way to use phpDocumentor or ApiGen and PHP attributes to solve this problem.

Want more? Sign up for my weekly newsletter

Oct 23 2023
Oct 23

Last week I gave a talk about onboarding the next generation of Drupal engineers at DrupalCon Europe in Lille. This is one of the top priorities for the Drupal community right now, which was also recently highlighted by the Drupal Association. In this blog post, I’ll recap and break down the main points from my talk, which you can also watch here.

Bostjan Kovac, development director at Agiledrop, at DrupalCon Lille 2023

Credit to Bram Driesen for the photo

Junior Drupal developer – now vs. in the past

Let me start with a bit of my personal background. I’m the development director at Agiledrop, having first come into contact with Drupal some time around 2010 when I was working for a company that was switching from a proprietary CMS to Drupal. I made my drupal.org account in 2012 and made my first contribution in 2016.

Now let me introduce our engineer Admir who joined Agiledrop in July of 2023, went through our highly refined Drupal Onboarding project, and is now already making contributions to Drupal, with currently 22 issue credits on drupal.org, his first one being in September.

If we compare my learning journey with Admir’s, I was:

  • Self-taught
  • Producing low-quality output during my first projects
  • Learning a lot from my mistakes
  • Attending Drupal events to expand my knowledge
  • Only starting to apply best practices after several projects
  • Learning the hard way alongside the work I was doing for a living

In contrast, Admir: 

  • Has a dedicated mentor
  • Is able to learn Drupal specifics & best practices from experienced developers
  • Is able to take time during his daily work to learn & contribute
  • Is versed in & adopting best practices from day one

Just looking at this it is immediately obvious how valuable dedicated mentorship and onboarding can be in launching the next generation of Drupal developers and helping them to quickly get involved with the project and its community.

Problems that PHP & Drupal have today

One of the biggest obstacles to attracting new generations of developers to Drupal is the unfavorable perception of PHP and Drupal. 

PHP is not exactly the hype of today, and many developers consequently fall for the myth of PHP being “dead”, which is further perpetuated due to many old PHP-based projects on poor codebases being kept alive and giving the language a bad reputation.

On top of that, jobs in more “niche” languages such as Rust and Go tend to come with higher salaries, and the problems the code solves there tends to be of higher value. 

This makes these languages more attractive to newer developers, who ignore the steep learning curve and the experience in older, more traditional languages (such as PHP) required to become proficient and provide real business value in those niche languages, where value per developer is also higher in startups and product companies compared to agencies and IT services firms.

With Drupal, the entry to the technology has become harder, and versions 8+ requires more knowledge such as using Composer, OOP, etc. It’s become more geared towards the enterprise and is as such much less suitable for hobby projects. In addition, a lot of new frameworks such as Laravel are providing a great experience for developers.

So, what can Drupal companies do to overcome these obstacles and make Drupal/PHP more attractive to younger generations?

What Drupal shops can do

The key thing for agencies is to commit to promoting Drupal and teaching people how to use it; it’s not enough to just post a job ad for a PHP/Drupal developer. You need to actively look for people who are still exploring their interests and impress them.

Step 1: Find people that can become great developers

  • Mainly look for junior/mid-level developers who are exhibiting talent & are fast learners
  • Organize workshops & local meetups
  • Be active in local universities and other educational institutions

This is something that pretty much all agencies are able to do locally. And, to re-emphasize: prioritize finding newcomers rather than developer rockstars.

Step 2: Inject your required skills and experiences directly into their veins, fast

  • Actively mentor developers & teach them best practices and industry standards
  • Provide adequate help on their first project(s)
  • Teach soft skills alongside hard skills to help developers become more independent
  • As a company, contribute a custom module or take over the maintenance of an existing one to make it easier for developers to start contributing.

All of these are key steps in Agiledrop’s Drupal Onboarding project which we have refined over the years to better suit any type of developer. 

Step 3: Make this a process that runs like clockwork all the time

  • Make workshops, meetups and university presentations regular
  • Block the time of your seniors for reviewing and helping juniors
  • Build & nurture a company culture where everyone is encouraged to help
  • Find effective ways to give praise & reward the team members who help a lot
  • Mentor new mentors

Results

At Agiledrop, we’ve successfully integrated this process into the core of our company culture, and we just keep streamlining it as we learn over the years. Here are some of the top highlights that this dedication has yielded:

  • Over the past seven years, we’ve hired more than a 100 developers
  • At our peak, we had 6 people going through the Onboarding project at the same time
  • Since 2017, we’ve organized 22 external Drupal workshops
  • We started a more advanced PHP Masterclass workshop
  • We’ve hosted and organized several Drupal, PHP, Laravel and other open-source meetups in our offices
  • We were active & present at other events, such as the local JobFair for University students

Conclusion

By employing the three steps outlined above, you’ll greatly minimize the most typical challenges for new developers and provide them a great employee & developer experience from day one. I hope my session and this blog post give you a better idea of how to approach and how to streamline your onboarding process.

For anyone looking to learn more or having any other questions, you can find me on social media (@boshtian) or reach out to Agiledrop directly for anything specific. I wish you lots of success in all your future Drupal onboarding initiatives!

Oct 20 2023
Oct 20

Effective integration of different systems in a company today is an elementary factor for success. In a world of dynamic technologies and IT tools, Drupal stands out because it’s a constantly evolving open source software with the support of a large community. With its flexible structure of modules written in PHP and the ability to use tools such as Composer, Drupal becomes an ideal solution for integrating various programs in an organization. 

Why does Drupal work well for integration? 

In favor of Drupal is its flexibility and the rich database of modules available on Drupal.org, which is constantly growing and often includes ready-to-use solutions for integration.

It’s also worth noting that Drupal has its API, which makes it much easier to create custom Drupal integration modules. This popular system is based on Symfony, which allows for writing new integrations even faster and easier, thanks to access to advanced, ready-made solutions. You don't have to start everything from scratch, which saves time and resources.

In our blog post, we'll discover how to harness Drupal's potential to effectively integrate it with other systems in your organization, taking advantage of the powerful tools and instant options available in this powerful open source software.

How is Drupal architecture built?

Architecture plays a crucial role in the context of Drupal integration with other systems. This is especially true in a dynamic business environment, where a company's systems are often subject to modification and must be easily extensible and ready for change. 

As technologies and business requirements evolve, Drupal's flexible design enables rapid implementation of changes and the addition of new features and integrations. This is critical to maintaining competitiveness and operational efficiency in the enterprise.  

PHP language

Drupal is written in PHP – a well-known language used worldwide by web developers. How does its popularity affect Drupal integrations with other systems? 

The PHP language is widely used in the development of web applications, resulting in unique toolkits for programmers known as SDKs (Software Development Kits). Examples include the SDK for Google services or the SDK for eBay integration

Ready-made libraries, numerous tutorials, and documentation on system connection in PHP are also beneficial. Thus, the process of Drupal integration with other systems becomes much more accessible and efficient. 

Symfony components 

Drupal and Symfony allow you to install off-the-shelf libraries using the Composer tool, which further simplifies the process of integrating with external programs. These libraries are often provided by the systems you want to integrate with, which means that companies can use official or unofficial solutions from manufacturers. 

As a result, the integration process becomes even smoother, and ready-made libraries make it easier to create connections and exchange data between different platforms. This, in turn, speeds up the implementation of integration.

An example is the installation of Google services such as Google Drive or YouTube:

{

    "require": {

        "google/apiclient": "^2.15.0"

    },

    "scripts": {

        "pre-autoload-dump": "google-autoload-dump::cleanup".

    },

    "extra": {

        "google/apiclient-services": [

            "Drive,

            "YouTube"

        ]

    }

}

Also noteworthy is the SDK provided by Amazon:
composer require aws/aws-sdk-php

Twig template system

Drupal uses the Twig template system to render content on websites. While it may seem unrelated to integration, it’s essential for Drupal's flexibility in this context. With Twig, advanced output content processing is possible, making it easier to communicate between different applications. 

In addition, the Twig template system works with the library system in Drupal. It allows external JavaScript libraries, which expands the possibilities for creating user interfaces and customizing them for a given project. This way, Drupal becomes a more flexible integration tool, allowing us to create advanced web solutions.

For example, we can create custom services for formatting and filtering the displayed content. Here is an example of turning www.xxxx.xxx addresses into clickable links "on the fly": 

service.yml

  my_module_twig_extension.twig.InlinerTwigExtension:

    class: drupal_module_twig_extension\TwigExtension\TwigExtension

    Tags:      { name: twig.extension }

Class code: 

public function getFilters(): array {

    return [

      new TwigFilter('replaceUrls', [$this, 'replaceUrls']),

    ];

  }

  /**

   * Replace url link to html link in texts.

   */

  public function replaceUrls($text): array|string|null {

    if (empty($text)) {

      return $text;

    }

    $pattern = '/(http:\/\S+|https:\S+|www.\S+)/i';

    $replacement = '$1';

    $text = preg_replace($pattern, $replacement, $text);

    $pattern = '/(.*?)/i';

    $replacement = '$2';



    return preg_replace($pattern, $replacement, $text);

  }

And in Twig, we add our custom filter:

  {{text|replaceUrls}}

How to perform Drupal integration with other systems? 

We’ve already reminded you of the basic elements of Drupal's architecture that can affect the system's connection with external tools. Below, we present specific approaches to integration. 

Integration using Drupal Rest API

Integration with Drupal Rest API is a relatively simple and effective process. To be able to implement it, we need to enable the Rest module in the Drupal admin panel, configure the appropriate access permissions, and create API endpoints.

Drupal Rest API allows us to integrate Drupal with systems after enabling the module in admin panel.


We can also use the REST UI add-on, which allows us to add some actions from the UI.

Fast and efficient Drupal integration with other systems can be done using an add-on such as Rest UI


It’s also important to implement authorization and authentication mechanisms to ensure that API access is secure. 

Drupal and Symfony allow the custom creation of REST endpoints. Developers can use tools such as Guzzle and other libraries to create custom API endpoints that meet the project's exact needs. This means that the structure and behavior of the API can be tailored to specific business requirements. As a result, we manage to build personalized integration solutions and gain accessible data exchange between Drupal or Symfony and other applications and platforms.

Before implementing an integration, it’s a good idea to thoroughly test the API and create documentation to make it easier for other developers to use the resources and operations provided by the API. This way, Drupal can be effectively integrated with other systems, allowing data and processes to flow freely between different applications and tools.

Creating a plugin for Rest 

We need to create a classe with annotation @RestResource along with url_paths and extend RestResource class. Example:

get('entity.manager')

    );

  }



  /**

   * Responds to GET requests.

   *

   * @return @DrupalResourceResponse.

   * The HTTP response object.

   *

   * @throws @SymfonyComponentHttpKernelException.

   * Throws exception expected.

   */

  public function get() {

    // Your custom logic here to handle GET requests.

    // For example, you can fetch data and return it as a JSON response.

    $data = ['message' => 'This is a custom REST resource.'];

    return new ResourceResponse($data);

  }



  /**

   * Responds to POST requests.

   *

   * @param mixed $data

   * The data received in the POST request.

   *

   * @return @DrupalResourceResponse.

   * The HTTP response object.

   *

   * @throws @SymfonyComponentHttpKernelException.

   * Throws exception expected.

   */

  public function post($data) {

    // Your custom logic here to handle POST requests.

    // For example, you can create a new resource based on the received data.

    // Return a response indicating success or failure.

    return new ResourceResponse(['message' => 'POST request handled.']);

  }



}

Another approach is to create routing and controllers to receive our requests:

my_module.resource_list:

  path: '/api/resources'

  defaults:

    _controller: '_controller::getList'.

    _title: 'Get list of resources'.

  methods: [GET].

  requirements:

    _permission: 'access content'

  formats: ['json']


my_module.resource_get:

  path: '/api/resources/{id}'

  defaults:

    _controller: '_controller::getSingle'.

    _title: 'Get a single resource'

  methods: [GET].

  requirements:

    _permission: 'access content'

  options:

    parameters:

      id:

        type: 'integer'

  formats: ['json']



my_module.resource_create:

  path: '/api/resources'

  defaults:

    _controller: '_drupal_module_Controller_ResourceController::create'.

    _title: 'Create a new resource'

  methods: [POST].

  requirements:

    _permission: 'create new resource'

  options:

    parameters:

      date:

        type: 'entity:my_resource'

  formats: ['json']

In addition, we present how to download sample data in our custom module from external systems, such as YouTube, using GuzzleHttpClient:

 'https://www.googleapis.com/youtube/v3/', // Google API base URL

    ]);



    // Query parameters, including the API key

    $params = [

        'query' => [

            'part' => 'snippet',

            'q' => 'cats', // Example query - search for cat videos

            'key' => 'YOUR_API_KEY', // Replace 'YOUR_API_KEY' with your own Google API key

        ],

    ];



    // Perform a GET request

    $response = $client->get('search', $params);



    // Decode the response JSON

    $data = json_decode($response->getBody());



    // Process data from the response

    $results = [];

    foreach ($data->items as $item) {

        // You can process video data here, such as displaying titles and descriptions

        $results[] = [

            'title' => $item->snippet->title,

            'description' => $item->snippet->description,

        ];

    }



    // Return the results as a JSON response

    return new JsonResponse($results);

  }

}

Drupal integration through modules 

Connecting Drupal with other systems via modules is a popular approach to extend the website's functionality. Especially if it's third-party systems that integrate with our web page.

Examples of popular modules include:

  • RESTful Web Services: the module described above allows us to create REST resources and handle HTTP requests, which works well for communicating with other applications and services.
  • Feeds: the Feeds module enables us to import and export data from different sources, which is helpful for synchronizing content with external systems. For example, with the Feeds module, we can define the data source and field mapping between Drupal and another system.
  • Create Views: the Views module allows us to create custom views that use data from other systems and display them on our Drupal website. Views can also be used to present data from other systems. Particularly useful in integrations is also the option to expose data in XML, CSV, or other formats, which external systems can easily consume. We can use the Views data export module for this purpose. 

Drupal integration by this method is a practical solution for various types of projects. There are dedicated modules for specific systems that are ready to use or significantly speed up integration. A few examples are:

  • Jira – a project management tool,
  • PayPal – an online payment system,
  • HubSpot – a CRM platform,
  • MailChimp – a marketing automation and e-mail marketing platform. 

More such components can be found on Drupal.org in the Third-party Integration
category.

Drupal Salesforce integration

Salesforce is one of the largest and best-known customer relationship management software companies. It offers various CRM (Customer Relationship Management) solutions and tools for automating business processes, marketing, customer service, and data analysis.

Using its example, we’ll show how easy it is to integrate this kind of system with Drupal. 

First, we can use a module available on Drupal.org – Salesforce.

The main component contains a set of modules that support integration with Salesforce by synchronizing various Entities (e.g.,  users, nodes, files) with Salesforce objects (e.g., contacts, leads). It supports uploading data from Drupal to Salesforce, as well as downloading or importing data from Salesforce to Drupal. Changes can be made in real-time or asynchronously in batches when running cron.

If, for some reason, we need more custom solutions, we can extend this with our own module. Salesforce API has classes and a set of hooks for extension, such as:

/**

 * Implement an EventSubscriber on SalesforceEvents::PUSH_PARAMS.

 */

function hook_salesforce_push_params_alter() {

}



/**

 * Implement an EventSubscriber on SalesforceEvents::PUSH_SUCCESS.

 */

function hook_salesforce_push_success() {

}



/**

 * Implement an EventSubscriber on SalesforceEvents::PUSH_FAIL.

 */

function hook_salesforce_push_fail() {

}

We can also use a dedicated SDK for PHP, downloaded with Composer, which allows us to easily receive and send data to Salesforce. 

Drupal integrations through Zapier

System integration through Zapier is the process of connecting different applications, tools, and systems to automate tasks and transfer data between them using the platform above. Zapier enables the creation of rules or "zaps" that determine what will happen when a certain event occurs in one system and what actions will be taken in another.

Why is integration with Zapier useful, and what benefits does it bring?

  • Simple and fast connection: Integration with systems using Zapier is easy to set up and doesn’t require advanced technical knowledge. We can create our own zaps, customizing them to suit our needs in minutes.
  • Task automation: Zapier enables the automation of many tasks and processes, saving time and avoiding human error. This allows us to focus on more strategic aspects of the business.
  • Expanded functionality: With support for hundreds of applications and tools, Zapier allows us to create more advanced and integrated solutions. We can synchronize data, generate notifications, create reports, and more, combining different systems into a cohesive work environment.

An example of a simple Drupal integration with Excel via Zapier:

Thanks to the Zapier platform, Drupal can be integrated with various applications, tools and systems.


Source: Zapier

Drupal integrations - summary

Drupal is a highly flexible system in terms of extensibility, offering unlimited integration with other solutions and tools. As an open source software, it has a wide range of integration modules available on Drupal.org, which allow us to connect a website to various applications, including CRM, ecommerce, social media, etc.

With its own API and Symfony components, Drupal enables us to create custom integrations, giving us complete control over the communication process between systems. Protecting the data is a priority, and Drupal maintains the highest security standards during integration. If you need help with this tool for creating personalized and integrated websites, get support from an experienced Drupal agency

Oct 20 2023
Oct 20

DrupalCon is the annual gathering of leaders in Drupal to meet, share knowledge, discuss the project roadmap, and work directly on progressing the development of Drupal Core at daily contribution events. On Friday 20th October, there is a huge Code Sprint where 100’s of Drupal Developers will make huge strides in progressing major initiatives.

We spoke to our Drupal Director, Paul Johnson, to find out more about the event, what he learned and how his talk went.

Visit Britain Digital Experience Platform at DrupalCon Lille

Photo credit - Mike Gilford

How did your talk go?

Together with Marie Orpen, Visit Britain's Head of Digital, I presented how CTI Digital is playing a central role in digital transformation across the organisation. The session focussed on how we led an extensive Discovery Phase and revealed what process and techniques we used to gather a body of knowledge to support decision-making by Visit Britain, leading to significant change in both public-facing websites, operating models and ways of working.

cti Blog Banner-2

Photo credit - Mike Gilford

If you would like to take a look through Paul's presentation during the talk, click here.

What were the key findings from the talks you attended?

Much like GDPR and accessibility legislation that came before them, new UK and EU legislation relating to carbon impact reports by businesses are on the near horizon. They must be on your agenda. 

At the DrupalCon 2 sessions we attended, we were provided with valuable knowledge transfer to complement our existing expertise in the subject.

In the UK, Streamlined Energy and Carbon Reporting (SECR) and EU the Corporate Sustainability Reporting Directive (CSRD) are set to arrive in 2024. They will introduce mandatory reporting of carbon emissions and tracking of improvements to the footprint.

IMG_7438IMG_7457

At both the infrastructure and software application levels, there are measures which can be taken to significantly reduce the carbon impact of digital services. The key first step in the journey to compliance with these legislations is the measurement of the current situation.

Our partner Platform.sh presented work they are undertaking together with Nestle to accurately track and report the carbon impact of Nestle’s Drupal applications and hosting infrastructure. Detailing the tools and techniques their enterprise uses to benchmark and track improvements, and how measures they have taken, such as moving hosting to countries drawing from carbon-neutral energy to performance optimisation in the application layer, are all lessons we can learn from.

Moving to green data centres brings the greatest benefit. A shift from Ireland to Sweden brings an 80% reduction in carbon footprint. Whilst essential, adapting the application layer yields far smaller benefits. However, a combination of these measures brings a significant benefit to the environment.

In a related session, Janne Kalliola signposted wider industry research, including findings from the University of Beira Interior in Portugal, concluding that there is a strong or very strong correlation between (software) execution time and energy consumption. All website owners need to begin to place greater emphasis upon and invest in web application performance and optimisation.

Of great concern and emphasising the importance of optimisation initiatives is that currently, global energy demand is growing faster than the production of green energy.

Our Drupal Director, Paul Johnson, talks at DrupalCon Lille 2023


"The ICT sector accounts for 4-10% of the world's energy consumption and it's growing" - Janne Kalliola

How are we adopting what you learned?

CTI Digital is starting to work with existing clients and will make available consultancy services to help organisations prepare for the new legislation.

If your organisation is approaching a digital transformation, why not get in touch with our experts today!

Oct 20 2023
Oct 20

You've likely heard repeatedly about the impending end-of-life for Drupal 7 and the potentially daunting task of updating to the latest version.

We're joined by the esteemed Matt Glaman, a prominent Drupal contributor and Principal Software Engineer at Acquia, who introduces his latest innovation: Drupal Retrofit.

This tool serves as a compatibility layer, enabling you to execute legacy Drupal 7 code on your Drupal 10 site. The goal? To potentially ease your upgrade process and expedite your transition to modern Drupal.

Oct 19 2023
Oct 19

This is a follow-up to my DrupalCon Pittsburgh talk. It does not provide an overview of the status nor the progress, but instead it’s hands-on, with 2 live demos to help attendees:

  1. use Config Inspector to find which config is still missing validation constraints, add it, and observe it catching invalid data — by adding 3 lines of YAML!
  2. update existing config forms to use validation constraints, including tweaking the validation error message — by adding 6 lines of YAML and copy/pasting 5 lines of PHP!

Each in less than 5 minutes, including the explanation!

In other words: everybody walked out ready to contribute to the DrupalCon sprints on the next day, or to update their own modules.

I’m honored to say that this was voted the 8th most interesting session at DrupalCon Lille!

Conference: 

DrupalCon Lille

Location: 

Lille, France

Date: 

Oct 19 2023 - 17:15

Duration: 

20 minutes

Oct 19 2023
Oct 19

As has become a tradition since DrupalCon Amsterdam 2019, all Drupal core initiatives with leads attending DrupalCon Lille took part in a PechaKucha-style keynote format. Despite not leading any initiative right now, I was asked to present the status & progress of the work on Config Validation that I together with a handful of others have been doing in the past few months.

Conference: 

DrupalCon Lille

Location: 

Lille, France

Date: 

Oct 19 2023 - 13:30

Duration: 

75 minutes

Oct 18 2023
Oct 18
Published on Wednesday 18, October 2023

One of the major problems observed in getting contributed modules Drupal 10 compatible was maintaining support for Drupal 9.5, which remains in security support (or remained if it is now past November 1, 2023.) Contributed modules should be compatible with all security-supported versions of Drupal core or more if they so choose. This can be difficult as Drupal 9.5 contained deprecated code removed in Drupal 10. It was up to maintainers and contributors to find workarounds and copy-pasting tricks using if/else statements with version_compare.

If you're interested in these challenges, I recommend catching my talk from MidCamp this year – Lessons learned from helping port the top contrib projects to Drupal 10.

Making backward-compatible calls possible

Luckily, Drupal 10.1.3 released a new utility class that will make supporting multiple versions of Drupal core easier while addressing deprecated code. The new class \Drupal\Component\Utility\DeprecationHelper and its backwardsCompatibleCall method allow code to be executed conditionally based on the current Drupal core version (change record.)

For instance, the user_roles() function has been deprecated in Drupal 10.2.0. Here's an example of using the deprecated user_roles function and its replacement using the DeprecationHelper::backwardsCompatibleCall method. Note – the example uses named arguments for demonstration purposes and is not required.

$result = DeprecationHelper::backwardsCompatibleCall(
    currentVersion: \Drupal::VERSION,
    deprecatedVersion: '10.2',
    currentCallable: fn() => Role::loadMultiple(),
    deprecatedCallable: fn() => user_roles(),
);

Let's break down this code. DeprecationHelper::backwardsCompatibleCall has four arguments

  • currentVersion is the version to be checked, which is the version of Drupal from \Drupal::VERSION.
  • deprecatedVersion is the version that introduced the deprecated code path, which happened in the release of Drupal 10.2.0.
  • currentCallable is the callable to be invoked for the new code path.
  • deprecatedCallable is the callable to be invoked for the deprecated code path

The method uses PHP's version_compare function to determine if currentVersion is greater than or equal to deprecatedVersion.

I sincerely appreciate everyone's discussions and bikeshedding of this code. There was a lot of back and forth over naming and documentation, which is extremely important for a tool like this. It may only be a few lines of code, but we needed to nail the developer experience.

There is a caveat, however. Modules using DeprecationHelper must support a minimum version of 10.1.3 for Drupal core. With the release of Drupal 10.2.0 during the week of December 11, 2023, Drupal 10.0.x will no longer receive security support. That means modules can begin choosing to drop support for 10.0.x and bump their minimum supported version to 10.1.

Making drupal-rector backwards compatible

Earlier this year, I wrote about the need to add backward compatibility to automated code fixes provided through Rector. Björn Brala (bbrala) has made this a reality: https://github.com/palantirnet/drupal-rector/pull/250!

As the Project Update Bot delivers automatic code fixes to projects for Drupal 11 compatibility through Rector, we can use DeprecationHelper to ensure breaking changes are not introduced. This is a giant leap forward in innovation for Drupal as the community works to reduce manual upkeep and maintenance of Drupal sites.

Want more? Sign up for my weekly newsletter

Oct 18 2023
Oct 18

November 1, 2023 will mark the second time in Drupal's history that a version's end-of-life date signals a true hard stop, with no possibility of extended support and no commercial vendors that are in a position to provide off-grid security maintenance and bug fixes.

This was the case in November 2021 when Drupal 8 was end of lifed, due to the decommissioning of Symfony 3, and it will be the case this November for Drupal 9 with the decommissioning of Symfony 4.

Drupal 10 is built upon the Symfony 6.2 technology stack, and Drupal 10's leap from the Symfony 4 PHP framework to Symfony 6.2 is compounding the upgrade imperative. Major risks are associated with a site that's built upon an outdated and unsupported PHP framework.

Drupal 9 site owners, as well as those who are still on Drupal 8, are urged to upgrade to Drupal 10 ASAP.

Fortunately, the upgrade from Drupal 9 to 10, and even Drupal 8 to 10 is relatively straightforward process. Current Drupal version upgrades bear little resemblance to the inherently major undertaking that accompanied migration from Drupal 7.

While upgrading to Drupal 10 is very much a "have to" at this point, it's important to keep in mind that it's important to keep in mind that Drupal 10 and the recently released Drupal 10.1 represent exciting new directions for the CMS, and a host of advantages for site builders. 

Here are answers to the questions we're hearing a lot these days, along with top recommendations concerning what to do now. 

What does end of life mean in the Drupal world?

End of life signals the cessation of Drupal Community support, bug fixes, security updates, and any further core development. 

Prior to Drupal 8, when a Drupal version reached end of life, commercial vendors stepped in to fill the void with the option of paid support packages. This is no longer the case due to the fact that Drupal is now built on top of Symfony.  

What is Symfony?

Symfony is a PHP framework for web projects that optimizes efficiencies in the creation and maintenance of PHP web applications, while leveraging a set of 50 reusable components. It is one of the most popular, reliable, and mature PHP frameworks available.

Why is Drupal is now built on top of the Symfony PHP web application framework?

Here are five reasons:

  1. Improved performance and scalability. Symfony components are designed to be lightweight and efficient, which helps to improve the overall performance and scalability of Drupal.
  2. Better maintainability. The use of Symfony components and conventions in Drupal makes the codebase more organized and consistent, which makes it easier to maintain and extend.
  3. Improved development experience. Symfony provides a set of well-documented, reusable components and tools that can be leveraged by developers to build Drupal sites more quickly and efficiently.
  4. Better integration with other systems. Symfony's use of modern web development techniques, such as HTTP caching and routing, makes it easier to integrate Drupal with other systems and services.
  5. A bigger developer community. Symfony is a widely used PHP framework, with an extensive community of developers who can contribute to and support Drupal.

Will a Drupal 9 CMS still function after November 1, 2023?

On November 2, Drupal 9 sites will continue to function as normal. We cannot predict the timeframe within which problems will begin to emerge, but it is likely just a matter of time. Once the Drupal Community stops issuing security releases and Symfony stops supporting the PHP code, potential vulnerabilities will run deep and wide. 

Security risks increase with each passing day after the November 1, 2023 end of life.

What’s the risk of further delaying migration from Drupal 8 or 9 to Drupal 10?

It’s not difficult to detect that a site is still on Drupal 8 or 9. Any organization that believes security is only an issue for sites that contain sensitive financial or medical data needs to question the potential organizational impact of their site being compromised or disabled.

There is no shortage of bad actors in the world for whom hijacking a site is seen as a sport. Failure to update can result in unnecessary exposure on many fronts.

Drupal versions and release dates
Due to Symfony 4 and CK Editor 4 dependencies -- both of which are reaching end of life on November 1, 2023 -- Drupal 9 is facing a forced end of life, at the same time. End of life means a hard stop for Drupal 9 security fixes and community support. End of life for Drupal 7, however, which is not built on Symfony, has been extended to January 5, 2025. 

How long does it take to upgrade a site from Drupal 9 to Drupal 10?

From 10 hours or less on the low end to 50 hours on the high end. 

Upgrading from Drupal 9 core to Drupal 10 core is straightforward and simple. It’s the presence of contributed and custom modules, along with detection of any deprecations, that can delay or complicate the process. Drupal 9 contributed modules need to be evaluated to determine whether there is a supported upgrade path or if an alternative is required. Custom modules and themes also need to be individually reviewed to determine the upgrade path.

What if a Drupal 9 site has a module that does not have a Drupal 10 version?

The first step is to try and identify a replacement with similar functionality. If no good alternatives are found, site owners can opt to stay on the Drupal 9 version of the module, closely monitor the functionality, and watch for the release of an upgraded version. In some cases, site owners might opt to have a custom module written to handle the gap. 

If extended commercial support for Drupal 7 might be available after that version’s end-of-life date, why isn’t that the case for Drupal 8 and 9?

Drupal 8 and 9 are built upon Symfony. Drupal 7 isn't. 

Pandemic-related disruptions and the the fact that Drupal 7 migrations essentially require new site builds have caused the Drupal community to extend the Drupal 7 end-of-life date three times. At DrupalCon Pittsburgh 2023, a third and final Drupal 7 end-of-life extension was announced. Drupal Community support will remain through January 5, 2025. 

Will there be any sort of extension or grace period for upgrading to Drupal 10 following the November 1, 2023 end of life date? 

No. 

The end of life date is based on a third-party dependency on Symfony 4. As such, it’s a non negotiable hard stop.

What to do now?

Promet Source has developed a comprehensive package of Drupal 7, 8, and 9 upgrade capabilities to ensure a straightforward and seamless upgrade process. The Promet team of Drupal 10 upgrade experts is adept at working closely with clients to optimize outcomes while ensuring no disruption to current operations. Questions about next steps? Let's Talk
 

Oct 12 2023
Oct 12

Takeaway: Drupal, an open-source powerhouse, is celebrated for its adaptability, community-driven innovations, and commitment to global standards. Conversely, Revize, a government CMS solution, prides itself on its bespoke features crafted specifically to empower government entities and engage their communities.

There are plenty of solutions for government agencies, that’s why it’s important to compare existing solutions to make sure you use the one that best serves your constituents and other stakeholders. We have compared Drupal vs WordPress, then Drupal vs AEM. This time, we’re comparing Drupal to a government-specific platform—Revize.

Revize CMS homepage

As we delve deeper into this comparison, we'll evaluate both platforms based on the following criteria:

  • Security measures against external threats
  • Compliance with FedRamp and GDPR
  • Accessibility features
  • Integration capabilities
  • Maintenance and upgrade requirements
  • Support and vendor responsiveness
  • Cost-effectiveness and long-term value

By the end of this guide, you will have a clearer understanding of which CMS aligns best with your specific government website needs.

SEND A SUMMARY TO YOUR STAKEHOLDERS

Security measures against external threats

The security of a government website is not just about protecting data; it's about ensuring the uninterrupted functioning of governance, maintaining public trust, and safeguarding national interests. It is crucial to choose a CMS that offers robust security features and can handle external threats.

Here are the top three reasons why security is an important criterion when choosing a CMS for your government website:

  1. Data protection: Government websites often store and manage sensitive data, including personal information of citizens, confidential government records, and critical infrastructure details. A security breach could lead to unauthorized access to this data, resulting in identity theft, fraud, and even national security threats.
  2. Public trust: Government websites are a primary source of information and services for citizens. Any security incident can erode public trust in the government's ability to safeguard their data and provide reliable online services.
  3. Service continuity: Cyberattacks can disrupt the availability of essential services provided through government websites, such as emergency response, public health updates, and benefit disbursements. Ensuring resilience against external threats ensures uninterrupted service to the public.

Drupal's security measures

Note: For a more extensive treatment of Drupal security measures, head over to the Adobe Experience Manager vs Drupal for Government blog.

  • Community vigilance and security advisory system: Drupal's dedicated security team actively monitors and addresses security concerns. They release security advisories on the Drupal official website, informing users of vulnerabilities and providing patches. For instance, they recently released an advisory for Drupal core where they found a vulnerability in sites using the JSON:API module. Included in the advisory is who reported the issue and who contributed to the solution.
  • Regular updates and built-in security features: Drupal releases core and module updates regularly. Drupal also has built-in security features like the brute-force detection system and more.
  • Granular user permissions and security modules: Drupal offers modules like "Paranoia" that help lock down the configuration further, preventing PHP code execution through the user interface. You can also assign roles to users, so not everyone gets administrative access.

Revize's security measures

  • Secure data centers: Revize's data centers have card readers, surveillance cameras, and guards on duty around the clock. As a result, unauthorized entries are prevented and any harm to the business is detected and resolved.
  • Continuous monitoring: Revize's web and network administrators also work around the clock to monitor activity. This helps protect your website against threats like Denial of Service (DoS) attacks.
  • Protection against malware and threats: Revize safeguards municipal website designs from malware injections, website vulnerabilities, and other threats.
  • Server configuration and maintenance: Patching and updating Revize's web servers, running security tests, scanning for vulnerabilities, monitoring log files, and backing up data and OS are all part of Revize's secure configuration.

Track record on security breaches

Drupal’s history of vulnerabilities and fixes is well-documented in their security advisories page. You can also subscribe to their email list to get security announcements. Being open-source, anyone can report security issues to the team, making finding and fixing issues faster.

As for Revize, I could not find any historical data on their security breaches and resolutions. It’s unclear to me if it’s a function of an incredibly secure platform or just a lack of transparency.

Drupal vs Revize on security measures

Both Drupal and Revize have robust security measures in place. While Drupal's open-source nature and active community provide transparency and rapid response to vulnerabilities, Revize's emphasis on physical security and continuous monitoring showcases their commitment to safeguarding their platform.

The choice between the two would depend on your organization's preference for transparency and the specific security features you prioritize.

Compliance with FedRamp and GDPR

We understand the importance of compliance with standards like FedRamp and GDPR. These standards ensure that government websites maintain the highest levels of security, privacy, and data protection for their users. Non-compliance can lead to legal repercussions, financial penalties, and a loss of trust among constituents.

Drupal's compliance measures

  • Modules for GDPR: Drupal offers various modules like the GDPR Compliance module that helps websites align with GDPR requirements. This module provides tools for data protection and privacy, such as consent collection, data export, and the right to be forgotten. According to the module information, “Installing and using this module pack does not mean your site becomes GDPR compliant. GDPR affects the whole organization, this module aims to help to understand its Drupal relations and tries to provide helper tools to make your site GDPR compliant.”
  • GDPR compliance team: There is also a GDPR compliance team project that serves as a repository for any efforts directed towards making Drupal sites more GDPR compliant.
  • FedRamp compliance: Hosting solutions that support Drupal, like Acquia, have achieved FedRAMP authorization. This means that when Drupal is hosted on Acquia, it can meet the stringent requirements of FedRAMP.

Revize's compliance measures

  • Secure infrastructure: Revize's emphasis on top-tier website protection protocols suggests a strong alignment with security and data protection standards. Their data centers, continuous monitoring, and protection against malware and threats are indicative of their commitment to security and compliance.
  • Specific compliance details: The Revize website does not explicitly mention FedRamp or GDPR compliance.

Drupal vs Revize on compliance measures

While Drupal provides tools and is associated with hosting solutions that are explicitly compliant with GDPR and FedRamp, Revize's compliance status remains less clear.

If your organization prioritizes FedRamp and GDPR compliance, you might find more explicit support with Drupal, especially when paired with compliant hosting solutions like Acquia.

Accessibility features

Ensuring that digital platforms under your purview are accessible is not just a matter of compliance, but a commitment to inclusivity and public service.

Accessibility ensures that all constituents, regardless of their physical or cognitive abilities, can access, understand, and engage with the digital content and services provided by the government. By prioritizing accessibility, you are championing the rights of every individual to have equal access to information and services, reinforcing the government's dedication to serving all its citizens equitably.

Download the accessibility webinar recording

Drupal's accessibility commitment

  • Open standards, semantic HTML, and WAI-ARIA: Drupal is built on open standards, ensuring that its content is accessible and usable by everyone. It uses semantic HTML, which provides meaning to web content, making it easier for assistive technologies to interpret. Drupal also incorporates WAI-ARIA (Web Accessibility Initiative – Accessible Rich Internet Applications) practices, enhancing the accessibility of dynamic content.
  • Aural alerts, controlled tab order, and alt text for images: Drupal provides features like aural alerts for screen readers, controlled tab order for keyboard navigation, and the ability to require adding alternative text for images, ensuring that visually impaired users can understand and navigate content.

Revize's accessibility features

  • Easy-to-use interface: The Revize CMS is designed for ease of use, ensuring that content creators, regardless of their technical proficiency, can create and manage content without barriers.
  • Responsive web design: Case studies on the Revize website show that responsive web design and mobile accessibility are some of the things they prioritize when building websites for their clients.

Case studies on accessibility implementation

Promet Source has a commitment to making websites accessible, as we strongly believe that everyone deserves unhampered access to information and services they need regardless of ability. This is also why we are huge advocates of Drupal.

Our team has made our clients from the waste and water sector ADA Sec 508 compliant, as well as other government clients such as the Martin County, Florida website. We have also worked with associations such as the Council on Foundations and American Camp Association, and organizations in the healthcare sector such as Southern Illinois University School of Medicine to make their sites compliant with accessibility standards.

As for Revize, their case studies on Machesney Park, IL, and Pittsfield, MA show that they have worked with their clients for accessible and responsive websites. Their other projects as well, which include Des Moines, IA, Troy, MI, and more all state they are 100% responsive to any screen size.

Data integration tools

Integration tools are essential for government websites because they allow for seamless communication between different systems, ensuring that data flows smoothly and efficiently. This is crucial for government agencies that rely on various systems to function effectively.

For instance, a municipal government might need to integrate its website with a CRM to manage citizen interactions. Without proper integration tools, these processes can become cumbersome, leading to inefficiencies and potential errors.

Drupal's integration modules and APIs

Drupal has a list of third-party integration modules that you can send to your developers. These range from Google Analytics integrations to CRM integrations such as with HubSpot or Salesforce. You can also check their list of APIs to see what you can use for your website.

In the event that you need a custom module or API, we can do that for you!

Revize's integration tools

From the information provided on the Revize website, it's clear that they prioritize security, ease of use, and functionality with various apps. However, specific modules or tools for data integration were not explicitly mentioned.

Maintenance and upgrades

When choosing a CMS, understanding the maintenance and upgrade requirements of a CMS is crucial. Regular updates ensure that the platform remains secure and efficient. However, it can be challenging if the upgrades are disruptive.

Drupal's maintenance requirements

  • Regular updates: Drupal is known for its regular updates, both for its core and for the various modules it supports. These updates often include security patches, bug fixes, and new features.
  • Security patches: The Drupal security team actively monitors and addresses security concerns, releasing advisories and patches as needed. This proactive approach ensures that vulnerabilities are addressed promptly.
  • Migrate API: To minimize disruptive migrations and ensure a smooth transition, Drupal has tools like the Migrate API.
  • Community support: Being an open-source platform, Drupal has a vast community of developers and users. This community is a valuable resource for troubleshooting, sharing best practices, and providing patches or solutions to emerging issues.

Revize's maintenance requirements

  • Server configuration and maintenance: As mentioned in the security section earlier, Revize’s team continuously monitors their activity and performs security tests and vulnerability scans, and patching and updating their web servers.

Upgrade frequency and disruption

  • Drupal's release cycle: Drupal announces all major releases on the Drupal website. Major versions, like the migration from Drupal 7 to Drupal 8, can bring significant changes, but they are usually well-documented and come with ample notice to give users enough time to perform the migration or upgrade, especially if the previous version is reaching its end of life. Minor updates are more frequent but less disruptive.
  • Revize's upgrade practices: The Revize website does not provide explicit details about its upgrade practices. However, given their emphasis on security and continuous monitoring, updates are likely performed as necessary to ensure the platform's security and efficiency.

Vendor support and responsiveness

When choosing a CMS, the level of vendor support and responsiveness is a critical consideration. Government websites serve as primary communication channels for public services, information dissemination, and citizen engagement. Any downtime, technical glitches, or security vulnerabilities can have significant repercussions, affecting public trust and the efficient delivery of services.

Drupal's support system

Being an open-source platform, Drupal has a vast and active community of developers, users, and enthusiasts. This community is a valuable resource for troubleshooting, sharing best practices, and providing solutions to common issues.

As for vendor support, you are free to choose among many agencies (like Promet Source) that offer professional Drupal maintenance and support services since there is no vendor lock-in. These vendors provide dedicated support, maintenance, and consultation services, ensuring that Drupal-based websites run smoothly and efficiently.

Revize's support system

As a proprietary CMS, we can reasonably assume that Revize offers dedicated support for its platform. While specific details about their support system doesn’t seem to be on their website (aside from a customer portal), we can infer that Revize provides a structured support system, given their emphasis on security, continuous monitoring, and commitment to serving government entities.

Platform cost-effectiveness

When choosing a CMS for government websites, we need to consider cost-effectiveness and flexibility. Government agencies operate within budgetary constraints, and it's essential to ensure that the chosen CMS offers value for money, not just in terms of initial setup but also in long-term maintenance and scalability.

Drupal's long-term costs

Since Drupal is open source, the CMS is free to use. This means that there are no licensing fees associated with the core software. This can result in significant cost savings, especially if you’re looking to build a large website.

The costs come with hosting, custom development, theming, custom modules, and any professional support, training, and maintenance. That’s why it’s important to choose your service provider well, so you know you’re getting the best service for the budget you have.

And despite these costs, the flexibility, scalability, and robustness of Drupal often result in a high return on investment, especially when considering the platform's longevity and the vast community support available.

Revize's cost implications

Specific details about Revize's pricing and cost structure doesn’t seem to be on their website. However, as a proprietary CMS, there are likely licensing fees associated with using Revize, along with potential costs for additional features, support, and customizations.

Why choose Promet Source as a Drupal Vendor?

In the vast landscape of Drupal vendors, our team at Promet Source stands out for several reasons:

  1. Expertise: With years of experience under our belt, we boast a team of expert Drupal developers, designers, and strategists. We also have IAAP CPACC-certified experts in our team to ensure ADA Sec 508 compliance. Our deep understanding of the Drupal ecosystem, combined with our technical prowess, ensures that we can tackle even the most complex challenges with ease.
  2. Track record: Our team has a proven track record of delivering successful Drupal projects for a diverse range of clients, including public sector agencies, educational institutions, and private organizations. Our portfolio showcases a wide array of projects, each reflecting our commitment to quality, innovation, and client satisfaction.
  3. Commitment to excellence: At the heart of our operations at Promet Source is an unwavering commitment to excellence. We don't just aim to meet client expectations; we strive to exceed them. This dedication is evident in our meticulous approach to project planning, our rigorous quality assurance processes, and our proactive approach to client communication and feedback.

Choosing Promet Source as your Drupal vendor means partnering with a team that's not only passionate about Drupal but also deeply invested in your success. Our blend of expertise, experience, and ethos makes us an ideal choice for organizations seeking to leverage the power of Drupal to its fullest potential.

SEND WHY TO YOUR STAKEHOLDERS

Which CMS should you choose for your government website?

After a comprehensive comparison of Drupal and Revize based on the criteria we mentioned, it's evident that both platforms have their strengths and cater to different needs. Here's a quick summary:

  1. Security measures: Both platforms prioritize security, but Drupal's open-source nature and active community provide a level of transparency and rapid response to vulnerabilities that is commendable. Revize, on the other hand, emphasizes physical security and continuous monitoring.
  2. Compliance: Drupal offers explicit tools and modules for GDPR compliance and is associated with hosting solutions like Acquia that are FedRAMP authorized. Revize's compliance status with GDPR and FedRAMP is less clear.
  3. Accessibility: Drupal's commitment to accessibility is evident in its features and modules, ensuring inclusivity for all users. Revize also prioritizes responsive web design and mobile accessibility.
  4. Integration capabilities: Drupal's open-source nature allows for a wide range of third-party integrations, while specific details about Revize's integration capabilities are not as transparent.
  5. Maintenance and upgrades: Drupal's regular updates, security patches, and community support ensure the platform remains up-to-date and secure. Revize emphasizes continuous monitoring and server maintenance.
  6. Support System: Drupal's vast community offers a wealth of knowledge and troubleshooting resources. Revize, being proprietary, likely offers structured support for its platform.
  7. Cost-effectiveness and Flexibility: Drupal's open-source nature can lead to significant cost savings, especially when considering its flexibility, scalability, and community support. Revize's cost structure is less transparent.
  8. Vendor Expertise: Promet Source, as a Drupal vendor, offers a blend of expertise, experience, and commitment to excellence, making it a top choice for organizations looking to leverage Drupal.

Given the comparison, if transparency, community support, flexibility, and a clear track record of security and compliance are priorities, Drupal for government emerges as the more favorable choice for those looking to migrate from their current CMS. Its open-source nature, combined with the robust support from vendors, ensures that government agencies can build and maintain secure, compliant, and user-friendly websites that serve their constituents effectively.

However, we still need to consider your specific needs and priorities. If you prefer a solution tailored for government entities, Revize might be worth considering, though further research and direct communication with Revize would be advisable.

Ready to future-proof your government website with security, accessibility, and seamless integration? Connect with our Drupal experts today!

Oct 12 2023
Oct 12

5. How we delivered a language learning website to rural internet-less schools in South Africa using Drupal 

Why this session? 

DrupalCon is pretty much about connectivity and technology, yet here we have this presentation about creating a website that will not be online, for a group of people who do not own devices that will allow them to use the internet, and they are barely literate. Where do you even start finding solutions to the ultimate accessibility challenge? 

I am South African, and have lived in this country which has one of the world’s biggest gaps between the haves and the have-nots, for many years. This mega gap is a very hard thing to witness. But there are people doing incredible work, solving problems that a few years ago would have seemed impossible. 

When is it? 

Thursday, October 19, 2023 – 10:30 to 11:15 

What is it? 

In South Africa, 78% of children who are nine and 10 years old cannot read for meaning in English. That's because, in this particular school year, they're required to switch from learning in their home language (South Africa has 11 official languages) to learning in English. 

Read to Learn is a project imagined by the people at Oxford University Press, and presenter Dane Rossenrode is the web designer and web developer on the project

Using innovative "offline server" boxes and Drupal, what they’ve created is a highly interactive website where children can go through lessons, take quizzes, and play interactive games. And they’re deploying them to schools in rural areas that don't have any internet connection! 

The schools have government-provided computer rooms or low-end Android tablets, which means that the entire system was built to work offline. Once a week, the box turns on its (weak) 3G radio to send simple reports back to the Oxford University Press team to analyse. 

Oct 11 2023
Oct 11

Authored by: Nadiia Nykolaichuk

If someone said “There’s no easy recipe for a perfect website,” we’d have to argue with that statement. Even more so now that Drupal is bringing a new, exciting concept of Recipes on stage. Recipes are currently in the making, but they have already become the talk of the town as one of the most powerful additions to the CMS on the way from Drupal 10 to Drupal 11.

What are Drupal Recipes?

Recipes are a new concept in Drupal that enables site builders and developers to assemble Drupal functionality from predefined packages quickly and easily. This can be helpful in jumpstarting a new website or adding smaller features such as content types, image styles, user roles, and so on. One of the major use cases for Recipes is when you need to compose feature sets for specific types of websites (a blog, a non-profit website, a higher-ed website, etc.). 

The new concept of would-be Recipes was introduced by Drupal founder Dries Buytaert at his DrupalCon Portland 2022 Driesnote where he called them “Starter templates.” To provide some examples, Dries mentioned a template of a product site that could include a carousel, a web form for requesting a demo, a bunch of content types, etc. Another example was an event website that would allow users to easily put together a program, create speaker bios, and more. Dries also showed a demo of how users should eventually be able to browse for starter templates on drupal.org.

A demo shared by Dries Buytaert of browsing for starter templates.A demo shared by Dries Buytaert of browsing for starter templates.

Currently, these kinds of templates are referred to as Recipes and are backed by a special Drupal strategic initiative, which is in full swing. There is also a contributed project page to check out. 

Recipes: “Standing on the shoulders” of Drupal distributions

If the idea of using a predefined package to jumpstart a website sounds extremely familiar to you, you’re absolutely right. Indeed, for many years, Drupal has been using the concept of distributions for that purpose. Distributions contain the Drupal core, as well as a set of contributed modules, themes, libraries, and configurations for a specific type of website in a single download.

“Obviously, nothing in Drupal is a green field. The Drupal Recipes Initiative is standing on the shoulders of giants.” Alex Pott, a top Drupal core committer and one of the Recipes Initiative leads, said at his DrupalCon Prague speech. Referring to giants, he mentioned a couple of well-known Drupal distributions from the entire history of the CMS — DeanSpace (later renamed to CivicSpace), OpenAtrium, Panopoly, Lightning, Thunder, and Commerce Kickstart. 

However, distributions weren’t delivering what was expected from them, and something needed to change, said Alex. So the creators of Recipes are learning all the lessons from Drupal distributions to make things better. We can see that the full name of the new strategic initiative is “Distributions and Recipes.”

So what exactly was wrong with Drupal distributions? 

  • Discussing the pitfalls of distributions, Alex mentioned that they are hard to create, maintain, and share. Their maintainers have to constantly make sure they are up to date with the latest API changes in Drupal and take care of all the dependencies.
  • Furthermore, distributions lack flexibility and bind websites with their own “rules of the game” from the day they are installed and forever. Quoting Alex Pott, they are “kind of responsible for the entire site — when you install a distribution, it’s responsible for what themes you’re choosing at the start, it’s taking over all of your configuration, and you just can’t get out of that.” Indeed, it’s virtually impossible to uninstall a distribution in Drupal. 
A slide by Alex Pott about the difficulty of creating and maintaining Drupal distribution.A slide by Alex Pott about the difficulty of creating and maintaining Drupal distribution.

There also are other solutions overlapping with Recipes to some extent — the Drupal core installation profiles (Standard, Minimal, and Umami), the Features module allowing you to package and export functionality, and custom modules. However, they all present a bunch of complexities as well, so here is where Recipes comes in as a particularly simple and flexible solution.

Some of the benefits of the game-changing Recipes

  • Installable at any time. One of the best benefits of recipes as opposed to distributions is that Recipes be installed at any point in time on your existing website. This should include the option to find and install recipes via the Drupal admin UI using Project Browser — another revolutionary innovation that’s coming to the Drupal core in the near future.
  • Mixable and composable. Next, you can mix and match as many recipes as you like. For example, if you want an LMS system but also need Commerce in it, it’s possible to install recipes for both. Recipes are easily composable with other recipes to create recipe Kits. 
  • Individual components are replaceable. Furthermore, recipes do not lock sites into a monolithic setup like distributions do. Instead, they allow you to replace individual components, so you are not bound to use an entire predefined package — you can use exactly what you need.
  • No need to maintain or update. Recipes are applied to websites, not installed on them, which frees you from the difficulties of maintaining anything. This was mentioned by the Recipes Initiative co-lead, Jim Birch, at DrupalCon Pittsburgh 2023.
A slide by Jim Birch about the benefits of Drupal Recipes.A slide by Jim Birch about the benefits of Drupal Recipes.

A glimpse of how Drupal Recipes work

To provide more clarity for the above-mentioned “applied, not installed” approach with recipes, it’s important to mention one of their most prominent characteristics — they are all about configuration. As successfully summed up on the Initiative’s page, they are “declarative, not functional.” 

The first thing recipes do is install the respective modules or themes for the required functionality. After that, you can create or update the configuration, explained Jim in the above-mentioned DrupalCon session. For example, if you want to have the Metatag module, you install the recipe for it, which comes with 5 configuration files, but it’s up to you to change this after the installation. 

Furthermore, recipes can apply to other recipes. For example, you can have a Drupal recipe that does one thing and it can apply to another Drupal recipe that does another thing. Finally, according to Jim, there is also a new idea to eventually make Drupal Recipes able to create content. 

A slide by Jim Birch about how Drupal Recipes work.A slide by Jim Birch about how Drupal Recipes work.

It’s noteworthy that recipes can install modules that contain code but they don’t have any code themselves. They don’t make dynamic changes to code-related things, only to configuration. Once you install a Drupal recipe, it’s part of your own configuration, explained Jim. Obviously, they also don’t have an upgrade path since there’s nothing to upgrade.

A slide by Jim Birch about what Drupal Recipes don’t do.A slide by Jim Birch about what Drupal Recipes don’t do.

A recipe is going to have a folder like a Drupal module, so let’s look at the folder structure for it. It includes a recipe.yml file and a configuration folder where you can keep your configuration files. In Jim’s example below, there is node.type.event.yml file that creates a content type called “Event.”

A slide by Jim Birch about the folder structure of Drupal Recipes.A slide by Jim Birch about the folder structure of Drupal Recipes.

Let’s dig a little deeper and look inside the recipe.yml file structure:

  • It defines the recipe’s name (in this example, “Event”) and type (in this example, “Content type”). 
  • It specifies whether the current recipe looks for other recipes. In this example, it looks for the “Event manager” recipe, which creates a user role with this name on the Drupal website and lies in the same folder as the “Event” recipe. 
  • Next, the recipe installs the necessary modules if those are not yet installed on the website. In this case, it installs the Datetime range and the Node modules. 
  • Finally, there are Config Actions, which Jim called the magic of Drupal Recipes. This powerful feature is useful for altering an existing configuration. In this example, config actions go into an existing “user.role.event_manager” configuration and alter it by granting the permissions to edit and delete any event content. 

Using the approach described in the above steps, it’s possible to create an entire “Event” system with a bunch of little recipes for various purposes aggregated into one larger recipe. 

A slide by Jim Birch about the recipe.yml file structure.A slide by Jim Birch about the recipe.yml file structure.

Final thoughts

It looks like Drupal has found a reliable recipe for becoming a CMS that empowers everyone to build amazing things on websites quickly and easily. It infallibly follows this path, offering remarkable improvements like Recipes and many others. 

While still in the making, Drupal Recipes are waiting for their golden era. They should appear in one of the next Drupal releases, so it’s just a matter of keeping your website updated to benefit from Recipes or other innovations. In the meantime, we could offer you a super quick “recipe” to effortlessly create the desired functionality on your website or do a seamless upgrade — just contact an experienced Drupal partner.

Oct 11 2023
Oct 11

We contributed the module Search API Decoupled to allow the creation of engaging search experiences with client-side Javascript applications. 

In comparison to traditional server side search, client side solutions are much faster, because fetching and rendering search results is much more efficient then requesting full pages. 

We released the backend functionality of Search API Decouple in Drupal Dev Days 2023 in Vienna, the slides and video are available online.

However, Drupal needs a fully working search client so that developers and marketers can easily evaluate the functionality for their projects. 

Such a client should provide great search functionality out-of-the-box and should be easy to extend and style.

We applied for funding at the Drupal Innovation Contest Pitchburgh but we did not get it. 

But we decided to build and contribute the functionality anyway.

Oct 10 2023
Oct 10

My first Drupal migration was onto a heavily patched version of Drupal 4.0, back in 2002. I previously ran a popular kernel development blog called KernelTrap, using PHPNuke. I conducted interviews with prominent kernel developers, and posted blog entries about other interesting kernel news, all of which were frequently linked to from the front page of Slashdot (the leading tech news aggregator at the time). This resulted in huge traffic spikes, which would frequently bring the website down, commonly known as "the Slashdot effect”.

In early March of 2002, I received a friendly email from a Belgian developer named Dries Buytaert about a relatively new CMS called Drupal. He told me the CMS would be gaining a near magical-sounding performance-feature called "the page cache," which allowed an entire page to be served out of the database with only a single query, theoretically making Drupal able to withstand even a Slashdotting.

During his 2015 keynote at DrupalCon Los Angeles, Dries explained that before starting Drupal, he was following Linux kernel development, "I considered contributing to the Linux kernel and so I would follow a website called KernelTrap. KernelTrap was managed by Jeremy Andrews, and at the time Linux and the Linux kernel was a very hot topic. Everybody wanted to read about it. Jeremy basically listened in on the kernel mailing list and would blog about interesting conversations.”

In his first email, Dries offered me complete admin access to Drop.org, the original and very active community from which Drupal was born. This allowed me to better understand how it would feel to manage KernelTrap with Drupal, and receiving this trust was my introduction to the amazing Drupal community. Dries approached me very confidently, later summarizing this exchange in his keynote, "I basically said [to Jeremy] if you convert your website to Drupal it will never crash again." He went on to acknowledge, "Jeremy did convert his website to Drupal, and of course the first time he ended up on Slashdot the site crashed.”

I have kept that original email, as it literally changed the course of my life:

Date: Tue, 9 Mar 2002 10:28:36 +0200 (SAST)
From: Dries Buytaert
To: Jeremy Andrews
Subject: Drupal as a replacement for [email protected]>

Hey Jeremy,

After having read http://www.kerneltrap.com/article.php?sid=196, I decided I'd let you know about the Drupal engine [1] as a replacement for PHPNuke. You can see Drupal in action at http://www.drop.org/ [2] and you can learn more about it at [3]. If you'd like to get an idea of how the admin pages look like and what sort of things can be configured, drop me a line, and I can give you temporary admin access to drop.org. Like that you don't have to install it yourself. [Note: I'm the main Drupal developer.]

Note that Drupal caches pages, and that it can pull out entire pages with just one SQL query. Furthermore, Drupal is designed to be modular so you can remove all the functionality you don't see fit - or you can easily add your own.

[1] http://www.drupal.org/
[2] http://www.drop.org/
[3] http://www.drop.org/node.php?id=703

Amongst other things, I'm *really* into the weblog development scene (it is a hobby), so if you want my opinion on any of the existing weblog tools (such as PHPNuke, PostNuke, Geeklog, DaCode, Scoop, Slash, Drupal, Zope, etc), just ask.


Dries Buytaert http://www.buytaert.net/

At that time, Drop.org was running one of the final 3.0 releases of Drupal. While I was very excited about the page cache, I found a few critical pieces that were still missing: there was no good way to categorize blog posts, the statistics Drupal collected were too limited, and there was no good way to browse older content.

Dries informed me that an amazing new module, called Taxonomy, was going to be a big new feature in Drupal 4.0. Indeed, a month and a half later, Marco Molinari's revolutionary Taxonomy patch was committed into the Drupal codebase, becoming one of Drupal's most powerful features. On June 15th, 2002, Drupal 4.0.0 was released and included both the page cache and the Taxonomy module.

At this point, my first Drupal migration started in earnest. I wrote scripts that read data directly out of the PHPNuke database, and then wrote it directly into the Drupal database. I had to learn more about Drupal's bootstrap process and hooks in order to get the content to properly load. My solution was not the most elegant, but in the end it was successful at repeatedly migrating users, content, and metadata like categorizations (taxonomy) into a Drupal 4.0 installation.

During this process, I read a book on PHP and spent a few days enhancing the Drupal statistics module to collect all the information I needed to properly maintain KernelTrap. I also got to work implementing what became Drupal core’s pager logic, which made it possible to browse older blog stories - similar to navigating pages of Google search results. This done, I spent a weekend migrating the live KernelTrap from PHPNuke to a now heavily patched version of Drupal 4.0.0.

A few days later, KernelTrap again found itself on the front page of Slashdot, and though now Drupal-powered and page cache enabled, the website immediately crashed! I was at work, but I remember jumping on IRC and asking for help. Amid a number of excited comments and suggestions, Moshe Weitzman, another early Drupal developer, suggested I purge the block table, which effectively disabled all blocks on the website and, suddenly, KernelTrap was serving pages again. (Later, after the traffic surge ended, I had to manually restore the various blocks used on the website.)

This led to my next Drupal contribution, the Throttle module. Dries described it during his 2015 keynote, "the Throttle module was cool because it would look for spikes in traffic and then automatically disable features based on the load. For example, if the load reached level 5 you could disable the forum module block, and when the load reached level 6 you could disable commenting altogether." This was essentially automating the initial purging of the block table, reducing expensive site functionality to continue serving content when the site was at great load, and then restoring functionality when the load returned to normal levels without having to manually add back all the things!

After a fair amount of conversation and feedback on the Drupal developer mailing list (this pre-dated the Drupal.org issue queues, and was how Drupal core was developed at the time), my statistics module rewrite and new Throttle module were merged into core. Shortly after, my pager logic was also merged. And finally, on February 1st, 2003, Drupal 4.1.0 was released, KernelTrap was updated, and my first Drupal migration was complete.

(The Throttle module was a relatively short-lived member of the Drupal community, removed from core five years later in November of 2008. It was overly complicated, and made it impossible to enable more aggressive caching, which was the preferred solution. However, at the time, it helped KernelTrap serve pages for over 50,000 unique users per day while running on a single small server living in an ISP's closet.)

Fast forward over twenty years, and Drupal has a very powerful and well-proven Migration API built into core. The project was originally written by Moshe Weitzman and Mike Ryan (both now working at Tag1), and is currently maintained by several other developers, including Tag1 engineers Benji Fisher and Lucas Hedding.

With Drupal 7 going End-of-Life in January 2025, we will be posting a steady stream of how-tos with code examples and informational blogs to help you plan and execute your migration from Drupal 7 (or from Drupal 9, or other CMSs, even PHPNuke), to the latest Drupal release. While I'll never regret all the development and learning required for my first Drupal migration, decades of improvement and shared community experience now provide a rich and powerful upgrade path that make it significantly easier to migrate onto the latest version of Drupal.

Please let us know if you have specific migration-related topics you'd like to see us cover. Or, reach out and let us know if we can be an active part of ensuring your migration is a success!

Photo by NASA on Unsplash
Oct 09 2023
Oct 09

Drupal, a powerful content management system, relies on a multi-component ecosystem comprising Drupal modules, themes, vendor packages, and external libraries. Regular updates are essential to keep your Drupal project secure, efficient, and equipped with the latest features. However, managing these updates manually can be time-consuming and error-prone.

The update process typically involves package updates, thorough testing (both automated and manual), and ensuring stability. Automating this process can alleviate the burden of manual labor and allow teams to focus on critical tasks. Furthermore, having a standardized update procedure ensures consistency across the development team.

Additionally, in Drupal, individual modules may introduce configuration changes, making it crucial to isolate these changes in separate commits, combining package updates with the associated configuration. This practice allows for easy rollbacks and commits revert when necessary.

Drupal Updater to the Rescue

The Drupal Updater is a versatile tool compatible with any Drupal 9 and above installation. Its primary function is to detect and update outdated packages listed in the `composer.json` file, along with their associated configuration. 

More info and full documentation on GitHub

Here's how it simplifies the update process:

  • Package Detection: The tool identifies all packages listed in your `composer.json` file that have new versions available. It integrates with composer audit and Drupal Update module to detect new versions.
  • Sequential Updates: It updates packages one by one, ensuring that the associated configurations are also updated simultaneously. This guarantees that your Drupal project remains coherent and functional.
  • Full package version control: The tool respects composer version constraints, giving you complete control over your package versions. You can even freeze a package's version in your `composer.json` file if needed, that way it will never be updated. If this is the case we recommend adding a note with the Composer comments package.
  • Specific packages update: you can specify a specific list of packages to be updated also.
  • Dependency Handling: The tool also manages dependencies intelligently, ensuring that updates do not cause conflicts or compatibility issues. It relies on each component's composer requirements constraints.
  • Security Focus: You have the option to update all packages or only those with security issues, allowing you to prioritize critical updates when the time comes.
  • Version Control Integration (GIT): the tool creates a commit with the updated package information and its dependencies.
  • Multisite integration: Drupal Updater integrates with Drupal Multisites, allowing you to export the different configurations per site when a package is updated.
  • Conflict Resolution (the only manual action): In case of conflicts, the Drupal Updater allows you to focus your efforts on resolving issues saving you time on the previous processes. e.g. rerolling problematic patches or adapting custom code to new package versions. All other aspects of the update process are automated.

Real example

Find a real example of the tool running and its steps in one of your projects:

  1. Consolidating configuration:
    // 1. CONSOLIDATING CONFIGURATION //
    Running drush cr on the "@self" environment:
    Running drush cim -y on the "@self" environment:
    Consolidating @self environment
    Running drush cex -y on the "@self" environment:
  2. Checking Packages
    // 2. CHECKING PACKAGES //
    algolia/places
    aliagadev/inheritlink
    choices/choices
    ckeditor/autogrow
    ckeditor/codemirror
    ckeditor/codesnippet
    ckeditor/fakeobjects
    ckeditor/image
    ckeditor/link
    ckeditor/videodetector
    codemirror/codemirror
    components/highlightjs
    composer/installers
    cweagans/composer-patches
    d3/d3
    drupal-composer/drupal-security-advisories
    drupal/admin_toolbar
    drupal/advagg
    drupal/allowed_formats
    drupal/antibot
    drupal/behat_javascript
    drupal/block_class
    drupal/ckeditor_bootstrap_buttons
    drupal/classy_paragraphs
    drupal/codesnippet
    drupal/components
    drupal/config_filter
    drupal/config_split
    drupal/config_update
    drupal/context
    drupal/core
    drupal/core-composer-scaffold
    drupal/crop
    drupal/ctools
    drupal/datalayer
    drupal/datalayer_webform
    drupal/default_content
    drupal/devel
    drupal/draggableviews
    drupal/editor_advanced_link
    drupal/embed
    drupal/entity_reference_revisions
    drupal/entity_usage
    drupal/environment_indicator
    drupal/eu_cookie_compliance
    drupal/eu_cookie_compliance_matomo
    drupal/extlink
    drupal/extra_field_plus
    drupal/extra_field_set
    drupal/field_group
    drupal/field_group_background_image
    drupal/fontawesome
    drupal/fvm
    drupal/gin
    drupal/google_tag
    drupal/google_tag_cookies
    drupal/honeypot
    drupal/hreflang
    drupal/image_styles_generator
    drupal/image_widget_crop
    drupal/imagemagick
    drupal/inherit_link
    drupal/inline_entity_form
    drupal/jquery_ui
    drupal/jquery_ui_datepicker
    drupal/jquery_ui_tabs
    drupal/jquery_ui_tooltip
    drupal/libraries
    drupal/link_icons
    drupal/matomo
    drupal/media_library_edit
    drupal/menu_attributes
    drupal/menu_block
    drupal/menu_link_attributes
    drupal/menu_multilingual
    drupal/metatag
    drupal/migrate_default_content
    drupal/migrate_source_yaml
    drupal/nagios
    drupal/node_authlink
    drupal/paragraphs
    drupal/paragraphs_previewer
    drupal/pathauto
    drupal/rabbit_hole
    drupal/radix
    drupal/realname
    drupal/redirect
    drupal/reroute_email
    drupal/schema_metatag
    drupal/scrollama
    drupal/simple_sitemap
    drupal/sitemap
    drupal/smart_trim
    drupal/stage_file_proxy
    drupal/string_field_formatter
    drupal/styleguide
    drupal/token
    drupal/url_embed
    drupal/views_condition
    drupal/views_infinite_scroll
    drupal/viewsreference
    drupal/webform
    drupal/xray_audit
    drupal/yoast_seo
    drush/drush
    fengyuanchen/cropper
    fontawesome/fontawesome
    idiazroncero/btbutton
    jquery/chosen
    jquery/geocomplete
    jquery/hotkeys
    jquery/icheck
    jquery/image-picker
    jquery/inputmask
    jquery/intl-tel-input
    jquery/rateit
    jquery/select2
    jquery/textcounter
    jquery/timepicker
    jquery/toggles
    kenwheeler/slick
    kint-php/kint
    metadrop/drupal-artifact-builder
    metadrop/drupal-dev
    metadrop/grumphp-php-compatibility
    mglaman/phpstan-drupal
    phpcompatibility/php-compatibility
    phpro/grumphp
    progress-tracker/progress-tracker
    psr/cache
    signature_pad/signature_pad
    svg-pan-zoom/svg-pan-zoom
    symfony/deprecation-contracts
    symfony/string
    tabby/tabby
    tippyjs/5.x
    tippyjs/6.x
  3. Updating Packages
    // 3. UPDATING PACKAGES //
    [...]
    /// Updating: drupal/admin_toolbar ///
    Running drush cr on the "@self" environment:
    Running drush updb -y on the "@self" environment:
    Running drush cex -y on the "@self" environment:
    
    Updated packages:
    +----------------------+-------+-------+------------------------------------------------------------------------+
    | Production Changes   | From  | To    | Compare                                                                |
    +----------------------+-------+-------+------------------------------------------------------------------------+
    | drupal/admin_toolbar | 3.4.1 | 3.4.2 | https://git.drupalcode.org/project/admin_toolbar/compare/3.4.1...3.4.2 |
    +----------------------+-------+-------+------------------------------------------------------------------------+
    /// Updating: drupal/advagg ///
    Running drush cr on the "@self" environment:
    Running drush updb -y on the "@self" environment:
    Running drush cex -y on the "@self" environment:
    
    Updated packages:
    
    /// Updating: drupal/allowed_formats ///
    Package drupal/allowed_formats has an update available to 3.0.0 version. Due to composer.json constraints, it hasn't been updated.
    /// Updating: drupal/antibot ///
    There aren't available updates for drupal/antibot package.
    /// Updating: drupal/behat_javascript ///
    Running drush cr on the "@self" environment:
    Running drush updb -y on the "@self" environment:
    Running drush cex -y on the "@self" environment:
    
    Updated packages:
    +----------------------------------+---------+---------+-------------------------------------------------------------------------------+
    | Production Changes               | From    | To      | Compare                                                                       |
    +----------------------------------+---------+---------+-------------------------------------------------------------------------------+
    | doctrine/deprecations            | v1.1.1  | 1.1.2   | https://github.com/doctrine/deprecations/compare/v1.1.1...1.1.2               |
    | laminas/laminas-stdlib           | 3.17.0  | 3.18.0  | https://github.com/laminas/laminas-stdlib/compare/3.17.0...3.18.0             |
    | masterminds/html5                | 2.8.0   | 2.8.1   | https://github.com/Masterminds/html5-php/compare/2.8.0...2.8.1                |
    | psr/http-client                  | 1.0.2   | 1.0.3   | https://github.com/php-fig/http-client/compare/1.0.2...1.0.3                  |
    | symfony/polyfill-ctype           | v1.27.0 | v1.28.0 | https://github.com/symfony/polyfill-ctype/compare/v1.27.0...v1.28.0           |
    | symfony/polyfill-intl-idn        | v1.27.0 | v1.28.0 | https://github.com/symfony/polyfill-intl-idn/compare/v1.27.0...v1.28.0        |
    | symfony/polyfill-intl-normalizer | v1.27.0 | v1.28.0 | https://github.com/symfony/polyfill-intl-normalizer/compare/v1.27.0...v1.28.0 |
    | symfony/polyfill-mbstring        | v1.27.0 | v1.28.0 | https://github.com/symfony/polyfill-mbstring/compare/v1.27.0...v1.28.0        |
    | symfony/polyfill-php72           | v1.27.0 | v1.28.0 | https://github.com/symfony/polyfill-php72/compare/v1.27.0...v1.28.0           |
    | symfony/polyfill-php73           | v1.27.0 | v1.28.0 | https://github.com/symfony/polyfill-php73/compare/v1.27.0...v1.28.0           |
    | symfony/polyfill-php80           | v1.27.0 | v1.28.0 | https://github.com/symfony/polyfill-php80/compare/v1.27.0...v1.28.0           |
    +----------------------------------+---------+---------+-------------------------------------------------------------------------------+
    +---------------------------------+---------+---------+-------------------------------------------------------------------------+
    | Dev Changes                     | From    | To      | Compare                                                                 |
    +---------------------------------+---------+---------+-------------------------------------------------------------------------+
    | friends-of-behat/mink-extension | v2.7.2  | v2.7.4  | https://github.com/FriendsOfBehat/MinkExtension/compare/v2.7.2...v2.7.4 |
    | phpdocumentor/type-resolver     | 1.7.2   | 1.7.3   | https://github.com/phpDocumentor/TypeResolver/compare/1.7.2...1.7.3     |
    | symfony/polyfill-php81          | v1.27.0 | v1.28.0 | https://github.com/symfony/polyfill-php81/compare/v1.27.0...v1.28.0     |
    +---------------------------------+---------+---------+-------------------------------------------------------------------------+
    /// Updating: drupal/block_class ///
    There aren't available updates for drupal/block_class package.
    /// Updating: drupal/ckeditor_bootstrap_buttons ///
    Running drush cr on the "@self" environment:
    Running drush updb -y on the "@self" environment:
    Running drush cex -y on the "@self" environment:
    
    Updated packages:
    +--------------------+-------+-------+-------------------------------------------------------------------+
    | Production Changes | From  | To    | Compare                                                           |
    +--------------------+-------+-------+-------------------------------------------------------------------+
    | drupal/ckeditor    | 1.0.1 | 1.0.2 | https://git.drupalcode.org/project/ckeditor/compare/1.0.1...1.0.2 |
    +--------------------+-------+-------+-------------------------------------------------------------------+
    /// Updating: drupal/classy_paragraphs ///
    There aren't available updates for drupal/classy_paragraphs package.
    /// Updating: drupal/codesnippet ///
    Running drush cr on the "@self" environment:
    Running drush updb -y on the "@self" environment:
    Running drush cex -y on the "@self" environment:
    
    Updated packages:
    +---------------------------------------------+--------+--------+----------------------------------------------------------------------------------------+
    | Production Changes                          | From   | To     | Compare                                                                                |
    +---------------------------------------------+--------+--------+----------------------------------------------------------------------------------------+
    | drupal-ckeditor-libraries-group/codesnippet | 4.20.1 | 4.22.1 | https://github.com/drupal-ckeditor-libraries-group/codesnippet/compare/4.20.1...4.22.1 |
    +---------------------------------------------+--------+--------+----------------------------------------------------------------------------------------+
    /// Updating: drupal/components ///
    There aren't available updates for drupal/components package.
    /// Updating: drupal/config_filter ///
    There aren't available updates for drupal/config_filter package.
    /// Updating: drupal/config_split ///
    There aren't available updates for drupal/config_split package.
    /// Updating: drupal/config_update ///
    There aren't available updates for drupal/config_update package.
    /// Updating: drupal/context ///
    There aren't available updates for drupal/context package.
    /// Updating: drupal/core ///
    Running drush cr on the "@self" environment:
    Running drush updb -y on the "@self" environment:
    Running drush cex -y on the "@self" environment:
    
    Updated packages:
    +--------------------------------+---------+---------+---------------------------------------------------------------------+
    | Production Changes             | From    | To      | Compare                                                             |
    +--------------------------------+---------+---------+---------------------------------------------------------------------+
    | composer/semver                | 3.3.2   | 3.4.0   | https://github.com/composer/semver/compare/3.3.2...3.4.0            |
    | doctrine/reflection            | 1.2.3   | 1.2.4   | https://github.com/doctrine/reflection/compare/1.2.3...1.2.4        |
    | drupal/core                    | 9.5.9   | 9.5.11  | https://github.com/drupal/core/compare/9.5.9...9.5.11               |
    | laminas/laminas-feed           | 2.20.0  | 2.21.0  | https://github.com/laminas/laminas-feed/compare/2.20.0...2.21.0     |
    | laminas/laminas-servicemanager | 3.21.0  | REMOVED |                                                                     |
    | symfony/polyfill-iconv         | v1.27.0 | v1.28.0 | https://github.com/symfony/polyfill-iconv/compare/v1.27.0...v1.28.0 |
    | symfony/var-dumper             | v5.4.24 | v5.4.29 | https://github.com/symfony/var-dumper/compare/v5.4.24...v5.4.29     |
    +--------------------------------+---------+---------+---------------------------------------------------------------------+
    /// Updating: drupal/core-composer-scaffold ///
    
    Updated packages:
    +-------------------------------+-------+--------+-------------------------------------------------------------------------+
    | Production Changes            | From  | To     | Compare                                                                 |
    +-------------------------------+-------+--------+-------------------------------------------------------------------------+
    | drupal/core-composer-scaffold | 9.5.9 | 9.5.11 | https://github.com/drupal/core-composer-scaffold/compare/9.5.9...9.5.11 |
    +-------------------------------+-------+--------+-------------------------------------------------------------------------+
    /// Updating: drupal/crop ///
    There aren't available updates for drupal/crop package.
    /// Updating: drupal/ctools ///
    There aren't available updates for drupal/ctools package.
    /// Updating: drupal/datalayer ///
    Package drupal/datalayer has an update available to 2.0.1 version. Due to composer.json constraints, it hasn't been updated.
    /// Updating: drupal/datalayer_webform ///
    There aren't available updates for drupal/datalayer_webform package.
    /// Updating: drupal/default_content ///
    There aren't available updates for drupal/default_content package.
    /// Updating: drupal/devel ///
    There aren't available updates for drupal/devel package.
    /// Updating: drupal/draggableviews ///
    There aren't available updates for drupal/draggableviews package.
    /// Updating: drupal/editor_advanced_link ///
    Running drush cr on the "@self" environment:
    Running drush updb -y on the "@self" environment:
    Running drush cex -y on the "@self" environment:
    
    Updated packages:
    +-----------------------------+-------+-------+-------------------------------------------------------------------------------+
    | Production Changes          | From  | To    | Compare                                                                       |
    +-----------------------------+-------+-------+-------------------------------------------------------------------------------+
    | drupal/editor_advanced_link | 2.1.1 | 2.2.4 | https://git.drupalcode.org/project/editor_advanced_link/compare/2.1.1...2.2.4 |
    +-----------------------------+-------+-------+-------------------------------------------------------------------------------+
    [...]
  4. Reporting:
    // 4. REPORT //
    +---------------------------------------------+--------------+---------------+----------------------------------------------------------------------------------------+
    | Production Changes                          | From         | To            | Compare                                                                                |
    +---------------------------------------------+--------------+---------------+----------------------------------------------------------------------------------------+
    | composer/ca-bundle                          | 1.3.6        | 1.3.7         | https://github.com/composer/ca-bundle/compare/1.3.6...1.3.7                            |
    | composer/semver                             | 3.3.2        | 3.4.0         | https://github.com/composer/semver/compare/3.3.2...3.4.0                               |
    | consolidation/output-formatters             | 4.3.1        | 4.3.2         | https://github.com/consolidation/output-formatters/compare/4.3.1...4.3.2               |
    | doctrine/deprecations                       | v1.1.1       | 1.1.2         | https://github.com/doctrine/deprecations/compare/v1.1.1...1.1.2                        |
    | doctrine/reflection                         | 1.2.3        | 1.2.4         | https://github.com/doctrine/reflection/compare/1.2.3...1.2.4                           |
    | drupal-ckeditor-libraries-group/codesnippet | 4.20.1       | 4.22.1        | https://github.com/drupal-ckeditor-libraries-group/codesnippet/compare/4.20.1...4.22.1 |
    | drupal/admin_toolbar                        | 3.4.1        | 3.4.2         | https://git.drupalcode.org/project/admin_toolbar/compare/3.4.1...3.4.2                 |
    | drupal/ckeditor                             | 1.0.1        | 1.0.2         | https://git.drupalcode.org/project/ckeditor/compare/1.0.1...1.0.2                      |
    | drupal/core                                 | 9.5.9        | 9.5.11        | https://github.com/drupal/core/compare/9.5.9...9.5.11                                  |
    | drupal/core-composer-scaffold               | 9.5.9        | 9.5.11        | https://github.com/drupal/core-composer-scaffold/compare/9.5.9...9.5.11                |
    | drupal/editor_advanced_link                 | 2.1.1        | 2.2.4         | https://git.drupalcode.org/project/editor_advanced_link/compare/2.1.1...2.2.4          |
    | drupal/environment_indicator                | 4.0.14       | 4.0.16        | https://git.drupalcode.org/project/environment_indicator/compare/4.0.14...4.0.16       |
    | drupal/eu_cookie_compliance_matomo          | 1.0.5        | 1.0.6         | https://git.drupalcode.org/project/eu_cookie_compliance_matomo/compare/1.0.5...1.0.6   |
    | drupal/file_mdm                             | 2.5.0        | 2.6.0         | https://git.drupalcode.org/project/file_mdm/compare/2.5.0...2.6.0                      |
    | drupal/fontawesome                          | 2.25.0       | 2.26.0        | https://git.drupalcode.org/project/fontawesome/compare/2.25.0...2.26.0                 |
    | drupal/gin                                  | 3.0.0-rc3    | 3.0.0-rc6     | https://git.drupalcode.org/project/gin/compare/3.0.0-rc3...3.0.0-rc6                   |
    | drupal/gin_toolbar                          | 1.0.0-rc1    | 1.0.0-rc3     | https://git.drupalcode.org/project/gin_toolbar/compare/1.0.0-rc1...1.0.0-rc3           |
    | drupal/honeypot                             | 2.1.2        | 2.1.3         | https://git.drupalcode.org/project/honeypot/compare/2.1.2...2.1.3                      |
    | drupal/libraries                            | 4.0.3        | 4.0.4         | https://git.drupalcode.org/project/libraries/compare/4.0.3...4.0.4                     |
    | drupal/link_icons                           | 3.1.0-rc1    | 3.1.0-rc2     | https://git.drupalcode.org/project/link_icons/compare/3.1.0-rc1...3.1.0-rc2            |
    | drupal/metatag                              | 1.25.0       | 1.26.0        | https://git.drupalcode.org/project/metatag/compare/1.25.0...1.26.0                     |
    | drupal/node_authlink                        | bdfdd7d      | c2c1f6e       | https://git.drupalcode.org/project/node_authlink/compare/bdfdd7d...c2c1f6e             |
    | drupal/paragraphs                           | 1.15.0       | 1.16.0        | https://git.drupalcode.org/project/paragraphs/compare/1.15.0...1.16.0                  |
    | drupal/radix                                | 5.0.6        | 5.0.11        | https://git.drupalcode.org/project/radix/compare/5.0.6...5.0.11                        |
    | drupal/redirect                             | 1.8.0        | 1.9.0         | https://git.drupalcode.org/project/redirect/compare/1.8.0...1.9.0                      |
    | drupal/reroute_email                        | 2.2.0        | 2.2.1         | https://git.drupalcode.org/project/reroute_email/compare/2.2.0...2.2.1                 |
    | drupal/schema_metatag                       | 2.4.0        | 2.5.0         | https://git.drupalcode.org/project/schema_metatag/compare/2.4.0...2.5.0                |
    | drupal/stage_file_proxy                     | 2.0.2        | 2.1.1         | https://git.drupalcode.org/project/stage_file_proxy/compare/2.0.2...2.1.1              |
    | drupal/string_field_formatter               | 2.0.0        | 2.0.2         | https://git.drupalcode.org/project/string_field_formatter/compare/2.0.0...2.0.2        |
    | drupal/token                                | 1.11.0       | 1.12.0        | https://git.drupalcode.org/project/token/compare/1.11.0...1.12.0                       |
    | drupal/views_infinite_scroll                | 2.0.1        | 2.0.2         | https://git.drupalcode.org/project/views_infinite_scroll/compare/2.0.1...2.0.2         |
    | drupal/viewsreference                       | 2.0.0-beta4  | 2.0.0-beta6   | https://git.drupalcode.org/project/viewsreference/compare/2.0.0-beta4...2.0.0-beta6    |
    | drupal/xray_audit                           | 1.3.1        | 1.5.0         | https://git.drupalcode.org/project/xray_audit/compare/1.3.1...1.5.0                    |
    | drupal/yoast_seo                            | 2.0.0-alpha8 | 2.0.0-alpha10 | https://git.drupalcode.org/project/yoast_seo/compare/2.0.0-alpha8...2.0.0-alpha10      |
    | fileeye/mimemap                             | 2.0.1        | 2.0.2         | https://github.com/FileEye/MimeMap/compare/2.0.1...2.0.2                               |
    | kint-php/kint                               | 5.0.5        | 5.0.7         | https://github.com/kint-php/kint/compare/5.0.5...5.0.7                                 |
    | laminas/laminas-feed                        | 2.20.0       | 2.21.0        | https://github.com/laminas/laminas-feed/compare/2.20.0...2.21.0                        |
    | laminas/laminas-servicemanager              | 3.21.0       | REMOVED       |                                                                                        |
    | laminas/laminas-stdlib                      | 3.17.0       | 3.18.0        | https://github.com/laminas/laminas-stdlib/compare/3.17.0...3.18.0                      |
    | lsolesen/pel                                | 0.9.12       | REMOVED       |                                                                                        |
    | masterminds/html5                           | 2.8.0        | 2.8.1         | https://github.com/Masterminds/html5-php/compare/2.8.0...2.8.1                         |
    | nikic/php-parser                            | v4.15.5      | v4.17.1       | https://github.com/nikic/PHP-Parser/compare/v4.15.5...v4.17.1                          |
    | psr/http-client                             | 1.0.2        | 1.0.3         | https://github.com/php-fig/http-client/compare/1.0.2...1.0.3                           |
    | psy/psysh                                   | v0.11.18     | v0.11.21      | https://github.com/bobthecow/psysh/compare/v0.11.18...v0.11.21                         |
    | symfony/polyfill-ctype                      | v1.27.0      | v1.28.0       | https://github.com/symfony/polyfill-ctype/compare/v1.27.0...v1.28.0                    |
    | symfony/polyfill-iconv                      | v1.27.0      | v1.28.0       | https://github.com/symfony/polyfill-iconv/compare/v1.27.0...v1.28.0                    |
    | symfony/polyfill-intl-grapheme              | v1.27.0      | v1.28.0       | https://github.com/symfony/polyfill-intl-grapheme/compare/v1.27.0...v1.28.0            |
    | symfony/polyfill-intl-idn                   | v1.27.0      | v1.28.0       | https://github.com/symfony/polyfill-intl-idn/compare/v1.27.0...v1.28.0                 |
    | symfony/polyfill-intl-normalizer            | v1.27.0      | v1.28.0       | https://github.com/symfony/polyfill-intl-normalizer/compare/v1.27.0...v1.28.0          |
    | symfony/polyfill-mbstring                   | v1.27.0      | v1.28.0       | https://github.com/symfony/polyfill-mbstring/compare/v1.27.0...v1.28.0                 |
    | symfony/polyfill-php72                      | v1.27.0      | v1.28.0       | https://github.com/symfony/polyfill-php72/compare/v1.27.0...v1.28.0                    |
    | symfony/polyfill-php73                      | v1.27.0      | v1.28.0       | https://github.com/symfony/polyfill-php73/compare/v1.27.0...v1.28.0                    |
    | symfony/polyfill-php80                      | v1.27.0      | v1.28.0       | https://github.com/symfony/polyfill-php80/compare/v1.27.0...v1.28.0                    |
    | symfony/string                              | v6.3.0       | v6.3.5        | https://github.com/symfony/string/compare/v6.3.0...v6.3.5                              |
    | symfony/var-dumper                          | v5.4.24      | v5.4.29       | https://github.com/symfony/var-dumper/compare/v5.4.24...v5.4.29                        |
    | fileeye/pel                                 | NEW          | 0.9.20        |                                                                                        |
    +---------------------------------------------+--------------+---------------+----------------------------------------------------------------------------------------+
    +------------------------------------+----------+----------+-----------------------------------------------------------------------------------+
    | Dev Changes                        | From     | To       | Compare                                                                           |
    +------------------------------------+----------+----------+-----------------------------------------------------------------------------------+
    | composer/composer                  | 2.2.21   | 2.2.22   | https://github.com/composer/composer/compare/2.2.21...2.2.22                      |
    | drupal/coder                       | 8.3.20   | 8.3.21   | https://github.com/pfrenssen/coder/compare/8.3.20...8.3.21                        |
    | friends-of-behat/mink-extension    | v2.7.2   | v2.7.4   | https://github.com/FriendsOfBehat/MinkExtension/compare/v2.7.2...v2.7.4           |
    | justinrainbow/json-schema          | 5.2.12   | v5.2.13  | https://github.com/justinrainbow/json-schema/compare/5.2.12...v5.2.13             |
    | metadrop/behat-contexts            | v1.13.1  | v1.13.5  | https://github.com/Metadrop/behat-contexts/compare/v1.13.1...v1.13.5              |
    | metadrop/drupal-updater            | 1.7.0    | 1.8.0    | https://github.com/Metadrop/drupal-updater/compare/1.7.0...1.8.0                  |
    | metadrop/scripthor                 | v2.5.0   | v2.6.0   | https://github.com/Metadrop/scripthor/compare/v2.5.0...v2.6.0                     |
    | mglaman/phpstan-drupal             | 1.1.35   | 1.2.0    | https://github.com/mglaman/phpstan-drupal/compare/1.1.35...1.2.0                  |
    | pdepend/pdepend                    | 2.14.0   | 2.15.1   | https://github.com/pdepend/pdepend/compare/2.14.0...2.15.1                        |
    | phpcompatibility/php-compatibility | 1f82405  | 302dffe  | https://github.com/PHPCompatibility/PHPCompatibility/compare/1f82405...302dffe    |
    | phpcsstandards/phpcsutils          | 1.0.6    | 1.0.8    | https://github.com/PHPCSStandards/PHPCSUtils/compare/1.0.6...1.0.8                |
    | phpdocumentor/type-resolver        | 1.7.2    | 1.7.3    | https://github.com/phpDocumentor/TypeResolver/compare/1.7.2...1.7.3               |
    | phpmd/phpmd                        | 2.13.0   | 2.14.1   | https://github.com/phpmd/phpmd/compare/2.13.0...2.14.1                            |
    | phpstan/phpdoc-parser              | 1.20.4   | 1.24.2   | https://github.com/phpstan/phpdoc-parser/compare/1.20.4...1.24.2                  |
    | phpstan/phpstan                    | 1.10.19  | 1.10.37  | https://github.com/phpstan/phpstan/compare/1.10.19...1.10.37                      |
    | phpstan/phpstan-deprecation-rules  | 1.1.3    | 1.1.4    | https://github.com/phpstan/phpstan-deprecation-rules/compare/1.1.3...1.1.4        |
    | phpunit/php-code-coverage          | 9.2.26   | 9.2.29   | https://github.com/sebastianbergmann/php-code-coverage/compare/9.2.26...9.2.29    |
    | phpunit/phpunit                    | 9.6.9    | 9.6.13   | https://github.com/sebastianbergmann/phpunit/compare/9.6.9...9.6.13               |
    | sebastian/global-state             | 5.0.5    | 5.0.6    | https://github.com/sebastianbergmann/global-state/compare/5.0.5...5.0.6           |
    | sirbrillig/phpcs-variable-analysis | v2.11.16 | v2.11.17 | https://github.com/sirbrillig/phpcs-variable-analysis/compare/v2.11.16...v2.11.17 |
    | slevomat/coding-standard           | 8.12.1   | 8.13.4   | https://github.com/slevomat/coding-standard/compare/8.12.1...8.13.4               |
    | symfony/phpunit-bridge             | v5.4.23  | v5.4.26  | https://github.com/symfony/phpunit-bridge/compare/v5.4.23...v5.4.26               |
    | symfony/polyfill-php81             | v1.27.0  | v1.28.0  | https://github.com/symfony/polyfill-php81/compare/v1.27.0...v1.28.0               |
    +------------------------------------+----------+----------+-----------------------------------------------------------------------------------+
    /// Not Updated Packages (Direct): ///
    drupal-composer/drupal-security-advisories 9.x-dev 9cfc00d ! 9.x-dev 0625017
    drupal/allowed_formats                     2.0.0           ~ 3.0.0
    drupal/core                                9.5.11          ~ 10.1.5
    drupal/core-composer-scaffold              9.5.11          ~ 10.1.5
    drupal/datalayer                           1.0.0           ~ 2.0.1
    drupal/google_tag                          1.6.0           ~ 2.0.2
    drupal/inline_entity_form                  1.0.0-rc15      ~ 2.0.0-rc9
    drupal/metatag                             1.26.0          ~ 2.0.0
    drupal/schema_metatag                      2.5.0           ~ 3.0.1
    drush/drush                                11.6.0          ~ 12.2.0
    metadrop/drupal-dev                        v0.3.0          ~ v1.1.0
    phpro/grumphp                              v1.5.1          ~ v2.1.0
    
    /// Not Updated Packages (ALL): ///
    Direct dependencies required in composer.json:
    drupal-composer/drupal-security-advisories     9.x-dev 9cfc00d ! 9.x-dev 0625017
    drupal/allowed_formats                         2.0.0           ~ 3.0.0
    drupal/core                                    9.5.11          ~ 10.1.5
    drupal/core-composer-scaffold                  9.5.11          ~ 10.1.5
    drupal/datalayer                               1.0.0           ~ 2.0.1
    drupal/google_tag                              1.6.0           ~ 2.0.2
    drupal/inline_entity_form                      1.0.0-rc15      ~ 2.0.0-rc9
    drupal/metatag                                 1.26.0          ~ 2.0.0
    drupal/schema_metatag                          2.5.0           ~ 3.0.1
    drush/drush                                    11.6.0          ~ 12.2.0
    metadrop/drupal-dev                            v0.3.0          ~ v1.1.0
    phpro/grumphp                                  v1.5.1          ~ v2.1.0
    Transitive dependencies not required in composer.json:
    amphp/amp                                      v2.6.2          ~ v3.0.0
    amphp/byte-stream                              v1.8.1          ~ v2.0.2
    amphp/parallel                                 v1.4.3          ~ v2.2.2
    amphp/parallel-functions                       v1.0.0          ! v1.1.0
    amphp/process                                  v1.1.4          ~ v2.0.1
    amphp/sync                                     v1.4.2          ~ v2.1.0
    asm89/stack-cors                               1.3.0           ~ v2.1.1
    behat/mink-browserkit-driver                   v1.4.1          ~ v2.1.0
    behat/mink-goutte-driver                       v1.3.0          ~ v2.0.0
    Package behat/mink-goutte-driver is abandoned, you should avoid using it. Use behat/mink-browserkit-driver instead.
    chi-teck/drupal-code-generator                 2.6.2           ~ 3.2.0
    composer/composer                              2.2.22          ! 2.6.4
    composer/pcre                                  1.0.1           ~ 3.1.0
    consolidation/log                              2.1.1           ~ 3.0.0
    consolidation/robo                             4.0.2           ! 4.0.6
    consolidation/site-alias                       3.1.7           ~ 4.0.1
    consolidation/site-process                     4.2.1           ~ 5.2.0
    dealerdirect/phpcodesniffer-composer-installer v0.7.2          ~ v1.0.0
    doctrine/annotations                           1.14.3          ~ 2.0.1
    doctrine/collections                           1.8.0           ~ 2.1.4
    doctrine/lexer                                 2.1.0           ~ 3.0.0
    doctrine/reflection                            1.2.4           = 1.2.4
    Package doctrine/reflection is abandoned, you should avoid using it. Use roave/better-reflection instead.
    drupal/core-dev                                9.1.15          ~ 10.1.5
    drupal/file_mdm                                2.6.0           ~ 3.0.0
    drupal/sophron                                 1.3.0           ~ 2.0.1
    egulias/email-validator                        3.2.6           ~ 4.0.1
    fabpot/goutte                                  v3.3.1          ~ v4.0.3
    Package fabpot/goutte is abandoned, you should avoid using it. Use symfony/browser-kit instead.
    grasmash/expander                              2.0.3           ~ 3.0.0
    guzzlehttp/guzzle                              6.5.8           ~ 7.8.0
    guzzlehttp/promises                            1.5.3           ~ 2.0.1
    guzzlehttp/psr7                                1.9.1           ~ 2.6.1
    metadrop/scripthor                             v2.6.0          ~ v3.0.0
    monolog/monolog                                2.9.1           ~ 3.4.0
    phploc/phploc                                  7.0.2           = 7.0.2
    Package phploc/phploc is abandoned, you should avoid using it. No replacement was suggested.
    phpunit/php-code-coverage                      9.2.29          ~ 10.1.7
    phpunit/php-file-iterator                      3.0.6           ~ 4.1.0
    phpunit/php-invoker                            3.1.1           ~ 4.0.0
    phpunit/php-text-template                      2.0.4           ~ 3.0.1
    phpunit/php-timer                              5.0.3           ~ 6.0.0
    phpunit/phpunit                                9.6.13          ~ 10.3.5
    psr/container                                  1.1.2           ~ 2.0.2
    psr/http-message                               1.1             ~ 2.0
    psr/log                                        1.1.4           ~ 3.0.0
    react/promise                                  v2.10.0         ~ v3.0.0
    sebastian/cli-parser                           1.0.1           ~ 2.0.0
    sebastian/code-unit                            1.0.8           ~ 2.0.0
    sebastian/code-unit-reverse-lookup             2.0.3           ~ 3.0.0
    sebastian/comparator                           4.0.8           ~ 5.0.1
    sebastian/complexity                           2.0.2           ~ 3.1.0
    sebastian/diff                                 4.0.5           ~ 5.0.3
    sebastian/environment                          5.1.5           ~ 6.0.1
    sebastian/exporter                             4.0.5           ~ 5.1.1
    sebastian/global-state                         5.0.6           ~ 6.0.1
    sebastian/lines-of-code                        1.0.3           ~ 2.0.1
    sebastian/object-enumerator                    4.0.4           ~ 5.0.0
    sebastian/object-reflector                     2.0.4           ~ 3.0.0
    sebastian/phpcpd                               6.0.3           = 6.0.3
    Package sebastian/phpcpd is abandoned, you should avoid using it. No replacement was suggested.
    sebastian/recursion-context                    4.0.5           ~ 5.0.0
    sebastian/type                                 3.2.1           ~ 4.0.0
    sebastian/version                              3.0.2           ~ 4.0.1
    symfony-cmf/routing                            2.3.4           ~ 3.0.1
    symfony/browser-kit                            v4.4.44         ~ v6.3.2
    symfony/config                                 v4.4.44         ~ v6.3.2
    symfony/console                                v4.4.49         ~ v6.3.4
    symfony/css-selector                           v4.4.44         ~ v6.3.2
    symfony/debug                                  v4.4.44         = v4.4.44
    Package symfony/debug is abandoned, you should avoid using it. Use symfony/error-handler instead.
    symfony/dependency-injection                   v4.4.49         ~ v6.3.5
    symfony/dom-crawler                            v4.4.45         ~ v6.3.4
    symfony/dotenv                                 v5.4.22         ~ v6.3.0
    symfony/error-handler                          v4.4.44         ~ v6.3.5
    symfony/event-dispatcher                       v4.4.44         ~ v6.3.2
    symfony/event-dispatcher-contracts             v1.1.13         ~ v3.3.0
    symfony/filesystem                             v4.4.42         ~ v6.3.1
    symfony/finder                                 v4.4.44         ~ v6.3.5
    symfony/http-client-contracts                  v2.5.2          ~ v3.3.0
    symfony/http-foundation                        v4.4.49         ~ v6.3.5
    symfony/http-kernel                            v4.4.50         ~ v6.3.5
    symfony/lock                                   v4.4.46         ~ v6.3.2
    symfony/mime                                   v5.4.13         ~ v6.3.5
    symfony/options-resolver                       v5.4.21         ~ v6.3.0
    symfony/phpunit-bridge                         v5.4.26         ~ v6.3.2
    symfony/process                                v4.4.44         ~ v6.3.4
    symfony/psr-http-message-bridge                v2.1.4          ! v2.3.1
    symfony/routing                                v4.4.44         ~ v6.3.5
    symfony/serializer                             v4.4.47         ~ v6.3.5
    symfony/service-contracts                      v2.5.2          ~ v3.3.0
    symfony/translation                            v4.4.47         ~ v6.3.3
    symfony/translation-contracts                  v2.5.2          ~ v3.3.0
    symfony/validator                              v4.4.48         ~ v6.3.5
    symfony/var-dumper                             v5.4.29         ~ v6.3.5
    symfony/yaml                                   v4.4.45         ~ v6.3.3
    twig/twig                                      v2.15.5         ~ v3.7.1
    webmozart/path-util                            2.3.0           = 2.3.0
    Package webmozart/path-util is abandoned, you should avoid using it. Use symfony/filesystem instead.
    /// Not Updated Securities (ALL): ///
    /// Unsupported Drupal modules: ///
    No obsolete modules have been found. Perhaps Update module is not installed?

Automating the Full Process

To streamline the entire update process, we leverage Jenkins to automate the Drupal Updater. Here's an overview of how  the automation process works:

  1. Scheduled Updates: Jenkins is configured to run the Drupal Updater tool automatically at regular intervals or specific trigger events.
  2. Launch the project: release your code and launch a new instance of your project.
  3. Branch Creation: Create a new branch to isolate the updates from the main development branch, ensuring a controlled environment for testing.
  4. Run the tool
  5. Push the code to the repository and create a new Merge Request
  6. Let the Automated Testing run: A suite of automated tests (e.g. PhpUnit, Behat, BackstopJs)  is executed to verify the stability and functionality of the updated project.
  7. Code Review: After the automated tests pass successfully, the development team reviews the changes and ensures they meet the project's quality standards.
  8. Merge and Release: Once the updates are approved, they are merged into the main development branch and deployed to the production environment.

Jenkins Pipeline

GitLab Commits on Update Branch

Conclusions

Updating a PHP project based on Composer, especially Drupal projects, can be a challenging task for developers. Dependency conflicts, configuration issues, multisite challenges, and the time-consuming nature and error-prone of the update process are just some of the difficulties that developers face when done manually.

The Drupal Updater provides an efficient solution to this problem, automating package updates, configuration management, and dependency handling. By integrating this tool into your development workflow and automating it with your CI/CD tool (optional), you can ensure that your Drupal projects are always up to date, secure, and ready for new features.

In summary, the Drupal updater package is a great ally for developers working on Drupal projects. It simplifies the update process and helps ensure that the project remains up-to-date, secure, and reliable. By using the Drupal updater package, developers can focus on developing great features for their projects instead of spending hours dealing with update issues that can be easily automated.

Future Work / References

The Drupal Updater is a valuable tool for Drupal maintenance we love to share with the community. We have been using it internally for more than a year, first as Bash scripts and later ported to PHP. It greatly helps us to maintain our Drupal projects and we think it can help others too. There is always room for improvement, we encourage you to provide feedback and help evolve this awesome tool in Github.

Oct 05 2023
Oct 05

Authored by: Nadiia Nykolaichuk

Lighting-fast, highly dynamic, and endlessly interactive interfaces are often the result of combining Drupal with JavaScript frameworks. While Drupal provides content, JavaScript handles its look and behavior. This separation of responsibilities is known as decoupled or headless architecture, and Drupal simplifies its implementation thanks to a cutting-edge advancement — Decoupled Menus. Read on to discover more about the goals of Decoupled Menus, see how they work, and check out their latest features that have been added in Drupal 10.1.

What Decoupled Menus in Drupal are all about

The essence and the mission

Decoupled Menus provide the most seamless ways for JavaScript front ends to consume configurable navigation menus managed in the Drupal admin UI. This concept was first presented at DrupalCon Europe 2020’s Driesnote by Drupal’s creator Dries Buytaert. 

Obviously, Decoupled Menus are meant to enhance Drupal’s image in the world of modern CMSs and provide better experiences for both developers and users. This is largely due to the fact that Decoupled Menus are easy for front-end developers to render without hardcoding and easy for Drupal content editors to edit, which we’ll discuss in more detail very soon. They also give front-end developers more flexibility to use their JS framework of choice.

The mission of Decoupled Menus presented at Driesnote 2020.The mission of Decoupled Menus presented at Driesnote 2020.

It’s also worth quoting one of the Decoupled Menus Initiative’s coordinators, Gabe Sullice, who outlined its key goals as:

  • giving Drupal a betterJavaScript developer experience than any other CMS can offer, and
  • making Drupal the best decoupled CMS overall. 

Gabe emphasized the importance of providing excellent non-developer experiences even in decoupled setups, which are usually extremely challenging for non-tech users.  

Why were menus chosen specifically?

Even when goals are big, you need to start somewhere. The Initiative’s team decided to focus on a specific UI component in Drupal, and navigation menus were chosen for this role. We all know that menus are used across almost all websites and have lots of nitty-gritty details, hence a vast ecosystem of contributed Drupal modules for creating menus

In reality, menus are pretty hard, explained Dries at the same Driesnote presentation. Not only do you need to add more web service API coverage, but also have to figure out how to manage different kinds of menus and their hierarchies, and pay due attention to path aliasing and routing, emphasized Drupal’s founder.

In addition to the fact that most Drupal websites need a menu, the Decoupled Menus functionality specifically focuses on representing the hierarchical nature of Drupal menus, which is often challenging to render on JavaScript front ends. That’s what Brian Perry, the Decoupled Menus Initiative lead, shared in this year’s interview with the DropTimes.

No hardcoding and easy management

We’ve now reached the part about one of the most essential qualities of Decoupled Menus that represents a transformational change. Before Decoupled Menus in Drupal, it was not uncommon for menus to be somewhat hardcoded in decoupled builds, and any changes to the menu required a front-end code deployment, said Brian Perry in the above-mentioned interview. Luckily, the arrival of Decoupled Menus eliminates the need for developers to hardcode menus. 

Thanks to no hardcoding, Decoupled Menus are easy to manage in the Drupal admin UI even by non-tech users such as content editors. They can edit menus (rename, add, delete, or reorder the items, change URL paths, etc.) and immediately see the changes applied on the front end, with no more need to reach out to developers and wait for deployment. 

Difference between decoupled menus and traditional menus

Replying to the interview question about the difference of Decoupled Menus from traditional menus in Drupal, Brian Perry said that in some ways, they don’t differ at all. The menu data is the same, and the difference lies in the way menus are exposed, explained Brian, that’s why the focus of the Decoupled Menus Initiative was to address the limitations related to sourcing the menu data and providing tools for a better use of this data outside of Drupal. 

How Decoupled Menus work in Drupal 10.1

Let’s now dive a little bit deeper into the technical aspects of Decoupled Menus. We’ll take a closer look at the key features and tools that define how they work in 2023, as well as check out some steps needed for making the setup.

The Decoupled Menus module

Currently, the Decoupled Menus functionality is maintained within a contributed module in Drupal named respectively — Decoupled Menus. This means you’ll first need to download and install the module on your website. However, the functionality provided by the module is gradually moving into Drupal core, so soon, you won’t need to download anything but just enable the Decoupled Menus module on the Extend page of the Drupal admin dashboard.

When installed/enabled, the module helps Drupal-managed menus to be successfully rendered on JavaScript front ends by providing handy interfaces and additional HTTP endpoints — specific URLs that are used for sending requests to retrieve certain data.

While the module is on its way to Drupal core, some parts of functionality, such as the Linkset endpoint and administration UI, are already in Drupal 10.1, and we’re moving to their overview right now.   

The Linkset endpoint

Drupal 10.1 boasts a new endpoint for sharing decoupled menus based on the Linkset specification. To be more precise, the Linkset functionality has finally been added to Drupal core after it had been maintained in the Decoupled Menus contributed module. 

The Linkset specification was chosen because it is specifically intended to represent relationships between a set of links, said Brian Perry in the same interview. He also explained that the Linkset endpoint provides a response in JSON format, so sourcing data from it is similar to working with other Drupal endpoints, including JSON:API. 

The Linkset admin page

Together with the Linkset endpoint, the Drupal 10.1 admin dashboard has a new page that can be found at Configuration > Web services > Menu Linkset Settings (or, alternatively, at /admin/config/services/linkset). 

Finding the Menu Linkset Settings in the Drupal 10.1 admin UI.Finding the Menu Linkset Settings in the Drupal 10.1 admin UI.

It offers you a checkbox to enable or disable the menu Linkset endpoint, after which you’ll need to click “Save configuration.”

Enabling/disabling the menu Linkset endpoint  in Drupal 10.1 UI.Enabling/disabling the menu Linkset endpoint  in Drupal 10.1 UI.

A standard data request example

With the Linkset endpoint enabled, your Drupal menu data will be available at /system/menu/[menu name]/linkset. The “[menu name]” is the machine name of the specific menu. Here is an example of requesting the main menu of a locally hosted website using the cURL command-line tool:

curl https://localhost:8888/system/menu/main/linkset

Multilingual support

If you have a multilingual website in Drupal, there is great news for you — Decoupled Menus can be requested on a JavaScript front end in any of the languages that are set up on your Drupal site. For example, to get the main menu in French, add the “fr” prefix to the URL.

curl https://localhost:8888/fr/system/menu/main/linkset

User permission support

Decoupled Menus respect user permissions in Drupal, which means your request to retrieve a menu will only be successful if you are logged in with a respective user account. 

The Decoupled Menu Parser package 

There is also a Decoupled Menu Parser package that simplifies the retrieving of data from a Linkset endpoint. According to Brian Perry, the package makes it easier to parse the endpoint response into a hierarchy that more accurately represents a menu. The key feature of the package is a utility that uses the approach of denormalizing — including all the necessary data in a single API response, even if that data is related to multiple entities or objects. 

So the Decoupled Menu Parser denormalizes the Linkset response by providing both the individual items, and a tree representing the entire menu hierarchy. Brian hopes this should be a time-saver for developers since re-assembling the menu hierarchy used to be a common task in the process of rendering menus on JavaScript front ends. 

In addition to the Decoupled Menu Parser contributed module, there is a decoupled-menu-parser JavaScript library published early this year under the Drupal namespace on the NPM repository of JavaScript packages. 

The Decoupled Menu Parser library.The Decoupled Menu Parser library.

You can also see more specific details about setting up a decoupled menu in the official Decoupled Menus documentation guide on drupal.org.

Final thoughts

Decoupled Menus are a great example of how Drupal is geared towards becoming the best CMS in everything, including decoupled builds. The Linkset functionality is listed among the best advancements for front-end development in Drupal 10.1, and it’s just the beginning. Stay tuned to know how Decoupled Menus are evolving and what other cool things are coming to the best CMS on the planet!

Oct 05 2023
Oct 05

Takeaway: If you’re looking for a great CMS for your government website, both Adobe Experience Manager (AEM) and Drupal present compelling advantages. While AEM offers a seamless, integrated experience tailored for enterprises, Drupal stands out with its open-source flexibility and community-driven innovation.

We previously compared Drupal and WordPress—this time, we’re comparing AEM and Drupal. We are comparing the two platforms based on the following criteria:

  1. Security
  2. Accessibility compliance
  3. Customization capabilities
  4. Support options
  5. Scalability
  6. Cost-effectiveness

SEND A SUMMARY TO YOUR STAKEHOLDER

Which platform is more secure?

Security is one of the top concerns of the public sector. Let’s compare Drupal vs AEM and see how they fare against each other.

Security in Adobe Experience Manager

Adobe places a strong emphasis on the security of its digital experiences. Their company has integrated security practices into its software development, operations processes, and tools. In fact, they state in their documentation that “Application Security starts during the development phase,” and have a list of best practices for their users to follow.

To prevent, detect, and respond to incidents promptly, cross-functional teams adhere to these practices. Adobe also stays updated with the latest threats and vulnerabilities through collaborations with a variety of organizations including security research institutions. I appreciate that their security features and initiatives are well-documented.

Here are their key security features:

  • Data encryption: HTTPS TLS v1.2 or greater is used to encrypt all content during upload, protecting and keeping private uploaded content until they’re published.
  • User authentication: AEM supports integration with existing enterprise identity management systems, including LDAP-compliant systems, SAML-compliant systems, SSO systems, social integration via OAuth, and custom integrations.
  • Cloud manager: This tool allows customers to check in, inspect, and validate the security of their new code and test performance, while providing secure access to their cloud environment.
  • Operational Responsibilities of Adobe Managed Services: Part of their responsibility is configuring firewalls, and they use a variety of security measures to manage and access customer instances and connect to the cloud service provider.
  • Operational Responsibilities of Cloud Infrastructure Providers: They manage everything from the hypervisor to the physical security of their facilities as part of their responsibilities.
  • Adobe Security Program: Adobe's security program consists of five centers of excellence, each focusing on different aspects of security. These centers include Application Security, Operational Security, Enterprise Security, Compliance, and Incident Response.

Drupal's open-source security approach

Drupal, as an open-source content management system, has a unique approach to security. Drupal’s open-source nature means that its codebase is publicly available, allowing a vast community of developers and security experts to inspect, modify, and improve the code. This collaborative approach has several advantages:

  • Community vigilance: With thousands of developers and security experts reviewing the code, vulnerabilities are often detected and patched quickly. The Drupal community is proactive in identifying and addressing potential security threats.
  • Security advisory system: Drupal has a dedicated security team that releases regular security advisories. These advisories inform users about potential vulnerabilities and provide patches or updates to address them. Their tasks and procedures are also well-documented and publicly available.
  • Regular updates: Drupal's core and contributed modules receive regular updates. These updates not only bring new features but also address any known security vulnerabilities.
  • Built-in security features: Drupal comes with several built-in security features, such as brute-force detection, database encryption, and field validation, to protect against common web vulnerabilities.
  • Granular user permissions: Drupal's role-based permission system allows administrators to define roles with specific permissions, ensuring that users only have access to the features they need.
  • Security modules and distributions: Modules like Paranoia and Security Kit offer additional tools and configurations to harden a Drupal site against potential threats, while distributions like Guardr combine modules and settings to enhance Drupal’s security.

Strengths and weaknesses on security

Strengths:

  • AEM: Adobe's proprietary nature means that its codebase is not publicly available for review. However, Adobe has a dedicated security team and follows industry best practices to ensure the security of its platform.
  • Drupal: Being open-source, Drupal's codebase is publicly available, allowing for community-driven security improvements. The vast community ensures rapid detection and patching of vulnerabilities.

Weaknesses:

  • AEM: Being a proprietary system, AEM functions with a single-governance model, with various teams reporting to the Chief Security Officer.
  • Drupal: As with any open-source platform, Drupal requires regular updates to ensure security. End-of-life also means the community stops supporting a Drupal version, so site owners need to be proactive in applying these updates.

Expert thoughts on security

According to Johannes Larsson, Founder and CEO of JohannesLarsson.com, "My top pick would be Adobe Experience Manager, primarily due to the paramount factor of security. When it comes to government websites, security is of utmost importance, given the sensitive nature of the information they often handle. Adobe Experience Manager is renowned for its robust security features and a track record of meeting stringent security-compliance standards. It provides granular control over user permissions, encryption capabilities, and regularly updates its security protocols to stay ahead of emerging threats. 

This is crucial to maintain data integrity and safeguard citizens' sensitive information, ensuring that the government website remains a trusted and reliable resource for the public. While Drupal is also a powerful CMS, it may require additional plugins and configurations to achieve the same level of security that AEM offers."

On the other hand, Adil Advani, Digital PR and Marketing Director of AnySoftwareTools chooses Drupal for security: "Drawing from experience with both platforms, Drupal is recommended for a government website. The paramount reason is security. Drupal has a commendable track record when it comes to security, with a dedicated security team and regular updates. Given the sensitive nature of government data and the necessity for robust cybersecurity measures, Drupal's emphasis on security, combined with its open-source flexibility, makes it an optimal choice for government websites."

AEM vs Drupal on security

Both AEM and Drupal have their strengths and weaknesses when it comes to security. While AEM offers a robust, enterprise-level solution backed by Adobe's dedicated security team, Drupal's open-source nature and active community involvement provide a unique advantage in terms of transparency and rapid response to vulnerabilities.

Which platform fares better in accessibility compliance?

Accessibility is paramount in today's digital landscape, especially for public sector entities that serve a diverse audience. Both AEM and Drupal have made significant strides in ensuring their platforms are accessible. Let's delve into AEM's accessibility tools.

AEM's accessibility features

AEM is designed not only to deliver exceptional digital experiences but also to ensure that these experiences are accessible to all, including individuals with disabilities. Here are some of the key accessibility features of AEM:

  • Commitment to accessibility standards: AEM is continuously enhanced to meet the needs of all users and adhere to global standards. Some of the standards AEM supports include:
    • Web Content Accessibility Guidelines (WCAG) 2.1.
    • Revised Section 508 of the Rehabilitation Act.
    • Accessibility Initiative – Accessible Rich Internet Applications (WAI-ARIA) by W3C.
    • EN 301 549.
  • Compatibility with assistive technologies: AEM is designed to work seamlessly with various assistive technologies.
  • Keyboard navigation: Many of AEM's user interface elements that are actionable with a pointer can also be engaged using a keyboard. This includes a range of keyboard shortcuts for various actions, enhancing the user experience for those relying on keyboard navigation.
  • Content creation and management: AEM provides features for content designers and creators to create and publish accessible content. This content can then be accessed by individuals with disabilities using assistive technologies. Additionally, AEM allows users and administrators with disabilities to access the user interface and controls to create and manage content.
  • Continuous updates: The core features ibn AEM Assets are regularly updated to improve compliance with global accessibility standards.

Drupal's commitment to accessibility

Drupal is renowned for its commitment to accessibility. The platform is designed to ensure that all users, regardless of their abilities, can access and interact with content. Here are some of the key accessibility features of Drupal:

  • Open standards: Drupal's community believes in open standards. All features of Drupal core are designed to align with guidelines from the World Wide Web Consortium (W3C) and other global standards. They are currently striving to be WCAG 2.1 AA compliant.
  • Semantic HTML and WAI-ARIA: Drupal uses semantic HTML to ensure that content is structured and meaningful while limiting WAI-ARIA to specific regions for better stability. This aids screen readers and other assistive technologies in interpreting and presenting content in a user-friendly manner.
  • Aural alerts: Drupal provides aural alerts to assist users with visual impairments. These alerts provide audible feedback to users, enhancing their interaction with the platform.
  • Controlled tab order: Drupal ensures a logical and controlled tab order, making it easier for users relying on keyboard navigation to move through content and interactive elements.
  • Fieldsets and legends: Drupal uses fieldsets and legends to group related form elements, enhancing the user experience for those using screen readers.
  • Alt text for images: Drupal emphasizes the importance of providing alternative text for images as it’s required by default.

Strengths and weaknesses on accessibility

Strengths:

  • AEM: AEM is designed to support various accessibility standards, including WCAG and Section 508, ensuring that content is accessible to all users. Adobe also offers comprehensive documentation and training resources to help users understand and implement accessibility best practices within AEM.
  • Drupal: Drupal's core is built with accessibility in mind, ensuring that basic functionalities are compliant with major accessibility standards. Their commitment to accessibility is evident in its ongoing efforts to improve and adhere to the latest accessibility standards, including WCAG 2.1. The Drupal community also has developed numerous modules specifically for enhancing accessibility, such as the CKEditor and Automatic Alternative Text module.

Weaknesses:

  • AEM: While AEM provides robust accessibility tools, the platform's complexity might require specialized training or expertise to ensure full compliance. Being a premium product, organizations might need to invest more in AEM to leverage its full range of accessibility features.
  • Drupal: While Drupal's modular approach offers flexibility, it also means that organizations might need to rely on specific modules for certain accessibility features not integrated within Drupal core. If these modules are not actively maintained, it could pose challenges.

AEM vs Drupal on accessibility compliance

Both AEM and Drupal prioritize delivering accessible digital platforms. AEM stands out with its comprehensive, enterprise-grade accessibility tools, while Drupal's open-source foundation, coupled with its vibrant community, ensures ongoing enhancements and clear transparency.

The choice between the two often comes down to the specific needs and priorities of the organization. However, in terms of community-driven improvements and transparency, Drupal might have a slight edge.

Which platform has better customization capabilities?

Customization is key to delivering experiences that resonate with your target audience. Both AEM and Drupal offer a plethora of customization tools, but their approaches differ. Let's look into the customization capabilities of both platforms and determine which one might be more suitable for government entities.

AEM's customization tools

Adobe Experience Manager integrations

Adobe Experience Manager is designed to provide a seamless and personalized digital experience. Here are some of the key customization features of AEM:

  • People-centric technologies: AEM focuses on delivering personalized, people-focused experiences. This ensures that government agencies can make their services accessible and tailored to their citizens and employees.
  • Quick site creation: AEM offers quick site creation features, from site templates to drag-and-drop components. This allows content teams to swiftly create stylized web experiences, enhancing citizen engagement.
  • Cloud-managed services: AEM's cloud services enable faster creation and deployment.
  • Easy customization and scalability: According to their website, AEM combines the benefits of an open platform with the support and security of a commercial-off-the-shelf solution.

Drupal's open-source flexibility

Drupal, being open-source, offers unparalleled flexibility and customization capabilities. Here are some of its standout features:

  • Vast module ecosystem: Drupal boasts over 50,000 modules that can be used to extend and customize the platform. These modules cater to a wide range of functionalities, from website optimization to advanced content workflows.
  • Adaptability: Drupal's open-source nature means it can be adapted and tailored to fit the specific needs of any organization, including government entities.
  • Community-driven improvements: The Drupal community is actively involved in developing and refining modules, ensuring that the platform remains cutting-edge and adaptable to evolving digital needs.
  • Quick site creation: Drupal has a steep learning curve, that’s why Promet Source built a component-based design system called Provus® to make building websites faster.

REQUEST YOUR FREE PROVUS® DEMO

H3: Strengths and weaknesses on customizability

Strengths:

  • AEM: AEM offers a suite of tools designed for quick site creation, cloud-managed services, and scalability. Its focus on people-centric web technologies ensures tailored experiences for citizens.
  • Drupal: Drupal's open-source nature provides unmatched flexibility. Its vast module ecosystem and community-driven improvements ensure a platform that can be tailored to any need.

Weaknesses:

  • AEM: While AEM offers robust customization features, its comprehensive toolset might present a steeper learning curve for users unfamiliar with the platform. Plus, being a premium product, leveraging the full range of AEM's customization features might come with higher costs.
  • Drupal: While the vast module ecosystem is a strength, it also means that organizations need to know what kind of modules they need to get certain features. And if these modules are not compatible with their version of Drupal, that could pose an issue.

Expert thoughts on customizability

Alexandru Contes, Co-Founder of ReviewGrower favors Drupal: "I once advised a local government body on website platforms. They desired transparency and autonomy over their site. Given these needs, I leaned towards Drupal over Adobe Experience Manager. Why? Primarily, Drupal's open-source nature stood out. It allowed the government team to adapt and tailor the website as their needs evolved, without licensing constraints. Plus, being open-source fostered a sense of public transparency, aligning with their mission. That recommendation, grounded in a genuine instance, has since propelled other governmental entities to consider the same approach."

AEM vs Drupal on customizability

While both AEM and Drupal offer robust customization capabilities, the choice often boils down to the specific needs (and budget) of the organization.

AEM's suite of tools and focus on personalized experiences make it a strong contender for government entities looking for a comprehensive solution. On the other hand, Drupal's open-source flexibility and vast module ecosystem provide a level of adaptability that's hard to match.

Which of these platforms has a better support system?

Public sector websites, which contain important, even life-saving information for citizens, must have strong support systems because they cannot afford downtime.

AEM's corporate-backed support

Adobe Experience Manager offers a corporate-backed support system. This means that users can expect a high level of responsiveness and reliability when they encounter issues or have questions. Adobe's support infrastructure is available in two tiers—Expert Support Plan and Ultimate Support Plan—and their documentation is extensive.

With a dedicated team of professionals and a wealth of resources, AEM's support is solid.

Drupal's community support

DrupalCon Prague

Drupal, on the other hand, boasts a vibrant community-driven support system. This community of more than 1,000,000 comprises developers, users, and enthusiasts who actively contribute to the platform. Their proactive approach ensures that issues are identified and addressed even before they become major problems.

The strength of Drupal's support lies in the collective knowledge and experience of its community members. They collaborate to provide solutions, share best practices, and continuously improve the platform. This community-driven approach ensures that users have a wealth of resources and expertise at their disposal.

And because Drupal is open-source, companies offering paid support step up and provide their A-Game because there is no vendor lock-in.

Strengths and weaknesses on support

Strengths:

  • AEM: AEM’s support provides a structured and reliable system, ensuring that users receive timely assistance. This can be especially beneficial for large agencies that require consistent and dedicated support.
  • Drupal: Drupal's community support offers a more dynamic and collaborative environment. The community's proactive approach ensures that solutions are continuously updated and refined. This can be advantageous for agencies that value flexibility and the collective wisdom of a diverse community.

Weaknesses:

  • AEM: With a corporate-backed support system, you will need to pay extra to get the Ultimate Support Plan, unless you’re fine with the lower tier. There might also be limitations in the scope of support, especially for custom implementations or third-party integrations. Plus, relying on a single corporate entity for support can be disadvantageous as you can’t switch to another company if you’re dissatisfied with the service.
  • Drupal: While the community-driven support system is a strength, it also means that there's no centralized entity responsible for addressing issues. This means organizations will need to rely on third-party companies for paid support. While these companies provide their best services due to the competitive nature of the market, the quality and responsiveness can vary between providers.

AEM vs Drupal on support

Both support systems have their strengths. The choice between them should be based on what ensures peace of mind for the user or organization in question. Some may prefer the structured approach of AEM, while others might value the freedom of choosing their support provider.

Which of these platforms is more scalable?

Scalability is another important factor that needs to be considered by public sector websites. No matter your agency’s size, it’s important that your CMS can support you when you grow.

AEM's infrastructure prowess

Adobe Experience Manager is designed with scalability in mind through its data storage system and other features, making it suitable for government agencies that require a reliable and scalable CMS. Plus, you can choose to deploy AEM in cloud instead of on-premise to help with scalability.

Drupal's robust hosting options

hosting logos

Drupal offers a wide range of hosting options tailored to different needs. The platform itself is highly scalable, but its true scalability power is unleashed when combined with the right hosting solution. Many hosting providers specialize in Drupal hosting, ensuring optimal performance, security, and scalability.

Drupal's modular architecture also allows for easy scalability, ensuring that as a government agency's digital needs grow, the platform can adapt accordingly.

Strengths and weaknesses on scalability

Strengths:

  • AEM: AEM's cloud support and infrastructure prowess make it a strong contender for large-scale government websites. AEM can also leverage caching, load balancing, and CDNs to enhance performance and scalability.
  • Drupal: Drupal's open-source nature and vast hosting options provide flexibility and adaptability, ensuring that government entities can choose a solution that best fits their scalability needs. Drupal also leverages caching, aggregation, database optimization, and CDNs for better performance.

Weaknesses:

  • AEM: There are significant differences between the local development environment and the Cloud Service deployment model, which can present a learning curve for users familiar with the traditional AEM setup.
  • Drupal: Excessive database activity can stifle performance and limit scalability if it isn't planned properly.

AEM vs Drupal on scalability

When it comes to scalability, both AEM and Drupal offer robust solutions. The decision between the two often boils down to specific requirements, budget considerations, and the desired level of customization.

The fact that both platforms are also used by huge agencies is a plus. The U.S. Census Bureau uses AEM, while the U.S. Government Accountability Office is on Drupal.

Which platform is more cost-effective?

Since building public sector websites means using tax money, it’s important to check which platform is more cost-effective.

AEM's licensing implications

AEM operates on a licensing model, which means that businesses and organizations need to pay licensing fees to access and use the platform. The cost of running and maintaining AEM can vary significantly based on several factors:

  • Traffic: Since AEM is hosted in the cloud, costs can increase with the amount of traffic a site receives. Adobe's expenses rise in proportion to the site's traffic, making it more costly for sites with higher pageviews.
  • Bandwidth: Sites with high-resolution images and content can be more expensive due to increased bandwidth usage.
  • Customization and integration: The more custom rules and integrations an organization requires, the higher the cost. This includes content customization per user, jurisdiction, and other criteria.
  • A/B testing: AEM allows for in-depth A/B testing, but the complexity and scale of the testing strategy can influence the cost.
  • API access: Access to AEM's API and its usage frequency can also impact the price.

Depending on what you read, the budget to license and implement AEM can range between $40,000 and $1,000,000.

Drupal's cost-effective nature

Drupal offers a distinct advantage in terms of cost. While there's no licensing fee associated with using Drupal, there are other potential costs to consider:

  • Hosting: Depending on the hosting solution chosen, there can be associated costs. However, Drupal offers flexibility in hosting options, allowing organizations to select a solution that fits their budget.
  • Development and customization: While Drupal is free, you’ll need to choose your service provider for development. There can also be costs associated with customizations, especially if you need specialized modules and APIs.
  • Maintenance and updates: Regular updates and maintenance are essential for security and functionality, which can incur costs, especially if external developers or agencies are involved.

Despite these considerations, Drupal's open-source nature often makes it a cost-effective solution, especially for organizations that have the in-house expertise to manage and customize the platform.

Strengths and weaknesses on costs

Strengths:

  • AEM: Its comprehensive features and integrations can justify the price for organizations that require a robust and integrated CMS solution, especially if you want to use the Adobe ecosystem.
  • Drupal: Its open-source nature offers substantial savings in terms of licensing since it’s technically free.

Weaknesses:

  • AEM: AEM's licensing model and associated costs can make it a significant investment, which is something to consider if you’re paying with tax money.
  • Drupal: The total cost of ownership might include development, customization, and maintenance expenses. You might also have to use different agencies for your development and support, depending on their capabilities.

Expert thoughts on cost-effectiveness

Munir Alsafi, Co-Founder of Vixelstudio states that "Drupal is often the first choice due to one main reason: cost. Being open-source, it is free to use. This allows governments to save a significant amount of money as they don’t have to buy licenses or pay hefty fees. The saved money can then be used to improve other areas, such as citizen services. 

AEM, however, comes at a cost. It offers advanced features and support, but at a price. For larger governments with substantial budgets, this might be acceptable. But for smaller ones, the cost can be a hurdle. Therefore, if a government is looking to save money and still wants a reliable website, Drupal might be the better choice. However, it's always important to consider the specific needs and budgets of each government."

AEM vs Drupal on cost-effectiveness

If your organization wants to make use of everything Adobe has to offer, using AEM would be more cost-effective. But if that’s not within your plans, Drupal is the better choice.

Why choose Drupal?

Being an open-source platform, Drupal doesn't come with licensing fees, making it a more affordable option for many organizations. While there are associated costs with hosting, development, and maintenance, the absence of licensing fees can lead to substantial savings in the long run.

Drupal also offers unparalleled flexibility. Organizations can tailor the platform to their specific needs, leveraging its vast module ecosystem and adaptability. This flexibility extends to hosting options, integrations, and custom developments.

The open-source nature of Drupal also ensures transparency, allowing users to have a clear understanding of the platform's codebase and security measures.

Lastly, Drupal boasts a vibrant and active community that continuously contributes to the platform's improvement. This community-driven approach ensures that issues are identified and addressed promptly, and new features and modules are regularly developed.

The collective knowledge and experience of the Drupal community are invaluable assets that AEM, as a proprietary platform, cannot match.

Why choose Adobe Experience Manager?

Since Adobe AEM is part of the Adobe ecosystem, integration with products is a breeze. This is useful for organizations that already use Adobe products.

AEM also offers a corporate-backed support system, ensuring a high level of responsiveness and reliability. With dedicated professional teams and extensive documentation, AEM's support infrastructure can provide peace of mind for government entities that require consistent and timely assistance.

Their cloud-first approach can be particularly beneficial for government agencies as well looking to future-proof their digital platforms and ensure they can handle increasing user loads.

Lastly, AEM is designed for personalized digital experiences. Its people-centric technologies enables government agencies can make their services more accessible and relevant to their citizens. Plus, their quick site creation features, drag-and-drop components, and cloud-managed services can enhance citizen engagement and streamline content management.

Conclusion

While Drupal has a broader reach due to its open-source nature and is widely used by government entities, AEM holds a significant position in the enterprise segment, especially among organizations that prioritize integrated solutions and have the budget for premium products.

Both AEM and Drupal bring their unique strengths to the table. AEM, with its integrated Adobe ecosystem, offers a seamless experience for entities deeply embedded in the Adobe suite. On the other hand, Drupal's open-source nature, flexibility, and strong community support make it a versatile choice for a wide range of organizations.

For government decision makers, the primary concerns revolve around security, accessibility, cost-effectiveness, and the ability to adapt to future challenges.

Both platforms have demonstrated their capabilities in these areas, but the optimal choice will depend on the specific nuances of the organization's needs and the long-term digital strategy they envision.

As the digital needs of government entities become more complex, it's crucial to partner with experts who understand these challenges and can offer tailored solutions.

At Promet Source, we pride ourselves on our deep understanding of Drupal. Our team of experts is equipped to provide insights, recommendations, and tailored solutions that align with your organization's unique needs. Make informed decisions on your CMS by contacting us today.

Oct 05 2023
Oct 05

Join us as we sit down with Joyce Peralta from McGill University to explore their world of "Web Standards."

We'll discuss how McGill's strategy for maintaining its impressive roster of 1,500 websites has grown to influence more than just the structure of the sites. These digital standards, developed, enforced, and cultivated by their web community, have become a cornerstone of the university’s technology framework.

Together, we’ll unpack the 9 standards that are fundamental to McGill University's web success and explore how they have significantly transformed its digital landscape, and how you might be able to do something similar in your organization.

Oct 04 2023
Oct 04

At Electric Citizen, we have long partnered with clients in higher education – from large universities to community colleges. 

That's why we're excited to be sponsoring this year's HighEdWeb conference, dedicated to the intersection of web professionals and higher ed. From Oct 8th to 11th, 2023, we'll be at booth #300 in the exhibit hall.  

This will be our first in-person visit to Buffalo, NY, and we can't wait. Stop by our booth to chat about what our team can do your organization, from strategy and design to web development and ongoing support. We're a team of Drupal experts and open-source enthusiasts, with over 11 years experience in partnering in the education space. Plus we have some fun swag to give away.

For those who can make it, I hope to see you there!

Oct 03 2023
Oct 03

On the 21st - 23rd of September, two of our team members attended DrupalCamp Spain 2023, which took place in Sevilla. DrupalCamp Spain is the largest organised event for the Spanish Drupal community with the aim of sharing knowledge, increasing awareness of Drupal and bringing people together. 

DrupalCamp

Have been consistently dedicated to the community since 2009, Zoocha are always proud to attend Drupal organised events. Our dedication has included contributing to fixes on a large number of contrib modules, including in Drupal Core itself. Our Spanish office in Valencia is a core branch of our global team, with unique expertise in front end development. 

Since 2015, we have been growing a strong and talented team in our Valencia, of whom one of our first permanent team members is still a respected senior presence at Zoocha today! Our team members in Spain have been significant contributors to Drupal modules, as well as supporting Zoocha to rise to our current position. 

Highlights

Throughout the duration of DrupalCamp, attendees had the chance to join in a variety of activities. The event itself presented an excellent networking opportunity, allowing our team to meet many interesting members of the Drupal community from around Spain and beyond, as well as running into some familiar faces from the past.

Furthermore, our team enjoyed two days full of learning. Workshops included introductions to module developments in Drupal 10 as well as a number of informative insights into quality boosting tools. Presentations discussed a plethora of topics; these were tailored to attendees across basic, intermediate and advanced levels, catering to all Drupal audiences.

Particular highlights from our team include a front-end presentation regarding component-based designs and a testing workshop explaining the ‘Behat’ tool. It was introduced that, by using the user-friendly Behat tool, testing scenarios are written in easy to understand sentences, allowing all individuals to clearly interpret and participate in the testing process despite their level of technical knowledge.

Presentation

With a wide variety of people in attendance at DrupalCamp Spain, it was great to see the effort that was put in by the organising committee. This not only included the provided food & drinks and the optional tour of Sevilla, but also the accessibility of the talks themselves, having both English and Spanish options and a variety of subjects for a range of levels.

DrupalCamp Spain was a fantastic experience and learning opportunity, and we look forward to the next!

Oct 02 2023
Oct 02

Drupal 10 upgrade

What it’s like?

Experienced developers will remember that Drupal 8 brought a new approach to updating the core of this CMS. This approach has survived to this day. At the heart of this approach is semantic versioning, i.e., the principle of assigning major, minor, and patch versions to any software, as well as marking versions to indicate the intermediate nature of the upgrade, which may behave incorrectly.

Drupal 8 incorporates components of the Symfony framework, which in turn allows developers to update Drupal through the Composer package manager, which uses semantic versioning. This paved the way for supporting backward compatibility between Drupal versions: bad code is marked but removed gradually, while the developer has time to find a new way to preserve the site functionality maintained by that code. In Drupal 7, outdated code was marked as such. However, this was not a requirement of the system policy, and developers did so at their own discretion.  

To sum up in a nutshell. 

In the past. Although changes to the code were recorded in the documentation of new core releases and the code itself was marked as obsolete, this was not a strict practice. When upgrading the core in Drupal 7 and earlier versions, developers had to rewrite themes and fix custom code. Although the extent of changes depended on the site complexity and amount of custom code, once the Drupal version was updated, this was largely a new site.

Now. With the advent of Drupal 8, the likelihood of unpredictable core upgrade errors has decreased significantly. The entire code base was checked for the presence of untrustworthy code (the so-called deprecation cycle), which was marked as obsolete and up for removal by the site developers. As a result, upgrading to Drupal 10 takes no more time than upgrading to a minor version.

Drupal upgrade or migration?

An important note: All recommendations in this post apply only if you are upgrading Drupal 9 to 10. If the site works on Drupal 7, you can’t just jump to Drupal 10. This is already a site migration and requires different instructions.

Read more: How to upgrade Drupal 7 and Drupal 8 to Drupal 10

Oct 01 2023
Oct 01

What is the Content templates module designed for?

The Content templates module is a valuable add-on to the Drupal CMS platform, designed to enhance your editorial experience. The main purpose of this module is to streamline the editorial workflow by allowing users to create and manage custom templates for different content types within the website. With the Content templates module your content editors become able not only to create visually appealing content layouts, but also to enjoy a simplified content creation process.

Easily create custom templates for any content type

This module allows you to create custom templates for different content types such as blog articles, news pages, product pages, or any other custom content types that align with your content strategy.

With a user-friendly interface for creating templates and the full potential of your Drupal CMS, it becomes easy to create custom layouts, defining content fields (headings, texts, images, etc.), formats and other settings to be included in a specific type of content. It gives you the possibility to populate template fields with demo content to significantly reduce the time and effort required to create the new content.

Conceptually, this module is similar to the Google Docs template mechanism. To speed up the editorial workflow, any existing node on your website can be saved as a template and serve as a starting point for the new content. The new content created from templates always retains the reference to the template for easy retrieval of all nodes generated from specific templates.

Sep 28 2023
Sep 28

As Drupal 9 approaches its end of life (EOL) this November, there has been a significant drive to upgrade to Drupal 10 across our client base. In this post, we will delve into the lessons we've learnt and the challenges we've encountered during this transition process.

Given Drupal 9’s dependency on its primary web application framework, Symfony 4, which reaches its end of life in November 2023, it has become critical for all sites running on Drupal 9 to undergo an upgrade to Drupal 10. This transition will ensure continued security and stability for Drupal platforms beyond the Symfony 4 end of life date. 

In addition to resolving the issues surrounding Symfony 4, a Drupal 10 upgrade is necessary in order to gain access to the latest features and enhancements that the new release has to offer, as well as underlying performance improvements and long term support, whilst safeguarding the integrity of client projects.

Drupal 10

How Zoocha Prepared for the Drupal 10 Upgrade

At Zoocha, we are host to a diverse range of client sites which involve many different components from intricate API integrations and customised search features to large scale commerce solutions. Consequently, it was crucial to take a proactive approach and plan in advance to allow clear communication and transparency with our clients as we moved closer to commencement.

Living Document

In order to create an upgrade process which proved to be progressively smoother and more efficient with each project, it was essential for us to maintain a living document. At Zoocha, we use Confluence to house documentation both internally and in collaboration with our clients. Given the substantial number of clients that required a Drupal 10 upgrade, the maintenance of living documents entailed a best practice of consolidating and folding valuable learnings and challenges into a dedicated space within Confluence

Consistency

Furthermore, ensuring consistency in our approach and workflow was extremely significant in the lead up to the Drupal 10 upgrade. This was established across all projects, enabling the team access to efficiencies such as:

  • Standardising naming conventions within Git for the Drupal 10 branch to enable alignment across testing environments.
  • Establishing processes to ensure the Drupal 10 branch remained up to date and in sync with any ongoing active deployments.
  • Creating consistent templates for pull requests and QA by providing information on module updates and key areas of functionality.

The Assessment Phase

Existing Drupal Core Versions

Before commencing the upgrade process, it was essential to optimise each site to ensure they were operating on the latest versions of either Drupal 9.4.x or Drupal 9.5.x. This proactive approach played a pivotal role in simplifying the transition to Drupal 10.

Upgrade Paths and Compatibility

By leveraging the upgrade status module, we gained access to invaluable data and recommendations regarding Drupal 10 compatibility for each project. This not only supported our estimations in gauging the level of effort needed from our team across our client base but also significantly influenced our overall approach to the upgrade process.

Upgrade status before:

Before

Upgrade States after addressing issues:

After

CKEditor Plugins

Some of the most notable changes within Drupal 10 to take into consideration upon the commencement of the assessment phase were the introduction of CKEditor 5 to core, replacing CKEditor 4 due to its EOL in June this year, and deprecated themes: Seven, Stable, Classy and Bartik.

The introduction of CKEditor 5 to Drupal core represents significant change, therefore making the assessment of the extent of the CKEditor plugin reliance across the client base was crucial to accurately guide estimates. The CKEditor plugin report alongside the outlook for modules offering plugins offered valuable insights into this process and provided us with the initial understandings of what to expect in reference to upgrade paths and plugin compatibility.

Deprecated and obsolete extensions

Regarding the reliance on deprecated themes, Zoocha needed to identify any dependencies on base themes that were removed in Drupal 10. This identification was crucial in order to accurately gauge the scope and effort required during the upgrade process.

Challenges and Learnings

Throughout the process, we have been faced with challenges related to upgrade paths and compatibility with particular contrib and custom CKEditor plugins. Consequently, we found it necessary to utilise the CKEditor 4 contrib module as a temporary solution, which provided us with the time required to address these issues. Within this, a number of security assessments were conducted to ensure that the decision to use CKEditor 4, given its EOL, did not introduce any security risks.

Similarly, in the interest of time and effort, we were able to alleviate the Stable and Classy contributed themes, allowing Zoocha to continue the utilisation as base themes during the investigation into the level of effort required to transition away.

JQuery Once

Furthermore, the removal of JQuery once from core within Drupal 10 meant that it became necessary to apply the required updates to utilise JavaScript once to maintain functionality and compatibility. Some of these updates were:

  • To replace jQuery once, which was still used in contrib modules by looking for patches or creating them ourselves.
  • To replace jQuery once in all of our custom modules and custom themes to make sure the code produced by Zoocha is behaving as desired under the new Drupal guidelines.

Twig 3

Drupal 10's adoption of Twig 3 (from Twig 2) is another noteworthy change. While there were no major changes, a few features were deprecated and removed in Twig 3. Some of the main encounters (so far) include:

  • {% spaceless %} should now be {% apply spaceless %}
  • A template that extends another one cannot include content outside Twig blocks

Final Thoughts

As we navigate our way through each project, encountering fresh challenges and overcoming hurdles, it is vital to embrace the mindset of contributing to the Drupal community. This includes providing any patches or solutions that we may develop along the way to further grow and enhance the community.

Zoocha Drupal 10
Sep 26 2023
Sep 26
Published on Tuesday 26, September 2023

I just finished reading Modernizing Drupal 10 Theme Development published by Packt Publishing by Luca Lusso. Don't let the title make you think it is about theme development. The book provides excellent coverage of general Drupal knowledge, so much so that I highly recommend this book as a go-to resource for any frontend or full-stack developer new to Drupal. I'd also recommend it for any backend developer working on a large team so that they understand the work their frontend colleagues are performing and how to assist them best.

I enjoyed the flow of the chapters. Reading this book made me think back to when I had my first job building websites, which was primarily front-end development. The book takes you down the journey of a developer tasked to implement a design onto a Drupal site.

There is a starting code base that you clone down and work with throughout the book. This felt natural for how build phases may work: backend developers or site builders scaffold the site, and then it is themed.  

The book begins with onboarding the reader to create a local environment, using the demo code base, some basics of how Drupal works, and how to create a new theme. Then, it dives into styling individual landing pages and components—each step along the way, the book layers in more Drupal knowledge alongside theming implementation.

My favorite highlights from the Modernizing Drupal 10 Theme Development book are:

  • As part of the local development environment setup with DDEV, it provides an excellent introduction for installing and setting up Docker for new users.
  • Creating a new theme using the Starterkit theme and TailwindCSS with Browsersync to provide a streamlined front-end development experience.
  • Introducing BackstopJS for visual regression testing! It is only briefly mentioned, but the example code repository provides the configuration and DDEV custom commands.
  • Learning how to use the WebProfiler module to understand various parts of Drupal's render pipeline and theme information
  • Understanding how to work with component-based design systems using Storybook and integrating them with Twig templates, including the newly added Single Directory Components.
  • Explains using Twig namespace for referencing Twig templates defined by other extensions.
  • Xdebug! The book explains why Xdebug is useful and how to use it in your development flow for theming, including debugging your Twig templates!
  • The book calls out a common mistake when modifying the output of templates: the loss of cacheable metadata bubbling. I was thrilled to see this covered and explain how you may end up with lost cacheable metadata and debugging it.
  • Creating custom Twig functions and filters to abstract away logic from templates into helper methods, keeping templates lean and clean.
  • Using custom entity type bundle classes to encapsulate logic further and remove it from your theming layer. The example given is creating a custom method to abstract away accessing a string value's content.

My only nitpicks are the amount comparisons to Drupal 7. Throughout the book, there are various comparisons to how Drupal 7 did things. I prefer we stop comparing Drupal to its previous iterations, but it may be good that this book does. There may be that frontend developer who worked on Drupal 6 or 7 and rolled their eyes at an upcoming Drupal project. Then, they read this book, which completely changed their mind about frontend development on a Drupal site.

Links to products may be Amazon or other affiliate links, which means I will earn a commission if you click through and buy something.

Want more? Sign up for my weekly newsletter

Sep 25 2023
Sep 25

For this year's Drupal Camp a joint effort has been made to offer three different workshops on testing with Drupal. One of them was a Behat workshop where a theoretical basis was given and different practical exercises with Behat were proposed. 

Through this article we want to make this same Behat workshop available to anyone who is interested so that they access the presentation and the exercises. Unfortunately, the slides are only available in Spanish. However, the exercises are written in English so even if you don't speak Spanish you may benefit of doing the practical part.

The workshop

The workshop uses two repositories, the first is a presentation used as a guide for the workshop, and the second is a pre-configured environment with Behat ready to be run.

The presentation can be viewed online directly from the browser. It consists of three parts:

  1. A very basic introduction to Behat, supported by more information during the practical part.
  2. How to configure the environment to perform the exercises using the second repository. This step is very simple as it is based on Metadrop's Boilerplate, which includes a set of Docker containers already configured to run Drupal and Behat (as well as other tools).
  3. The practical part, where exercises are presented in the form of user stories to be written using Behat.

The interesting thing about the practical part is that all the exercises have a solution that can be consulted to validate the exercise. This allows the doer to have at least one reference solution to each problem.

How to

First go to the workshop's slides. Read the first part with the introduction to Behat. Since it is a presentation, there are not many details but you can learn more in the official Behat documentation or in other references you can find.

For the practical part, check the slide "Montar entorno" (which is duplicated, once at the beginning of the presentation and then at the beginning of the practical part), where you can find the the three simple commands required:

  1. Clone the repo:
    git clone [email protected]:rsanzante/drupalcampspain2023-behat-workshop.git
  2. Install PHP pacakges (run inside the cloned repository):
    composer install              
  3. Run the assistant to configure the environment:
    composer boilerplate:assistant

    The assitant will ask several questions but the default values are fine except the profile to install:  you must select the Umami profile. This is because the workshop makes use of the functionalities and content of this demo profile that comes with the Drupal core. It also asks whether to create a Radix subtheme; although we can leave the default option (yes), it is not required for the workshop and it takes a while to generate it, so it's better not to generate it.

The exercise repository contains a workshop branch and several tags:

Commits and repository tags from the practical part. The dev branch and "Initial commit" commit are generated by the assistant and can be ignored (or select not to initialise the Git repository so that it doesn't add the branch and commit).

Start by jumping to the first tag, initial-setup, and test that Behat works (make shell and then just behat). Then, checkout the tag of the first exercise (us1-exercise) and check the directory tests/functional/behat/features/umami/ to find the exercise. Once done, you can checkout the next tag to see the suggested solution (us1-solution). This cycle is repeated for all exercises.

Each exercise is completed in a file and the solution is in another file, so that both solutions can coexist (the suggested one and the one wrote by the person doing the workshop). In fact, the suggested solutions are not executed because the files do not have the .feature extension. The last commit renames the suggested solutions by adding this extension, so that these solutions can be tested quickly and easily.

URL to clone exercises repository: [email protected]:rsanzante/drupalcampspain2023-behat-workshop.git
Sep 24 2023
Sep 24

Radix is a Bootstrap base theme for Drupal that provides a solid foundation for building your website. It includes built-in Bootstrap 4 and 5 support, Sass, ES6, and BrowserSync. This makes it easy to create a website that looks great on all devices and is easy to maintain.

In this video, you’ll learn the following:

  • Download and install Radix.
  • Generate a Radix sub-theme.
  • Integrate a Bootswatch theme in your site.
  • Implement the Carousel component using blocks and paragraphs.
  • Implement the Accordion component using paragraphs.
  • Display articles in a Bootstrap grid using Views.
Sep 22 2023
Sep 22

Authored by: Nadiia Nykolaichuk

Front-end developers are committed to crafting website interfaces that are not just visually captivating but also a joy for users to interact with. It’s great to know that Drupal helps them along the way. Drupal 10 was released with a bunch of improvements for front-end development such as modern JavaScript components in place of jQuery, Views Responsive Grids, the New Theme Starterkit Tool, the end of support for Internet Explorer 11, and more. 

The progress on the way from Drupal 10 to Drupal 11 is even more impressive. The Drupal 10.1 release has introduced tangible advancements for everyone, but it offers an exceptionally remarkable array of new features and updates that front-end developers would appreciate the most. Let’s review them in this article. 

Drupal 10.1 advancements for front-end developers

Single Directory Components (SDC)

Creating and managing interface components becomes significantly easier and more consistent in Drupal 10.1 with Single Directory Components (SDC). This incredible architectural improvement generated a lot of buzz in front-end development circles so our team held an internal workshop as well as published a detailed article about SDC.

The essence of this new addition is its ability to group together all files that are necessary for rendering a UI component so they reside in a single directory. The files include a YAML file with the metadata, a Twig file with the templates, a CSS file with the stylesheets, a JavaScript file with the scripts, and anything else that might be needed within a component.

A slide about the SDC file structure from an internal workshop held by our team’s developers.A slide about the SDC file structure from an internal workshop held by our team’s developers.

When located in the same directory, all files are easy to find even for front-end developers that are new to Drupal. Furthermore, SDC automatically looks for component files and generates a library to render each component. SDC components can be shared and reused across multiple development projects at a snap of a finger. They are safe to refactor or delete without fear that they might be used somewhere else.

The new Development Settings page

The Drupal 10.1 admin dashboard boasts a new Development Settings page where you can enable the Twig development mode and disable caching. This presents an exceptional leap forward in front-end workflows. Previously, front-end developers had to do cumbersome edits to the services.yml files, but not just a few button clicks in a handy interface are needed to achieve the same goals. 

Managing the Twig and cache settings is indispensable for a clean and easy theme development process, helping front-enders to seamlessly troubleshoot issues in templates and instantly see the impact of their editing. See more details in our article about the new Development Settings page in Drupal 10.1.

In a nutshell, there are the following checkboxes on the new page:

  • Twig development mode
  • Do not cache markup

When checked, the Twig development mode checkbox exposes and automatically selects two additional checkboxes:

  1. Twig debug mode
  2. Disable Twig cache
Drupal 10.1’s new Development Settings page with Twig and cache settings.Drupal 10.1’s new Development Settings page with Twig and cache settings.

Responsive image lazy-loading with a set width and height

Image lazy-loading has been widely used in Drupal as a recognized technique to boost website speed. However, there used to be a problem with lazy-loading responsive images in Drupal because their tags lacked the width and the height attributes.

Drupal 10.1 comes to the rescue providing the width and height attributes for responsive image tags, as well as adding a toggle element to switch between the loading=”lazy” and the loading=”eager” options in the “Responsive image” field formatter settings. In Drupal 9.4, a similar element was introduced for the “Image” formatter, which was described in more detail in our earlier article about image lazy-loading in Drupal

The toggle to enable/disable lazy-loading for the “Responsive image” field formatter in Drupal 10.1.The toggle to enable/disable lazy-loading for the “Responsive image” field formatter in Drupal 10.1.

Media in the oEmbed format is configurable for lazy-loading

Drupal 10.1’s advancements for lazy-loading are not limited to responsive images — they also apply to multimedia in the oEmbed format. Adding online media from any oEmbed provider (YouTube, Twitter, Slideshare, SoundCloud, etc.) to a Drupal website has been popular since the introduction of the Media module in the Drupal 8 core. Drupal 10.1 has a new element for the “oEmbed content” field formatter that toggles lazy-loading on and off.

The toggle to switch lazy-loading on and off for the “oEmbed content” field formatter in Drupal 10.1.The toggle to switch lazy-loading on and off for the “oEmbed content” field formatter in Drupal 10.1.

The Linkset functionality for decoupled menus is in the Drupal core

One of Drupal’s most cutting-edge initiatives in progress, Decoupled Menus, helps seamlessly expose Drupal-managed navigation to JavaScript front-ends. Drupal 10.1 has introduced new APIs for sharing decoupled menus using the Linkset standard

The Linkset format was recommended by the Internet Engineering Task Force (IETF). The Linkset functionality was previously used in the Decoupled Menus contributed module but has been moved into the Drupal core’s System module starting with Drupal 10.1, which means out-of-the-box support. For more convenience, there is a new page in the Drupal admin dashboard — Configuration > Web services > Menu Linkset Settings, where it’s possible to enable the menu Linkset endpoint.

The UI to enable the menu Linkset endpoint in Drupal 10.1.The UI to enable the menu Linkset endpoint in Drupal 10.1.

Improvements in CSS and JavaScript aggregation

Drupal 10.1 significantly improved approaches to CSS/JavaScript aggregation — another known performance optimization technique. The aggregation logic has been revamped so the main HTML request now generates a URL with the asset filename. It also contains sufficient information in the query string for a separate route to generate, serve, and write the asset to disk. 

This approach reduces the time it takes to serve HTML pages and allows multiple CSS and JavaScript assets to be loaded in parallel. This enhances overall page speed, especially in stampede/cold cache scenarios.

These new aggregation methods remove the need for additional complicated modules such as the ever-popular AdvAgg.

On-the-fly JavaScript minification

Another noteworthy front-end improvement in Drupal 10.1 is that JavaScript minification has been seamlessly integrated into the core, leading to substantial reductions in file sizes. Previously, achieving the same effect required complex build steps or the installation of contributed modules. 

JavaScript files are now minified on the fly, right out of the box, thanks to the integration of the Peast library. Peast specializes in parsing and minifying JavaScript code according to the ECMAScript specification. An example of significant JavaScript size reduction is the ajax.es6.js file which loses its size from 59 KB to around 17 KB in approximately 100 milliseconds. 

Integrating JS minification directly into the Drupal core provides more streamlined front-end performance across a broader spectrum of websites, regardless of the adoption of contributed modules. 

The path for CSS/JS optimized assets is now configurable

The next improvement in Drupal 10.1 gives front-end developers greater control over asset storage and resource optimization. More precisely, it gives them a choice as to where they’d prefer to store the optimized CSS and JS assets. Previously, the optimized asset directory was hardcoded to a fixed location — public://{css,js}, which didn’t suit everyone due to possible performance and reliability concerns.

Now, front-end developers are able to configure the path for the optimized assets using the file_assets_path settings variable. This path determines the parent directory for the css/ and js/ subfolders. By default, this path is still set to the public:// directory, so nothing changes unless a developer decides to provide a different path.

BigPipe reduces page reflows

BigPipe, a web page rendering strategy and module introduced in Drupal 8, is great at delivering the content of web pages to users faster. It loads the essential page elements immediately, while non-essential or dynamic elements can load in the background. Gábor Hojtsy, Drupal core committer and initiative coordinator, shared a GIF of how BigPipe in Drupal 10.1 reduces page reflows because it now supports serving interface previews for delayed content. 

A demo of how BigPipe in Drupal 10.1 reduces page reflows A demo of how BigPipe in Drupal 10.1 reduces page reflows.

Other changes for front-end development

Some other advancements in Drupal 10.1 related to front-end development include the following: 

  • The Stylelint tool that checks and enforces consistent coding styles in CSS and the Prettier tool that automatically formats code in JavaScript, CSS, HTML, and other languages, have been updated to newer versions in Drupal 10.1. Prettier is now used for formatting PostCSS.
  • The Twig template engine has been updated to version 3.5.0 in Drupal 10.1.
  • Node.js 16 reaches its end of life in September 2023, so core JavaScript development is going to require a minimum version of Node.js 18.
  • The js-cookie library is deprecated in Drupal 10.1 and is planned to be removed in Drupal 11. This should eliminate another third-party JavaScript dependency that wasn’t used in the Drupal core.

Final thoughts

The array of new opportunities and improvements for front-end developers in Drupal 10.1 is truly impressive. In addition to the innovations built into the Drupal core, it’s worth paying attention to brand-new contributed modules, a great example of which would be the Bootstrap UI Kit created by our team’s developer Aaron. We’ll continue keeping you abreast of what’s latest and greatest in Drupal, so stay tuned for more! 

Sep 21 2023
Sep 21

It’s back and more exciting than ever! We are thrilled to announce the highly anticipated return of Drupal GovCon, the third biggest Drupal Conference in the world! This notable event is returning to the Washington DC area on November 1 & 2, marking a lively return to in-person Drupal camps.

Join host Matt Kleve as he engages in insightful discussions with accomplished organizers Nina Ogor and Christoph Weber, unveiling the plans and expectations for the upcoming conference.

Sep 21 2023
Sep 21

With Drupal 9 slated for end of life within a matter of weeks, the time to jump on the Drupal 10 upgrade fast track is now. 

The November 1 scheduled end of life for Drupal 9 signals a true hard stop, with no possibility of extended commercial support or off-grid security and bug fixes.  

At issue is the November 2023 decommissioning of Symfony 4.

Drupal versions beginning with Drupal 8 are now built on top of the Symfony open source PHP web application framework. As such, the decommissioning of a Symfony version sparks end of life for the Drupal version upon which it was built. 

Upgrade vs. Migration

Fortunately, the upgrade from Drupal 9 to 10, and even Drupal 8 to 10 is a relatively straightforward process, bearing little resemblance to the architectural restructuring that accompanied migrations from Drupal 7 to current versions.

Drupal migration team graphic

But despite Drupal 9’s impending hard stop, the Drupal community’s appetite for another upgrade appears a bit lacking at the moment. As of mid-September, only 2.2 percent of Drupal sites have upgraded to version 10. While that small percentage might appear as an indicator that far to many of the 104,795 sites that are currently on Drupal 9 are headed for security vulnerabilities and a lack of support after Drupal 9’s November 2023 end-of-life date, there are actually two great reasons for optimism.  

Advantages of upgrading to Drupal 10 are huge and the Drupal 9 to 10 upgrade process can be amazingly fast and value-added. 

Drupal 10 Advantages

The Drupal Community has enthusiastically greeted Drupal 10 as the best-ever version of the CMS, and the June 2023 release of Drupal 10.1 raised the bar even higher with a host of new benefits for site builders.

Upgrade to Drupal 10 graphic

Here are some essential benefits that are built into Drupal 10.

Enhanced Security 

Drupal 10 introduces important new security features, the most significant being advanced password hashing, improved cross-site scripting (XSS) protection, and fortified session management. While these security enhancements are designed to further reign in platform vulnerabilities, the more significant security motivating a Drupal 10 upgrade is actually the impact of not upgrading, as Drupal 9 sites will no longer receive security support following the November 2023 end of life.

I imagine public sector websites and those that house sensitive data would be interested in ensuring their website remains as secure as possible.

Drupal 9 on a headstone graphic

Performance Optimization  

There is less code to maintain with Drupal 10, resulting in a faster, more efficient and easier to maintain CMS.

Improved Experience 

Drupal 10 provides a more marketer friendly CMS that has an intuitive and user-friendly interface for content editors and administrators. An enhanced and modernized backend, delivers better authoring, editing, and support.

Built-in Mobile Responsiveness

Drupal 10 comes with built-in responsive design capabilities, ensuring that websites will seamlessly adapt to different screen sizes and devices for consistent and optimized user experience.

A Move toward Automatic Updates 

automatic updates initiative

The Automatic Updates module is designed to simplify the process of keeping Drupal Core up to date. Automatic Updates requires Composer 2.3.5 or later, and for the module to work, Drupal must be able change its own code base and not all hosting environments allow for this. When Automatic Updates is not compatible with the hosting environment, it is recommended that Automatic Updates be leveraged in a local development environment, and the changes then being pushed to the host.

Continued Community Support

An overarching benefit of Drupal is the professional community of dedicated developers and contributors who work collaboratively and continuously improve and extend the platform. Upgrading to Drupal 10 ensures continued alignment with the community and unbroken access to the monitoring and expertise of Drupal's vast, global brainpower.

Extensibility and Scalability 

Drupal 10 offers greater flexibility within its architecture that allows for easier customization and scalability to accommodate evolving needs of organizations of all sizes.

Better Integration

Drupal 10 integrates seamlessly with other systems, applications, and third-party services including CRM platforms, marketing automation tools, and social media platforms, for enhanced integration within specific digital ecosystems.

Streamlined Migration Processes

Drupal 10 offers a streamlined migration path from previous versions, excluding Drupal 7. The robust Drupal community has developed tools and resources to facilitate a smooth transition, minimizing disruption and downtime during the upgrade process.

As specialists in Drupal migrations, Promet Source is adept at thoroughly auditing a site in preparation for a straightforward migration. We have the tools, the team, and the systems in place to ensure a streamlined and value-added migration that positions you to benefit from Drupal 10 ASAP.

Start with a Site Audit 

The best and most efficient place to start a migration from Drupal 7 or an upgrade from subsequent versions, is an audit of the current site with the objective of inventorying, categorizing, and rationalizing all content. Whether you're performing a migration from one CMS to another or a Drupal upgrade, this is where we begin. 

Dividing the migration process into the following six sequential steps creates a framework for avoiding shortcuts that lead to pitfalls, while ensuring a consistent path forward.

  1. Audit the existing content.
  2. Consider the design.
  3. Plan the migration
  4. Build a new content model.
  5. Map the content.
  6. Execute the migration .

Content Considerations

Often, tough choices surrounding what content to keep and what to let go of. 

Fact is, organizations are constantly evolving and the content on a site too often lags behind. Here are some questions to ask for evaluating the relative value of various pages and the content that’s on them:

  • How old is the content? 
  • How does it rank for page visits?
  • How integrated is the content to your messaging?
  • Are there redundancies?
  • How does it rank on the spectrum of trivial to essential?
  • Does the content drive engagement? Revenue? SEO?
  • Are there regulatory considerations that require the content remain?
  • Are there roles and permissions concerning content governance and workflows?
  • Is this documented?

Design Issues

Migration is the ideal time to redesign a website, or at least to define and determine essential design issues. To cite a few:

  • Is structured content in place?
  • Is CSS used to indicate heading styles, fonts, the color palette, quote style, ordered and unordered lists, buttons, hover states, etc. Does the design reflect the brand?
  • Is the UX aligned with current expectations and best practices?
  • Would a modern refresh help to engage constituents and clients?

Thorough time and attention to these initial steps will serve to lay the groundwork for a streamlined website migration that stays on course without pitfalls and unwanted surprises.

Never before has it been more essential for websites to ensure user experiences that offer a straightforward path to desired objectives, compelling content, engaging visuals, and added value. 

Looking for more insights into  wrangling your content, redesigning your site, or mapping out a migration to Drupal 10? That's what we do! Sign up for a free Drupal upgrade consultation

Sep 21 2023
Sep 21
Published on Wednesday 20, September 2023

Last week, I drove up to Minneapolis and attended Twin Cities DrupalCamp. I have only made it to the conference once before, way back in 2016, to present about the beginnings of Drupal Commerce 2.x. This is the first time Twin Cities DrupalCamp has been held at the end-of-summer/beginning-of-fall period. Twin Cities DrupalCamp was always held in June, which always conflicted with other events and family time at the end of the school year.

Twin Cities DrupalCamp was on Thursday and Friday. Each day had four session slots, with the afternoon set aside for an unconference time. I enjoyed this format. It can be mentally taxing to sit through sessions all day. It was a nice break of pace to have more casual conversations about different topics in the afternoon. After all, one of the best parts of getting together at a conference is for those serendipitous moments.

All of the session recordings are now available on YouTube: https://www.youtube.com/playlist?list=PLztBsFl4ot8t3uTki5JGMydmBdZPFOCaU. Thank you, Kevin Thull, for providing the recording equipment and recordings for so many conference sessions through your Drupal Recording Initiative.

It was a short trip for me. I drove to Minneapolis Wednesday afternoon and went home Friday afternoon. It's usually a 5-6 hour drive. However, the trip took a bit longer, about 7 hours, because the rental company gave me a Tesla Model 3. That was pretty cool because I have never driven a Tesla, let alone any electric car. The extra time was due to chargers not being as easily accessible off the interstate as if going to a gas station, and, of course, the actual charge time. It was a cool experience. And it only cost roughly $30 in charging fees, versus the two probably tanks of gas costing $120 ($3.75 a gallon at 16 gallons.)

Save time upgrading from Drupal 7 to Drupal 10 using Retrofit

Twin Cities DrupalCamp was also my first time talking about Retrofit for Drupal. On Thursday morning, I gave my "Save time upgrading from Drupal 7 to Drupal 10 using Retrofit" talk. You can download the slides as well.

The session was well attended and led to some great discussions, included in the recording at the end. Overall there was a lot of positive feedback. It led to some more interesting discussions about Drupal 7 during the unconference on Friday.

Thursday

Unfortunately I missed a few sessions on Thursday. After I gave my session I had to take a work call. Then I missed lunch and the Tiffany Farriss keynote, but I had the rare opportunity to get an in-real-life lunch with my manager. Luckily, I knew the sessions were going to be recorded!

I am ready to watch A WordPresser in a Drupal World over the weekend. Open source projects should always be reviewing their developer experience and finding ways to make it easier to onboard developers from other platforms.

I am also going to watch Decoupled Drupal Dev on Docker with Docksal Doing the Dirty Work. Doing decoupled application development in Drupal is weird. When you're using Symfony or Laravel it's very easy to have the frontend and backend code in the same repository, in fact those framework applications can mount the application for you. With how Drupal handles rendering, it's a bit more difficult because we can't completely remove the theme system and have non-admin or non-API routes "just" served from a single page application. Also, you may not want this approach if you're using a full-stack framework like Next.js. I have set up a workflow using DDEV and networking between projects. I'm really curious to see what J.D. has setup.

I was able to catch Building In Public- How live-streaming software development can supercharge your programming abilities. I was excited to see this since I do coding via live-streaming. It was really cool getting to meet Mark Dobossy and his journey with live-streaming. He isn't a Drupal developer. He's an Angular and Ionic developer. If I'm remembering correctly, J.D. (who also live-streams!) suggested Mark should give this talk, since he's local to the area.

So, as a plug, here are all of our Twitch channels:

Thursday night there was a social at the House of Balls, where we had some delicious BBQ. While I didn't partake, there was definitely karaoke. 

Friday

Friday was a really packed day.

The morning kicked off with Matthew Tift and Habits of an Effective Drupal Contributor. Even though I am definitely not a first-time contributor, I am sure I have various habits that I can improve to be an even more effective contributor. I really enjoyed this session, especially grounding myself in the basics that newcomers experience. It has been 10 years since I was in that position.

Next I caught Brian Perry's The Drupal API Client Project session. The Drupal API Client project was one of the funded projects from the Pitchburg Innovation Contest. There are plenty of JSON:API or GraphQL clients. But there isn't a Drupal client. Yes, technically Drupal implements specifications and there isn't anything Drupal-specific. But it is something needed for brand presence, as you can see from Brian's presentation when you search NPM for wordpress versus drupal. I am really excited about this project because of my history of API-first e-commerce with Centarro and my new work at Acquia (yet to be announced.)

When you see that Steve Persch is giving a session, you just go. The Fourth Decade of Website Deployments covered the ways creating websites has evolved over time – from simple servers to edge distribution, to the micro-ization of all the things, to the future of edge computing. I haven't watched the recording yet so I don't know how much was caught on camera (he had a few pointed to catch the props.) But it's a great watch regardless.

After lunch I caught Cooking with Caching: Drupal code served fast! by Tess Flynn (socketwench.) It was a fun themed session. Caching is a complex topic and it covered many components of Drupal's caching. 

I stuck around for the first unconference session. We had a table to discuss the concept of a Drupal 7 soft landing. There are a few options for Drupal 7 sites, and they are all outlined on the Drupal 7 End of Life landing page. There are a few problems.

Do people know they even have a Drupal 7 site? Some people will read this and go "how not?" the others have worked with non-profits or very small businesses. One of the folks at the table (I'm so sorry your name is escaping me!) doesn't even do Drupal anymore, but knows he built several sites on Drupal 7 and those organizations may have no idea their website will be running on end-of-life software. He felt is in his good conscience to make sure they were on a stable platform.

THEMES. We discussed a lot about themes. Migrating from Drupal 7 to Drupal 10 will require writing your theme to move from PHPTemplate to Twig amongst other changes. I've been working on Retrofit to support themes and PHPTemplate overrides, but will it be enough? Moving to Backdrop also requires reworking your theme. Backdrop still uses PHPTemplate but has made some of the same internal changes of variables available to templates that Drupal has done.

A proper workflow of what an organization needs for their migration. Do organizations really have a great way to understand their Drupal 7 migration? Do they know part of the migration is evaluating the amount of module dependencies and compatibilities? Do they have any custom code? If the site is only a few modules and no custom code, it could be extremely easy to migrate. Do they have a custom theme? Chances are, yes. Are they considering a redesign/refresh as part of the upgrade? These kind of workflows can help organizations make decisions. Or, it could be a template that smaller agencies can use when creating proposals for clients.

Twin Cities DrupalCamp 2024

It hasn't been announced if there will be a Twin Cities DrupalCamp 2024. But I have a good feeling there will be. I'm looking forward to attending next year!

Want more? Sign up for my weekly newsletter

Sep 19 2023
Sep 19

Drupal Camp Spain is happening this Friday! This year is in Seville, at the Faculty of Computer Science, University of Seville. From Thursday 21st to Saturday 23rd, including not only a lot of talks but also a Business Day where companies or individual freelancers can meet with other Drupal agents and share experiences and ideas.

Photo by Joan Oger on Unsplash.

Thanks!

A Drupal Camp is an event where a Drupal community can meet and exchange knowledge in real life, as opposed to the digital interactions of the rest of the year. It is the great opportunity better known these people,  these that you talk to in the Drupal chat channels or see in the issue queues, Twitter threads or any other Internet-based channel.

I would like to thanks the organizers, people that are volunteering to make this happens. They have work hard, believe me, they deserve message of thanks, so: thank you for making it possible!

In addition, there are many speakers. They also collaborate with the event without any kind of payment or compensation, you could say just for fun. People invest many hours in preparing their talks, so we should also be grateful to them. Ok, I am one of the speakers, but let me at least ask for recognition of all the other speakers that will be there.

Metadrop will be there

Talking about speakers, Metadrop will be there with four sessions and one workshop. Let me detail what will offer to the people coming to the Drupal Camp.

The Form API Workflow

This talk is the same featured in the past Drupal Con and Drupal Dev Days. Yes, I am touring with this talk. I could not be in a rock band touring the world but I least I am a Drupal developer touring Europe. And I don't have to deal with music critics or record sales so I think is better this way.

Come if you want to deep dive into the Form API internals and what happens when a form is being generated, rebuilt or submitted or how AJAX works. 

Friday, 22nd, 18:30 - Minsait Room

La importancia del QA (Control de calidad): Optimización del proceso y herramientas clave

This walk will be Spanish, hence the title in Spanish. My colleague Aberto Fernández will talk about the QA process, why it is important and will provide some strategies that work for us very well to optimize the developing process. QA allows to identify and fix errors sooner saving efforts and resources. We strongly believe in the QA automated tools, the safe net that allows us to focus on the new features and development instead of with with old known bugs or unexpected errors on production. Embrace QA and save your sleep.

Saturday, 23rd, 11:30 - Minsait Room

Managing Complexity: Best Practices for Software Development Project Managers

Development is not the only factor in the success of a project. Jorge Tutor will talk about many other things that are very important for the successful delivery of a project. I honestly believe that development skills are key to this, a company or freelancer without the technical knowledge will struggle to meet the requirements of complex projects, but lack of management skills will bring down the most skilled developer. This is especially true when it comes to projects with many layers and parties involved. Jorge will share his experience and knows very well what he is talking about: scope, risks, stakeholder expectations, budget, team, communication, change management, team morale and more.

Saturday, 23rd, 11:30 - Hiberus Room

Visual Layout Suite para site builders con gran ambición (ambitious site builders)

Visual Layout Suite is one of our big bets for Drupal. The strongly think this module will vastly help content editors to generate their content. You could label it as low-code approach because with no code you will be able to create landings and components with different shapes and look and feel, including for example carrusel of any content. No need to code or add any CSS, everything is already included and ready to be use by the module. Cristian Aliaga, the main developer, and Alberto Ortega, also involved in the development, will explain how this works under the hood and show different usage examples. The module is under heavy development but already ready to be use in production. And if you want more you can always check the session at Drupal Dev Days Vienna (you can find the video in our post about the event). This talk will be in Spanish.

Saturday, 23rd, 12:30 - Hiberus Room

Boosting quality in Drupal

This year, a joint effort has been made to raise awareness of different Drupal testing techniques, with the aim of helping developers to ensure the quality of Drupal projects. There will be three related workshops on Drupal testing: Behat, Kernel tests and PHPUnit.

I will be the host of the first workshop. Behat is a Behavior Driven Development framework based on Cucumber. In our experience, it helps in several areas: first, it allows to define and run automatic tests on our projects. Because Behat is oriented to behavior we test the final result, so you can think of it as integration tests, with all project parts involved. However, I prefer to say Behat provides acceptance tests. And this is one of the key points: because you can write tests using natural language you can agree with the product owner on the expected behavior. And this is a big advantage because it kills any ambiguity on requirements: writing the tests forces to define all the undefined details that many times take lots of effort during development (messages, conversations, meeting to clarify, implementations that doesn't fit the product owner expectations, changes on requisites after realizing what was requested is not what the product needs, etc). 

If you come to this workshop bring a laptop with Docker, Docker Compose (v1), Git, Make and PHP installed and working. We will use Metadrop Boilerplate because it provides out-of-the-box a Drupal site with Behat preconfigured in a container infrastructure.

In the second workshop Óskar Calvo will explain and allow attendees to deal with kernel tests. Kernel tests are a great way to test module functionalities because the allow to have a working database, allowing a full Drupal Bootstrap.  Docker4Drupal will be used, so Docker, Docker Compose and Git are requirements to attend this whorksop.

Last but not less, Pedro Pelaez will introduce attendees to unit testing on Drupal using PHPUnit. Attendees will learn how to write unit tests to check functions, classes and methods, and how to simulate situations, verify results and automatize the testing process. In this case DDEV will be used, so if you plan to attend please install DDEV in your machine.

The workshops will be in Spanish, although non-Spanish speakers may benefit of attending (we will try to help all attendees).

Behat

Saturday, 23rd, 10:30 to 12:30 (with coffee break), AED Room

Kernel tests

Saturday, 23rd, 12:30 to 16:00 (with lunch break), AED Room

PHPUnit testing

Saturday, 23rd, 16:00 to 17:30, AED Room

Sep 15 2023
Sep 15

In this example, I'm building a tool that allows a user to calculate the amount of subsidy that housing associations receive when renovating buildings.

Creating Webform Fields

First, we create a webform and the necessary elements. When creating elements, you have the choice between different types such as text fields, numbers, or radio buttons.

When working with numbers, it may seem logical to choose a number element. However, these have unwanted functionality. If you have the focus on the number field and scroll up or down, for example, to view the rest of the form, the number is decreased or increased. This happened to me a few times without realizing it, which is why I opt for text fields with an input mask. With an input mask, you can determine what a user can enter. When creating or editing a text field element, you can choose what input mask to use under 'Form Display.' For the year, I choose 'Custom...' and then '9999.' This means users must enter 4 digits.

The elements I have added are:

  • Year of construction of the house (text field with input mask '9999')
  • Type of house: single-family or multi-family (radio buttons)
  • The compactness of the building (text field with input mask '9.9')
  • Amount of energy required in kWh (text field with input mask '99')
  • Amount of sustainable energy generated, which should always be 0 or less (text field with input mask '-99')

Displaying Different Results Based on User Input/Choices

Based on the values the user enters, a different 'EPV' value, the subsidy amount per square meter, is displayed on the results page. For example, if a user enters the following:

  • Year of construction: 2018
  • Type: single-family house
  • Compactness: 0.8
  • Energy requirement: 40
  • Generated energy: 0

Then the EPV value will be 1.25 euros.

But if the user provides different input, the EPV value should also change. For example:

  • Year of construction: 2019
  • Type: multi-family house
  • Compactness: 0.6
  • Energy requirement: 10
  • Generated energy: -20

Then the EPV value should be 1.15 euros.

First, we create a text field in the webform that can contain the variable EPV value that we can update. This field, named 'EPV value,' is set to private under the 'Advanced' tab. This means the field is not shown on the form to the visitor. It's also advisable to disable the field so that an administrator can't accidentally enter something during testing.

We set the default value to 'not applicable.' This is displayed when users enter values that make them ineligible for EPV subsidy.

Now we can adjust the value of the 'EPV value' field based on the user's input. We do this by adding various handlers after the form is submitted. These handlers are created in the webform under 'Settings > Emails/Handlers > Add Handler.'

When creating or editing the handler, you can override the value of the 'EPV value' field in the 'Update the below submission data. (YAML)' field. We do this by using the key of the field, which you can find in the elements table under 'Build.' It's the text under the 'Key' heading of the element you want to edit. We use the key 'epv' and override it by putting 'epv: 1.25 euros' in the 'Update the below submission data. (YAML)' field.

We want to ensure that the value is overridden only if certain conditions are met. We can add this under the 'Conditions' tab of the Handler. First, we indicate that the status must be 'Enabled' and that all conditions must be met before the handler is executed.

Next, we add the following conditions:

  • The 'Year of construction' must be 'Less than' the number '2019.' This means the EPV value is updated only if a number less than 2019 is entered by the user.
  • The 'Type of house' must be set to 'single-family' using 'Value is.'
  • 'Compactness' must be 'Less than' the number '1.'
  • The 'Heating requirement' must be 'Less than' the number '43.'
  • The 'Generated energy' must be 'Less than or equal to' the number '0.'

Only when a user enters values in the webform that meet these conditions will this handler be triggered, and the 'EPV value' will be updated. Now it's possible to add multiple handlers that update the 'EPV value' based on other conditions.

Complex Calculation/Formula

The calculator tool also has a complex formula that comes into play when 'Compactness' is greater than '1.' The heating requirement must be (43 + 40 * (compactness - 1)). For example, if the user enters 1.5 for compactness, the entered value for 'Heating requirement' must be lower or equal to (43 + 40 * (1.5 - 1)).

To execute this formula in a webform, we use a 'Computed Twig' element and name it 'Formula' with the key 'formula.' With this field, you can perform calculations and store the result in the field. When creating a Computed Twig element, you enter the formula in the 'Computed value/markup' field in the following format {{ formula }}. In this case, {{ (43 + 40 * (data.compactness - 1)) }}.

Because the result of the formula is stored in the 'Formula' field, we can use it in the conditions of the handlers' requirements. We can create a handler where the 'Heating requirement' must be less than or equal to the result of the 'Formula' field. We do this by calling this result with the following token: [webform_submission:values:formula].

Displaying Results to the User

Now we need to ensure that the user sees the results of the calculator tool. We do this with the 'EPV value' that we have updated via the handlers based on the user's input fields.

As soon as the user clicks the submit button, it's possible to display a message. We set this up under 'Settings > Confirmation' in the webform. In the 'Confirmation message,' you can display the 'EPV value' by using the following token '[webform_submission:values:epv]'. As you can see, we use the 'epv' key that we updated via the handler. The confirmation message can be further supplemented with explanations or by repeating the other entered values.

Drupal + Webform = Low-code Calculator Configurator

As you have discovered, Drupal in combination with the Webform module is extremely suitable for creating calculators with complex logic. By using handlers, conditions, tokens, and the Computed Twig field, you have few limitations as an ambitious site builder when creating such tools.

If you have any questions or comments about the above, please leave a comment below.

Sep 13 2023
Sep 13

A frequent question in the open-source CMS world is a variation of: “Which is better, Drupal or WordPress?” 

There’s not a simple answer to the WordPress vs Drupal question. Many have a strong bias towards one content management system or the other, but often, staunch opinions on the subject are based on a few cursory facts or outdated information.

Both WordPress and Drupal have evolved a lot since their introductions in the early 2000s. In some ways, this evolution has brought them into closer alignment with each other, evidenced by developments such as the porting of WordPress’s Gutenberg content editor over to Drupal in 2018. 

Drupal’s addition of Layout Builder into Core has served as a significant step forward for easily building landing pages using prebuilt components – a feature that’s leveraged by Promet’s Provus® platform.

In other ways, WordPress and Drupal evolutions have clarified distinctions. Generally speaking, though, in the current environment, the majority of sites can be supported equally well by either option. 

Which CMS is More Scalable? More Secure? More User Friendly?

That’s not to say that the WordPress vs Drupal debate doesn’t still spark strong opinions, as both have their devotees.

Promet Source has deep ties to Drupal, and over the past few years, we have broadened our perspectives and talent base to include WordPress advocates and experts. As such, we're well positioned to objectively cover an in-the-trenches comparison of the strengths of each.

Let's start with a few key stats and facts about Drupal and WordPress.

What are the Benefits of Drupal?

A modular CMS written in PHP, Drupal enables developers to leverage a flexible taxonomy system that’s designed to organize complex content types, set highly customizable user permission levels, and ensure web accessibility compliance with enhanced testing and tracking capabilities.

The November 2015 release of Drupal 8 set in motion Drupal’s enterprise-level trajectory. Drupal 8 amounted to a complete architectural overhaul from Drupal 7. Upgrades from Drupal 8 onward are now intended to be incremental, bearing no resemblance to the migration that accompanied the leap from Drupal 7 to Drupal 8. The trend toward steady, incremental upgrades is particularly true with the December 2022 release of Drupal 10.  

Upgrades between Drupal 8, 9, and 10 have continued to solidify and enhance core features, as well as accessibility. Through ongoing revisions and community efforts, Drupal is on a consistently feature-rich trajectory. 

An important example is the availability of no-code/low-code solutions, such as drag-and-drop functionality or component-based design capabilities that are finding their way into Drupal – empowering marketers and content editors with greater possibilities and flexibility for managing their sites. 

Drupal by the numbersSources: BuiltWith, W3Techs, WebTribunal

Drupal's Share of CMS Market

For reasons that include core support for multilingual sites, Drupal is an attractive CMS option government, higher education, large enterprises, and health care institutions – architecturally complex, high-stakes sites that can scale for surges in traffic.

The City of London and the State of New York websites are on Drupal, as is Orange County, California, the U.S. District Court of the Southern District of New York, and Southern Illinois University School of Medicine

Another essential Drupal advantage: a diverse and dedicated community of contributors, as evidenced by 47,350 modules that are available for free download.

Drupal CMS share of market

WordPress dominates the CMS market at every level.\ Drupal's share increases with a site's size and complexity -- from a 1.8% CMS market share overall, to a 7.5% share of the world's top 1,000 CMS sites. Source: W3Techs.com.

WordPress Advantages

While Drupal advantages come into play among architecturally complex sites, WordPress covers a wide spectrum of needs, and its popularity is on an upward trajectory, currently accounting for a 64.3% share of the worldwide CMS market.

Originally developed as a blogging platform, WordPress has maintained its appeal for non-tech types with the advantage of a relatively low barrier to entry. It’s entirely possible to set up a WordPress site without development or coding expertise, experienced developers frequently work within WordPress and leverage their knowledge of HTML, CSS, and PHP to build sizable sites with a greater range of capabilities for both public and private sector clients.

Making steady inroads into the enterprise CMS space, WordPress is now the CMS of choice for an increasing number of heavy hitters such as Sony Music, BBC America, The New York Times, and The Walt Disney Company.  

WordPress offers more than 60,000 of plug-ins to expand functionality, outranking Drupal for ready-to-go themes that serve to fast-track site builds without the need for custom development work.

WordPress by the numbers

Source: 15 Fascinating Facts about WordPress

Among the conclusions to be drawn from WordPress’s impressive internet saturation: it’s a CMS that has proven to be the right fit for a wide range of different needs and has gotten many things right, from more than 60,000 plugins to an easy-to-use CMS. 

Core Distinctions between Drupal vs WordPress

Both Drupal and WordPress offer a depth and breadth of add-ons that extend functionality. These are called "modules" in Drupal, and "plugins" in WordPress. "Themes" that refer to a site’s aesthetics and user experience, such as design, layout, colors and navigation, is a term that applies to both Drupal and WordPress.

Here are some additional distinctions between WordPress and Drupal:

  • Unlike Drupal’s 2015 architectural realignment with the launch of the enterprise-ready Drupal 8, WordPress has never undergone that same kind of overhaul. The resulting difference is that expanded functionality for WordPress occurs at the theme/plugin layer. Much of Drupal’s functionality, on the other hand, is centralized within the ever-increasing core level, as the most frequently used and widely accepted Drupal modules are continuously incorporated into core. 
  • Key Drupal modules that are used to build the majority of Drupal sites, such as Layout Builder, Translations, and URL aliases have been pulled into Drupal 10 core. The result is a greater efficiency associated with finding and installing contributed modules and streamlining development. 
  • Drupal core is becoming increasingly robust, while still allowing for the flexibility of whether or not to actually install core modules.
  • WordPress functionality relies heavily upon themes and plugins, and this can be viewed as an advantage. The vast WordPress collection of themes and plugins provides a high degree of flexibility. 
  • The flipside of flexibility, on the other hand, and a key factor that tends to fuel the appeal of Drupal for architecturally complex enterprise, higher ed, and government sites, is that there is an inherently higher level of security and stability associated with core, vs the contributed module or plug-in layer.
  • WordPress updates can be rolled out automatically without touching the code. This is a useful feature for smaller sites, but at Promet, we do not activate it because on a more complex site, something could break during the upgrade process that would require troubleshooting to unravel and fix. At this point, Drupal updates do not occur automatically, and require the intervention of a support partner or an in-house expert.

Scalability vs Complexity

While WordPress has proven itself to be extremely scalable and the right fit for a multitude of significant sites, the essential distinction which is often missed is not so much size and scalability, but complexity. Even though there are hundreds and hundreds of pages, on whitehouse.gov, for example, the site consists primarily of articles and information. When a greater range of content types and complex data models are required, Drupal proves to be the CMS of choice. 

Acknowledging that both Drupal and WordPress are solid content management systems, and that there’s considerable overlap in the types of sites for which either would provide an excellent solution, Promet recently developed the following matrix in an effort to highlight the relative strengths of both options and open a dialog among our teams.

Here’s what we came up with relative to 10 key criteria.

Drupal vs WordPress comparison matrix

  1. Open Source. Both Drupal and WordPress are solid open-source solutions with great track records.
  2. Lamp Stack (PHP). Both use Lamp Stack PHP equally. Five stars for both.
  3. Enterprise Ready. That’s where Drupal shines. WordPress: Yes and No. It’s applicable for some, not all, enterprise applications.
  4. Dedicated Hosting Partners. Both Drupal and WordPress have dedicated hosting partners, allowing for proactive maintenance, as well as heightened security, speed, and reliability.
  5. Available/Accessible to Novices. With the availability of Layout Builder in Drupal core, barriers to entry have been reduced. Even though developing a Drupal site and understanding how to work within the Drupal interface requires distinct expertise and training, it is now easier to create a Drupal site than it was in Drupal 7 or even 8. Barriers to entry are inherently lower in WordPress. A non-technical hobbyist or small business owner with a touch of know-how can find a theme that fits their needs and figure out how to build and manage a WordPress site, but developing a complex or enterprise-level WordPress site requires development expertise.
  6. Appropriate for a Brochure Site. Even though Drupal sites offer core and contributed modules that enable component building capabilities similar to Elementor in WordPress, there is often not much point in relying on Drupal for a brochure site when other, more appropriate options are available. WordPress was originally developed for blog and brochure sites, and it is ideal for that purpose. This is true for reasons that include it is simply easier to get started in WordPress and the vast number of WordPress themes can eliminate the need for customization.
  7. Complex Content Model. Complex taxonomy content models are where Drupal thrives. Not so much for WordPress, which best serves sites that don’t require the organization of high levels of complexity.
  8. Works for a Tight Budget (Under $10,000). The flipside of Drupal’s ability to navigate complexity tends to be the requirement of considerable developer legwork and ramping up. WordPress offers a greater range of out-of-the box solutions and, depending on requirements, it’s quite possible to build a respectable Drupal site for under $10,000.
  9. Design Theme Availability. Drupal has a limited number of design themes that are ready out of the box. While Promet has created a Drupal theme within the Provus® component-based design system, WordPress has an extensive and robust selection of design themes.
  10. Community. Drupal is powered by a professional community of dedicated developers, who regularly gather for training and information exchange at events, camps, and meetups all over the world. While there are many professional WordPress events, the WordPress community is more diverse and less cohesive.

Tracking the Evolution

Among those of us whose history in the CMS trenches dates back many years, it’s been very interesting to witness the evolutions of both Drupal and WordPress. 

Selecting the right CMS calls for careful consideration and expert analysis. The Drupal vs WordPress conversation does not lend itself toward across-the-board rules or easy answers. In fact, the judgment and expertise of anyone who suggests that Drupal is always the answer or that WordPress is always the answer should be considered highly suspect.

As the saying goes: “When all you have is a hammer, everything looks like a nail.”

WordPress and Drupal each have a distinct place at their respective ends of the CMS spectrum, with hobbyist or small business sites on one end and complex, government and enterprise-level digital experiences at the other. The vast middle ground between these two ends can be highly nuanced with no easy answers, but there’s a likelihood that either Drupal or WordPress would work equally well.

The main thing is the assurance that true experts with a depth of perspective and commitment to client success are doing the work. 

Interested in an expert analysis of the CMS that stands to represent the right fit for your organization’s distinct objectives? At Promet Source, we have the right people to help with that. Let's talk!

Sep 12 2023
Sep 12

Authored by: Nadiia Nykolaichuk

Drupal 10.1 is a truly outstanding release for advancements in the front-end development realm. The first ground-breaking innovation that comes to mind is Single Directory Components (SDC), which burst onto the scene bringing brand-new practices for creating and managing UI components. 

However, there is yet another brilliant solution meant to significantly simplify theming practices — the new Development Settings page in the Drupal 10.1 admin dashboard. It enables theme builders to make some essential Twig and cache settings in a few clicks with no longer having to do tedious edits in files. Let’s see in more detail how it all works.

A glimpse at why the special Twig and cache settings are needed

The Twig and cache settings mentioned in this article are the cornerstone of efficient, seamless, and accurate theming:

  • Twig, the default template engine in Drupal since the release of Drupal 8, is a fundamental tool with a clean and logical syntax for crafting templates for each page element. During the theming process, the Twig development mode needs to be on, which provides a number of additional mechanisms for hassle-free debugging and optimizing your workflows so you can deliver high-quality themes quickly and efficiently.
  • Caching is a proven technique of speeding up page loading times that works by storing frequently accessed data for quick retrieval. Drupal is known to have a set of powerful caching layers. However, during development, you need to immediately see the results of changes you make to templates, styles, and content. These changes may not be reflected right away with active caching because you have to wait for the caches to expire. Therefore, the best theming practices require the various caching mechanisms to be disabled. 

We’ll now show you how the newly introduced Development Settings page helps you manage the Twig development mode and cache settings. We’ll also provide some more specific details about each setting along the way.

Introducing the new Development Settings page in Drupal 10.1

“The UI has logical defaults and is simple enough to be understandable by newbie developers while offering the granularity that senior developers may require”

- Mike Herchel, a contributor to the new page

The new page provides a set of super simple checkboxes for managing the Twig and cache settings in the Drupal admin UI. You can find this page at Configuration > Development > Development settings. 

The checkboxes are unchecked by default because they should only be enabled on development environments and never on a live website, for which there’s a useful reminder on top of the page. Initially, there are only two checkboxes but two more appear once the first one gets checked.

The new Development Settings page in Drupal 10.1 with checkboxes unchecked.The new Development Settings page in Drupal 10.1 with checkboxes unchecked.

The checkboxes are:

  • Twig development mode

The Twig development mode gives you access to debugging features and settings that help you identify and resolve issues quickly. By enabling the “Twig development mode” checkbox, you expose and automatically enable two additional checkboxes for Twig’s development settings. You can always choose to select or deselect any of those individually. They are as follows:

  • Twig debug mode

The Twig Debug Mode provides a dump() function, enabling you to inspect variables and data structures in real time. In addition to that, by checking the “Twig debug mode” checkbox, you’ll have template suggestions exposed via HTML comments and your Twig templates will be automatically recompiled after any changes are made. 

  • Disable Twig cache

Twig cache stores precompiled templates, speeding up website performance in a production environment but can hinder dynamic changes during development. Disabling the Twig cache ensures your Twig templates are not cached and are recompiled on every request so you can immediately see the impact of your changes.

  • Do not cache markup

The final checkbox on this page is meant to disable 3 layers of Drupal markup cache (the caching of the final HTML output of a webpage) — the render cache, the dynamic page cache, and the page cache. This ensures that any changes made to the markup and content are immediately reflected in the rendered output, giving you accurate and real-time previews of your changes during development.

The new Development Settings page with 2 more checkboxes exposed and all checkboxes checked.The new Development Settings page with 2 more checkboxes exposed and all checkboxes checked.

Warnings on the Status report page

Since the above-described settings are meant for development environments, Drupal gives you warnings when they are applied. If you go to Reports > Status report, you’ll see warnings about the markup caching being disabled and the Twig development mode being enabled. This is to make sure you don’t forget to revert to the defaults when the development and testing phases are over and the website is ready to go live.

Warnings about the development settings on the Status report page.Warnings about the development settings on the Status report page.

Why the new page was needed and how it was created

Simplifying the front-end experiences

“If you’re a front-end developer, you now owe Matt a beer,” — that was the “PS” line written by Mike Herchel in his article dedicated to the new Development Settings page, referring to Matt Glaman as the person who came up with the idea and concept and wrote most of the code. 

Matt and Mike, well-known Drupal contributors who laid the cornerstone for the new page, had the key goal of making the life of front-enders, especially newbies, much easier, as well as attracting more developers to Drupal. For example, front-end developers that come to work with Drupal instead of WordPress or Next.js need a delightful experience that would make them want to work with Drupal again, writes Matt in his own article about the new Development Settings page. 

From the idea to the making

It all began when Matt Glaman created the issue on drupal.org a little over a year ago, describing the need and concept of the new page. However, it wasn't until April of 2023 when Matt and Mike met at MidCamp that the wheels started turning. Mike shared that they sprinted for a little while as Matt wrote the code, and he had several hallway conversations to figure out the way to output those settings in the Drupal admin dashboard. 

Overall, it took a little more than a year to go from an idea to implementation, with valuable input from many other contributors for user experience feedback, testing, and code contribution. Finally though, the page successfully landed in the Drupal 10.1 core.

A glimpse at the tedious workflows replaced by the new page

Matt Glaman’s article, which is focused on the technical details of the new solution, describes the overhead of the traditional steps of managing the Twig debug mode and cache settings.  The difficult workflows eventually became the inspiration for the idea of creating a new UI that would enable anyone to do the same things in a few clicks.

For example, calling Drupal’s cache “amazing for production performance but a roadblock for local development,” Matt overviews the current steps for bypassing the cache layers in a local environment:

  • To bypass the markup caching, one must be familiar with the sites/example.settings.local.php file and be ready to perform as many as 7 steps of the setup. 
  • Next, to bypass Twig's template caching, a developer has to open the sites/development.services.yml file and do a 6-step setup. 

The steps require a deep understanding of the details of Drupal’s file system and are definitely challenging for anyone who has not been working with Drupal for quite some time. And even for those who have, the new UI comes as a huge time saver and workflow optimizer.

Final thoughts

The new Development Settings page in Drupal 10.1 fully aligns with the overall trend to automate tedious work and focus on creativity instead. Being set free from the hassle of multi-step file edits and having a smoother, faster, and more reliable workflow, theme builders can have more time and inspiration to make their themes shine. Anyone who’s just embraced Drupal and is new to its front-end development secrets is much more likely to stay for a long time or forever, even. 

It’s amazing to observe how Drupal is actively optimizing its front-end experiences, so stay tuned to check out our article with a summary of all recent Drupal advancements for front-end development in the near future!

Sep 12 2023
Sep 12

Sub-theming has been an integral part of Drupal development over the years. It’s a process of inheriting a parent theme’s resources. 

The Starterkit theme for Drupal 10 adds a new method for developers to implement a starting point for a project’s theme. 

Prior to Starterkit, a developer would create a sub-theme either manually or in some cases, contrib themes provided a drush command to automate the process. Now that Starerkit is in core, this brings theme creation to a wider audience. 

Starterkit architecture 

A default Starterkit generated theme inherits from a core theme called “starterkit_theme” which in turn uses the core theme called “Stable9” as its base theme. The end result for your Starterkit generated theme is similar markup and CSS previously provided by the Classy base theme. However, instead of inheriting the markup and CSS from a base theme, the Starterkit theme generator copies the defaults into your new theme. 

Why Starter Kit

  1. Drupal core’s Classy theme is deprecated in Drupal 10 and is now a contrib theme for existing projects that use it as a dependency.  The Classy project page states that for Drupal 10, Starterkit is the way forward if you want to have all the benefits of what used to be Classy in core.
  1. Starterkit gives a better onboarding experience for new developers by reducing the efforts needed to build a project theme starting point. 
  1. Core maintainership is changed to individual theme maintainers which will help with faster innovation and frequent updates.

Prerequisites

    • A Drupal 10 installation 
    • PHP installed with a minimum version set to PHP 8.1. Starterkit uses PHP to generate your new theme. 

Theme generation using command line interface.

Run the below command relative to your project’s root (docroot, web). This will create a new theme with the name specified under “themes/ my_new_theme” 

php core/scripts/drupal generate-theme my_new_theme

You can also provide a specific custom theme path by using the “–path” argument in the script command.  

php core/scripts/drupal generate-theme my_new_theme --path themes/custom

The Output will be as below. 

Starterkit-folder-structure

On the other hand, You can get reference to see all configuration options 

You can see all possible Starterkit options by running the help command below 

php core/scripts/drupal generate-theme --help

Custom starterkit theme generation

In the previous example it was using the default theme i.e., “starterkit_theme” this was part of Drupal core.

But In order to use the custom/contrib theme as starter kit then It should have the line containing “starterkit: true” to the theme’s source_theme_name.info.yml file. 

In the example below, we use Olivero as an example starting point, but noting that there is a core issue open to make Olivero Starterkit ready. 

Olivero starterkit

The command will look as below with the option “–starterkit” and using olivero as a starterkit generator theme 

php core/scripts/drupal generate-theme customstarterkit_theme --path themes/custom --starterkit olivero

And the theme will look like this: 

Olivero generated theme

Conclusion

With the advent of Starterkit in Drupal 10 core, this brings vast improvements to theming by reducing dependencies such as Classy. Starterkit provides a great starting point for themers and implies that Drupal is a continuously evolving CMS and on the right path. Yet another enhancement to make a Drupal developer’s workflow easier. 

  1. Starterkit theme https://www.drupal.org/docs/core-modules-and-themes/core-themes/starterkit-theme
  2. Allow starterkit theme generator tool to clone Olivero   https://www.drupal.org/project/drupal/issues/3301173
  3. New starterkit will change how you create themes in Drupal 10 https://www.drupal.org/about/core/blog/new-starterkit-will-change-how-you-create-themes-in-drupal-10 
Sep 11 2023
Sep 11

Restarting an in-person camp after three years of pandemic postponement has been a huge challenge. 

We initially had cancelled our 2020 Camp due to the scheduled presence of DrupalCon Minneapolis. When the pandemic forced DrupalCon online, we were grateful that we (at the very least) did not have to worry about cancelling our Camp as well. 

What we didn't expect, however, is how long the pandemic would continue to affect in-person conferences. By the time we were ready to restart our Camp, it had been a full 4 years since the last one! Getting the ball rolling again took some effort.

We were fortunate to still have some money left over to begin camp planning. But so many things had changed. Our previous venue was no longer an option, forcing us to find a new location. Some of our previous sponsors and attendees had moved on to other things. Any moment we had used to carry us into the next year was long gone. We were all older, and everything seemed to cost a bit more. 

Starting in late 2022, we conducted a survey of past attendees, asking them what they wanted out of an in-person conference, if they were still interested in attending, and what kind of format made the most sense.

One of the big changes we're trying out this year include a move to a 2-day, weekday only schedule. So many more attendees these days are coming on behalf of their employers (versus hobbists), and attendance frequently dropped in half for our Saturday sessions. So we moved the schedule to Thursday/Friday. 

While attendance is sure to be less than pre-pandemic numbers, we are well over 100 attendees to date, and hope to gain a few more in these last few days. More importantly, we've restarted the engine, and put Twin Cities Drupal Camp back in action. The hope is that next year (assuming we have it) will be easier to maintain, and hopefully continue to grow our community.

Pages

About Drupal Sun

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

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

See the blog post at Evolving Web

Evolving Web