Primary tabs
Useful Drupal modules
Click on the module name for notes, comments, patches.
Recommendations (for and against) are my personal opinion only and may be out of date. Feel free to email with corrections/suggestions.
Why doesn't the table mention Drupal 9 or 10?
1. Nowadays, I try and use Drupal as little as possible. Specifically I do not recommend it for a new website. I'd also strongly caution you against choosing Drupal if you're at the beginning of your career and trying to learn web development (front / back / full stack) or just want to manage/maintain a website. More details why by email on request.
2. By February 2022 I'd updated all the sites I look after to Drupal 9 (experience: mixed). As of March 2023, a year later, none of them were fully ready for Drupal 10 (waiting on support for various modules). By 13 Nov 2023 (a week or two after D9 lost support) I had updated a couple of them.
Q: What's the Drupal 9 to 10 upgrade experience like? A: it's what I'd describe as "just bearable", slightly better than D8 to D9, though with plenty of things to still trip you up. There is still deprecated code that needs fixing in D10 modules, and policy changes mean odd things will break (be prepared to turn off Aggregate CSS/JS files if your themes stop working, and note that Drush launcher doesn't work with Drush 12...)
Admittedly the upgrade_status module is the best solution they could have come up with for tracking compatibility. Also watch out for a nasty session headers bug with redirect_after_login.
What about sites still running Drupal 7? In short I still recommend leaving them on Drupal 7 or moving to another platform entirely. My prediction was that Drupal will extend D7 support year after year (note that drupal.org itself is still running D7). It's now been confirmed as 5 Jan 2025. There will have to be some sort of third-party long term support, because of the sheer volume of sites that are not being upgraded.
Your decision is really what specifically you think you will gain from Drupal 8/9/10 - often the answer will be not enough, and one of the main hassles - apart from converting each content type one at a time, and setting up a new theme, will be recreating all your views by hand, as views can't be automatically upgraded.
(134 modules in list)Name | D8 Sort descending | Personally Tested | Last Updated |
---|---|---|---|
Devel (devel) | ✔ | ✔ | |
"Essential" Key features:
|
|||
Add another (addanother) | ✔ | ✔ | |
"Essential" For this to work for any content type after you activate it, you have to manually edit and save that content type's settings, otherwise the buttons will be missing. |
|||
Responsive and off-canvas menu (responsive_menu) | ✔ | ✔ | |
This uses a JS library and works without a second copy of the menu in the HTML, and you don't need to make any changes to your existing navigation menu. Look at the README file for instructions. Note you're forced with the mobile version of the menu to have it expand to full depth (although the hack/workaround, if you want a top-level menu only, is to hide the lower elements in CSS) For hand-crated CSS / minimal javascript solutions, see https://css-tricks.com/responsive-menu-concepts/ |
|||
SEO Checklist (seo_checklist) | ✔ | ✔ | |
Shows a long checklist, split over a series of tabs, you can tick off items and some (e.g. modules you need to install) are auto-detected. See Module of the Week blog post. |
|||
Block Visibility Groups (block_visibility_groups) | ✔ | ✖ | |
Rather than change visibility for individual blocks, you can group them together and assign complex visibility settings to all of them. Module page promotes it as a simpler alternative to Panels. |
|||
Configuration Update Manager (config_update) | ✔ | ✔ | |
You also need to enable config_update_ui, which adds an 'Updates report' tab to Config Sync (/admin/config/development/configuration/report) |
|||
Better Exposed Filters (better_exposed_filters) | ✔ | ✔ | |
"Essential" My recommendation - safe to use but understand it's currently pretty limited due to bugs. To activate, change a view's Exposed Form style (Advanced column) to 'Better exposed filters'.
Limitations:
So all you can really do with BEF at the moment is use the AJAX setting. |
|||
Real Name (realname) | ✔ | ✔ | |
Use tokens to merge first name, last name or any other fields. Note: you have to add code to substitute the default username in the title of user node views - e.g. in |
|||
Computed Field (computed_field) | ✔ | ✔ | |
Add a field whose value is calculated using raw PHP; specifically $value = 'foo'; (The recommendation is you write your PHP in a module of your own, and then call that method from the UI - for security and version control reasons). Note: value is only calculated when nodes are saved (i.e. will initially be empty for existing content). D8 status; alpha but working. |
|||
Toolbar menu (toolbar_menu) | ✔ | ✔ | |
"Essential" Add extra menus (which appear as cog icons with a title, which you can click and expand) to the admin toolbar at the top of your site. |
|||
Views Contextual Filters OR (views_contextual_filters_or) | ✔ | ✔ | |
"Essential" By default if you add multiple contextual filters to a view, they must all pass (AND). |
|||
Coffee (coffee) | ✔ | ✔ | |
"Essential" Keyboard shortcuts. A bit like Spotlight/Alfred/Launchbar. Alt+D to launch (memonic: alt + D = coffee!) Handy as it doesn't clash with browser keyboard-shortcut extensions such as Vimium. Tips:
|
|||
Configuration Override Warn (config_override_warn) | ✔ | ✔ | |
"Essential" Displays a message on config pages indicating which config settings have been override by settings. |
|||
D8 Editor Advanced link (editor_advanced_link) | ✔ | ✔ | |
Adds options should as choice of target, title, class ID etc. to the link dialog in CKEditor. Needs configuring after install. |
|||
Snippet Manager (snippet_manager) | ✔ | ✔ | |
Snippets are Twig templates that can be managed using the UI. They can be inserted in various ways including via CKEditor, tokens. Support for HTML, CSS, JS, and variables. |
|||
Environment Indicator (environment_indicator) | ✔ | ✔ | |
"Essential" Change the colour of the admin menu according to whether you're using dev, staging, production etc. (You can also add 'switcher' menu links, e.g. Open in dev, Open in Prod). Notes: - need to reset the cache after you've made changes [#2406619] |
|||
Content access (content_access) | ✔ | ✔ | |
"Essential" Set permissions by content type (with the option of overriding node by node) |
|||
Rules (rules) | ✔ | ✔ | |
Patch needed (the pages and roles tabs are missing on block editing form otherwise): |
|||
HMS Field (hms_field) | ✔ | ✔ | |
Hours/minutes/seconds field type (formats: h:mm, h:mm:ss, m:ss, h, m or s). Drupal 8 in beta. |
|||
Two Factor Authentication (tfa) | ✔ | ✔ | |
"Essential" install tfa and ga_login (TFA is just a framework, it doesn't come with it's own login plugins.) Use this patch I wrote - it adds display of validation skip times and an admin reset button for users who are got locked out. My installation instructions: Next you need to generate an encryption profile. Set key provider to File rather than Configuration, this means the key won't end up in your version control. Tick the 'strip trailing line breaks' box to avoid the "The selected key size does not match the actual size of the key." error Key path should be relative to Drupal so the config will work on multiple sites Remember to save the key somewhere in your password manager, or your ansible variables, in case you lose the files later. In the TFA settings (/admin/config/people/tfa) you probably want to increase the number of times a user can skip validation. Note that TFA has a separate 'Tfa user login' block (replacing the ordinary 'User login') |
|||
AJAX Comments (ajax_comments) | ✔ | ✔ | |
Not recommended Not very actively maintained and it can be quite buggy. Needs this patch: Reply button can be pressed multiple times, resulting in multiple comment forms I abandoned it for a project because the admin XHR response when you submit comments sends back comments you've already filtered out (I had written code to restrict visibility of certain comments). Also had a problem where the initial comment form was left in place rather than being replaced, so you ended up with duplicates. |
|||
Automatic User Names (auto_username) | ✔ | ✔ | |
"Essential" Removes the 'Username' field from registration form. Use in conjunction with a module that allows users to login with their email address. Patches:
|
|||
Feeds (feeds) | ✔ | ✖ | |
"Essential" As of Sep 2018, up to alpha3 in D8 (but not personally tested). Lets you import CSV/RSS etc. files and various other formats and map them to nodes/user/taxonomy terms, either one-off or periodically. |
|||
Layout builder (layout_builder) | ✔ | ✔ | |
Benefits:
Nov 2018: core, experimental in 8.6.x Installation:
By turning on Layout Builder, you switch from the standard Manage Display view (field, label, format/widget settings) and the layout builder GUI. Resources: Compatibility:
|
|||
Login email or username (login_emailusername) | ✔ | ✔ | |
"Essential" Self-explanatory. |
|||
Alexa (alexa) | ✔ | ✖ | |
Integrates with Amazon Echo. Allows Drupal to respond to Alexa skills requests. See Dries' blog with video demo. |
|||
Field collection (field_collection) | ✔ | ✖ | |
Allows you to group a set of fields together. In active development for D8 but still a lot of open bugs at time of writing - project page says it will likely be replaced by Paragraphs. |
|||
Configuration Read-only (config_readonly) | ✔ | ✔ | |
Lock all configuration changes via the admin UI - e.g. if you need to lockdown a production environment. config_readonly now has a whitelist, added via an array in settings.php. |
|||
Password policy (password_policy) | ✔ | ✔ | |
Not recommended There are still quite a few bugs open. I dropped this for a project, partly because it adds a load of clutter with the 'resets' and reset dates. |
|||
Automatic Entity Label (auto_entitylabel) | ✔ | ✔ | |
"Essential" Hide entity labels (i.e. titles) or auto-generate them. (Works for anything - nodes, comments, taxonomies). |
|||
Field Formatter Condition (fico) | ✔ | ✔ | |
(based on ffc which hasn't been ported to D8). Allows you to configure field display based on value. Adds a 'Conditions' pane to the cog in Manager Display of all entities (so content types but also comment types, e.g. if you have comments with multiple fields) Requires Display Suite (ds) Note: if you wanted to hide say a checkbox when it's value is false - you can do in it core with Manage Display - turn the label off then set (via cog wheel) the output format to Custom, and you can enter a value for true and leave false blank - exactly the same widget for boolean values you use when setting the output of a field in a view. |
|||
Webform Views Integration (webform_views) | ✔ | ✔ | |
"Essential" This module lets you add fields from submissions to view, and sort/filter the view on them, in the same way you would standard fields from the Field API. It's still alpha and not as polished/robust as the webform module itself - but it's certainly OK to use in production provided you test things first - check every combination of exposed filters works, and double check you aren't seeing duplicate rows (right now I've locked it to a recent commit on the dev-5.x branch, which doesn't need any patches). |
|||
Menu position (menu_position) | ✔ | ✔ | |
"Essential" Assign various pages (by content type, URL, role etc.) to certain menu entries - so the 'active' status of the menu is set correctly (i.e. they appear within the sections you want). - patch: Add enabled checkbox to edit form + enable new rules by default
|
|||
Conditional Fields (conditional_fields) | ✔ | ✔ | |
Adds a 'Manage dependencies' tab to the admin page for content types. This lets you set a 'target field' whose visibility is set according to a 'control field' and whether the latter is full/empty/checked/unchecked/has a specific value. Another useful feature is you can prefill/pre-tick etc. the target field (including with a custom text value, for example). To detect quickly if it's in use anywhere (I needed to do this before being sure I could uninstall the module on a site), export your site config and grep the /config/sync directory for 'conditional_fields' - it's stored in the 'third_party_settings' key in core.entity_form_display.node.[content type].default.yml |