<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Code-Rhapsodie feed</title>
    <subtitle type="html">Atom feed for last blogposts</subtitle>
    <id>https://www.code-rhapsodie.fr/</id>
            <updated>2026-08-17T09:43:48+02:00</updated>
    
    <link rel="self" type="application/atom+xml" href="https://www.code-rhapsodie.fr/en/feed/all"/>

            <link rel="next" href="https://www.code-rhapsodie.fr/en/feed/all/2"/>
    <link rel="last" href="https://www.code-rhapsodie.fr/en/feed/all/8"/>

    <generator uri="https://www.code-rhapsodie.fr/" version="">Code-Rhapsodie</generator>
    <link href="https://www.code-rhapsodie.fr/" />

            <entry>
            <id>https://www.code-rhapsodie.fr/en/blog/code-genere-par-ia-shadow-dev-et-dette-technique-comment-eviter-la-destabilisation-de-votre-application-php-symfony</id>
            <title><![CDATA[Code généré par IA, Shadow Dev et dette technique : comment éviter la déstabilisation de votre application PHP/Symfony ?]]></title>
            <link rel="alternate" type="text/html"
                  href="https://www.code-rhapsodie.fr/en/blog/code-genere-par-ia-shadow-dev-et-dette-technique-comment-eviter-la-destabilisation-de-votre-application-php-symfony" />
            <updated>2026-08-17T09:43:48+02:00</updated>
            <published>2026-08-17T09:43:37+02:00</published>
                            <category term="https://www.code-rhapsodie.fr/en/tags/audit" label="Audit" />
                            <category term="https://www.code-rhapsodie.fr/en/tags/coaching-technique" label="Coaching-technique" />
                            <category term="https://www.code-rhapsodie.fr/en/tags/technos/ia" label="IA" />
                            <category term="https://www.code-rhapsodie.fr/en/tags/technos/symfony" label="Symfony" />
                            <category term="https://www.code-rhapsodie.fr/en/tags/technos/php" label="PHP" />
                        <author>
                <name>Olivier</name>
            </author>
            <content type="html">
                <![CDATA[        <div         class="ibexa_richtext-field" >
        <p>L'&eacute;mergence des assistants IA (Copilot, Claude, Cursor, OpenAI, Google Gemini) a permis une r&eacute;volution : produire du code 5 fois plus vite, r&eacute;duire les backlogs et acc&eacute;l&eacute;rer le <em>Time-to-Market</em>.</p><p>Mais quelques mois apr&egrave;s le d&eacute;ploiement massif de ces outils, un retour de b&acirc;ton silencieux s'op&egrave;re dans de nombreuses entreprises : <strong>l'explosion de la dette technique</strong>, amplifi&eacute;e par le ph&eacute;nom&egrave;ne &eacute;mergent du <strong>Shadow Dev</strong>.</p><p>C'est l'analogie classique du ch&acirc;teau de cartes : produire des fonctionnalit&eacute;s &agrave; toute vitesse procure un sentiment d'efficacit&eacute; imm&eacute;diat, mais si les fondations architecturales ne sont pas ma&icirc;tris&eacute;es, l'ensemble finit par se fragiliser.</p><h2>Le "Shadow Dev" : quand l'IA contourne les processus de la DSI</h2><p>Apr&egrave;s le <em>Shadow IT</em> (l'usage d'outils SaaS non valid&eacute;s par l'IT), voici l'&egrave;re du <strong>Shadow Dev</strong>.</p><p>Autrefois, d&eacute;velopper une petite fonctionnalit&eacute; m&eacute;tier ou un script d'automatisation n&eacute;cessitait des comp&eacute;tences techniques pointues et la validation de la DSI. Aujourd'hui, un profils marketing, un chef de projet ou un d&eacute;veloppeur junior peut g&eacute;n&eacute;rer un script complet en quelques clics gr&acirc;ce &agrave; des assistants IA.</p><ol><li>Un besoin m&eacute;tier appara&icirc;t,</li><li>Un collaborateur cr&eacute;e une solution "Quick &amp; Dirty" via un LLM,</li><li>Le code est mis en prod sans passer par la revue d'architecture,</li><li>L'application devient critique... mais personne ne sait la maintenir.</li></ol><p><strong>Le probl&egrave;me ?</strong> Ces d&eacute;veloppements "sous le radar" &eacute;chappent totalement aux normes de s&eacute;curit&eacute;, aux tests d'int&eacute;gration et &agrave; la gouvernance de l'entreprise. Lorsqu'ils finissent par &ecirc;tre int&eacute;gr&eacute;s au socle applicatif principal, ils y injectent une dette technique colossale.</p><h2>Le syndrome du "Code Illusoire" : les pi&egrave;ges de l'IA</h2><p>M&ecirc;me au sein des &eacute;quipes de d&eacute;veloppement officielles, l'IA pr&eacute;sente trois limites structurelles majeures si elle n'est pas strictement encadr&eacute;e :</p><ul><li><strong>L'absence de vision syst&eacute;mique :</strong> L'IA r&eacute;sout un probl&egrave;me localis&eacute; (un contr&ocirc;leur, une classe, un script) sans comprendre l'architecture globale Symfony, vos principes DDD ou vos contraintes m&eacute;tiers.</li><li><strong>L'illusion du "&Ccedil;a marche" :</strong> Le code g&eacute;n&eacute;r&eacute; fonctionne lors de tests locaux basiques, mais masque des failles critiques de mont&eacute;e en charge (requ&ecirc;tes SQL N+1, mauvaise gestion des caches Redis, fuites m&eacute;moire).</li><li><strong>La perte de ma&icirc;trise intellectuelle :</strong> La validation passive de Pull Requests (PR) volumineuses g&eacute;n&eacute;r&eacute;es par IA diminue la connaissance fine que les d&eacute;veloppeurs ont de leur propre base de code.</li></ul><h2>Les 4 signaux d'alarme d'un socle applicatif d&eacute;stabilis&eacute;</h2><ol><li><strong>Le Shadow Dev prend le dessus :</strong> Vous d&eacute;couvrez en production des scripts ou des briques de code dont l'&eacute;quipe d'architecture ignorait l'existence.</li><li><strong>Des r&eacute;gression fr&eacute;quentes &agrave; chaque livraison :</strong> Ajouter une fonctionnalit&eacute; simple en casse une autre en raison de couplages forts g&eacute;n&eacute;r&eacute;s par l'IA.</li><li><strong>Des lenteurs serveurs inexpliqu&eacute;es :</strong> La consommation de ressources CPU/RAM s'envole lors des pics de trafic en raison de requ&ecirc;tes BDD non optimis&eacute;es.</li><li><strong>La crainte des mont&eacute;es de version :</strong> Envisager une migration vers les derni&egrave;res versions de Symfony ou d'Ibexa DXP devient un sujet tabou tant le code est devenu h&eacute;t&eacute;rog&egrave;ne.</li></ol><h2>Reprendre le contr&ocirc;le : instaurer une gouvernance "Code &amp; IA"</h2><p>L'objectif n'est pas d'interdire l'IA &mdash; c'est un formidable levier de productivit&eacute; &mdash;, mais de placer des <strong>garde-fous stricts</strong> pour concilier rapidit&eacute; et stabilit&eacute;.</p><ol><li><strong>Canaliser le Shadow Dev :</strong> Offrir un cadre s&eacute;curis&eacute; aux &eacute;quipes m&eacute;tiers pour qu'elles puissent exprimer leurs besoins sans injecter du code "sauvage" dans le SI.</li><li><strong>Renforcer votre CI/CD (Garde-fous automatis&eacute;s) :</strong> Automatisez la d&eacute;tection du code non conforme via des r&egrave;gles d'analyse statique strictes (PHPStan niveau max, SonarQube, Rector et des <a href="https://audit.security.code-rhapsodie.fr/" target="_blank">audits de s&eacute;curit&eacute; automatis&eacute;s</a>).</li><li><strong>Conservez la primaut&eacute; de la revue humaine senior :</strong> Exigez une revue de code rigoureuse pour toute PR int&eacute;grant des suggestions IA.</li><li><strong>R&eacute;alisez un bilan de sant&eacute; technique (Audit) :</strong> &Eacute;valuez l'&eacute;tat r&eacute;el de votre socle par un &oelig;il ext&eacute;rieur neutre pour cartographier la dette accumul&eacute;e et les d&eacute;veloppements fant&ocirc;mes invisibles (Shadow Dev).</li></ol><h2>Reprenez la ma&icirc;trise de votre &eacute;cosyst&egrave;me web</h2><p>La v&eacute;ritable valeur d'une &eacute;quipe technique ne se mesure pas au nombre de lignes de code produites par jour, mais &agrave; la <strong>solidit&eacute;, la s&eacute;curit&eacute; et la p&eacute;rennit&eacute; du syst&egrave;me d'information</strong>.</p><p>Chez <strong>Code Rhapsodie</strong>, nous aidons les entreprises et grands comptes &agrave; reprendre la main sur leurs plateformes PHP, Symfony et Ibexa DXP. Notre offre d'<strong>Audit de Code, Post-IA &amp; Gouvernance</strong> permet d'assainir la dette technique, de d&eacute;tecter le Shadow Dev et d'instaurer les bonnes pratiques d'ing&eacute;nierie.</p><blockquote><p><strong>Un doute sur la qualit&eacute; de votre base de code ?</strong></p><p><a href="https://www.code-rhapsodie.fr/en/services/php-symfony-audit-and-recommendations"><strong>D&eacute;couvrez notre offre d'audit PHP/Symfony &amp; pr&eacute;conisations &rarr;</strong></a></p></blockquote>

    </div>

]]>
            </content>
        </entry>
            <entry>
            <id>https://www.code-rhapsodie.fr/en/blog/nouveautes-de-dataflow-stockage-des-logs-en-fichier-et-nettoyage-automatise-de-l-historique</id>
            <title><![CDATA[Nouveautés de Dataflow : stockage des logs en fichier, et nettoyage automatisé de l'historique]]></title>
            <link rel="alternate" type="text/html"
                  href="https://www.code-rhapsodie.fr/en/blog/nouveautes-de-dataflow-stockage-des-logs-en-fichier-et-nettoyage-automatise-de-l-historique" />
            <updated>2026-08-13T17:10:53+02:00</updated>
            <published>2026-08-13T17:09:46+02:00</published>
                            <category term="https://www.code-rhapsodie.fr/en/tags/technos/dataflow" label="Dataflow" />
                        <author>
                <name>Jérémy J.</name>
            </author>
            <content type="html">
                <![CDATA[        <div         class="ibexa_richtext-field" >
        <p>Vous en avez marre d'avoir les logs de vos jobs dans la base de donn&eacute;es ?<br>Vous en avez encore plus marre d'avoir des ann&eacute;es d'historique de jobs sans moyen pratique de les supprimer ?<br>D&eacute;couvrez les nouvelles fonctionnalit&eacute;s de Dataflow pour all&eacute;ger votre historique.</p><h2>Logs externalis&eacute;s avec Flysystem</h2><p>Jusqu&rsquo;&agrave; pr&eacute;sent, les logs &eacute;taient enregistr&eacute;s en base de donn&eacute;es. Cette m&eacute;thode, bien que pratique, n'est pas compatible avec les moyens modernes de gestion des logs.</p><p>Pour se mettre &agrave; la page, il est possible depuis Dataflow 5.4 d'&eacute;crire les logs dans n'importe quel stockage compatible avec <strong>Flysystem</strong>.</p><p>Voici un exemple de config pour stocker les logs dans un S3 :</p>   <pre>
   <code class="language-Yaml">

oneup_flysystem:
&nbsp; &nbsp;adapters:
&nbsp; &nbsp; &nbsp; &nbsp;awss3v3_dataflow:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;awss3v3:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;client: &#039;Aws\S3\S3Client&#039;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bucket: &#039;%env(string:AWS_BUCKET)%&#039;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;prefix: &#039;dataflow&#039;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;options:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ACL: bucket-owner-full-control
&nbsp; &nbsp; &nbsp; &nbsp;filesystems:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dataflow_logs:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;adapter: awss3v3_dataflow
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;alias: &#039;dataflow_filesystem&#039;
&nbsp; 
   </code>
</pre>

   <pre>
   <code class="language-Yaml">

code_rhapsodie_dataflow:
&nbsp; &nbsp;exceptions_mode:
&nbsp; &nbsp; &nbsp; &nbsp;type: &#039;file&#039;
&nbsp; &nbsp; &nbsp; &nbsp;flysystem_service: &#039;oneup_flysystem.dataflow_logs_filesystem&#039; 
   </code>
</pre>

<h2>Nettoyage automatis&eacute; de l'historique</h2><p>Dans un projet avec plusieurs jobs qui tournent souvent, l'historique peut rapidement se remplir avec des milliers de lignes.</p><p>Pour facilement nettoyer cet historique, une commande est disponible depuis Dataflow 5.5.</p><pre>
   <code class="language-plaintext">

php bin/console code-rhapsodie:dataflow:job:cleanup 
   </code>
</pre>

<p>Cette commande supprime tous les jobs termin&eacute;s depuis plus de 30 jours. Cette dur&eacute;e de r&eacute;tention est configurable :</p>   <pre>
   <code class="language-Yaml">

code_rhapsodie_dataflow:
&nbsp; &nbsp;job_history:
&nbsp; &nbsp; &nbsp; &nbsp;retention: 30 
   </code>
</pre>

<h2>Plantage des jobs</h2><p>M&ecirc;me si Dataflow essaie d'intercepter toutes les erreurs afin de marquer proprement chaque job comme termin&eacute;, il reste des cas o&ugrave; le job reste coinc&eacute; dans l'&eacute;tat "En cours".</p><p>Ceci est source de confusion pour les utilisateurs qui pensent que le job est encore en train de s'ex&eacute;cuter, alors qu'il a plant&eacute;.</p><p>Afin de mieux repr&eacute;senter l'&eacute;tat des jobs, une nouvelle est disponible depuis Dataflow 5.5.</p><pre>
   <code class="language-plaintext">

php bin/console code-rhapsodie:dataflow:job:set-crashed 
   </code>
</pre>

<p>Cette commande marque tous les jobs en cours depuis plus de 24 heures comme plant&eacute;s. Cette dur&eacute;e est configurable :</p>   <pre>
   <code class="language-Yaml">

code_rhapsodie_dataflow:
&nbsp; &nbsp;job_history:
&nbsp; &nbsp; &nbsp; &nbsp;crashed_delay: 24
&nbsp; 
   </code>
</pre>

<p>Vous souhaitez aller plus loin et essayer Dataflow : <a href="https://github.com/code-rhapsodie/dataflow-bundle/#installation" target="_blank">https://github.com/code-rhapsodie/dataflow-bundle/#installation</a></p><p><span class="btn btn-contact"><a href="https://github.com/code-rhapsodie/ibexa-dataflow-bundle/#installation" target="_blank">Essayer Dataflow</a></span>
</p>

    </div>

]]>
            </content>
        </entry>
            <entry>
            <id>https://www.code-rhapsodie.fr/en/blog/comment-utiliser-les-parametres-avec-ibexa_render-et-ibexa_render_location</id>
            <title><![CDATA[Comment utiliser les paramètres avec ibexa_render et ibexa_render_location]]></title>
            <link rel="alternate" type="text/html"
                  href="https://www.code-rhapsodie.fr/en/blog/comment-utiliser-les-parametres-avec-ibexa_render-et-ibexa_render_location" />
            <updated>2026-08-13T16:47:12+02:00</updated>
            <published>2026-08-13T16:44:56+02:00</published>
                            <category term="https://www.code-rhapsodie.fr/en/tags/technos/twig" label="Twig" />
                            <category term="https://www.code-rhapsodie.fr/en/tags/technos/ibexa" label="Ibexa" />
                            <category term="https://www.code-rhapsodie.fr/en/tags/technos/ibexa/ibexa-commerce" label="Ibexa Commerce" />
                        <author>
                <name>Loïc</name>
            </author>
            <content type="html">
                <![CDATA[        <div         class="ibexa_richtext-field" >
        <p>Si vous d&eacute;veloppez sur Ibexa depuis quelques ann&eacute;es, vous avez pris pour habitude de passer des param&egrave;tres personnalis&eacute;s &agrave; une vue, vous utilisiez le contr&ocirc;leur Symfony <strong>ibexa_content::viewAction</strong>.</p><p><strong>Cette &eacute;poque est r&eacute;volue.</strong> Avec l'arriv&eacute;e du support des param&egrave;tres dans les fonctions Twig natives, le vent tourne. Voici pourquoi vous devrez changer dans vos habitudes d&egrave;s aujourd'hui.</p><h2>Le duel : Ancien vs Nouveau</h2><h3>L'ancienne m&eacute;thode (Symfony Standard)</h3><p>On passait par une sous-requ&ecirc;te Symfony pour injecter nos donn&eacute;es :</p>   <pre>
   <code class="language-Twig">

{# &#10060; &Agrave; &eacute;viter d&eacute;sormais pour les rendus simples #}
{{ render(controller(&#039;ibexa_content::viewAction&#039;, {
&nbsp; &nbsp;&#039;contentId&#039;: content.id,
&nbsp; &nbsp;&#039;viewType&#039;: &#039;line&#039;,
&nbsp; &nbsp;&#039;params&#039;: { &#039;my_param&#039;: &#039;custom_data&#039; }
})) }} 
   </code>
</pre>

<h3>La nouvelle m&eacute;thode (Ibexa Native)</h3><p>On utilise le helper d&eacute;di&eacute; qui g&egrave;re tout en interne :</p>   <pre>
   <code class="language-Twig">

{# &#9989; La recommandation actuelle #}
{{ ibexa_render(content, {
&nbsp; &nbsp;&#039;viewType&#039;: &#039;line&#039;,
&nbsp; &nbsp;&#039;params&#039;: { &#039;my_param&#039;: &#039;custom_data&#039; }
}) }} 
   </code>
</pre>

<p>&nbsp;</p><h2>Pourquoi privil&eacute;gier ibexa_render ?</h2><h3>1. Performance : Adieu les sous-requ&ecirc;tes inutiles</h3><p>La fonction render(controller(...)) de Symfony cr&eacute;e ce qu'on appelle une <strong>sous-requ&ecirc;te</strong>. Le noyau de Symfony doit recr&eacute;er un cycle de vie complet (Request, Kernel Events, etc.). &Agrave; l'inverse, ibexa_render avec la m&eacute;thode par d&eacute;faut (direct) appelle directement le moteur de rendu. C'est plus l&eacute;ger, plus rapide, et moins gourmand en m&eacute;moire.</p><h3>2. Lisibilit&eacute; et Intention</h3><p>En utilisant ibexa_render, vous indiquez clairement que vous rendez un objet du CMS. Le code est plus court et beaucoup plus facile &agrave; maintenir pour un nouveau d&eacute;veloppeur sur le projet.</p><h3>3. Flexibilit&eacute; native</h3><p>Le bloc params de la fonction Twig fait exactement la m&ecirc;me chose que celui du contr&ocirc;leur. Vous ne perdez aucune fonctionnalit&eacute;, mais vous gagnez en clart&eacute;.</p><p>&nbsp;</p><h3>Comment mettre &agrave; jour vos templates ?</h3><p>Le passage est indolore. Dans votre template de destination (votre "View Template"), <strong>rien ne change</strong>. Les variables que vous passez dans le tableau params restent accessibles sous le m&ecirc;me nom.</p><p><strong>Exemple de transition :</strong></p><ol><li>Identifiez vos appels render(controller(...)).</li><li>Remplacez-les par ibexa_render(content, { ... }) ou ibexa_render_location(location, { ... }).</li><li>Profitez d'un code plus propre.</li></ol>

    </div>

]]>
            </content>
        </entry>
            <entry>
            <id>https://www.code-rhapsodie.fr/en/blog/reprise-de-la-maintenance-du-provider-apple-pour-php-league-oauth2-client</id>
            <title><![CDATA[Reprise de la maintenance du provider Apple pour PHP League OAuth2 Client]]></title>
            <link rel="alternate" type="text/html"
                  href="https://www.code-rhapsodie.fr/en/blog/reprise-de-la-maintenance-du-provider-apple-pour-php-league-oauth2-client" />
            <updated>2026-04-27T14:02:16+02:00</updated>
            <published>2026-04-27T14:02:15+02:00</published>
                            <category term="https://www.code-rhapsodie.fr/en/tags/technos/php" label="PHP" />
                        <author>
                <name>Jean-Baptiste N.</name>
            </author>
            <content type="html">
                <![CDATA[        <div         class="ibexa_richtext-field" >
        <h2>&#127823; On sauve le package oauth2-apple !</h2><p>Vous utilisez l'authentification Apple dans vos projets PHP ? Alors vous connaissez s&ucirc;rement le package de <a href="https://github.com/patrickbussmann" target="_blank">Patrick Bussmann</a>. Malheureusement, celui-ci n'est plus maintenu depuis un moment, laissant les d&eacute;veloppeurs face &agrave; des enjeux de compatibilit&eacute; et de s&eacute;curit&eacute;.</p><p>Chez Code Rhapsodie, nous croyons fermement &agrave; la force de l'Open Source. Plut&ocirc;t que de laisser cet outil s'&eacute;teindre, nous avons d&eacute;cid&eacute; de prendre nos responsabilit&eacute;s.</p><h2>&#128640; Ce qui change aujourd'hui</h2><p>Nous avons officiellement <a href="https://github.com/code-rhapsodie/oauth2-apple" target="_blank">fork&eacute; le projet</a> pour lui donner un second souffle !</p><p>Maintenance active : Suivi des issues et des pull requests.</p><p>Mises &agrave; jour de s&eacute;curit&eacute; : Un code surveill&eacute; et mis &agrave; jour r&eacute;guli&egrave;rement.</p><p>Compatibilit&eacute; : Alignement avec les derni&egrave;res versions de PHP et des d&eacute;pendances de l'&eacute;cosyst&egrave;me OAuth2.</p><h2>&#128230; Comment l'utiliser ?</h2><p>Rien de plus simple, le nouveau point d'entr&eacute;e est d&eacute;sormais disponible sur Packagist. Pour migrer, il vous suffit de mettre &agrave; jour votre composer.json :</p><p><span class="ezstyle-inline_code">composer require coderhapsodie/oauth2-apple</span>

</p><p>Un grand merci &agrave; Patrick Bussmann pour le travail initial. Nous sommes ravis de pouvoir continuer &agrave; faire vivre cette ressource pour la communaut&eacute;.</p>

    </div>

]]>
            </content>
        </entry>
            <entry>
            <id>https://www.code-rhapsodie.fr/en/blog/nouvelle-fonctionnalite-de-suggestion-de-mots-cles-au-connecteur-gemini-pour-ibexa</id>
            <title><![CDATA[Nouvelle fonctionnalité de suggestion de mots-clés au connecteur Gemini pour Ibexa]]></title>
            <link rel="alternate" type="text/html"
                  href="https://www.code-rhapsodie.fr/en/blog/nouvelle-fonctionnalite-de-suggestion-de-mots-cles-au-connecteur-gemini-pour-ibexa" />
            <updated>2026-04-27T14:02:15+02:00</updated>
            <published>2026-04-27T14:02:14+02:00</published>
                            <category term="https://www.code-rhapsodie.fr/en/tags/technos/gemini" label="Gemini" />
                            <category term="https://www.code-rhapsodie.fr/en/tags/technos/tags" label="Tags" />
                            <category term="https://www.code-rhapsodie.fr/en/tags/technos/ibexa" label="Ibexa" />
                        <author>
                <name>Equipe Code Rhapsodie</name>
            </author>
            <content type="html">
                <![CDATA[        <div         class="ibexa_richtext-field" >
        <p>La suggestion de mots-cl&eacute;s de Taxonomy est disponible dans Ibexa DXP avec le pack de mise &agrave; jour LTS et le LLM OpenAI. Pour plus d'information sur cette fonctionnalit&eacute; :</p><ul><li><a href="https://doc.ibexa.co/en/latest/content_management/taxonomy/taxonomy/#extending-taxonomy-suggestions" target="_blank">la documentation technique des IA Actions</a></li><li><a href="https://doc.ibexa.co/en/latest/content_management/taxonomy/taxonomy/#extending-taxonomy-suggestions" target="_blank">la suggestion de Taxonomy</a></li></ul><p>Cette fonctionnalit&eacute; et maintenant disponible avec <a href="https://github.com/code-rhapsodie/connector-gemini" target="_blank">notre connecteur Gemini</a>. En un click, vous disposez d'une suggestion de mots-cl&eacute;s propos&eacute;s par l'IA qui s'appuie sur une liste de champs de votre contenu (ici Titre, Introduction et Corps de texte).</p>        
<div  class="align-center ibexa-embed-type-image">
    
    
    <figure         class="ibexa_image-field" >
                            <img src="https://www.code-rhapsodie.fr/var/coderhapsodie/storage/images/4/0/8/0/10804-2-fre-FR/b14c97317abc-IA-TAGS-Suggestion.png" alt="" height="1426" width="1726" />
    </figure>


</div>
        
<div  class="align-center ibexa-embed-type-image">
    
    
    <figure         class="ibexa_image-field" >
                            <img src="https://www.code-rhapsodie.fr/var/coderhapsodie/storage/images/0/1/8/0/10810-1-fre-FR/1dc068ef3764-tags-suggestion.png" alt="tags suggestion.png" height="542" width="2266" />
    </figure>


</div>
<h2>Installation</h2><p><a href="https://github.com/code-rhapsodie/connector-gemini" target="_blank">T&eacute;l&eacute;chargez le bundle Gemini Connector</a> et l'installer dans votre projet.</p><p>Depuis l'interface d'administration d'Ibexa, rendez-vous dans Administration / AI actions, ajouter une action IA "Suggest taxonomy" :</p>        
<div  class="align-center ibexa-embed-type-image">
    
    
    <figure         class="ibexa_image-field" >
                            <img src="https://www.code-rhapsodie.fr/var/coderhapsodie/storage/images/2/2/8/0/10822-1-fre-FR/06e15a9d7cb6-add-new-action.png" alt="add-new action.png" height="518" width="945" />
    </figure>


</div>
<p>Compl&eacute;ter la configuration en s&eacute;lectionnant un type de contenu, ici Article, et les zones de saisie &agrave; s&eacute;lectionner (title, intro, body) et le ou les champs taxonomy que l'on veut cibler :</p>        
<div  class="align-center ibexa-embed-type-image">
    
    
    <figure         class="ibexa_image-field" >
                            <img src="https://www.code-rhapsodie.fr/var/coderhapsodie/storage/images/6/1/8/0/10816-1-fre-FR/68473dd3a5b9-ai-action-suggest.png" alt="ai-action-suggest.png" height="1454" width="1171" />
    </figure>


</div>
<p>Et voil&agrave;, &agrave; vous de jouer !</p>

    </div>

]]>
            </content>
        </entry>
            <entry>
            <id>https://www.code-rhapsodie.fr/en/blog/split-a-large-sql-file-into-smaller-ones-for-easier-import</id>
            <title><![CDATA[Split a large SQL file into smaller ones for easier import]]></title>
            <link rel="alternate" type="text/html"
                  href="https://www.code-rhapsodie.fr/en/blog/split-a-large-sql-file-into-smaller-ones-for-easier-import" />
            <updated>2026-04-27T14:02:13+02:00</updated>
            <published>2026-04-27T14:02:12+02:00</published>
                            <category term="https://www.code-rhapsodie.fr/en/tags/technos/sql" label="sql" />
                            <category term="https://www.code-rhapsodie.fr/en/tags/technos/ibexa/linux" label="linux" />
                        <author>
                <name>Olivier PORTIER</name>
            </author>
            <content type="html">
                <![CDATA[        <div         class="ibexa_richtext-field" >
        <h2>Project context</h2><p>The project is installed on a Debian Linux VM (Virtual Box), and we need to debug a problem from an SQL file containing anonymised production data. The SQL file is several gigabytes in size.</p><p>Despite multiple attempts to import &ndash; whether via PHPStorm from your host machine, via command line from the host, or directly within the VM via its terminal &ndash; the result is always the same: the VM freezes, the import fails during the process, forcing you to start all over again.</p><h2>Workaround</h2><p>The best solution is to split the file into several smaller SQL files. We can then import the files to complete the data model from the table that crashed. This way, each file can be re-imported until the import is complete.</p><p>Thanks to <em>Kedar Vaijanapurkar</em> who developed a script for manipulating mysqldump files: <a href="https://github.com/kedarvj/mysqldumpsplitter/" target="_blank">https://github.com/kedarvj/mysqldumpsplitter/</a></p><h2>MySQLDumpSplitter</h2><p>Setup the script on your computer<span class="ezstyle-inline_code">https://github.com/kedarvj/mysqldumpsplitter/blob/master/mysqldumpsplitter.sh</span>

et and add execution rights :</p><pre>$ chmod +x mysqldumpsplitter.sh </pre><p>List all tables in SQL file:</p><pre>$ ./mysqldumpsplitter.sh --source my_huge_sql_file.sql --desc</pre><p>Export the biggest table that crash your import:</p><pre>$ ./mysqldumpsplitter.sh --source my_huge_sql_file.sql --extract REGEXP --match_str 'TABLE_NAME'</pre><p>We get a <span class="ezstyle-inline_code">out/</span>

 folder with a file <span class="ezstyle-inline_code">TABLE_NAME.sql.gz</span>

.</p><h2>Import a gzip file in MySQL</h2><p>To import a .gz file, use gunzip with the following commande:</p><pre>$ gunzip ./out/TABLE_NAME.sql.gz | mysql -h localhost -u &lt;db_user&gt; --password=&lt;db_password&gt; &lt;DBNAME&gt;</pre><p>Unfortunately, we do not have much information on the progress of this import.</p><h2>Progress bar</h2><p>We need a progress bar to see how the import is going:</p>        
<div  class="align-center ibexa-embed-type-image">
    
    
    <figure         class="ibexa_image-field" >
                            <img src="https://www.code-rhapsodie.fr/var/coderhapsodie/storage/images/4/6/7/0/10764-1-fre-FR/e39db5b09fc3-progressebar.png" alt="progressebar.png" height="112" width="1076" />
    </figure>


</div>
<h2>Install the progress bar</h2><pre>sudo apt install pv</pre><h2>Use pv</h2><pre>$ pv ./out/TABLE_NAME.sql.gz | gunzip | mysql -h localhost -u &lt;db_user&gt; --password=&lt;db_password&gt; &lt;DBNAME&gt;</pre><h2>Export multiple tables</h2><p>Exporting and importing work perfectly for a single table. Here's how to export multiple tables:</p><pre>$ ./mysqldumpsplitter.sh --source my_huge_sql_file.sql --extract REGEXP --match_str '(TABLE_NAME_1|TABLE_NAME_2|TABLE_NAME_3|TABLE_NAME_4|TABLE_NAME_5|TABLE_NAME_6|TABLE_NAME_7|TABLE_NAME_8)' </pre><h2>Bulk import script</h2><p>We are not going to execute one command per table, so we will develop a small script to import all the files in the<span class="ezstyle-inline_code">out/</span>

folder</p><p>&nbsp;</p><pre>
   <code class="language-plaintext">

#!/bin/bash
for i in ./out/*.sql.gz
do
&nbsp; echo &quot;Importing: $i&quot;
&nbsp; pv $i | gunzip | mysql -h localhost -u &lt;db_user&gt; --password=&lt;db_password&gt; &lt;DBNAME&gt;
&nbsp; wait
done&nbsp; 
   </code>
</pre>

<p>Execution of a progressive import that runs smoothly:</p><pre>$ chmod +x import-sql-gz.sh
$ ./import-sql-gz.sh</pre><p>Debugging of the project can begin!</p><p>Please contact us for any debugging requests for your solutions or for the implementation of your project. <a href="/contact">Do not hesitate to get in touch</a>.<br>&nbsp;</p>

    </div>

]]>
            </content>
        </entry>
            <entry>
            <id>https://www.code-rhapsodie.fr/en/blog/sylius-vs-shopware-quelle-architecture-choisir-pour-votre-futur-e-commerce</id>
            <title><![CDATA[Sylius vs Shopware : Quelle architecture choisir pour votre futur e-commerce ?]]></title>
            <link rel="alternate" type="text/html"
                  href="https://www.code-rhapsodie.fr/en/blog/sylius-vs-shopware-quelle-architecture-choisir-pour-votre-futur-e-commerce" />
            <updated>2026-01-23T11:19:48+01:00</updated>
            <published>2026-01-23T11:17:00+01:00</published>
                        <author>
                <name>Jean-Baptiste N.</name>
            </author>
            <content type="html">
                <![CDATA[        <div         class="ibexa_richtext-field" >
        <p>Dans l'&eacute;cosyst&egrave;me PHP, il y a de nombreux outils pour r&eacute;aliser un site e-commerce. Voyons deux d'entre eux : <a href="https://sylius.com/fr/" target="_blank"><strong>Sylius</strong></a> et <a href="https://www.shopware.com/en/" target="_blank"><strong>Shopware</strong></a>. Bien qu'ils partagent le m&ecirc;me socle technologique, leurs philosophies divergent radicalement.</p><p>Le choix de l'un ou de l'autre n'est pas qu'une question de fonctionnalit&eacute;s, c'est une d&eacute;cision strat&eacute;gique qui impactera votre flexibilit&eacute; m&eacute;tier et vos co&ucirc;ts de maintenance &agrave; long terme. D&eacute;cryptage.</p><h2>1. Deux philosophies, deux approches du e-commerce</h2><h3>Sylius : Le "Framework" de la sur-mesure</h3><p>Sylius n'est pas une solution "cl&eacute;s en main" au sens traditionnel. C&rsquo;est un framework sp&eacute;cialis&eacute;. &Agrave; l'installation, vous disposez des briques essentielles, mais la plateforme est pens&eacute;e pour &ecirc;tre model&eacute;e par une &eacute;quipe de d&eacute;veloppement. C'est l'outil de pr&eacute;dilection pour les projets o&ugrave; le m&eacute;tier doit dicter le fonctionnement de l'outil, et non l'inverse.</p><h3>Shopware : Le "Produit" orient&eacute; &eacute;cosyst&egrave;me</h3><p>Shopware propose une approche plus packag&eacute;e. Tr&egrave;s orient&eacute; vers les plugins et les applications, il tend de plus en plus vers un mod&egrave;le <strong>SaaS (Software as a Service)</strong>. C'est une solution robuste qui permet de lancer des fonctionnalit&eacute;s rapidement gr&acirc;ce &agrave; son marketplace, tout en offrant une version auto-h&eacute;berg&eacute;e pour plus de contr&ocirc;le.</p><h2>2. L'extension du syst&egrave;me : SaaS vs Self-Hosted</h2><p>Le choix de l'architecture d'extension est le point de rupture entre les deux outils :</p><p><strong>L'approche Shopware (Vision SaaS) :</strong> Via son mod&egrave;le d'applications, Shopware d&eacute;porte la logique m&eacute;tier vers des services tiers via des <strong>Webhooks</strong> et des <strong>API</strong>. C&rsquo;est id&eacute;al pour la scalabilit&eacute;, mais cela limite la personnalisation au p&eacute;rim&egrave;tre des points d'extension pr&eacute;vus par l'&eacute;diteur.</p><p><strong>L'approche Sylius (Vision Framework) :</strong> Ici, le "SaaS" pur est plus complexe &agrave; mettre en &oelig;uvre car Sylius mise sur la souplesse. La personnalisation se fait au c&oelig;ur du code, offrant une libert&eacute; totale.</p><blockquote><p><strong>Le saviez-vous ?</strong> Si vous h&eacute;bergez vous-m&ecirc;me Shopware, vous pouvez utiliser des <strong>Plugins</strong> (similaires aux Bundles Symfony). Attention toutefois: multiplier les plugins tiers peut complexifier vos futures mises &agrave; jour, une probl&eacute;matique que les d&eacute;veloppeurs Symfony ont bien connue avec l'&egrave;re des "tout bundles" de Symfony 2.</p></blockquote><h2>3. Comparatif Technique : Sous le capot</h2><p>Bien que les deux utilisent Symfony, leur gestion des donn&eacute;es et de l'interface diff&egrave;re :</p><table class="table"><thead><tr><th><strong>Caract&eacute;ristique</strong></th><th><strong>Sylius</strong></th><th><strong>Shopware</strong></th></tr></thead><tbody><tr><td><strong>Gestion des donn&eacute;es</strong></td><td>Doctrine ORM (standard Symfony)</td><td>Couche d'abstraction propri&eacute;taire (DAL)</td></tr><tr><td><strong>Modification DB</strong></td><td>Surcharge de mod&egrave;les (souple)</td><td>Configuration &amp; tables d&eacute;di&eacute;es (rigide)</td></tr><tr><td><strong>Frontend</strong></td><td>Personnalisation totale "from scratch"</td><td>Syst&egrave;me de th&egrave;mes bas&eacute; sur l'h&eacute;ritage</td></tr><tr><td><strong>Recherche</strong></td><td>&Agrave; ajouter (<a href="https://www.elastic.co/fr/elasticsearch" target="_blank">Elasticsearch</a>, <a href="https://www.algolia.com/fr" target="_blank">Algolia</a>...)</td><td>Native (Elasticsearch/<a href="https://opensearch.org/" target="_blank">OpenSearch</a> requis)</td></tr></tbody></table><p><strong>Le point critique :</strong> Dans Shopware, la recherche est int&eacute;gr&eacute;e nativement, ce qui acc&eacute;l&egrave;re le "Time to Market". Dans Sylius, cette brique doit &ecirc;tre construite ou int&eacute;gr&eacute;e via un plugin, ce qui demande plus d'effort initial mais permet de choisir une solution parfaitement calibr&eacute;e (comme <a href="https://www.meilisearch.com/" target="_blank">Meilisearch</a> ou Algolia).</p><h2>4. Comment faire le bon choix ?</h2><p>Le choix final d&eacute;pend de votre &eacute;quipe et de votre vision strat&eacute;gique :</p><p><strong>Optez pour le SaaS (Shopware Cloud)</strong> si vous souhaitez d&eacute;l&eacute;guer la maintenance technique et adapter vos processus m&eacute;tier aux outils existants.</p><p><strong>Optez pour l'Auto-h&eacute;berg&eacute; (Sylius ou Shopware Self-hosted)</strong> si vous avez des besoins m&eacute;tier sp&eacute;cifiques, des flux de donn&eacute;es complexes ou une volont&eacute; de ma&icirc;triser votre infrastructure de A &agrave; Z.</p><h2>Pourquoi vous faire accompagner ?</h2><p>Peu importe l'outil choisi, la r&eacute;ussite de votre projet d&eacute;pend de la qualit&eacute; de l'impl&eacute;mentation. Une application e-commerce mal con&ccedil;ue devient rapidement une dette technique co&ucirc;teuse.</p><p><strong>Notre expertise technique &agrave; votre service :</strong></p><p>Que vous penchiez pour la souplesse absolue de <strong>Sylius</strong> ou la puissance de l'&eacute;cosyst&egrave;me <strong>Shopware</strong>, nous vous accompagnons dans :</p><ul><li>Le choix de l'architecture adapt&eacute;e &agrave; votre volume de ventes.</li><li>Le d&eacute;veloppement de fonctionnalit&eacute;s m&eacute;tier sp&eacute;cifiques.</li><li>La maintenance &eacute;volutive et l'optimisation des performances.</li></ul><p>Vous avez un projet e-commerce et vous h&eacute;sitez encore sur la technologie ? <a href="#section-contact">Contactez nos experts pour un audit technique</a></p><p>&nbsp;</p>

    </div>

]]>
            </content>
        </entry>
            <entry>
            <id>https://www.code-rhapsodie.fr/en/blog/ibexa-announces-the-release-of-a-new-lts-version-with-contributions-from-code-rhapsodie</id>
            <title><![CDATA[Ibexa announces the release of a new LTS version with contributions from Code Rhapsodie]]></title>
            <link rel="alternate" type="text/html"
                  href="https://www.code-rhapsodie.fr/en/blog/ibexa-announces-the-release-of-a-new-lts-version-with-contributions-from-code-rhapsodie" />
            <updated>2026-04-27T14:01:47+02:00</updated>
            <published>2026-04-27T14:01:46+02:00</published>
                            <category term="https://www.code-rhapsodie.fr/en/tags/technos/symfony" label="Symfony" />
                            <category term="https://www.code-rhapsodie.fr/en/tags/technos/ibexa" label="Ibexa" />
                        <author>
                <name>Code Rhapsodie team</name>
            </author>
            <content type="html">
                <![CDATA[        <div         class="ibexa_richtext-field" >
        <p>On 10 December 2025, Ibexa published <a href="https://developers.ibexa.co/security-advisories/ibexa-sa-2025-005-password-change-and-xss-vulnerabilities-in-back-office" target="_blank">a security advisory and subsequently released new versions of <strong>Ibexa DXP v4.6.26 and v5.0.4</strong></a>.</p><p>As part of an Ibexa 5 project, we identified a security flaw when changing a user's password.</p><p>We reported this flaw to the publisher Ibexa through our client's support portal. Ibexa fixed it and included it in the new version 5.0.4. Thank you to Ibexa for the mention &#128079;</p><p><strong>Don't wait to start an Ibexa 5 project to benefit from Symfony 7 and PHP 8.3</strong> and above. Despite a few anomalies that we are identifying as we go along, version 5 is very stable and perfectly suited to starting your DXP project.</p><p>&nbsp;</p>

    </div>

]]>
            </content>
        </entry>
            <entry>
            <id>https://www.code-rhapsodie.fr/en/blog/connecteur-mistral-pour-les-actions-ia-d-ibexa</id>
            <title><![CDATA[Connecteur Mistral pour les actions IA d'Ibexa]]></title>
            <link rel="alternate" type="text/html"
                  href="https://www.code-rhapsodie.fr/en/blog/connecteur-mistral-pour-les-actions-ia-d-ibexa" />
            <updated>2026-04-27T14:01:48+02:00</updated>
            <published>2026-04-27T14:01:47+02:00</published>
                            <category term="https://www.code-rhapsodie.fr/en/tags/technos/ia" label="IA" />
                            <category term="https://www.code-rhapsodie.fr/en/tags/technos/mistral" label="Mistral" />
                            <category term="https://www.code-rhapsodie.fr/en/tags/technos/ibexa" label="Ibexa" />
                        <author>
                <name>L&#039;équipe de Code Rhapsodie</name>
            </author>
            <content type="html">
                <![CDATA[        <div         class="ibexa_richtext-field" >
        <p>Le connecteur Mistral pour Ibexa est compatible avec Ibexa v4.6 et n&eacute;cessite<a href="https://doc.ibexa.co/en/latest/release_notes/ibexa_dxp_v4.6/#ibexa-dxp-v4613" target="_blank"> la LTS Update AI Actions</a>. Pour commencer &agrave; utiliser les actions IA, il est n&eacute;cessaire d'installer <a href="https://doc.ibexa.co/en/latest/ai_actions/install_ai_actions/" target="_blank" title="Voir les actions d'installation requises dans la documentation officielle">les paquets requis et de proc&eacute;der &agrave; la configuration initiale des AI Actions</a>.</p><p>Dans un second temps vous devrez suivre la documentation d'installation disponible dans <a href="https://github.com/code-rhapsodie/connector-mistral/blob/master/README.md" target="_blank" title="README du connecteur Mistral">le README du connecteur Mistral pour AI actions.</a></p><p>Pour configurer votre clef d'API Mistral, rendez-vous sur <a href="https://docs.mistral.ai/getting-started/quickstart" target="_blank">la documentation Mistral Ai pour les d&eacute;veloppeurs</a>.</p><p><br>N'oubliez pas d'<strong>importer les migrations </strong>apr&egrave;s l'installation et l'activation du connecteur. Ces migrations vous mettent &agrave; disposition des actions par d&eacute;faut telles que :</p><ul><li>r&eacute;sumer un texte (summarize),</li><li>reformuler un texte (rewrite),</li><li>raccourcir un texte (shorten).</li></ul><h3>R&eacute;sumer, raccourcir, reformuler ... traduire</h3><p>Dans les blocs de texte riches, vous disposez aussi d'un bouton d'action IA. S&eacute;lectionnez un paragraphe ou une portion de texte et choisissez l'action qui sera ex&eacute;cut&eacute;e par Mistral AI.</p>        
<div  class="align-center ibexa-embed-type-image">
    
    
    <figure         class="ibexa_image-field" >
                            <img src="https://www.code-rhapsodie.fr/var/coderhapsodie/storage/images/7/3/4/0/10437-1-fre-FR/5045678e90ac-mistralaidemo.png" alt="mistralaidemo.png" height="1434" width="2274" />
    </figure>


</div>
<p>Vous aurez le choix de remplacer le texte ou de l'ajouter dessous et ainsi remanier votre texte comme bon vous semble.</p><h3>Pour en savoir plus</h3><p>Pour aller plus loin et pourquoi pas d&eacute;velopper votre propre connecteur IA, prenez connaissance de <a href="https://doc.ibexa.co/en/latest/ai_actions/ai_actions/" target="_blank" title="Ibexa AI Actions documentation">la documentation officielle l'Ibexa AI Actions</a>.</p><p>Votre aide est pr&eacute;cieuse, si vous aimez notre connecteur, parlez-en sur les r&eacute;seaux sociaux ou <a href="https://github.com/code-rhapsodie/connector-mistral" target="_blank" title="D&eacute;velopper sur GitHub du Connecteur Mistral">participer au co-d&eacute;veloppement sur Github</a>.</p><p>&nbsp;</p>

    </div>

]]>
            </content>
        </entry>
            <entry>
            <id>https://www.code-rhapsodie.fr/en/blog/is-the-naming-of-ibexa-dxp-page-builder-zones-suitable-for-contributors</id>
            <title><![CDATA[Is the naming of Ibexa DXP Page Builder zones suitable for contributors?]]></title>
            <link rel="alternate" type="text/html"
                  href="https://www.code-rhapsodie.fr/en/blog/is-the-naming-of-ibexa-dxp-page-builder-zones-suitable-for-contributors" />
            <updated>2026-04-27T14:01:44+02:00</updated>
            <published>2026-04-27T14:01:43+02:00</published>
                            <category term="https://www.code-rhapsodie.fr/en/tags/technos/ibexa" label="Ibexa" />
                            <category term="https://www.code-rhapsodie.fr/en/tags/technos/page-builder" label="Page Builder" />
                        <author>
                <name>Olivier Portier</name>
            </author>
            <content type="html">
                <![CDATA[        <div         class="ibexa_richtext-field" >
        <h2>Zones in Ibexa Page Builder</h2><p>Within the Ibexa DXP Page Builder, you define the layout of your pages by declaring content zones. Blocks are then dragged and dropped into these zones to construct the page progressively, block by block.</p><p>Here's an example of a zone configuration within an Ibexa YAML file:</p><pre>        dlayout_three_rows_two_columns:
            identifier: 'layout_three_rows_two_columns'
            name: 'Three rows, two columns'
            description: 'Three rows, two columns'
            thumbnail: '/bundles/ibexadashboard/img/layouts/three_rows_two_columns.svg'
            template: '@ibexadesign/dashboard/builder/layouts/three_rows_two_columns.html.twig'
            zones:
                top:
                    name: 'top'
                middle_left:
                    name: 'middle-left'
                middle_right:
                    name: 'middle-right'
                bottom:
                    name: 'bottom'</pre><p>The '<em><strong>top</strong></em>' zone name is '<strong>top</strong>' but this name won't appear anywhere in the Page Builder's edit interface; it will be identified as <strong>Drop zone 1</strong>:</p>        
<div  class="align-center ibexa-embed-type-image">
    
    
    <figure         class="ibexa_image-field" >
                            <img src="https://www.code-rhapsodie.fr/var/coderhapsodie/storage/images/9/2/3/0/10329-1-fre-FR/b99bb96173cd-dashboard-edition-zones.png" alt="dashboard-edition-zones.png" height="756" width="2244" />
    </figure>


</div>
<p>The same principle applies in the <strong>Structure view</strong> (which is very useful to move blocks from one zone to another). Zones are identified as <strong>Drop zone 1</strong>, <strong>Drop zone 2</strong>, <strong>Drop zone 3</strong>, and so on...:</p>        
<div  class="align-center ibexa-embed-type-image">
    
    
    <figure         class="ibexa_image-field" >
                            <img src="https://www.code-rhapsodie.fr/var/coderhapsodie/storage/images/_aliases/reference/5/3/3/0/10335-1-fre-FR/69e3d7a075dd-treemenu.png" alt="treemenu.png" height="600" width="492" />
    </figure>


</div>
<p>What's the point of assigning a specific name in the configuration if that name isn't used anywhere?</p><h2>How is the zone name displayed?</h2><p>The zone names are displayed in JavaScript by the following scripts:</p><ul><li>ibexa/page-builder/src/bundle/ui-dev/src/modules/page-builder/page.builder.js</li><li>ibexa/page-builder/src/bundle/ui-dev/src/modules/page-builder/components/structure/structure.tree.js</li></ul><pre>const hasFieldset = zone.querySelector('fieldset') !== null;

if (!hasFieldset) {
  const dropZoneLabel = Translator.trans(
    /*@Desc("Drop zone %number%")*/ 'structure.drop.zone',
    {
        number: index + 1,
    },
    'ibexa_page_builder',
  );
  const fieldset = document.createElement('fieldset');
  const legend = document.createElement('legend');</pre><p>It's tricky translating text strings when the labels change depending on the area. Within the <em>page.builder.js</em> script, it appears that if a <span class="ezstyle-inline_code">&lt;fieldset&gt;</span>

 element already exists in the DOM for a given area, it isn't recreated.</p><p>Without getting into overly complex development or kernel hacks, we should be able to add this HTML block to our layout template to properly name our areas,</p><h2>Ensuring intuitive zone names</h2><p>Consequently, we've added the <span class="ezstyle-inline_code">&lt;fieldset&gt;</span>

 and <span class="ezstyle-inline_code">&lt;legend&gt;</span>

elements, with the zone name configured in our YAML file, to our <span class="ezstyle-inline_code">three_rows_two_columns.html.twig</span>

 template.</p><pre>&lt;div class="ibexa-db-zones"&gt;
    &lt;div class="ibexa-db-zones__row"&gt;
        &lt;div class="ibexa-db-zones__zone" data-ibexa-zone-id="{{ zones[0].id }}"&gt;
             &lt;fieldset class="m-page-builder__fieldset"&gt;
                &lt;legend class="m-page-builder__legend"
                        style="background-color: white; padding: 3px; border-radius: 5px; border: 1px dashed #4191ff;"
                &gt;
                  {{ zones[0].name }}
                &lt;/legend&gt;
             &lt;/fieldset&gt;
    
            {% if zones[0].blocks %}
    ...
             
            {% endif %}
        &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ibexa-db-zones__row ibexa-db-zones__row--double"&gt;
        &lt;div class="ibexa-db-zones__zone" data-ibexa-zone-id="{{ zones[1].id }}"&gt;
            &lt;fieldset class="m-page-builder__fieldset"&gt;
                &lt;legend class="m-page-builder__legend"
                        style="background-color: white; padding: 3px; border-radius: 5px; border: 1px dashed #4191ff;"
                &gt;
                  {{ zones[0].name }}
                &lt;/legend&gt;
            &lt;/fieldset&gt;            
            {% if zones[1].blocks %}

   ...

            {% endif %}
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div</pre>        
<div  class="align-center ibexa-embed-type-image">
    
    
    <figure         class="ibexa_image-field" >
                            <img src="https://www.code-rhapsodie.fr/var/coderhapsodie/storage/images/1/4/3/0/10341-1-fre-FR/a79b7d0d650c-zone-renames.png" alt="zone-renames.png" height="876" width="3006" />
    </figure>


</div>
<p>The preview areas now offer clearer, more informative feedback, which is particularly helpful when dealing with complex editorial management scenarios, such as the following example:</p>        
<div  class="align-center ibexa-embed-type-image">
    
    
    <figure         class="ibexa_image-field" >
                            <img src="https://www.code-rhapsodie.fr/var/coderhapsodie/storage/images/7/4/3/0/10347-1-fre-FR/82f8b28b1f0e-zones-custom-ibexa-stackable.png" alt="zones-custom-ibexa-stackable.png" height="1126" width="3010" />
    </figure>


</div>
<p>Without explicit zone names, the editorial team can't distinguish between a Cover zone, a zone with <a href="https://tailwindcss.com/plus/ui-blocks/application-ui/application-shells/stacked" target="_blank" title="Tailwind stackable blocks"><em>stackable blocks</em></a> (which we'll discuss in a future article), or a adaptable zone where blocks display one after the other.</p><p>Any ideas on how to promote this functionality, which really <strong>should</strong> be native in Ibexa DXP within the <em>Structure view</em>? I'm calling on the Ibexa team to bring us this small improvement with Ibexa 5.</p><p>&nbsp;</p><p><em><strong>Update of 16th of october</strong></em></p><p>We continued development and created a hack to get all the areas with the desired name. Voil&agrave;!</p>        
<div  class="align-center ibexa-embed-type-image">
    
    
    <figure         class="ibexa_image-field" >
                            <img src="https://www.code-rhapsodie.fr/var/coderhapsodie/storage/images/9/8/4/0/10489-3-fre-FR/328760eda8b0-zones-custom-ibexa-stackable-finale.png" alt="" height="1126" width="3010" />
    </figure>


</div>
<p>If you would like to know more, please do not hesitate to <a href="https://www.code-rhapsodie.fr/en/contact">contact us.</a></p>

    </div>

]]>
            </content>
        </entry>
    </feed>
