Drupal CMS

Drupal is een open-source content management systeem (CMS) dat wordt gebruikt voor het bouwen en beheren van websites en webapplicaties. Het is gebaseerd op PHP en biedt een scala aan functies en tools voor het maken van aangepaste websites en webapplicaties.

Het is dan ook één van de grootste spelers in CMS-land en dient voor meer dan duizenden bedrijven als platform voor websites. Al overtuigd van deze CMS-krachtpatser? Wij alvast wel.

Wat is Drupal?

Drupal is een open-source content management system (CMS) met Belgische roots. Het is een zeer veilig, flexibel en betrouwbaar platform en wordt ondersteund door een wereldwijde community van ontwikkelaars. Drupal is erg geliefd doordat ze eenvoudig aan te passen is en daarom uitmuntend geschikt is voor maatwerk. Denk maar aan het koppelen van je eigen CRM of software.

Omdat Drupal open-source is, wordt het actief onderhouden en ontwikkeld door een grote gemeenschap van ontwikkelaars en gebruikers, waardoor het voortdurend wordt verbeterd en geüpdatet met nieuwe functies en mogelijkheden.

Is Drupal de beste keuze voor jou?

Deze Belgische trots is een geweldig CMS voor uiteenlopende type projecten. Ben je niet zeker of Drupal wel de beste keuze voor jouw einddoel is? Geen nood. Nadat we bij onze verkennende gesprekken jouw business en klanten volledig uit de doeken hebben gedaan, bekijken we samen met jou welke technologie het beste bij jouw wensen en noden past.

make it fly - Drupal

Drupal als CMS

Drupal is een CMS dat al enkele jaren aan een steile opmars bezig is. Dagelijks werken er wereldwijd duizenden developers aan de uitbreiding van dit platform waardoor er ondertussen meer dan 15.000 (!) extra modules beschikbaar zijn. Drupal is een veelgebruikt CMS voor web en web app development.

Bij Duo zijn we overtuigd van de kracht die in het Drupal content management systeem schuilt en daarom gebruiken we dit vaak als basis voor onze web development. Hierop bouwen onze Drupal developers dan verder en programmeren modules op maat waarmee unieke, interactieve en gebruiksvriendelijke websites en webshops worden gecreëerd.

Enkele reden waarom je zou kiezen voor Drupal, op een rijtje:

  • je geniet van technologie dat met je meegroeit

  • garandeer de meest gebruiksvriendelijke ervaring

  • integreer eenvoudig interne systemen en externe tools

  • beheer centraal je inhoud en verspreidt via diverse kanalen (omnichannel)

  • profiteer van de flexibiliteit, vrijheid en mobielvriendelijkheid van je Drupal website

make it fly - Drupal

De voordelen van Drupal CMS

Deze krachtpatser brengt natuurlijk tal van voordelen met zich mee:

Gebruiksvriendelijk

Drupal zorgt ervoor dat je als eindgebruiker, die misschien niet over alle technische kennis beschikt, zelf gemakkelijk inhoud kunt wijzigen of toevoegen met behulp van een overzichtelijk en gebruiksvriendelijke gebruikersinterface.

Flexibel

Drupal is een zeer flexibel content management systeem, omdat het in staat is de inhoud van de website op basis van tags te organiseren in vooraf bepaalde categorieën. Elke node of content type kan bestaan uit uiteenlopende types inhoud: tekst, afbeeldingen, video, formulieren… Drupal - in tegenstelling tot vele andere content management systemen - kunnen we inzetten voor:

Een eenvoudige website die je huisstijl omarmt en je identiteit uitstraalt? Dan is een Drupal website iets voor jou. Overzichtelijk en makkelijk vindbaar.

Drupal biedt een krachtige en uitgebreide set functies voor e-commerce websites, zoals geavanceerde zoekfunctionaliteit, productcatalogi, winkelwagentjes, betaalgateways, en integratie met externe systemen zoals ERP en CRM.

  • Campagnewebsites of miniwebsites

Je merk echt in de kijker zetten doe je met je identiteit, positionering én een brand of campagne website. Alles wat je nodig hebt om je consumenten te informeren en met hen te communiceren heb je in handen. Daarbovenop geeft het je merk online een unieke look.

Uitbreidbaar

Drupal CMS heeft een modulair ontwerp. Door modules toe te voegen of op maat te schrijven kunnen onze developers handige functies aan je website toevoegen Deze modules kunnen eenvoudig geïmplementeerd worden en maken je website uniek.

Mobielvriendelijk

Het is natuurlijk belangrijk dat je website zich ook op mobiele toestellen perfect aanpast. Dit gaat het best als je website zich aan de grootte van het scherm aanpast, in het zogenaamde responsive webdesign. Drupal zorgt dat we op een vlotte manier een responsive design kunnen integreren. Op deze manier kunnen we je website op alle toestellen (smartphones, tablets en desktops) perfect weergeven.

Externe integratiemogelijkheden

Moeten bepaalde acties op je website ook met een bestaand systeem, zoals een ERP- of CRM-pakket, gekoppeld worden? Met Drupal is het perfect mogelijk om die koppeling te maken. Onze ervaring met diverse systemen zorgt ervoor dat de integratie met externe tools of applicaties, web services of backend-systemen steeds feilloos in je website geïntegreerd wordt.

