Planet Drupal

Specbee: How to perform Automated Backups on a Drupal 8 (or 9) Website

1 week 1 day ago
How to perform Automated Backups on a Drupal 8 (or 9) Website Aaditya Walawalkar 09 Mar, 2021 Top 10 best practices for designing a perfect UX for your mobile app

Different Drupal developers have different techniques to backup their Drupal websites. In this article, we will be talking about two of my go-to methods to backup a Drupal 8 or Drupal 9 website. One with the help of the Backup and migrate Drupal module. And the other way is with Cron jobs using CLI. 

Data loss can be brutal and devastating, no matter who or what caused it. The good news is that it can be prevented by taking regular backups of your site. Sometimes, backups are done every day and sometimes, occasionally. The regularity depends on various factors like the size of your Drupal site or how often you update the website. Luckily, Drupal 8 and 9 provides you with easier options to backup and restore your website with the help of the Backup and migrate Drupal module and via CLI.

Using the Backup and Migrate Module for Drupal 8 and 9

The backup and migrate module can backup both database as well as files. It can also backup the entire Drupal application folder. The module also has an encryption feature which requires you to download an additional library called the Defuse PHP encryption library-

composer require defuse/php-encryption Steps for usage:
  • Install the Backup and Migrate module.
  • Create a private directory and assign with writable permissions (similar to what we’d give to the files folder).
  • Set the path of private directory in settings.php file so that the module can use it for storing the backups.

UI for the Backup and Migrate Module

Once you install the module, head to Administration -> Configuration -> Development -> Backup and Migrate. You will see 5 tabs:

Backup – where you can do quick backups. Once you click on Backup now, you will be able to see it in the Saved Backups tab.
Restore – where you can restore the earlier backups
Saved Backups – will have the list of all the backups you have taken so far
Schedules – where you can schedule your backups
Settings – contains general settings and options for this module

Schedules:

This is one of the most important features of the module. The module provides an automated scheduler where you can schedule your backup. This runs automatically during every cron run. You can add as many schedules as you want, to take backups of the database, public or private files directories or the entire site.

Viewing all the Schedules

Configuring the Schedule

Here is where you can add or edit the schedules. You can give a name for the schedule. There’s an option to enable or disable the scheduler. Select one of the various backup sources like the database, public or private files, directories, or the entire site. Or add your own in the Settings tab. If you are backing up both the database and files, you can have different backup destinations configured for each of the backup type. This means you can have a different destination for the database backups, a different destination for the file backups, and such. The module also provides configurations for adding more destinations of your choice in the Settings tab. The Frequency option lets you specify how often you want a backup to take place as a cron job. You can select options from hours, minutes, days, and weeks. The Numbers to keep option allows us to specify the number of backups we want to keep. It automatically deletes the older backups once it reaches the limit that you set, thereby solving memory and storage problems. 

Configuring the Schedules

Adding your Backup Source

Are there any limitations?

Sadly, yes. As per my personal experience, I’ve noticed that when the database size grows, I do run into Time-out errors. And this is a problem because on certain servers, we cannot increase the maximum execution time for the database to execute. The other issue that I have faced is memory issue. It may run out of memory in some cases depending on the configuration of the server or the database size or the size of the backup. When we run into such issues, we can use the CLI method.

The CLI Method to Backup 

In the command-line interface method, we can perform backups using these two methods:

  • Using Drush in combination with the Crontab
  • Using Native commands and Crontab depending on what we need to backup.
     

Using Drush and Crontab

Scenario: Scheduling a database backup at 3 a.m. every morning –

Format:

0 3 * * * -r sql:dump --result-file=.sql --gzip

Example:

0 3 * * * /var/www/html/drupal_demo/vendor/drush/drush/drush -r /var/www/html/drupal_demo sql:dump --result-file=/var/www/html/drupal_demo/db-dump-`date +%d%m%Y%H%M%S`.sql --gzip

Using Native commands and Crontab

Scenario: The same one - scheduling a database backup at 3 a.m. every morning -

Format:

0 3 * * * mysqldump -u -p | gzip -c > .sql.gz

Example:

0 3 * * * mysqldump -u drupal -p drupal_demo | gzip -c > /var/www/html/drupal_demo/db-dump-`date +%d%m%Y%H%M%S`.sql.gz

Scenario: Scheduling a Files backup at 5 a.m. every morning -

Format:

0 5 * * * tar -czvf .tgz

Example:

0 5 * * * tar -czvf /home/ubuntu/backups/drupal_demo-files-`date +%d%m%Y%H%M%S`.tgz /var/www/html/drupal_demo/web/sites/default/files/

Backups are not just essential when you need to migrate your website. Taking regular backups is the best thing you can do to protect yourself from data loss. And it doesn’t have to be a tedious job when Drupal 8 (and 9) offers you with modules that can help automate backups. The Backup and Migrate module and the CLI method we discussed here, are my two most recommended methods to automate your backups. Curious to know how we can implement such amazing Drupal modules and features for your next project? Talk to our Drupal experts today.

Drupal Drupal 8 Drupal 9 Drupal Development Drupal Planet Drupal Tutorial Shefali ShettyApr 05, 2017 Subscribe For Our Newsletter And Stay Updated Subscribe

Leave us a Comment

  Shefali ShettyApr 05, 2017 Recent Posts Image How to perform Automated Backups on a Drupal 8 (or 9) Website Image How to Export/Import Menus, Custom Blocks & Taxonomies with the Drupal 9 (& 8) Structure Sync Module Image Drupal Project Management: What No One Is Talking About Want to extract the maximum out of Drupal? TALK TO US Featured Success Stories

A Drupal powered multi-site, multi-lingual platform to enable a unified user experience at SEMI.

link

Discover how our technology enabled UX Magazine to cater to their massive audience and launch outreach programs.

link

Discover how a Drupal powered internal portal encouraged the sellers at Flipkart to obtain the latest insights with respect to a particular domain.

link

OpenSense Labs: Everything Is Better With Some JS on The Head: Progressively Decoupled Drupal

1 week 1 day ago
Everything Is Better With Some JS on The Head: Progressively Decoupled Drupal Gurpreet Kaur Tue, 03/09/2021 - 18:00


The 21st century is a pretty marvelous time to live in. There is so much that can be achieved today with limitless possibilities. There aren’t any inhibitions found in people. If we want it, we get it. I mean the 21st century folks have landed on Mars, so is there anything that we can’t do? I think not. 

