Contao Content Visibility : masquer des contenus dans le back-office, par groupe d'utilisateurs

Contao Content Visibility : masquer des contenus dans le back-office, par groupe d'utilisateurs

Petit préambule pour situer le décor. Contao, c’est un CMS/CMF open source d’origine allemande. Discret, mais redoutablement efficace. Moins omniprésent que WordPress, moins “tendance” que Strapi - et pourtant, dès qu’on met les mains dedans, difficile de revenir en arrière.

Son back-office est propre, structuré, sans surprise. Et comme il repose sur Symfony, on bénéficie d’une base solide, proprement architecturée. Bref, une techno qui ne fait pas de bruit… mais qui fait très bien le job.


Le problème (réel et récurrent)

Sur plusieurs projets Contao, je me suis retrouvé face au même besoin.

Un back-office partagé entre différents profils :

  • des rédacteurs,
  • des responsables de contenu,
  • parfois même des clients avec un accès direct.

Contao gère déjà très bien les droits… mais uniquement au niveau des types de contenu. On peut autoriser un groupe à créer des titres, interdire les galeries à un autre, etc.

Mais dès qu’un contenu existe déjà, c’est une autre histoire.

Impossible, nativement, de dire :

“ce bloc-là, dans cette page, tu peux l’éditer - mais celui-ci, non”

Résultat : soit on donne accès à toute la page, soit à rien du tout. Un peu brutal. Et si on rajoute des éléments de contenu de type "HTML/HTML non filtré", le simple éditeur se retrouve avec des balises HTML assez barbares.


La solution : Contao Content Visibility

L’idée derrière ce bundle est volontairement simple : ajouter une couche de granularité… là où elle manque.

Dans le formulaire d’édition de chaque élément de contenu, une nouvelle section apparaît :

Une simple case à cocher : “Masquer dans l’administration”

Une fois activée, une liste de groupes d’utilisateurs s’affiche :

On choisit les groupes concernés, on sauvegarde… et c’est tout.

👉 Les utilisateurs appartenant à ces groupes ne voient plus l’élément. Pas grisé. Pas verrouillé. Juste… inexistant.


Et pour les admins ?

Les super-admins & admins, eux, continuent de tout voir.

Mais pour garder une bonne lisibilité, un petit badge est ajouté dans la liste des éléments :

Discret, mais suffisant pour comprendre qu’un filtre est en place.


Ce que le bundle ne fait pas (et c’est volontaire)

Pas de magie noire ici.

Le module ne remplace pas le système de droits de Contao. Il vient simplement se poser au-dessus, sans interférer.

  • Si un groupe n’a déjà pas accès à un type de contenu → rien ne change
  • Aucun impact côté front-office
  • Aucun effet de bord sur les permissions existantes

L’objectif est clair : rester simple, prévisible, et sans surprise.


Sous le capot

Pour ceux que ça intéresse.

Le filtrage repose sur un listener Symfony branché sur le hook loadDataContainer. Quand un utilisateur non-admin charge la liste tl_content, une condition SQL est injectée dynamiquement dans le DCA.

En gros, on exclut les éléments masqués selon ses groupes.

 NOT (hide_content = 1 AND (hide_from_groups LIKE '%s:1:"3";%')) AND 1=?

Ce AND 1=? un peu étrange ?

C’est un workaround lié à PDO : les % dans les LIKE peuvent entrer en conflit avec les placeholders. Du coup, on ajoute une condition toujours vraie (1=? avec 1) pour “satisfaire” le moteur.

Pas très élégant, mais efficace.


Autre détail : le badge dans le listing.

Ici, pas de label_callback. Comme tl_content est en parent view (mode 4), c’est le child_record_callback qui pilote l’affichage de chaque ligne.

Un de ces petits pièges qu’on découvre… en production 😄J'en ai chié.


Installation

Le bundle est disponible sur Packagist :

 composer require greeneffect/contao-content-visibility

Le repo est pensé pour être propre et maintenable. Ou en tout cas, j'ai essayé :

  • migrations automatiques
  • traductions FR / EN / DE
  • tests PHPUnit
  • CI GitHub Actions
  • CHANGELOG, CONTRIBUTING, SECURITY…

Bref, rien d’exotique - juste ce qu’il faut pour que le projet vive correctement.


Conclusion

Ce n’est pas un gros bundle. Pas une usine à gaz. Pas une révolution.

Juste une petite brique qui manquait dans certains projets… et qui fait exactement ce qu’on attend d’elle.

👉 GreenEffect/contao-content-visibility sur GitHub

Si vous utilisez Contao et que vous avez déjà rencontré ce besoin, ça devrait vous parler. Et comme toujours : PR bienvenues.

(Image de couverture générée par IA)