<?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.com/feed/all"/>

            <link rel="next" href="https://www.code-rhapsodie.com/feed/all/2"/>
    <link rel="last" href="https://www.code-rhapsodie.com/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.com/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.com/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.com/tags/audit" label="Audit" />
                            <category term="https://www.code-rhapsodie.com/tags/coaching-technique" label="Coaching-technique" />
                            <category term="https://www.code-rhapsodie.com/tags/technos/ia" label="IA" />
                            <category term="https://www.code-rhapsodie.com/tags/technos/symfony" label="Symfony" />
                            <category term="https://www.code-rhapsodie.com/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.com/services/audit-php-symfony-ibexa-code-augmente-post-ai-et-preconisations"><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.com/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.com/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.com/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.com/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.com/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.com/tags/technos/twig" label="Twig" />
                            <category term="https://www.code-rhapsodie.com/tags/technos/ibexa" label="Ibexa" />
                            <category term="https://www.code-rhapsodie.com/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.com/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.com/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.com/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.com/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.com/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.com/tags/technos/gemini" label="Gemini" />
                            <category term="https://www.code-rhapsodie.com/tags/technos/tags" label="Tags" />
                            <category term="https://www.code-rhapsodie.com/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.com/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.com/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.com/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.com/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.com/blog/diviser-un-fichier-sql-volumineux-en-petits-fichiers-pour-un-import-facilite</id>
            <title><![CDATA[Diviser un fichier SQL volumineux en petits fichiers pour un import facilité]]></title>
            <link rel="alternate" type="text/html"
                  href="https://www.code-rhapsodie.com/blog/diviser-un-fichier-sql-volumineux-en-petits-fichiers-pour-un-import-facilite" />
            <updated>2026-04-27T14:02:13+02:00</updated>
            <published>2026-04-27T14:02:12+02:00</published>
                            <category term="https://www.code-rhapsodie.com/tags/technos/sql" label="sql" />
                            <category term="https://www.code-rhapsodie.com/tags/technos/ibexa/linux" label="linux" />
                        <author>
                <name>Olivier PORTIER</name>
            </author>
            <content type="html">
                <![CDATA[        <div         class="ibexa_richtext-field" >
        <h2>Contexte du projet</h2><p>Le projet est install&eacute; sur une VM Linux Debian (Virtual Box), nous devons d&eacute;boguer un probl&egrave;me &agrave; partir d'un fichier SQL avec des donn&eacute;es de production anonymis&eacute;es. Le fichier SQL fait plusieurs giga octets.</p><p><br>Malgr&eacute; de multiples tentatives d'importation &ndash; que ce soit via PHPStorm depuis votre machine h&ocirc;te, en ligne de commande depuis l'h&ocirc;te, ou directement au sein de la VM via son terminal &ndash; le r&eacute;sultat est syst&eacute;matiquement le m&ecirc;me : la VM se fige, l'importation &eacute;choue en cours de processus, obligeant &agrave; tout reprendre depuis le d&eacute;but.</p><h2>Solution de contournement</h2><p>La meilleur solution envisag&eacute;e c'est de d&eacute;couper le fichier en plusieurs petits fichiers SQL. Nous pourrons alors importer les fichiers pour compl&eacute;ter le mod&egrave;le des donn&eacute;es &agrave; partir de la table qui &agrave; plant&eacute;e. Ainsi chaque fichier pourra &ecirc;tre reprise jusqu'&agrave; l'import complet.</p><p>Merci &agrave; <em>Kedar Vaijanapurkar</em> qui a d&eacute;velopp&eacute; un script permettant de manipuler un fichier mysqldump : <a href="https://github.com/kedarvj/mysqldumpsplitter/" target="_blank">https://github.com/kedarvj/mysqldumpsplitter/</a></p><h2>MySQLDumpSplitter</h2><p>Pour installer le script <span class="ezstyle-inline_code">https://github.com/kedarvj/mysqldumpsplitter/blob/master/mysqldumpsplitter.sh</span>

et ajouter les droits d'&eacute;x&eacute;cution :</p><pre>$ chmod +x mysqldumpsplitter.sh </pre><p>Lister les tables pr&eacute;sentes dans le fichier SQL :</p><pre>$ ./mysqldumpsplitter.sh --source my_huge_sql_file.sql --desc</pre><p>Exporter la table la plus grosse qui plante &agrave; chaque tentative :</p><pre>$ ./mysqldumpsplitter.sh --source my_huge_sql_file.sql --extract REGEXP --match_str 'TABLE_NAME'</pre><p>On obtient dans le dossier <span class="ezstyle-inline_code">out/</span>

 un fichier<span class="ezstyle-inline_code">TABLE_NAME.sql.gz</span>

.</p><h2>Import d'un fichier gzip dans MySQL</h2><p>Pour l'importer, on va utiliser gunzip avec la commande suivante :</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>Malheureusement, nous n'avons pas beaucoup d'information sur l'avanc&eacute; de cet import.</p><h2>Barre de progression</h2><p>Il nous faudrait une barre de progression pour plus de visibilit&eacute; sur l'avanc&eacute;e de l'import :</p>        
<div  class="align-center ibexa-embed-type-image">
    
    
    <figure         class="ibexa_image-field" >
                            <img src="https://www.code-rhapsodie.com/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>Installer progresse bar</h2><pre>sudo apt install pv</pre><h2>Utiliser 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 de plusieurs tables</h2><p>L'export et l'import fonctionnent parfaitement pour une table, voici comment en exporter plusieurs :</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>Script d'import en masse</h2><p>Nous n'allons pas executer une commande par table, on va donc se d&eacute;velopper un petit script d'import de tous les fichiers pr&eacute;sents dans le dossier <span class="ezstyle-inline_code">out/</span>

</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>Ex&eacute;cution d'un import progressif qui se d&eacute;roule sans accros :</p><pre>$ chmod +x import-sql-gz.sh
$ ./import-sql-gz.sh</pre><p>Le d&eacute;bogage du projet peut commencer !</p><p>Nous vous invitons &agrave; nous contacter pour toute demande de d&eacute;bogage de vos solutions ou pour la mise en oeuvre de votre projet, <a href="/contact">n'h&eacute;sitez pas &agrave; nous solliciter</a>.<br>&nbsp;</p>

    </div>

]]>
            </content>
        </entry>
            <entry>
            <id>https://www.code-rhapsodie.com/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.com/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.com/blog/ibexa-annonce-la-sortie-d-une-nouvelle-version-lts-avec-les-contributions-de-code-rhapsodie</id>
            <title><![CDATA[Ibexa annonce la sortie d'une nouvelle version LTS avec les contributions de Code Rhapsodie]]></title>
            <link rel="alternate" type="text/html"
                  href="https://www.code-rhapsodie.com/blog/ibexa-annonce-la-sortie-d-une-nouvelle-version-lts-avec-les-contributions-de-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.com/tags/technos/symfony" label="Symfony" />
                            <category term="https://www.code-rhapsodie.com/tags/technos/ibexa" label="Ibexa" />
                        <author>
                <name>Code Rhapsodie team</name>
            </author>
            <content type="html">
                <![CDATA[        <div         class="ibexa_richtext-field" >
        <p>Ibexa a publi&eacute; le 10 d&eacute;cembre 2025 <a href="https://developers.ibexa.co/security-advisories/ibexa-sa-2025-005-password-change-and-xss-vulnerabilities-in-back-office" target="_blank">un avis de s&eacute;curit&eacute;</a> et sortie dans la foul&eacute;e une nouvelle version <strong>Ibexa DXP v4.6.26 et v5.0.4.</strong></p><p>Dans le cadre d'un projet Ibexa 5, nous avons identifi&eacute; une faille de s&eacute;curit&eacute; lors du changement de mot de passe d'un utilisateur.&nbsp;</p><p>Nous avons d&eacute;clar&eacute; cette faille &agrave; l'&eacute;diteur Ibexa au travers du portail de support de notre client. Ibexa l'a corrig&eacute; et inclut &agrave; la nouvelle version 5.0.4. Merci &agrave; Ibexa pour la mention &#128079;</p><p><strong>N'attendez pas pour d&eacute;marrer un projet Ibexa 5 </strong>et b&eacute;n&eacute;ficiez de Symfony 7 et PHP 8.3 et +. Malgr&eacute; quelques anomalies que nous identifions au fils de l'eau, la version 5 est tr&egrave;s stable et tout &agrave; fait adapt&eacute;e pour d&eacute;marrer votre projet DXP.</p><p>&nbsp;</p>

    </div>

]]>
            </content>
        </entry>
            <entry>
            <id>https://www.code-rhapsodie.com/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.com/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.com/tags/technos/ia" label="IA" />
                            <category term="https://www.code-rhapsodie.com/tags/technos/mistral" label="Mistral" />
                            <category term="https://www.code-rhapsodie.com/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.com/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.com/blog/le-nom-des-zones-du-page-builder-d-ibexa-dxp-est-il-adapte-aux-contributeurs</id>
            <title><![CDATA[Le nom des zones du Page Builder d'Ibexa DXP est-il adapté aux contributeurs ?]]></title>
            <link rel="alternate" type="text/html"
                  href="https://www.code-rhapsodie.com/blog/le-nom-des-zones-du-page-builder-d-ibexa-dxp-est-il-adapte-aux-contributeurs" />
            <updated>2026-04-27T14:01:44+02:00</updated>
            <published>2026-04-27T14:01:43+02:00</published>
                            <category term="https://www.code-rhapsodie.com/tags/technos/ibexa" label="Ibexa" />
                            <category term="https://www.code-rhapsodie.com/tags/technos/page-builder" label="Page Builder" />
                        <author>
                <name>Olivier Portier</name>
            </author>
            <content type="html">
                <![CDATA[        <div         class="ibexa_richtext-field" >
        <h2>Les zones du Page Builder d'Ibexa</h2><p>Dans le Page Builder d'Ibexa DXP, vous pouvez d&eacute;finir le layout de vos pages en d&eacute;clarant des zones de contribution. Les blocs seront gliss&eacute;s dans ces zones afin de construire progressivement la page bloc par bloc.</p><p>Voici un exemple de configuration des zones dans un fichier YAML d'Ibexa :</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>La zone '<em><strong>top</strong></em>' porte le nom '<strong>top</strong>' mais ce nom n'apparait nulle part dans l'interface d'&eacute;dition d'une page du Page Builder, elle sera identifi&eacute;e par <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.com/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>M&ecirc;me principe dans la <em>structure view </em>(tr&egrave;s utile pour d&eacute;placer vos blocs d'une zone &agrave; une autre) les zones sont identifi&eacute;es par <strong>Drop zone 1, 2, 3 </strong>... :</p>        
<div  class="align-center ibexa-embed-type-image">
    
    
    <figure         class="ibexa_image-field" >
                            <img src="https://www.code-rhapsodie.com/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>A quoi bon donner un nom sp&eacute;cifique dans la configuration si ce nom n'est utilis&eacute; nulle part.</p><h2>Comment est affich&eacute; le nom de la zone ?</h2><p>Le nom des zones est affich&eacute; en javascript par les 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>Difficile de traduire une chaine de texte alors que son libell&eacute; change &agrave; chaque zone. Dans le script <em>page.builder.js,</em> on voit que si un &eacute;l&eacute;ment <span class="ezstyle-inline_code">&lt;fieldset&gt;</span>

 est d&eacute;j&agrave; pr&eacute;sent dans le DOM de la zone, alors il n'est pas recr&eacute;&eacute;.</p><p>Sans faire de d&eacute;veloppement trop complexe ni de <em>hack kernel</em>, on doit pouvoir ajouter ce bloc HTML dans notre template de layout pour nommer convenablement nos zones.</p><h2>Avoir des noms de zones intuitifs</h2><p>Dans notre template <span class="ezstyle-inline_code">three_rows_two_columns.html.twig</span>

, on a donc ajout&eacute; le <span class="ezstyle-inline_code">&lt;fieldset&gt;</span>

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

 avec le nom de zone que l'on a configur&eacute; dans notre fichier YAML.</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.com/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>Les zones de pr&eacute;-visualisation sont maintenant parlantes et bien plus simples &agrave; comprendre, surtout lors de cas complexe de gestion &eacute;ditoriale dont voici un exemple :</p>        
<div  class="align-center ibexa-embed-type-image">
    
    
    <figure         class="ibexa_image-field" >
                            <img src="https://www.code-rhapsodie.com/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>Sans des noms de zones explicites, l'&eacute;quipe &eacute;ditoriale ne peut pas distinguer une zone de Cover, une zone avec des blocs empilables (<a href="https://tailwindcss.com/plus/ui-blocks/application-ui/application-shells/stacked" target="_blank" title="Tailwind stackable blocks"><em>stackable blocks</em></a> dont nous parlerons dans un prochain article) ou une zone libre avec des blocs qui s'afficheront les uns sous les autres.</p><p>Des id&eacute;es pour propager cette fonctionnalit&eacute; qui devrait &ecirc;tre native dans la <em>Structure view</em> ? J'en appelle &agrave; l'&eacute;quipe d'Ibexa pour nous apporter une petite am&eacute;lioration avec Ibexa 5.</p><p><em><strong>Mise &agrave; jour du 16 octobre</strong></em></p><p>Nous avons poursuivis les d&eacute;veloppements et r&eacute;alis&eacute; un hack pour avoir l'ensemble des zones avec le nom souhait&eacute;. Voil&agrave; !</p>        
<div  class="align-center ibexa-embed-type-image">
    
    
    <figure         class="ibexa_image-field" >
                            <img src="https://www.code-rhapsodie.com/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>Si vous souhaitez en savoir plus n'h&eacute;sitez pas &agrave;<a href="https://www.code-rhapsodie.com/contact"> nous contacter.</a></p>

    </div>

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