If you look at all of our accomplishments, you’ll find that technology is at the root of it all. It is the advancements we have made in science that has allowed the present time to be as marvelous as it is.

Talking about all of these technologies would take as long as a year, even if I do it succinctly. So, I’ll not get into it. However, I will talk about one segment of tech that has had a profound effect in the way we surf the web. And it is the web development process. 

To be concise, I want to discuss a trend in web development that has aided the developers, designers and project managers to build to their heart’s desire without having to rely on one specific technology, which used to constraint them. It is a trend that eliminates restraint and promotes innovation. 

Let’s find out what it is. 

The Drupal Prequel

Before I get to the main agenda of this blog, I felt like I needed to talk about the underlying technology, which is Drupal. Being a content management software, Drupal ticks all the right boxes when it comes to building versatile web experiences. 

To build websites from the ground up and being completely responsible for all of the site’s aspects is deemed as Drupal being traditional or monolithic. What it means is that Drupal would have total control over a site’s technological stack. The front end and all the presentational aspects along with the back end and all of its data layers would fall within the realms of Drupal. Such use of Drupal is quite sufficient for standalone websites and applications, where editorial needs surpass developers' needs and the former seeks complete control over all the visual elements of the page. With Drupal offering features like in-place editing and layout management, I don’t disagree with wanting such control. 

However, what happens when the developers want to start implementing the current technology on the front end? What happens when the site needs more interactivity than before? Wouldn’t React or Angular seem like a better option to achieve that? 

I think they would and that brings me to the trend I was talking about in the introduction, being Decoupled Drupal.

Unfettered innovation and Decoupled Drupal 

Decoupled Drupal essentially removes the link between the frontend and backend and makes the developers free to do what they want with the presentation layer of the site. The reason for this separation is the flexibility it gives to the architectural development, empowering the front end developers to have total control over the projects’s rendered markup along with the user experience.

It’s not just the control over the frontend layer that motivates developers to push for decoupling, there are plenty of other benefits that make the feat of decoupling too good to give up. 

These include; 

  • Building impressive features through server-side rendering or Node.js; 
  • Securing data through a publicly inaccessible CMS; 
  • Publishing your content on all forms of IOT devices; 
  • Increasing the speed and efficiency of work with a clear separation of concerns and duties, less interdependence and less hassle; 
  • Updating the software becomes quicker too, without any impact on the working of the other end;
  • Finally, being able to take advantage of the rich JavaScript framework or a static site generator of your choice for an immaculately interactive site. 

All of these advantages of decoupling have made the trend to follow. Depending on your need, decoupled Drupal has the potential of building your project with its inbuilt web services and APIs. REST, JSON:API, and GraphQL are the prominent contenders in this regard so that the flow of information from the front to the back is seamless.

With decoupling, it is also easy to find the right personnel for your project. When you are building a frontend with JavaScript, you would need developers fluent in JS, and it is a well known fact that there are far more JS developers than Twig.

However, decoupling Drupal can also leave you in a bit of conundrum as well. The thing is when you decouple Drupal, you are saying goodbye to many of the out-of-the-box features Drupal offers such as layout and display management, content previews and certain security features. Some of these can be written from scratch by your developers, but there are more than a few that cannot be compensated for. 

So, in a situation like this how do you lessen the losses? How do you ensure that you get the unfettered innovative edge on the front end and still be able to reap the benefits of Drupal’s frontend capabilities? 

The Middle Ground: Progressively Decoupled Drupal

How to decouple Drupal? There is a perfectly reasonable answer to the decoupling dilemma and it lies in its categories. Decoupling Drupal can be achieved in two different aspects. 

  • The first one is when you decouple completely, totally extracting the frontend from the backend. This is called fully decoupled Drupal architecture. It can be done for dynamic sites using JavaScript or for static sites by relying on static site generators like Gatsby and Metalsmith
  • In the second approach, you will separate the presentation and data layers, however, there won’t be total interdependence between the two. By this, I mean some aspects of the front end would be developed outside of Drupal and the remaining would house inside of Drupal. This is called progressively decoupled Drupal architecture. 

In the first approach, with a total separation you would have to part with Drupal’s out-of-the-box features on the frontend, there is no going around it. However, when you take up the second approach, which is to progressively decouple Drupal that won’t be the case. You would get to play with other front end technologies, yet enjoy all the functionality Drupal has to offer. More on best frontend technologies for decoupled Drupal here.

You must be wondering how that becomes possible, and let me tell you that. 

When progressively decoupled Drupal is in the picture, you get to build a frontend using Drupal and all its out-of-the-box features. Once you have done that, then you can layer a JavaScript framework on top of the layer you have built. 

It is important to understand that in progressively decoupled Drupal, it is up to you and your needs to decide the kind of responsibility you are to dole on JavaScript. The JS layer on top of the Drupal frontend could be responsible for rendering an independent block or component on a single page or it could go as far as to render every single aspect of that page. 

The kind of progressive decoupling you would do, would have a direct impact on the kind of control your editors would have. More JavaScript rendering would mean less editor control because Drupal’s administrative capabilities would diminish on the frontend, while less JS rendering would automatically mean more room for Drupal’s administrative capabilities and more power to the editors.  

Progressively decoupled Drupal is indeed the perfect balance between advanced frontend technologies and the powerful capabilities of Drupal. You would not need to compromise on one to get the other. The reference of the middle ground for web development in the decoupled sense is an accurate description of the progressive architectural approach.

But how do you decide whether taking up progressive decoupling is the better choice. The question progressively decoupled Drupal or fully decoupled Drupal can often prove to be quite difficult to answer, yet we have to try. So, let’s do just that.

Think of the Editors or the Developers?

For any web project, be it a site or an application, there are two important players. These are the people who bring the project alive, being the developers, and the people who become the voice of the project, being the content authors and editors. So when deciding whether to go for coupled, fully decoupled or progressively decoupled Drupal approaches, you have to keep them in mind. 

For the editors, you have to think about; 

  • The kind of ease they would need in manipulating page content and layout; 
  • The kind of in-context tools they would require; 
  • The kind of accessibility they would need in Drupal’s HTML by default; 
  • And the kind of previews they would be in need of without custom development

For the developers, you would have to think about; 

  • The king of control they want over the frontend presentation; 
  • The kind of server-side rendering they want; 
  • The kind of APIs they want to write JavaScript;
  • And the kind data security they want.

