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. Error: Call to undefined function layout_builder_form_entity_form_display_edit_form_alter() in layout_builder_at_form_entity_form_display_edit_form_alter() (line 56 of /web/modules/contrib/layout_builder_at/layout_builder

    Fons

    Problem/Motivation

    The module seems to call a function that doesn't exist anymore in Drupal 11.

    Steps to reproduce

    1. Install a Drupal 11 website
    2. Install the latest layout_builder_at module (Mine is patched see below)
    3. Create a block type to use in layout builder
    4. Go to the form display of this block, the error hits

    Patch:

    "drupal/layout_builder_at": {
        "#3431569: Drupal 11 compatibility": "https://www.drupal.org/files/issues/2024-10-18/D11-compatibility-3431569-8.patch"
    },
    

    Remaining tasks

    Look for a solution for the code at layout_builder_at.module line 56:

    if ($hide) {
        layout_builder_form_entity_form_display_edit_form_alter($form, $form_state);
    }
    
  2. Error: Call to undefined function layout_builder_form_entity_form_display_edit_form_alter() in layout_builder_at_form_entity_form_display_edit_form_alter() (line 56 of /web/modules/contrib/layout_builder_at/layout_builder

  3. Masquerade by URL doesn't work

    Randal

    Hi @julianriemersma,

    Sorry for the delay, I'll try to take a look into this ASAP. I think something else might be wrong still, it's normal the authenticated role can't be chosen (since you *need* that role to use Masquerade by Role), but it shouldn't deny access when trying to masquerade as authenticated.

    I think I've found a solution but need to do more testing. Will keep you updated.

  4. Performance issue with the altSelector method in the SchemaMetatagManager class

    Randal

    Problem/Motivation

    On one of our websites, one that has a lot of available metatags/groups/.., we noticed the node edit page (and a custom entity's edit page) were extremely in loading. Through some profiling with xdebug and xhprof, I've come to the conclusion that the SchemaMetatagManager::altSelector method is the culprit. In our case, it got called 512 times but caused a very noticeable 400 ms delay. After uninstalling schema_metatag locally, the entities' edit pages were fast.

    Proposed resolution

    I'm not 100% certain on what a lasting/stable solution here would be, I think changing this code to the reworked snippet would already be a big step forward.

        /** @var \Drupal\metatag\MetatagManager $metatag_manager */
        $metatag_manager = \Drupal::service('metatag.manager');
        $metatag_groups = $metatag_manager->sortedGroupsWithTags();
    
        $group = '';
        $matches = [];
        $regex = '/:input\[name="(\w+)\[/';
        preg_match($regex, $selector, $matches);
        $id = $matches[1];
        foreach ($metatag_groups as $group_info) {
          if (!empty($group_info['tags'])) {
            if (array_key_exists($id, $group_info['tags'])) {
              $tag = $group_info['tags'][$id];
              $group = $tag['group'];
              break;
            }
          }
        }

    Refreshed/reworked snippet:

      // Add a new property to the manager class.
      protected $metatagGroups;
    
        // Check and fill this property first, and access it directly on succeeding calls.
        if (!isset($this->metatagGroups)) {
          $metatag_manager = \Drupal::service('metatag.manager');
          $this->metatagGroups = $metatag_manager->sortedGroupsWithTags();
        }
    
        $group = '';
        $matches = [];
        $regex = '/:input\[name="(\w+)\[/';
        preg_match($regex, $selector, $matches);
        $id = $matches[1];
        foreach ($this->metatagGroups as $group_info) {
          if (!empty($group_info['tags'])) {
            if (array_key_exists($id, $group_info['tags'])) {
              $tag = $group_info['tags'][$id];
              $group = $tag['group'];
              break;
            }
          }
        }
    

    But I'm open to other suggestions! 😇

  5. Issue with Ajax functionality and Drupal 11

    Fons

    I created a patch with replaces $.trim with .trim() based on the JQuery documentation:

    Note: This API has been deprecated in jQuery 3.5; please use the native String.prototype.trim method instead. Unlike jQuery.trim, String.prototype.trim does not work with types other than strings (null, undefined, Number). Make sure that your code is compatible when migrating.

    Source: https://api.jquery.com/jQuery.trim/#:~:text=Note%3A%20This%20API%20has%2....

    The error is now gone and the functionality works again as it should with AJAX checked.

  6. Issue with Ajax functionality and Drupal 11

    Fons

    I have the same issues in a Drupal 11 environment using the Views Load More module with the following error:

    An error occurred during the execution of the Ajax response: TypeError: $.trim is not a function"

    Your reasoning on where this error comes from seems accurate.

  7. Add more social media link icons

    Sven Decabooter

    Problem/Motivation

    For the Drupal.be I wanted to add links to our Facebook Group & Mastodon account at drupal.community. These do not generate an icon, like Meetup, Linkedin, etc.. do. I guess we can add them to our instance individually, but would be good to get that fixed upstream.

    Maybe we need to make use of the new Icon API in Drupal? https://www.drupal.org/docs/develop/drupal-apis/icon-api

  8. Default tag id and additional IDs no longer return valid IDs.

    Randal

    Problem/Motivation

    In #3450154, the patch added `=== 0` to two of the preg_match comparisons which essentially wrecked this functionality. In our case, this fails in the js code that does this:

      if (additionalConfigInfo.length === 0) {
        gtag('config', config.tagId);
      } else {
        gtag('config', config.tagId, additionalConfigInfo);
      }

    Because the `config.tagId` value is empty.

    Steps to reproduce

    This should be visible as soon as you configure google tag with the google analytics debugger chrome plugin.

    Proposed resolution

    Simply remove the `=== 0` in the comparison so this functionality works again like before.

  9. 8.3.27 triggers error: Class "Drupal\Sniffs\Semantics\FunctionCall" not found

    Sven Decabooter

    Problem/Motivation

    My PHPCS pipeline fails with the new 8.3.27 release. It throws the following error:

    Fatal error: Uncaught Error: Class "Drupal\Sniffs\Semantics\FunctionCall" not found in /root/.composer/vendor/drupal/coder/coder_sniffer/Drupal/Sniffs/Semantics/PregSecuritySniff.php:22

    When I update the pipeline to use 8.3.26 explicitly, it works again. I have checked the release notes for version 8.3.27, but can't find anything specific that would break it, since these classes were not changed recently.

    Any pointers perhaps?

  10. Offering to co-maintain Layout Builder Asymmetric Translation

    Sven Decabooter

    Problem/Motivation

    I would like to become a co-maintainer of this module to merge the Drupal 11 compatibility patch along with any appropriate RTBC issues and create a D11-compatible release.

    You can view my profile to see my large history of work.

    Proposed resolution

    Review my profile and, if approved, add me as co-maintainer with appropriate permissions to merge code, manage issues, and create releases.

    Remaining tasks

    Add me as co-maintainer for this module.

  11. Automated Drupal 11 compatibility fixes for context

    Fons

    I applied MR 35 as a patch:

    https://git.drupalcode.org/project/context/-/merge_requests/35.patch

    But then the D11 compatibility patch didn't apply anymore after that so I made a new one (in attachment) that does work.

    Apply it after the above patch.

  12. Close Layout Builder Browser on placement of block

    Sven Decabooter

    Problem/Motivation

    Related to #3344334: Settings Tray does not close on placement of block, when using layout_builder_browser module, instead of the default settings tray, the browser window should also be closed upon placement of a block from within the iframe.

  13. Offering to co-maintain layout_builder_iframe_modal

    Sven Decabooter

    Problem/Motivation

    I would like to become a co-maintainer of this module to merge the Drupal 11 compatibility patch along with any appropriate RTBC issues and create a D11-compatible release.

    You can view my profile to see my large history of work.

    Proposed resolution

    Review my profile and, if approved, add me as co-maintainer with appropriate permissions to merge code, manage issues, and create releases.

    Remaining tasks

    Add me as co-maintainer for this module.

  14. Explore adding conditions to price list items

    Randal

    I was looking for this functionality as well. We have a website that has pricelists 'linked' to a value on the user entity.

    We import our pricelists from an ERP, and we've worked around this issue by hooking onto the user & pricelist insert/update events.

    Pricelist on insert/update: - Find all users with the custom value and attach them to the customers field User on insert/update: - Remove the user from pricelist(s) with the old value (if applicable) and add to pricelist(s) with the new value

    The main problem here is that, if no users have the value of that pricelist, the pricelist applies to EVERY user. That's something that conditions would have easily solved. In our use case, we've solved this by creating a 'dummy' user and if no other users apply for the pricelist, we attach the 'dummy' user to the pricelist.

    Configuration/development wise this would have been much faster and cleaner if we had conditions, but I understand the argument of speed is a factor here too. I'll set this as postponed, it's not and hasn't been really an active issue and if the need arises later on it can be reopened.

  15. The xls encoder doesn't strip tags when no setting is provided.

    Randal

    Ah.. my bad, you're absolutely right. I overlooked the default value of the class property.

    I'm not sure if a backport to 1.x is still necessary, I suppose it depends on how long 8.x-1.x will remain supported? If it will, then maybe it would be good to have that fix there too 😇

  16. The xls encoder doesn't strip tags when no setting is provided.

    Randal

    Hi @mably, apologies, I hadn't seen that!

    Although if I'm not mistaken that doesn't entirely fix the issue I was experiencing, because the encoder will still not strip tags or trim strings unless a setting is specifically provided (whereas before it would strip/trim by default).

    With the fix currently in the 2.x branch, the warning message is gone, but if the encoder is used in Views Data Export it'll still let any and all HTML through (without the possibility of configuring it otherwise 😞).

    It would be easily solved if encoders allowed configuration forms, but since (I think?) they don't, would it be preferred to keep the old functionality intact?

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.