Zoekmachinevriendelijk (of SEO-vriendelijk)

Een parel van een website moet kunnen gevonden worden door zoekmachines om organisch verkeer naar de website te brengen. Drupal behaalt telkens opnieuw zeer mooie resultaten bij zoekmachines door de uiteenlopende SEO-modules en optimalisatiemogelijkheden.

  1. Add a cleanup function

    Sven Decabooter

    Thanks for the MR. Logic looks good to me. Only thing I'm wondering: couldn't we use a QueueWorker plugin to process the deletion of the stale log entries? Then we wouldn't need the batch processing logic within the cron hook. The processing time could be configured in the QueueWorker plugin - e.g. \Drupal\locale\Plugin\QueueWorker\LocaleTranslation has this set to 30 seconds.

  2. Allow collapsing / expanding of multivalue items

    Sven Decabooter

    Yeah I have set it up with "Details" wrapper currently. Would be good to allow for 1-click collapsing / expanding though, to easily switch between "editing" mode and "reordering" mode.

  3. Allow collapsing / expanding of multivalue items

    Sven Decabooter

    Problem/Motivation

    We use custom_field to create multivalue fields, containing a bunch of properties / subfields. While this allows site editors to add rather complex multivalue data, it is a challenge for them to reorder the items, once created.

    In some cases we are using modals for content editing, which makes it even more challenging.

    Example:

    A video of me trying to reorder the items for a custom_field field with a bunch of subfields, is available here: https://www.drupal.org/files/issues/2025-08-18/custom_field_reorder_issu...

    For example the Paragraphs module seems to provide a better UX for this, with Collapse (all) / Edit (all) buttons:

    By default the editing experience would be similar, with all fields exposed:

    Clicking "Collapse all" gives us the following:

    This allows for easy reordering, and subsequently editing a specific item.

  4. It's possible a referenced paragraph does not exist, resulting in a WSOD

    Randal

    Problem/Motivation

    It's possible a referenced paragraph does not exist, resulting in a WSOD with this error: Error: Call to a member function createDuplicate() on null in Drupal\layout_builder_at\Plugin\Field\FieldWidget\LayoutBuilderCopyWidget->cloneEntity() (line 344 of /.../web/modules/contrib/layout_builder_at/src/Plugin/Field/FieldWidget/LayoutBuilderCopyWidget.php).

    Steps to reproduce

    I'm not sure how this came to be, but one of our nodes had a block with a referenced paragraph that doesn't seem to exist.

    Proposed resolution

    Lines 338 to 344 of the LayoutBuilderCopyWidget contain this code:

              $values = $clone->get($definition->getName())->getValue();
              if (!empty($values)) {
                foreach ($values as $value) {
                  /** @var \Drupal\Core\Entity\EntityInterface $reference */
                  /** @var \Drupal\Core\Entity\EntityInterface $reference_clone */
                  $reference = \Drupal::service('entity_type.manager')->getStorage($target_type)->load($value['target_id']);
                  $reference_clone = $reference->createDuplicate();

    I would suggest replacing it with:

              /** @var \Drupal\Core\Entity\EntityInterface[] $references */
              $references = $clone->get($definition->getName())->referencedEntities();
              if (!empty($references)) {
                foreach ($references as $reference) {
                  $reference_clone = $reference->createDuplicate();

    This ensures only existing references can be cloned, and `createDuplicate` can't be called on a null-value.

    Remaining tasks

    I'll create a patch/MR

    User interface changes

    N/A

    API changes

    N/A

    Data model changes

    N/A

  5. Gotenberg

    Randal

    Module purpose

    This module provides a Drupal-sauce around the gotenberg/gotenberg-php package, with basic configuration and a wrapper class to be used within Drupal.

    It also adds an 'entity_print'-plugin that uses Gotenberg as the printing back-end.

    For more information regarding Gotenberg, please visit their website and documentation Website: https://gotenberg.dev Documentation: https://gotenberg.dev/docs/getting-started/introduction

  6. Drupal 11 compatibility

    Randal

    Alright, I've pushed some changes that should make it fully D11 compatible.

    The biggest one was the constructor for the ConfigurationForm, in D11 an extra argument was required. To keep backwards compatibility, I've removed the constructor entirely and set the custom properties in the static create() method.

    This has the added advantage that any future changes to the constructor will be fully handled by the parent create() method, and we can simply set our own custom properties without having to worry about that.

    Other than that, only a version requirement change was needed in composer & info.yml.

  7. Only works for nodes, other entity types aren't supported.

    Randal

    A small fix in this patch: when checking whether the alias is unique, two faults were present in the code.

    1. The REQUEST domain was used, not the ENTITY domain, this meant that with entity saves via CLI (e.g. drush), the domain context was always the main domain... So aliases for other domains were saved with `-0` or `-1` 2. When checking if the alias is reserved, the source was not given, meaning if the alias previously existed in the database with the current source then it's marked as 'reserved' even though it's not.

    This latest patch solves all of that.

  8. Use Icon API for Navigation module integration

    Sven Decabooter

    Problem/Motivation

    Since Drupal 11.2.x, the (experimental) Navigation module no longer shows and icon in the Navigation sidebar:

    This seems caused by the fact that the navigation sidebar icons are added via the new Icon API now. In #3507687: Add Site settings menu to Navigation module content block we opted to add a default icon (same as for Configuration), and added it via CSS. This approach seems to no longer work in 11.2.x.

    Steps to reproduce

    - Install Drupal 11.2.x - Enable Site Settings module - Enable Navigation module - Check icon in the sidebar

    Proposed resolution

    - Use new Icon API to set the same icon as previously.

  9. Navigation sidebar + small viewport + big_pipe needs double click for action

    Sven Decabooter

    Problem/Motivation

    We encountered this issue after updating to Drupal 11.2.2. We are using the experimental navigation module, but when viewing the website in smaller view ports, the sidebar expand / collapse toggle + close button doesn't seem to react the first time they get clicked. On a subsequent click, the action is triggered.

    See attached video for an example.

    Since we encountered this issue on a website with a bunch of customizations and contrib modules, I tried to reproduce the behavior by checking a Drupal core 11.2.x development branch and installing a clean instance. At first I couldn't reproduce this, but after trying to pinpoint the culprit by disabling specific JS files on my client website, I narrowed it down to being related to big_pipe module.

    Steps to reproduce

    I was now able to reproduce the issue (see attached video) with the following configuration:

    • Drupal 11.2.x dev branch checkout
    • big_pipe module enabled
    • DDEV config: webserver_type: apache-fpm (I had this set to nginx first and couldn't reproduce the issue with that webserver)

    I don't know if this issue belongs in the navigation module component, or big_pipe. Adding it to navigation module for now + referencing it in a meta-issue for big_pipe related issues.

  10. Non-translatable fields can only be changed when updating the current revision.

    Randal

    Little use case where the patch did not help for me:

    - layout_builder - layout_builder_at (for asymmetric LB translations) - added new boolean field to block - saved pre-existing block with that new boolean field (ticket or unticked)

    This field was initially empty (not `['value' => 0]` but just non-existing), upon saving a block (even the default translation) I received the error mentioned in this issue because the value was "changed" (it changed from non-existing to `['value' => 0]`.

    The solution for me was to simply turn on the "Hide untranslatable fields" checkbox on my block types, this did not impact the editor experience whatsoever in my case because with `layout_builder_at` the blocks are *cloned* into translations, they aren't translated, so even on node translations all the fields on the block are always visible because you're always editing the block's default translation.

    Hope it helps someone.

  11. Fix PHP 8.4 implicit nullable deprecation

    Fons

    I had the same error.

    Applying and testing the code that is in the merge request (https://git.drupalcode.org/project/pathauto/-/merge_requests/91.patch) fixed it for me.

    Thanks!

  12. Deprecate module for ai 1.2.x

    Sven Decabooter

    Problem/Motivation

    The AI Translated text extractor plugins have been revamped in the AI module in branch 1.2.x. See #3531717: Add text extractor plugins for image, file, text_with_summary and link field types. As part of this effort, the asymmetric translation of Layout Builder has been included in the main LbTextExtractor plugin, to avoid having multiple plugins conflicting with each other for the same field type.

    This means this module will no longer be needed when using AI 1.2.x.

    Proposed resolution

    * Update composer.json to indicate this module requires ai 1.0.x or 1.1.x, but not 1.2.x E.g. `"drupal/ai": "~1.0.0 || ~1.1.0"` * Update the project description, to indicate the module is no longer needed for AI 1.2.x onwards, since it has been included into the main AI package.

  13. Support mapping of multiple entity reference field values

    Randal

    This seems like a useful feature, just passing the mapped value along to the field setter should work fine.

    Drupal's entity_reference field setters can handle all of the following input values just fine: - 13 - [13, 14, 15] - ['target_id' => 13] - [ ['target_id' => 13], ['target_id' => 14], ['target_id' => 15] ]

    So I don't see any issues with this patch.

  14. Support for core navigation experimental module

    Sven Decabooter

    I tested the current MR, and this seems to work as intended. Maybe the Drupal logo color changing according to the environment indicator settings could be an option? Although from what I can see this is managed in CSS, so probably not very easy to make this configurable...

  15. Version identifier fallback source not used

    Sven Decabooter

    Problem/Motivation

    When the primary version identifier source cannot be retrieved, the fallback option is never shown.

    Steps to reproduce

    Set the configuration at /admin/config/development/environment-indicator as follows: - Source of version identifier to display: "Deployment identifier" - Fallback source of version identifier to display: "Drupal version"

    Make sure there is no deployment identifier configured anywhere. This should show the Drupal version, but shows nothing at all.

Fons Vandamme

Gebruik Drupal als CMS voor een veilige en betrouwbare website die altijd up-to-date is.

Fons Vandamme
Drupal Architect & Sales manager

Met doordachte positionering scheppen we met Drupal een optimale visuele hiërarchie, cohesie en gebruiksvriendelijkheid.