Assuming the editors want it all, an ease of manipulating page content and layout, tools like in-place editing and contextual links, the ability to preview unpublished content and a constant access to content. Now, assuming that the developers also require the same kind of ease, with control, with the ability to choose between server-side rendering and Node.js built features, with JSON:API at work and a publicly inaccessible CMS. 

If that is the case, progressively decoupled Drupal architecture would help you give the best to both your developers and editors. The developers would be able to adopt JavaScript for portions of the pages and satiate their appetite for interactivity and advanced development. At the same time, the editors would be able to work without any blocks with all of the Drupal features they always wanted. A win-win situation for the crucial players. 

OSL and A Progressively Decoupled Drupal Project

We, at OpenSense Labs, have worked with a global brand, Produce Market Guide (PMG) to cater to a specific need by performing progressive decoupling. 

PMG is a leading name in the market for producing commodity information, trends and data analysis. A part of the Farm Journal family, but aimed to provide an advanced and enriching experience to its users. However, because of a slow search feature that was becoming impossible. 


Other than that, the site was functioning pretty well with Drupal. So, in order to rectify the slow search feature, a progressively decoupled Drupal approach was implemented by OSL. using React and elastic, the new search function was built and this improved the time it took to present the result to mere seconds. Look at the detailed case study for PMG for a clearer picture of the project. 

This was one project that made our developers understand decoupled Drupal a lot better. The fact that you do not have to build an entire front end from the ground up is a prominent benefit of the progressive approach. Using JS for just one function, making it as advanced and interactive as possible, and calling it a day is essentially how progressively decoupled Drupal works. And I think there are very few architectural approaches better than this one.

The Final Verdict 

I want to conclude by giving you another example. 

“Imagine you have a site that needs a lot of interactive elements that would encompass user choices and give the user the option of getting a personalised experience based on his history, with future recommendations. Also, imagine that your site has a lot of traffic and a lot of content to manage for which you are bound to need highly competent content management and site building tools.”

For such a site, neither the coupled Drupal architecture would work, nor would the fully decoupled architecture work. It needs a balance of the two. 

Why?

Because Drupal alone cannot build a highly interactive site like this one, it would have to rely on JavaScript and the likes. However, with high traffic, a lot of the data is often cacheable and Drupal is equipped to handle that very well. If the content isn’t handled properly, the performance of the site would be affected drastically. That is why a middle ground has to be chosen and progressively decoupled Drupal is just that. I wouldn’t be totally wrong in saying that the future of decoupling Drupal could lie in doing it progressively. Do you agree?

blog banner blog image Drupal Progressively decoupled Drupal Decoupled Drupal Frontend technologies Blog Type Articles Is it a good read ? On

Droptica: How to Create TODO Lists in Drupal? The Checklist API Module Overview

1 week 1 day ago

A to-do list is the primary tool of a productive person. It helps in everyday work and allows you to carry out your duties better. As it turns out, some of its elements can also be entered into the administration panel of a Drupal website.

In this article I'll take a closer look at the Checklist API module, which provides Drupal users with an interesting implementation of a TODO list.

Dates

The first alpha release of the module was introduced in 2012 for Drupal 7. The stable version 1.0 was released several months later. To date, 12 stable versions have been created – including the newest, marked as 2.0, for Drupal 8 and 9.

Popularity

Even though the Checklist API module isn't very popular, it has become quite recognisable over the years. Currently, according to the official statistics, it's used by over 30 thousand Drupal-based websites, 63% of which are the 7.x-1.x branch.

Module's creators

The module is maintained by Travis Carden from Acquia, a very active member of the Drupal community. Besides him, 11 other people have also participated in the project so far. About 170 commits were created in total.

Purpose of the module

The Checklist API module is used to create lists with checkboxes. The status of the task execution is saved to the configuration or to the State API, and it can be modified using the code. Checklist API can be employed to build a to-do list, but that is only one way to use it.

In the case of the Droopler distribution, the Checklist API module was used as a mechanism supporting the update process. When automatic processes fail, we advise the user to perform the operations that aren’t checked on the list manually. There are detailed instructions and links available for them:

Checklist API is used by many tools for checking websites in terms of SEO and quality, including SEO Checklist and QA Checklist.

Unboxing

The module is available on the Drupal.org website. You can install it both via Composer (using the composer require drupal/linkit command) and from the .zip file available on Drupal.org.

Module's use

After running the Checklist API module, you'll probably be surprised by the fact that it doesn't have any administration panel. New lists can only be created via the API. This is done using a hook – hook_checklistapi_checklist_info().

Here is an example of a hook that adds a simple to-do checklist when publishing a new website:

/** * Implements hook_checklistapi_checklist_info(). * * Defines an example deploy checklist. * . */ function mylist_checklistapi_checklist_info() { $definitions = []; $definitions['mylist'] = [ '#title' => t('Website deploy checklist'), '#path' => '/admin/config/development/website-checklist', '#callback' => 'mylist_checklistapi_checklist_items', '#description' => t('An example deploy checklist for the website.'), '#help' => t('

This is an example deploy checklist for your website, provided by the hook_checklistapi_checklist_items().

'), '#storage' => 'state', ]; return $definitions; }

This hook references the mylist_checklistapi_checklist_items function, which returns a multidimensional array. You divide the checklist into tabs with tasks. Each defined task can have a description and a list of links to help the user perform it:

/** * Implements callback_checklistapi_checklist_items() for mylist. */ function mylist_checklistapi_checklist_items() { return [ 'tab1' => [ '#title' => t('Drupal admin panel'), '#description' => t('

Set up the Drupal installation for PROD environment.

'), 'aggregate_css_js' => [ '#title' => t('Enable JS/CSS aggregation'), '#description' => t('Enable optimization of the site assets, it is crucial for page speed.'), 'handbook_page' => [ '#text' => t('Performance options'), '#url' => Url::fromUri('base://admin/config/development/performance'), ], ], 'disable_devel' => [ '#title' => t('Disable "devel" module'), 'handbook_page' => [ '#text' => t('Module list'), '#url' => Url::fromUri('base://admin/modules'), ], ], ], 'tab2' => [ // ... ], ]; }

After calling the above code, every authorised user of the website will get access to the new checklist. When they uncheck subsequent items, they'll obtain clear information about the level of completion of tasks:

Defining the content via code has one major advantage – the ability to manipulate tasks, including automatically marking them as completed. Looking at the example above, you could write a module that will check by itself whether the CSS/JS aggregation is enabled and if the "devel" module has been uninstalled. This way, the potential user will save a lot of time.

Here's an example of a piece of code that loads the checklist and enforces its initial state. If the "devel" module is active, the relevant checkbox will be checked automatically.

$handler = \Drupal::service('module_handler'); $checklist = checklistapi_checklist_load('mylist'); $progress = [ 'tab1' => [ 'disable_devel' => $handler->moduleExists('devel'), ], ]; $checklist->saveProgress($progress); Summary

Checklist API is very useful for carrying out repetitive tasks, such as those you perform when publishing a new website. The module can also be used as a tool supporting security monitoring and website optimisation.

With little effort, Checklist API provides plenty of possibilities and a convenient interface for non-technical users. I definitely recommend getting better acquainted with its functionalities.

Matt Glaman: Getting phpstan-drupal PHP 8 ready starts, now!

1 week 2 days ago

This week I will be kicking off development for phpstan-drupal after Florida DrupalCamp astoundingly met my funding goals. Since this open source work and I am being funded publicly, I plan to do as much development over live streams as possible. I really enjoy live coding, and I hope it helps teach folks some tricks.

I have been using YouTube for my scheduled live streams, but I plan on giving Twitch a try. If you'd like to pop in and watch along as I work on the testing matrix for phpstan-drupal, follow me and get notified when I go live: https://www.twitch.tv/mglaman. I plan on going live at least every Wednesday at 1 PM CST (7 PM UTC) for two hours.

Tag1 Consulting: On 20 years of Drupal...An interview with Greg Lund-Chaix

1 week 2 days ago

As we continue to celebrate the 20th anniversary of Drupal, we approach the project from a different angle. Today’s Tag1 Team Talk guest is Senior Infrastructure Engineer Greg Lund-Chaix. Greg’s experience includes not only Tag1, but wealth of experience gained in the Oregon State University Open Source Lab. While Greg’s name may not be prevalent in Drupal’s code, his contributions have nonetheless helped Drupal become what it is today. In this talk, Managing Director Michael Meyers interviews Greg to help us understand one of the ways it’s possible to contribute to Drupal without writing Drupal code itself. For a transcript of this video, see Transcript: 20 years of Drupal - Greg Lund-Chaix. ### Related content In the coming weeks, Tag1 will be featuring Team Talks with some of its long time Drupal contributors. Check back here, or follow the blog to see these interviews as they become available: - Jeremy Andrews - Doug Green - Fabian Franz - Narayan Newton - Francesco Placella - Greg Lund-Chaix - Marco Molinari - Michael Meyers - [Moshe Weitzman](https://www.tag1consulting.com/blog/interview-moshe-weitzman "Moshe...

Read more lynette@tag1co… Mon, 03/08/2021 - 07:24

Flocon de toile | Freelance Drupal: Prevent unsolicited mass submissions on its Drupal 9 (or Drupal 8) site

1 week 2 days ago

Several anti-spam solutions exist on Drupal to prevent the submission of forms (contact, newsletter subscription, etc.) by more or less well-intentioned robots. Without wanting to be exhaustive, we can use the Honeypot and Antibot modules which provide (different) non-intrusive defence mechanisms, or the captcha / recaptcha modules which ask the visitor to respond to different challenges before allowing him to submit the form.

OpenSense Labs: Web development planning with Drupal 9

1 week 2 days ago
Web development planning with Drupal 9 Akanksha Mehta Mon, 03/08/2021 - 16:58

As a business, once you start with something, it becomes almost impossible to retrace your steps and retrospect on your choices or alter the decisions that you took in the past - especially if one little move holds the capacity to affect both you and your audience exponentially. Hence, optimum planning is necessary for each aspect that your organisation is working towards, including web development for your online presence.

To keep pace with the digital world, more and more businesses are showing up online to grab more eyeballs and solidify their market value. A facilitator in this process is Drupal 9 - and a quite popular one at that owing to its flexibility and scalability. Drupal 9 presently is in use across several industry verticals and powers thousands of websites. 

While there’s a lot that goes into the general process of web development, simplifying the process by placing all your thoughts methodically is always possible. This list is intended to serve both as an exhaustive guide and as a checklist representing the correct chronology in which web development needs to be approached.

Defining the Purpose

The very reason that you’re getting into web development is because you have a purpose in your mind, but what’s essential is to define that purpose. This is required both for your future team and for your audience to understand and resonate with your brand better. Your target audience along with your unique value proposition must be clearly outlined along with your short term and long term goals, including both value addition and business targets. The defined goals should be measurable, relevant to your business value, time bound, and lastly, be attainable in the time allocated. While planning the execution, defining ways to measure the success of each campaign is also equally important.

A blueprint will only help you proceed with web development in a defined, synchronised manner - essential for managing future growth and expansion.

Picking the right team

After defining the purpose, the next step in web development planning would be to pick a team that brings these targets to a tangible completion. Depending on your business, the team would vary in terms of manpower and skillset. If your business focuses on UX (User Experience), you would want to have designers on board. If it focuses on sales of a product or a service, more marketers would be required. Nevertheless, the team that you tentatively need would comprise

  • a project manager for keeping things on the track, 
  • content creators to provide written and other media content, 
  • a content strategist/architect to plan priorities organise the site,
  • Designers to plan and design the layout,
  • Developers - both frontend and backend.

Refer to all the different roles and skills integral to building a Drupal 9 website here. And, for the decoupled Drupal project, you can check out all the right skills here.

Building a Brand Image

Once two and two are together, the first thing that you and your team needs to do is to plan out a brand image as this will be the bedrock to the web development process of all your website content, marketing strategies and social media presence. Some important elements to decide on would be -

  • The logo, as this is what most people would associate your brand to. The layout, colour palette and design of the logo should represent the underlying identity of your business.
  • The domain name, essential for brand identity as well as driving traffic to your website. It must be short and easy to pronounce. 
  • Also keep in mind that the advertised USP (Unique Selling Proposition) must also be in line with the brand image, as anything that reaches out to the audience more often is a matter of greater scrutiny.
Planning it out

Now is the time to analyse every nook and corner of the web for competitor research. Ideally, there should be a list of brands that you both consider a competitor but also look up to, preferably businesses operating in the same domain with a similar target audience. Another area of analysis should be the current market standing of the kind of products and services that you’re offering. What are you audience looking for in the present scenario? What is the gap that your product is intending to fulfill?

Here’s what the mind map for your research should look like -
 


Post research, comes the actual planning of the website's elements, which will be -

  • The website’s structure. A sitemap can be used for facilitating the layout.
  • Identifying the interests and navigation trends of your audience by deploying relevant tools to do the job, and creation of a users’ persona for better understanding of the market needs. A flowchart software can be of great help in this case, as it lays out the navigation in this manner -
     

 

  • Budgeting. Allocation of money, or a draft blueprint of the same needs to be created.
The layout

For the web development process regarding the website’s layout, elements under consideration should be -

  • Deciding on the colour palette, the font, photography style, spacing - basically everything that your audience interacts on a daily basis with, that could be a potential bottleneck later on if left undecided. 
  • Use of wireframes to preview your website’s layout. A wireframe is exactly what it sounds like - the skeleton of the layout like page contents and their placement without added elements of color and design, for an understanding of the site’s functionality.
  • Quality design is invaluable, as elements in your layout can comprise your  USP as well. The layout should be attractive and convenient enough to navigate for your user to want to come back.
The importance of UX

If a website is too complicated, has lousy speed, has a scattered icon placement or the content isn’t comprehensible, even having a good service delivery will not help. The design of a website holds the capacity to create a bond of trust with the user, and also to establish customer loyalty. Areas of focus should be 

  • Use of simple, lucid language.
  • The content should put across the point instantly without beating around the bush.
  • A well thought out design that visualises the effort that has been put into it.
  • A list of FAQs (Frequently Asked Questions) makes knowledge sharing about your service even easier.
  • Multiple device compatibility
  • Interactive, responsive UI (User Interface)

The overall look and feel of the website must be professional and should have an elegant touch in the present elements. If a user is by chance tickled off by the design or performance of the website or if he can’t find what he’s looking for, retaining him would not be possible. Read our comprehensive guide to web design to know more.

Choosing the right CMS

A good amount of work is already done just by choosing a good CMS (Content Management System). Some large enterprises are based on CMSes like Drupal and rely on the softwares for their digital infrastructure due to the inbuilt tools and stability that comes with it, excluding the need for being extremely tech savvy. Depending on the amount of features and flexibility that is required by your business, Drupal can be your best bet.

Certain points to keep in mind after deciding to start your web development project with Drupal -

  • Keep up with the frequent updates that the software goes through. It might seem like a simple, matter-of-fact thing to do right now, but if you are not mindful of planning it ahead, you can miss out on many new features and benefits offered by Drupal by lagging in the update cycle. It is, hence, recommended to schedule reminders ahead of time.
  • The architecture of the website needs to be revisited from time to time. Is there any deprecated code that needs to be removed? Or, have your priorities changed over time, and you require different features than the ones already existing? It is imperative that these questions be answered time and again.

Drupal 9, the latest version of Drupal, is always a good option to go for because of the widespread community support and global usage it comes with. With a variety of packages and distributions, web development in Drupal 9 becomes pretty simple even for new developers as there are multiple tools to their aid - the best part being that there’s something for everyone. Updating Drupal is even simpler, a single click upgrading every theme and module on the site. 

Source : Drupal.org

The correct choice of modules can greatly amplify one’s experience when it comes to web development in Drupal 9. A great choice to make the page layout more methodical would be the  Admin Toolbar module, as it makes the admin toolbar into a drop down menu. A simple XML sitemap module increases the efficiency of SEO by creating multiple multilingual sitemaps along with custom URLs, and a Coffee module greatly enhances the UX by allowing the user to navigate to the admin seamlessly just by using a keyboard shortcut.

To know about the complete list of essential Drupal modules that will help in kick starting your web development project with Drupal 9, read this blog. Access our complete guide to Drupal 9 and go through Drupal 9 FAQs to know more.

Marketing it right

First, a decision needs to be taken on what avenues would be used for advertising and also how these channels will be prioritised, according to the underlying research about one's target audience. Is social media your primary channel to reach your audience? if yes, then which platform fits best with your business model? All these questions need to be answered before hitting the market. Some valuable points to keep in mind are -

  • Search Engine Optimization of all the content on your website is essential to drive more traffic into your website.
  • The URL structure should be logical and also optimised. 
  • Meta description is what a person reads before clicking on the website link, and it should be viewed as an interactive opportunity for a business to make a good first impression. 
  • Targeted marketing like cold emails and DMs might also work for some businesses.
  • The content strategy should be end to end, which schedules in line for planning, creating, executing and measuring it.

Brainstorming sessions with your team about new marketing strategies and ideas are also a good marketing execution method.

Choosing the right agency partner 

Taking expert aid can never hurt. Instances where the work gets too bulky or complicated for you, it is best to delegate it to an agency that knows the job inside out owing to years of experience and varied resources suited to different purposes.

  • An agency not only does your work in a much better and professional fashion, but also acts as a consultancy for any queries that you might have. 
  • Technology is fast evolving, hence, it is best to have a safety net that fills in the gaps in expertise wherever required. 
  • Your development gains maximum momentum with an additional number of hands working towards a specific goal with a focused intent, hence catalysing the development process. 
  • Strategising, design and development are all areas that can gain significantly from an outsider’s perspective. 

If you sync well with your agency partner and are able to make it long-term, a professional advisory would always be at a close proximity. Hence, it is an investment disguised as a partnership. An agency can help you migrate a bulk of content or develop a new website from scratch with ease - using their seasoned knowledge. Often, agencies also provide you post production support and maintenance. If your functional CMS is Drupal and you are unsure about how to incorporate the latest Drupal upgrade, or if you’re a business just setting up their Drupal website, you can well utilise the services of certified Drupal experts at OpenSenseLabs. Or, if you wish to extend your team of Drupal developers, UI/UX strategists and JavaScript developers, our unique staff augmentation model is available for flexible contracts with dynamic availability of certified professionals.

Future Plans

Lastly, everything might be moving on track for now, but that won’t be the case forever. Pre plan safety nets for all possible ups and downs. Also, it is important to not lose track of your long term goals by getting too engulfed in the day to day functioning of the website. A little farsightedness goes a long way.  

blog banner blog image web development Drupal 9 Drupal Blog Type Articles Is it a good read ? On

MidCamp - Midwest Drupal Camp: MidCamp 2021: It's You

1 week 5 days ago
MidCamp 2021: It's You

MidCamp 2021 is less than three weeks away, and tickets are on sale now. We’re accepting topic submissions for Thursday’s “Meet the Drupal Community” day and Friday’s “Share Your Knowledge” Unconference. There’s a lot going on between now and then, so pitter-patter.

Schedule

This year we’re embracing the virtual format and working to create spaces that encourage community building, connection, and mentorship. Each day builds on the next, but the schedule is built for maximum flexibility.

  • Wednesday, March 24 - Get Started with Drupal
  • Thursday, March 25 - Meet the Drupal Community
  • Friday, March 26 - Share Your Knowledge
  • Saturday, March 27 - Give Back to the Project
We want you for MidCamp

Instead of a formal call for papers, we’re now opening submissions for Thursday and Friday topics.

Thursday will be a day to Meet the Drupal Community: Attendees are encouraged to propose a topic for presentation or discussion. This need not be a formal session submission… it could be a conversation, case study, or just a time to get outside and walk in the park. Submit an idea and we’ll get you on the schedule.

Friday is a day to Share Your Knowledge: Submit a topic and we’ll gather them all together for an Unconference. The rules of an Unconference are simple:

  • Whoever shows up are the right people
  • Whatever the results of a session were what it was supposed to be
  • Whenever it starts is the right time
  • It is over when it’s over
And now… a word from our sponsor

Drupal developers: Leverage the power of your community

Join our growing network of Drupal professionals at Esteemed working together as one team. Learn about Drupal, and our opportunities for contract or full-time jobs. Also, refer your colleagues/clients and earn commissions. We provide support and mentoring, helping you build your career–every step of the way. Join us today: app.drupalcontractors.com

Ny Media: On mistakes and the tools needed to learn from your mistakes

1 week 5 days ago
On mistakes and the tools needed to learn from your mistakes eirik March 5, 2021

The excitement around releasing something was in the air that morning, and by the time the code was rolled out, everything seemed to be running smoothly and according to plan. This was also expected, as we have a staging site and a range of automated tests. And with that confidence one would think a bug never makes it all the way to production, right? Not right, unfortunately. In the complex solutions as we build, some parts might be very customized, and have a range of either edge cases, or test cases that our tests do not cover. So this morning we quite fast received reports of a bug that prevented a specific part of the site from working as it should.

One reaction to this would be to find the bug, assume who wrote that part was responsible. Complain publicly in Slack about this person and hotfix it on production. Add a post-mortem PR and be done with it.

Another reaction would be to analyze how the bug was introduced, fix the bug while carefully making sure the changes that introduced the bug is kept, and write some tests that makes sure we do not roll out a release that breaks this part of the site again.

Let’s try the latter approach in this article.

Analyze how the bug was introduced.

We use git on all of our projects, which has a a version history of all changes introduced. This way we can also find out what went wrong here. To find out when this bug was introduced, we use git bisect, which is an integrated tool in git. I first learned of this tool in a blog post from Webchick, more than 10 (!) years ago, and have since used that blog post several times as a cheat sheet. So please don’t take down that site (or article), but just in case, here is a brief summary on the steps needed:

Start with finding a commit in the history where the functionality was working. In my case I found one at the SHA 0c6ec6e2330cf7fb89f1aee7bb059edf764fd695. Then take a note where it is not working, in our case the tip of the production branch, which was the SHA a0c161c0067442fa028d80f19f3a5642c653b820. So I started bisecting:

git bisect start git bisect good 0c6ec6e2330cf7fb89f1aee7bb059edf764fd695 git bisect bad a0c161c0067442fa028d80f19f3a5642c653b820

This will start the bisect, and it will say something like this:

Bisecting: 25 revisions left to test after this (roughly 5 steps)

So it checks out the most effective path to finding the commit that introduced the error. So to investigate each step we have to tell git what the current state is. I run the build step on this commit SHA, and see that the error is there. That is bad. Let’s tell git:

git bisect bad

It checks out another SHA for me, and I build the project again, checking if the bug is there. Yay, it’s gone. Let’s tell git:

git bisect good

This will the continue until you find the commit that introduced the error. Something like this:

72624098ee091143d5b1318e0912c0e1c8a65406 is the first bad commit commit 72624098ee091143d5b1318e0912c0e1c8a65406 Author: xxx Date: Wed Feb 10 19:51:54 2021 +0100 Commit message

This can give us enough info to blame someone, but that is really not constructive. Especially since the author ended up being me.

Fix the bug in a careful way

Now that we know what introduced the bug, it might first of all be easy to actually spot the error. So this can actually help you fix the bug. But more importantly, you know why the change was introduced so you can fix the error, while making sure this will not revert whatever change the author wanted to achieve with the commit. So this step will be left to the reader, since it will vary greatly on the bug and the contents of the commit

Analyze what went wrong

The bug was introduced, and we could fix it in a timely manner. But what actually got us in this situation? There can be several answers to this question:

  • Missing test coverage
  • Undocumented functionalty
  • Undocumented dependencies
  • Mis-use of functionality that introduced a bug when you fixed something else
  • Misunderstandings in code reviews or pull requests

An analysis of the bug should be able to uncover if any one or several of these things were at play. Or maybe there are other structural issues with this project that needs to be addressed. We can talk through all this, and make a plan (with corresponding issues) to tackle as many as possible out of these issues. In our case missing test coverage was quite obvious, as the change would never have been committed, had we known that it would make the specific functionality break. Which brings us to the last step of this story:

Add the missing test coverage, and make sure it covers the bug introduced

While fixing the bug is priority number one, and was initially done quite fast, the follow up is to write a test that illustrates what went wrong, and confirms the bug actually fixes the bug.

In practice this means we will do these things:

  • Fix the bug and create a pull request
  • Working from the develop branch without the fix applied, we make a test
  • Confirm this test is failing locally

We are writing functional tests like this with Behat, so running the test locally would look something like this:

$ ./vendor/bin/behat --tags=some_functionality @api @javascript @issue @more_tags @some_functionality Feature: Use this specific thing We introduced a bug with with something specific, and here is a description. We also include a link here: http://example.com/issue/677 Background: Given viewport is desktop Given some entity Scenario: A user should be able to do something specific Given I am viewing the thing Then I click the 0 element ".bundle--item-wrapper .select-wrapper" No html element found for the selector ('.bundle--item-wrapper .select-wrapper') (Exception) Then I click the 1 element ".select-wrapper li span" Then I click the 1 element ".some-wrapper .select-wrapper" Then I click the 4 element ".select-wrapper li span" Then I should see "Expected text" Then I should see "More expected text" Then I click add to cart Then I go to checkout for last order Then I should see "special-variation" Then I should see "Expected text" Then I should see "More expected text" --- Failed scenarios: tests/features/some-feature.feature:12 1 scenario (1 failed) 14 steps (3 passed, 1 failed, 10 skipped)

As expected, our test fails. Trying it with the bug fixed:

@api @javascript @issue @more_tags @some_functionality Feature: Use this specific thing We introduced a bug with with something specific, and here is a description. We also include a link here: http://example.com/issue/677 Background: Given viewport is desktop Given some entity Scenario: A user should be able to do something specific Given I am viewing the thing Then I click the 0 element ".some-wrapper .select-wrapper" Then I click the 1 element ".select-wrapper li span" Then I click the 1 element ".some-wrapper .select-wrapper" Then I click the 4 element ".select-wrapper li span" Then I should see "Expected text" Then I should see "More expected text" Then I click add to cart Then I go to checkout for last order Then I should see "special-variation" Then I should see "Expected text" Then I should see "More expected text" 1 scenario (1 passed) 14 steps (14 passed) 0m11.06s (66.01Mb)

🎉️🎉️🎉️

Our next step is to push this branch to Github. We use Github for code and Github actions for continuous integration. Now to prove our test is actually testing the bug we have fixed, we revert the fix, and create a pull request from this.

Pull request, including the reverted commit, which we now expect to fail.

(Note: Commit messages and titles have been manipulated for illustration purposes).

As we can see, the pull request succeeded with just the test, but we want to make sure the change would have prevented us to push the broken code to production. So we remove the fix in this reverted commit, which we applied like this:

git revert ba31d6c9f4ffaa5508642a23a598b854124ac572 # <- Our commit sha for the fix.

Then, as the test failed like we expected it to, we add back the fix. For example by reverting the reverted commit, so something like this:

git revert 3d3866985e24a19a65c05abaaa1afab9242bc76d # <- Same SHA as the screenshot

Then, let's go back to our pull request, and verify that it now passes again (which it should, since it initially passed before we reverted the fix)

We can now merge in the test. This way we have accomplished the following things

  • Fixed the bug
  • Analyzed why the bug was introduced
  • Wrote a test that illustrated the problem
  • Made sure the functionality in question will not be broken by releases in the future

If you are looking for an agency with a focus on Quality Assurance, automation and stability, we can help! Our clients benefit from our focus on quality, and we always have long term cooperation in mind while working with clients. This way we can deliver solutions that have a high quality, but also increases in quality as the complexity grows. Contact us today if you are looking for a technical partner for your project!

DDEV Blog: Florida Drupal Camp highlights

1 week 6 days ago

Florida Drupal Camp this year took a slightly different shape as a virtual event (with fond memories of being there in person just a year ago) and the organizers and volunteers pulled it all off beautifully. The addition of a virtual world on gather.town really brought the event to life and enabled bumping into folks on the “hallway track” and greeting visitors in our booth. We were again very...

Source

rachel_norfolk: TECH(K)NOWDAY

1 week 6 days ago
TECH(K)NOWDAY

Tech(k)nowday is an online conference, featuring over 200 women in tech and it is taking place this weekend. Not only that, it is FREE to attend so why not take a look at the program and see what interests you?

I recorded a short talk for them today, about how we are making some improvements to DrupalCon so that we can help people focus their participation on selected strategic initiatives of the Drupal project. I hope it is useful to people.

Tags

Promet Source: Powering On: The Drupal Community Keeps Connected

2 weeks ago
A little over a year ago, the global pandemic struck and all planned events came to a screeching halt for the foreseeable future. In signature Drupal community style, tech solutions were explored, adjustments were made barely a beat was missed as networking, learning, and growth kept right on going. 

Mediacurrent: How to Get the Most out of Your SEO in Drupal 9

2 weeks ago

This post is an updated part of our Marketer's Guide to Drupal series. This guide will walk you through considerations for choosing an open source CMS, plus case studies and CMO advice to bring your site to the next level.

Supercharge SEO with Drupal

“Over the last 20 years, Drupal has grown into one of the largest enterprise content management systems in the world.” - Drupal Founder Dries Buytaert

Along with the growth of Drupal, the marketing landscape is vastly different now than it was 20 years ago. The same techniques once used to make the top of the search engine no longer work, so marketers need to understand the powerful role a CMS like Drupal can play in building a successful SEO strategy. 

The release of Drupal 8 marked a significant stride in giving content authors more control. That focus continues to evolve with Drupal 9. Notable editor-focused features include a templating engine called Twig for component variety, an API-first foundation to “write once, publish everywhere”, and an editor-friendly content block authoring experience. Layout Builder additionally provides a "drag and drop" module that lets editors add components to pages and add pages to the site with no code. Now, Drupal 9 has even more upgrades for marketers, tech-savvy or not.

This shift places the marketing team in the driver’s seat more often and allows them to get involved in the CMS decision. In this post, we’ll outline some ways you can up your SEO game with Drupal.

Traditional SEO is Dead

No longer will well-placed keywords alone get you to the top of the SERP ranks. Content is still King in the world of marketing, and it’s what helps you improve your SEO.

Every algorithm change Google has made has one thing in common: it aims to provide the best content based on what it "thinks" the user is trying to find. In other words, the user’s intent. If you want your rankings to stick, don't try to cheat the system. Attract your prospects with informative, entertaining pieces that they can use to take action. And avoid no-value posts that are keyword-stuffed with your industry and the word "best" 100 times. Google can see through it and so can all of your users.

That said, there are a few other factors that are critical to keeping your rankings high that can’t be ignored, including quick load times and mobile-friendliness. Drupal 9 is built with several of these factors in mind to help us make needed improvements quickly and effectively.

Mobile-First Mentality

Drupal 9 is created with responsive design capabilities built-in, so you can begin to address many problems immediately. That’s not to say all of your responsive problems will be solved. Content editors still need to think through their content and imagery, and themers will still need to do configuration to establish things like breakpoints. But Drupal 9 will set you on the right path, giving you and your team many of the tools you need.

You’ll also have the option to choose different images and content for desktop and mobile versions right from the WYSIWYG editor, making it easier to see the differences for every piece of content when you add it and before you publish. This means a solid visual of both versions in real-time for faster publishing and peace of mind knowing exactly what your users experience on any device. 

The Need for Speed

Another big factor that could affect your rankings is speed on both desktop and mobile. Google places such high importance that they provide a PageSpeed Insights test to show where and how your website is slowing visitors down. Drupal 9 is “smart” in that it caches all entities and doesn’t load JavaScript unless it has to. This means the same content won’t be reloaded over and over and instead can be loaded quickly from the cache. It also uses a feature called velocity, which makes creating and publishing new dynamic content experiences is significantly faster than in Drupal 7 and older Drupal versions.

Responsive design is a must-have in today’s digital landscape and speeding up your website on both desktop and mobile is a surprisingly effective way to contribute to your SEO efforts. In short, if your marketing team is focused (as you should be) on top rankings, Drupal 9 provides many of the tools to make that happen. 

Accessibility = Key for Search

Drupal 8 spurred an overall commitment to accessibility from the community, and with the release of Drupal 9 came another big push toward improving web accessibility, including: 

This is important because, as we know, the relationship between web accessibility and SEO is closely intertwined. Improving accessibility on your website will, in turn, improve your SEO rank.

SEO Friendly Modules for Drupal 9

There are thousands of modules available for Drupal 9, many of which are perfect for marketers. Whether you’re looking to try out something new or to find something that fits what you already know, you have your pick. Here are our favorite SEO modules to use when optimizing your site:

  1. Metatag - allows you to automatically provide metadata, aka "meta tags", that help search engines understand your content. This must-have module offers over 300 different meta tags for different purposes, so take a look and find the right ones for your site.
  2. Two Metatag submodules that we highly recommend are Twitter Cards and Open Graph. Connect your site to Facebook, LinkedIn, Slack, Twitter, and other social platforms and control how links will look when shared on them.
  3. Schema.org Metatag - provides a way of adding some of the hundreds of standardized metadata structures from the international schema.org project on a site, making it easier to clearly define metadata that Google et al can use to more accurately understand your site’s unique information.
  4. Pathauto - helps save you time from manually having to create URL path/aliases as new content is created.
  5. Sitemap - provides a site map that gives visitors an overview of your site. It can also display the RSS feeds for all blogs and categories.
  6. Redirect - Almost every new site needs to incorporate 301 redirects for old page URLs. This gives site admins an easy interface for creating those redirects in Drupal.
  7. Google Analytics - this simple module allows site admins the ability to easily configure Google Analytics in Drupal.
  8. Easy Breadcrumbs - uses the current URL (path alias) and the current page's title to automatically extract the breadcrumb's segments and its respective links.

Thankfully, because Drupal is open source, you’re not out of luck in the instance that you can’t find a module that works for you. There are many options available for making a new one that works, from building it yourself to enlisting help from a Drupal team like Mediacurrent.

Visualize SEO Success with Siteimprove

In addition to Drupal's SEO-friendly modules, an SEO optimization tool like Siteimprove can…

  • Give content editors information about their technical SEO to make more informed decisions
  • Gain an understanding of how SEO and content intersect for your overall strategy
  • Flag potential issues before your content is published
  • Provide insights about the SEO impact on unpublishing a page

The Siteimprove module works directly in Drupal, giving editors access to these insights while they’re adding content. This means no more waiting to fix it post-publish. It is important to correctly set up Siteimprove in order to get the most out of it and effectively transform your strategy into a workable roadmap for your site.

SEO and Beyond

Drupal’s content management system is perfectly structured for search optimization and its core features support many of the critical SEO elements. But features only take you so far on their own. To manage and continuously improve your SEO, consider a dashboard like Siteimprove that you can customize to show you just how the data is processed and how it impacts your business's goals.

Setting those custom data points and interpreting the data that comes in can be time-consuming and difficult, so if you need any help, our team of Siteimprove certified experts can apply our knowledge to configuring your dashboards and making sense of the data. Get started with a Siteimprove tune up.

Jacob Rockowitz: To Drupal or not to Drupal... maybe it's not okay when individuals or organizations leave the Drupal community.

2 weeks ago

As of late, I’ve been discussing the fact that my employer/organization is moving away from Drupal. I now face the decision "To Drupal or not to Drupal." I have decided to discuss this decision openly. In my previous blog post, To Drupal or not to Drupal… that is my mid-career crisis, I expressed the guilt I have about potentially not maintaining the Webform module and stepping away from the Drupal community. If the Webform module is unsupported, the Drupal community and organizations that need to create forms and collect submissions could suffer.

Generally, when people and organizations leave the Drupal community, they don't talk about it. Occasionally, there are snarky discussions involving assumptions on Reddit. As for me, I’m using my blog as a platform to have this discussion.

Before considering what my exit interview might entail, it would help to define my role and responsibility as the Webform module's maintainer in the Drupal community.

Role

My initial contribution to Drupal began with the YAML Form module. I focused on building out the baseline functionality, reaching feature parity with the Webform module's previous version. As more people started using the YAML Form module, documentation and training material became essential. I created documentation using GitHub Pages. I recorded screencasts that walk-thru existing and new features. When the YAML Form module became the 8.x-5.x release of the Webform module, the usage stats started to increase significantly; I realized that...Read More

Tag1 Consulting: On 20 years of Drupal - an interview with Fabian Franz

2 weeks ago

Vice President of Software Engineering Fabian Franz, is another of Tag1 Consulting’s long time contributors to Drupal. Fabian is a core committer, helped bring Twig into Drupal Core, and helped develop and is a maintainer of Drupal’s caching system. In this Tag1 Team Talk, Managing Director Michael Meyers caught up with Fabian to talk about Fabian’s time in the community, what he’s most passionate about and proud of, and how he got to where he is today, as we celebrate 20 years of Drupal. For a transcript of this video, see Transcript: 20 years of Drupal - Fabian Franz ### Related content In the coming weeks, Tag1 will be featuring Team Talks with some of its long time Drupal contributors. Check back here, or follow the blog to see these interviews as they become available: - Jeremy Andrews - Doug Green - Fabian Franz - Narayan Newton - Francesco Placella - Greg Lund-Chaix - Marco Molinari - Michael Meyers - Moshe Weitzman - Nat Catchpole --- Photo by Michael Olsen on Unsplash

Read more lynette@tag1co… Wed, 03/03/2021 - 05:25
Checked
1 week 1 day ago
Drupal.org - aggregated feeds in category Planet Drupal
Subscribe to Planet Drupal feed