ludiWARE

Historique des versions de la plateforme ludiWARE (plus récent en premier).

v1.2.12026-08-09 16:47:35Mon compte extensible et lightbox annoncesLes plugins peuvent ajouter des onglets à Mon compte (ex. Mes annonces). Les pages publiques injectent correctement le script de la galerie photos en fin de HTML.
Pour les utilisateurs
- Mon compte : les extensions peuvent proposer de nouveaux onglets via le CMS (URL ?tab=…).
- Annonces classées 1.2.12 : onglet « Mes annonces » avec modifier, supprimer et marquer comme vendue.
- Lightbox des photos d’annonce : fonctionne aussi sur les fiches intégrées via jetons CMS (pas seulement les routes /annonces/…).

Pourquoi ce changement
- Centraliser la gestion des annonces dans Mon compte, là où les membres gèrent déjà leur profil.
- Corriger la galerie lorsque le HTML de l’annonce est rendu dans une page du site sans passer par le routeur du plugin.

Détail technique
- Filtres CMS : public_account_tabs, public_account_tab_panels, public_account_post_actions, public_accounts_handle_post, public_page_html.
- Plugin classifieds : statut sold, actions propriétaire, JS galerie defer v4.
v1.2.0 Package2026-08-09 15:29:10ludiWARE 1.2.0 — profils publics et identité membreRelease mineure 1.2.0 : packages d’installation complets (ZIP + tar.gz), profils publics des membres, noms cliquables partout, historique d’activité unifié sur le profil, et plugins Forums / Annonces classées republiés.
Pour les utilisateurs
- Téléchargement : ludiware-1.2.0.tar.gz + ludiware-1.2.0.zip
- Dépôt : https://repo.ludiware.com/releases/1.2.0/
- Assistant /install/ inclus

Nouveautés CMS (depuis 1.1.x)
- Profil public membre : /membre/{uid} (avatar, nom, date d’inscription)
- Noms des membres cliquables vers le profil (blogue, bandeau compte, extensions)
- Historique d’activité sur le profil : commentaires blogue, sujets/réponses forum, annonces et commentaires
- Filtre `public_member_profile_activity` pour les extensions

Plugins MarketPlace republiés
- Forums 1.0.18 (liens profil + activité forum)
- Annonces classées 1.2.9 (commentaires liés, activité annonces)

Détail technique
- Export OSS sans secrets ni outils usine
- FileName VersionLog → tar.gz public sur repo.ludiware.com

Télécharger le package

v1.1.142026-08-09 15:26:40Historique d’activité sur le profil publicLa page profil d’un membre affiche désormais une chronologie unifiée de ses contributions publiques : commentaires de blogue, sujets et réponses forum, annonces et commentaires sur annonces.
Pour les visiteurs
- Section « Historique d’activité » sous l’en-tête du profil (/membre/{uid}).
- Chaque ligne : date, type d’action, titre cliquable vers le contenu, extrait court si pertinent.
- Tri antichronologique (60 entrées max.), mélangeant blogue, forums et plugins actifs.

Pour les développeurs / extensions
- Nouveau filtre `public_member_profile_activity` — retourne des items `{at, kind, label, title, url, excerpt?}`.
- Helpers : `lw_public_accounts_collect_member_activity()`, `lw_public_accounts_render_member_activity_html()`, `lw_public_accounts_member_activity_item()`.
- Blogue : `lw_blog_member_public_activity()` (commentaires publiés).
- Les plugins enregistrent leurs sources via le filtre (Forums, Annonces classées).

Pourquoi
- Donner une vue d’ensemble de la présence publique d’un membre au lieu de sections isolées par extension.
v1.1.132026-08-09 15:23:12Noms des membres cliquables vers le profil publicPartout où un membre inscrit apparaît (commentaires du blogue, bandeau compte, etc.), son nom mène désormais à sa page profil publique lorsque celle-ci est visible.
Pour les visiteurs
- Clic sur le nom d’un membre local actif → page /membre/{uid} (ou /member/{uid} en anglais).
- Bandeau « Vous êtes connecté en tant que … » : le nom affiché est aussi un lien vers votre profil.
- Commentaires d’articles de blogue : auteurs membres identifiés par leur compte local.
- Invités, comptes CDS ou auteurs sans compte membre : nom affiché sans lien (comportement inchangé).

Pour les développeurs / extensions
- Helpers centralisés : `lw_public_accounts_author_context_from_row()`, `lw_public_accounts_resolve_content_author()`, `lw_public_accounts_render_author_name_html()`.
- Classe CSS partagée `lw-member-profile-link` pour les liens vers profil.

Pourquoi
- Uniformiser l’identité publique des membres sur tout le site (blogue, forums, annonces, etc.) après l’introduction des profils publics en 1.1.12.
v1.1.122026-08-09 15:17:27Profil public des membres inscritsChaque membre inscrit sur un site (comptes locaux) dispose d’une page profil publique avec avatar et nom. Les extensions peuvent y ajouter du contenu (ex. annonces publiées).
Pour les visiteurs
- URL publique : /membre/{uid} (FR) ou /member/{uid} (EN) — avatar, nom affiché, date d’inscription.
- Les profils ne sont visibles que pour les comptes membres actifs (inscription locale), pas pour les administrateurs ni le portail CentreDeService.

Pour les développeurs / extensions
- Nouveau filtre `public_member_profile_html` pour enrichir la page (le plugin Annonces classées y liste les annonces publiées).
- Helpers : `lw_public_accounts_public_profile_url()`, `lw_public_accounts_user_by_uid_public()`.

Pourquoi
- Permettre de reconnaître qui publie (annonces, forums, etc.) et de consolider l’identité publique des membres du site.
v1.1.112026-08-09 14:33:21Alertes standardisées pour l’admin et les pluginsNouveau système d’alertes unifié : messages de succès, erreur, avertissement et info affichés de façon cohérente dans lw-admin et sur le site public. Les plugins peuvent y contribuer via des hooks dédiés.
Pour les utilisateurs
- Les confirmations et erreurs dans l’administration (ex. « Annonce supprimée », « Réglages enregistrés ») s’affichent désormais en haut de page dans un bandeau uniforme, plus lisible.
- Sur le site public, les plugins peuvent afficher des messages utilisateur avec le même style visuel.

Pourquoi
- Chaque module et plugin gérait ses propres alertes (variables différentes, query strings, classes CSS propres), ce qui créait des doublons et des incohérences.

Détail technique
- Nouveau module lw-admin/functions/flash.php : lw_flash_add(), lw_flash_redirect(), lw_flash_render_html(), lw_public_flash_html().
- Hooks admin_flash et public_flash pour les extensions.
- Rétrocompatibilité avec $lwFlash et $lwPageFlashError.
- Feuille de style lw-flash.css partagée admin/public.
- Plugin Annonces classées migré en exemple (v1.2.2).
v1.1.102026-08-08 18:52:20Configuration portable site à siteconfig.php ne contient plus de secrets ni de domaine usine : base de données, courriels et surcharges d’environnement vivent dans config.local.php ; le domaine et les valeurs par défaut sont déduits automatiquement.
Pour les utilisateurs
- Copier le CMS d’un site à l’autre sans retoucher config.php : seul config.local.php (ou l’assistant /install/) doit être adapté au nouvel hébergement.
- Les cookies et le nom du site suivent le domaine réel si HTTPpath / COOKIEpath ne sont pas définis.

Pourquoi
- config.php mélangeait identifiants MySQL, domaine ludiware.com et courriels usine, ce qui compliquait chaque déploiement client.

Détail technique
- lw_config_detect_http_host() + lw_config_apply_runtime_defaults() après config.local.php.
- Connexion MySQL uniquement si DBhost / DBname / DBusername sont renseignés.
- config.local.example.php et installateur mis à jour (domaine optionnel).
v1.1.92026-08-08 17:58:54Correction connexion modal (champs POST + SQL)La connexion depuis le modal envoie désormais courriel et mot de passe de façon fiable (POST vers la page courante, champs lus explicitement) et fonctionne aussi sur hébergements sans mysqlnd.
Pour les utilisateurs
- Le modal login/register poste vers la page où vous êtes (pas seulement /connexion/), ce qui évite les échecs silencieux.
- Si le compte n’a pas de mot de passe (connexion Google/Facebook admin), un message explicite s’affiche au lieu de « courriel ou mot de passe incorrect ».

Pourquoi
- Sur certains thèmes, les champs n’avaient pas toujours d’attribut name au moment du FormData ; sur certains hébergeurs, la lecture SQL des utilisateurs échouait sans mysqlnd.

Détail technique
- lw-account-forms.js v4 : buildFormData explicite ; action = page courante en modal.
- lw_public_accounts_stmt_fetch_one_assoc() ; formulaires modal : post_url injecté au rendu.
v1.1.82026-08-08 17:51:46Reconnaissance admin sur le site public + cookies domaineUn administrateur connecté à lw-admin est de nouveau reconnu sur le site vitrine (header Mon compte). Les cookies s’alignent sur le domaine réel du site (ex. dormezcheznous.com).
Pour les utilisateurs
- Si vous êtes connecté à lw-admin sur le même domaine que le site public, le header affiche « Mon compte » sans reconnecter via le modal.
- Après connexion via le modal, la session publique est conservée.
- Vérifiez config.local.php : COOKIEpath doit être le domaine du site (pas ludiware.com si le site est sur un autre nom).

Pourquoi
- Les cookies admin étaient parfois posés pour ludiware.com alors que le site tourne sur un domaine custom ; le site public ne recevait pas les cookies. La connexion modal échouait aussi si les cookies admin invalides perturbaient la session.

Détail technique
- lw_cookie_domain() utilise l’hôte HTTP courant si différent de COOKIEpath.
- lw_public_accounts_auth_from_cookies() + sync session membre.
- Bootstrap auth dès index.php public.
v1.1.72026-08-08 17:31:50Header compte conditionnel (snippets / jetons)Affichez « Connexion » ou « Mon compte » dans le header selon l’état de session, via un snippet HTML et les jetons {{​account_if_guest}} / {{​account_if_logged_in}}.
Pour les utilisateurs
- Dans un snippet HTML (ou le gabarit) : entourez le bouton Connexion avec {{​account_if_guest}}…{{​/account_if_guest}} et Mon compte avec {{​account_if_logged_in}}…{{​/account_if_logged_in}}.
- Jetons utiles : {{​account_account_url}}, {{​account_user_name}}, {{​account_logout_url}}, {{​account_logged_in}} (1 ou vide).
- Placez  dans le header du gabarit.
- Alternative prête à l’emploi : {{​account_strip}} (bandeau lw-admin).
- Snippets PHP : variable $lw_db + lw_public_accounts_viewer().

Pourquoi
- DormezChezNous et thèmes importés veulent un bouton Bootstrap/modal personnalisé, pas le bandeau générique.

Détail technique
- lw_public_accounts_apply_conditional_blocks() dans apply_tokens ; $lw_db exposé aux snippets PHP.
v1.1.62026-08-08 17:25:08Correction AJAX modals compte (thèmes Homelengo)La connexion depuis un modal ne réagissait pas au clic : le script compte intercepte maintenant le clic avant les scripts du thème, affiche les erreurs (retrait de d-none) et indique le chargement sur le bouton.
Pour les utilisateurs
- Le bouton « Connexion » dans le modal répond de nouveau : texte « … » pendant l’envoi, message d’erreur visible en rouge si échec, rechargement de la page si succès.
- Aucun changement requis dans votre HTML si data-lw-account et data-lw-account-error sont déjà en place.

Pourquoi
- Les thèmes importés (Homelengo / DormezChezNous) enregistrent des écouteurs qui bloquaient l’événement submit avant notre script ; les erreurs restaient aussi cachées par la classe Bootstrap d-none.

Détail technique
- lw-account-forms.js v3 : capture click + submit, chargé en dernier avant </body>.
- Retrait automatique de d-none sur data-lw-account-error.
v1.1.52026-08-08 17:13:29Connexion et inscription en AJAX (modals)Les formulaires compte dans une fenêtre modale (Bootstrap ou autre) peuvent être envoyés sans recharger toute la page : les erreurs s’affichent dans le modal, et la page se met à jour après une connexion réussie.
Pour les utilisateurs
- Si votre formulaire login/register est dans un modal (.modal ou role="dialog"), la soumission se fait en AJAX automatiquement — plus de redirection vers /connexion/ qui casse l’expérience.
- Placez un emplacement d’erreur : <div data-lw-account-error></div> dans le modal.
- Forcer ou désactiver : data-lw-account-ajax="1" ou "0" sur le <form>.
- Après succès : par défaut rechargement de la page (menu compte à jour) ; data-lw-account-on-success="redirect" pour aller vers Mon compte.
- Le captcha inscription est rafraîchi automatiquement après une erreur.

Pourquoi
- DormezChezNous et thèmes similaires ouvrent login/inscription en popup : un POST classique rechargeait toute la page.

Détail technique
- lw-account-forms.js injecté quand data-lw-account est présent.
- Réponses JSON côté serveur (lw_public_accounts_handle_post) ; hook index.php pour POST depuis n’importe quelle page.
v1.1.42026-08-08 16:54:04Formulaires compte personnalisés (data-lw-account)Vous pouvez utiliser vos propres formulaires HTML de connexion et d’inscription dans le template : le moteur les branche automatiquement et expose les messages d’erreur via des jetons ou des emplacements dédiés.
Pour les utilisateurs
- Marqueur sur le <form> : data-lw-account="login" ou "register" (aussi forgot, reset, profile, security).
- Champs : data-lw-account-field="email|password|…" ou détection par id/name/placeholder (comme le contact).
- Erreurs : {{​account_error_text}} dans votre HTML, ou <div data-lw-account-error></div>.
- Succès : {{​account_success_text}} ou data-lw-account-success.
- Remplacez {{​account_login}} par votre markup sur la page coquille /connexion/ si vous ne voulez pas le formulaire lw-admin par défaut.
- Inscription : emplacement <div class="lw-account-captcha-slot"></div> pour le captcha.
- OAuth optionnel : <div data-lw-account-oauth></div>.

Pourquoi
- DormezChezNous et autres thèmes importés gardent leur design Bootstrap sans dupliquer la logique compte.

Détail technique
- account_forms.php (même principe que data-lw-contact).
- CSRF + lw_account_action injectés ; action POST vers /connexion/, /inscription/, etc.
v1.1.32026-08-08 12:47:55Éditeurs HTML avec coloration et tabulationTous les champs HTML et code de l’admin bénéficient de la coloration syntaxique et de l’indentation à la touche Tab (4 espaces), y compris la vue « code source » de TinyMCE.
Pour les utilisateurs
- Champs HTML bruts (en-tête, pied de page, snippets, templates, CSS personnalisé, etc.) : numéros de ligne, coloration, Tab pour indenter.
- Éditeur riche TinyMCE : le bouton « code source » ouvre la même expérience colorée.
- Thèmes importés : édition HTML directe avec coloration.

Pourquoi
- Faciliter la lecture et l’édition du markup sans IDE externe.
- Tab insère une indentation cohérente ; Maj+Tab la réduit.

Détail technique
- Module lw-code-editor.js (CodeMirror 5 via CDN).
- Modes html, css et php selon le champ.
- Compatible navigation app-shell (réinit après changement de page).
v1.1.22026-08-08 11:37:45Mise à jour CMS in-app et alerte footerLes installations distantes voient un avertissement visible dans le pied de page admin lorsqu’un package plus récent existe, et peuvent installer la mise à jour depuis Réglages → Versions sans ré-uploader manuellement les fichiers.
Pour les utilisateurs
- Pied de page admin : badge « Mise à jour disponible (vX.Y.Z) » lorsqu’un paquet VersionLog plus récent est publié sur repo.ludiware.com.
- Réglages → Versions : bandeau avec bouton « Mettre à jour maintenant » (téléchargement + déploiement automatique).
- Fichiers locaux préservés : config.local.php, config.php (seule la ligne Version est mise à jour), uploads/, storage/, extensions installées.

Pourquoi
- Éviter les mises à jour manuelles FTP/SFTP sur chaque site hébergé.
- Rendre visible une version obsolète (ex. 1.0.53 vs 1.1.x) sans fouiller l’historique.

Détail technique
- lw_cms_update_apply() : télécharge ZIP/tar.gz depuis repo.ludiware.com, extrait et copie le core.
- lw_versionlog_check_update() inchangé (cache 30 min).
- Badge sidebar Réglages + alerte chrome pour les gestionnaires.
v1.1.12026-08-08 11:30:24Historique : jetons et accolades lisiblesLes entrées VersionLog n’affichent plus de codes HTML bruts ({) : les jetons {{​account_login}} et similaires apparaissent normalement.
Pour les visiteurs
- Page Historique : les exemples de jetons CMS s’affichent comme du texte (accolades visibles), sans entités HTML encodées en double.

Pourquoi
- Certaines entrées VersionLog mentionnaient des entités HTML ({) dans leur texte ; htmlspecialchars() les affichait telles quelles à l’écran.

Détail technique
- lw_versionlog_prepare_display_source() : décodage des entités d’accolades avant neutralisation zero-width space et lw_e().
v1.1.0 Package2026-08-08 11:28:14ludiWARE 1.1.0 — distribution publiqueRelease mineure 1.1.0 : package d’installation complet (ZIP + tar.gz), comptes publics OAuth, historique des versions sur la vitrine, formulaire contact prérempli, et plugins MarketPlace à jour.
Pour les utilisateurs
- Téléchargement : ludiware-1.1.0.tar.gz + ludiware-1.1.0.zip
- Dépôt : https://repo.ludiware.com/releases/1.1.0/
- Assistant /install/ inclus (base de données, schéma, compte admin)

Depuis la distribution 1.0.40
- Comptes membres locaux : inscription, connexion, mot de passe oublié, Mon compte (onglets profil / sécurité)
- OAuth Google et Facebook sur la vitrine
- Header public reconnaît la session lw-admin et les membres OAuth
- Jeton 

Historique des versions de la plateforme ludiWARE (plus récent en premier).

v1.2.12026-08-09 16:47:35Mon compte extensible et lightbox annoncesLes plugins peuvent ajouter des onglets à Mon compte (ex. Mes annonces). Les pages publiques injectent correctement le script de la galerie photos en fin de HTML.
Pour les utilisateurs
- Mon compte : les extensions peuvent proposer de nouveaux onglets via le CMS (URL ?tab=…).
- Annonces classées 1.2.12 : onglet « Mes annonces » avec modifier, supprimer et marquer comme vendue.
- Lightbox des photos d’annonce : fonctionne aussi sur les fiches intégrées via jetons CMS (pas seulement les routes /annonces/…).

Pourquoi ce changement
- Centraliser la gestion des annonces dans Mon compte, là où les membres gèrent déjà leur profil.
- Corriger la galerie lorsque le HTML de l’annonce est rendu dans une page du site sans passer par le routeur du plugin.

Détail technique
- Filtres CMS : public_account_tabs, public_account_tab_panels, public_account_post_actions, public_accounts_handle_post, public_page_html.
- Plugin classifieds : statut sold, actions propriétaire, JS galerie defer v4.
v1.2.0 Package2026-08-09 15:29:10ludiWARE 1.2.0 — profils publics et identité membreRelease mineure 1.2.0 : packages d’installation complets (ZIP + tar.gz), profils publics des membres, noms cliquables partout, historique d’activité unifié sur le profil, et plugins Forums / Annonces classées republiés.
Pour les utilisateurs
- Téléchargement : ludiware-1.2.0.tar.gz + ludiware-1.2.0.zip
- Dépôt : https://repo.ludiware.com/releases/1.2.0/
- Assistant /install/ inclus

Nouveautés CMS (depuis 1.1.x)
- Profil public membre : /membre/{uid} (avatar, nom, date d’inscription)
- Noms des membres cliquables vers le profil (blogue, bandeau compte, extensions)
- Historique d’activité sur le profil : commentaires blogue, sujets/réponses forum, annonces et commentaires
- Filtre `public_member_profile_activity` pour les extensions

Plugins MarketPlace republiés
- Forums 1.0.18 (liens profil + activité forum)
- Annonces classées 1.2.9 (commentaires liés, activité annonces)

Détail technique
- Export OSS sans secrets ni outils usine
- FileName VersionLog → tar.gz public sur repo.ludiware.com

Télécharger le package

v1.1.142026-08-09 15:26:40Historique d’activité sur le profil publicLa page profil d’un membre affiche désormais une chronologie unifiée de ses contributions publiques : commentaires de blogue, sujets et réponses forum, annonces et commentaires sur annonces.
Pour les visiteurs
- Section « Historique d’activité » sous l’en-tête du profil (/membre/{uid}).
- Chaque ligne : date, type d’action, titre cliquable vers le contenu, extrait court si pertinent.
- Tri antichronologique (60 entrées max.), mélangeant blogue, forums et plugins actifs.

Pour les développeurs / extensions
- Nouveau filtre `public_member_profile_activity` — retourne des items `{at, kind, label, title, url, excerpt?}`.
- Helpers : `lw_public_accounts_collect_member_activity()`, `lw_public_accounts_render_member_activity_html()`, `lw_public_accounts_member_activity_item()`.
- Blogue : `lw_blog_member_public_activity()` (commentaires publiés).
- Les plugins enregistrent leurs sources via le filtre (Forums, Annonces classées).

Pourquoi
- Donner une vue d’ensemble de la présence publique d’un membre au lieu de sections isolées par extension.
v1.1.132026-08-09 15:23:12Noms des membres cliquables vers le profil publicPartout où un membre inscrit apparaît (commentaires du blogue, bandeau compte, etc.), son nom mène désormais à sa page profil publique lorsque celle-ci est visible.
Pour les visiteurs
- Clic sur le nom d’un membre local actif → page /membre/{uid} (ou /member/{uid} en anglais).
- Bandeau « Vous êtes connecté en tant que … » : le nom affiché est aussi un lien vers votre profil.
- Commentaires d’articles de blogue : auteurs membres identifiés par leur compte local.
- Invités, comptes CDS ou auteurs sans compte membre : nom affiché sans lien (comportement inchangé).

Pour les développeurs / extensions
- Helpers centralisés : `lw_public_accounts_author_context_from_row()`, `lw_public_accounts_resolve_content_author()`, `lw_public_accounts_render_author_name_html()`.
- Classe CSS partagée `lw-member-profile-link` pour les liens vers profil.

Pourquoi
- Uniformiser l’identité publique des membres sur tout le site (blogue, forums, annonces, etc.) après l’introduction des profils publics en 1.1.12.
v1.1.122026-08-09 15:17:27Profil public des membres inscritsChaque membre inscrit sur un site (comptes locaux) dispose d’une page profil publique avec avatar et nom. Les extensions peuvent y ajouter du contenu (ex. annonces publiées).
Pour les visiteurs
- URL publique : /membre/{uid} (FR) ou /member/{uid} (EN) — avatar, nom affiché, date d’inscription.
- Les profils ne sont visibles que pour les comptes membres actifs (inscription locale), pas pour les administrateurs ni le portail CentreDeService.

Pour les développeurs / extensions
- Nouveau filtre `public_member_profile_html` pour enrichir la page (le plugin Annonces classées y liste les annonces publiées).
- Helpers : `lw_public_accounts_public_profile_url()`, `lw_public_accounts_user_by_uid_public()`.

Pourquoi
- Permettre de reconnaître qui publie (annonces, forums, etc.) et de consolider l’identité publique des membres du site.
v1.1.112026-08-09 14:33:21Alertes standardisées pour l’admin et les pluginsNouveau système d’alertes unifié : messages de succès, erreur, avertissement et info affichés de façon cohérente dans lw-admin et sur le site public. Les plugins peuvent y contribuer via des hooks dédiés.
Pour les utilisateurs
- Les confirmations et erreurs dans l’administration (ex. « Annonce supprimée », « Réglages enregistrés ») s’affichent désormais en haut de page dans un bandeau uniforme, plus lisible.
- Sur le site public, les plugins peuvent afficher des messages utilisateur avec le même style visuel.

Pourquoi
- Chaque module et plugin gérait ses propres alertes (variables différentes, query strings, classes CSS propres), ce qui créait des doublons et des incohérences.

Détail technique
- Nouveau module lw-admin/functions/flash.php : lw_flash_add(), lw_flash_redirect(), lw_flash_render_html(), lw_public_flash_html().
- Hooks admin_flash et public_flash pour les extensions.
- Rétrocompatibilité avec $lwFlash et $lwPageFlashError.
- Feuille de style lw-flash.css partagée admin/public.
- Plugin Annonces classées migré en exemple (v1.2.2).
v1.1.102026-08-08 18:52:20Configuration portable site à siteconfig.php ne contient plus de secrets ni de domaine usine : base de données, courriels et surcharges d’environnement vivent dans config.local.php ; le domaine et les valeurs par défaut sont déduits automatiquement.
Pour les utilisateurs
- Copier le CMS d’un site à l’autre sans retoucher config.php : seul config.local.php (ou l’assistant /install/) doit être adapté au nouvel hébergement.
- Les cookies et le nom du site suivent le domaine réel si HTTPpath / COOKIEpath ne sont pas définis.

Pourquoi
- config.php mélangeait identifiants MySQL, domaine ludiware.com et courriels usine, ce qui compliquait chaque déploiement client.

Détail technique
- lw_config_detect_http_host() + lw_config_apply_runtime_defaults() après config.local.php.
- Connexion MySQL uniquement si DBhost / DBname / DBusername sont renseignés.
- config.local.example.php et installateur mis à jour (domaine optionnel).
v1.1.92026-08-08 17:58:54Correction connexion modal (champs POST + SQL)La connexion depuis le modal envoie désormais courriel et mot de passe de façon fiable (POST vers la page courante, champs lus explicitement) et fonctionne aussi sur hébergements sans mysqlnd.
Pour les utilisateurs
- Le modal login/register poste vers la page où vous êtes (pas seulement /connexion/), ce qui évite les échecs silencieux.
- Si le compte n’a pas de mot de passe (connexion Google/Facebook admin), un message explicite s’affiche au lieu de « courriel ou mot de passe incorrect ».

Pourquoi
- Sur certains thèmes, les champs n’avaient pas toujours d’attribut name au moment du FormData ; sur certains hébergeurs, la lecture SQL des utilisateurs échouait sans mysqlnd.

Détail technique
- lw-account-forms.js v4 : buildFormData explicite ; action = page courante en modal.
- lw_public_accounts_stmt_fetch_one_assoc() ; formulaires modal : post_url injecté au rendu.
v1.1.82026-08-08 17:51:46Reconnaissance admin sur le site public + cookies domaineUn administrateur connecté à lw-admin est de nouveau reconnu sur le site vitrine (header Mon compte). Les cookies s’alignent sur le domaine réel du site (ex. dormezcheznous.com).
Pour les utilisateurs
- Si vous êtes connecté à lw-admin sur le même domaine que le site public, le header affiche « Mon compte » sans reconnecter via le modal.
- Après connexion via le modal, la session publique est conservée.
- Vérifiez config.local.php : COOKIEpath doit être le domaine du site (pas ludiware.com si le site est sur un autre nom).

Pourquoi
- Les cookies admin étaient parfois posés pour ludiware.com alors que le site tourne sur un domaine custom ; le site public ne recevait pas les cookies. La connexion modal échouait aussi si les cookies admin invalides perturbaient la session.

Détail technique
- lw_cookie_domain() utilise l’hôte HTTP courant si différent de COOKIEpath.
- lw_public_accounts_auth_from_cookies() + sync session membre.
- Bootstrap auth dès index.php public.
v1.1.72026-08-08 17:31:50Header compte conditionnel (snippets / jetons)Affichez « Connexion » ou « Mon compte » dans le header selon l’état de session, via un snippet HTML et les jetons {{​​​​account_if_guest}} / {{​​​​account_if_logged_in}}.
Pour les utilisateurs
- Dans un snippet HTML (ou le gabarit) : entourez le bouton Connexion avec {{​​​​account_if_guest}}…{{​​​​/account_if_guest}} et Mon compte avec {{​​​​account_if_logged_in}}…{{​​​​/account_if_logged_in}}.
- Jetons utiles : {{​​​​account_account_url}}, {{​​​​account_user_name}}, {{​​​​account_logout_url}}, {{​​​​account_logged_in}} (1 ou vide).
- Placez {{​​​​snippet:votre_cle}} dans le header du gabarit.
- Alternative prête à l’emploi : {{​​​​account_strip}} (bandeau lw-admin).
- Snippets PHP : variable $lw_db + lw_public_accounts_viewer().

Pourquoi
- DormezChezNous et thèmes importés veulent un bouton Bootstrap/modal personnalisé, pas le bandeau générique.

Détail technique
- lw_public_accounts_apply_conditional_blocks() dans apply_tokens ; $lw_db exposé aux snippets PHP.
v1.1.62026-08-08 17:25:08Correction AJAX modals compte (thèmes Homelengo)La connexion depuis un modal ne réagissait pas au clic : le script compte intercepte maintenant le clic avant les scripts du thème, affiche les erreurs (retrait de d-none) et indique le chargement sur le bouton.
Pour les utilisateurs
- Le bouton « Connexion » dans le modal répond de nouveau : texte « … » pendant l’envoi, message d’erreur visible en rouge si échec, rechargement de la page si succès.
- Aucun changement requis dans votre HTML si data-lw-account et data-lw-account-error sont déjà en place.

Pourquoi
- Les thèmes importés (Homelengo / DormezChezNous) enregistrent des écouteurs qui bloquaient l’événement submit avant notre script ; les erreurs restaient aussi cachées par la classe Bootstrap d-none.

Détail technique
- lw-account-forms.js v3 : capture click + submit, chargé en dernier avant </body>.
- Retrait automatique de d-none sur data-lw-account-error.
v1.1.52026-08-08 17:13:29Connexion et inscription en AJAX (modals)Les formulaires compte dans une fenêtre modale (Bootstrap ou autre) peuvent être envoyés sans recharger toute la page : les erreurs s’affichent dans le modal, et la page se met à jour après une connexion réussie.
Pour les utilisateurs
- Si votre formulaire login/register est dans un modal (.modal ou role="dialog"), la soumission se fait en AJAX automatiquement — plus de redirection vers /connexion/ qui casse l’expérience.
- Placez un emplacement d’erreur : <div data-lw-account-error></div> dans le modal.
- Forcer ou désactiver : data-lw-account-ajax="1" ou "0" sur le <form>.
- Après succès : par défaut rechargement de la page (menu compte à jour) ; data-lw-account-on-success="redirect" pour aller vers Mon compte.
- Le captcha inscription est rafraîchi automatiquement après une erreur.

Pourquoi
- DormezChezNous et thèmes similaires ouvrent login/inscription en popup : un POST classique rechargeait toute la page.

Détail technique
- lw-account-forms.js injecté quand data-lw-account est présent.
- Réponses JSON côté serveur (lw_public_accounts_handle_post) ; hook index.php pour POST depuis n’importe quelle page.
v1.1.42026-08-08 16:54:04Formulaires compte personnalisés (data-lw-account)Vous pouvez utiliser vos propres formulaires HTML de connexion et d’inscription dans le template : le moteur les branche automatiquement et expose les messages d’erreur via des jetons ou des emplacements dédiés.
Pour les utilisateurs
- Marqueur sur le <form> : data-lw-account="login" ou "register" (aussi forgot, reset, profile, security).
- Champs : data-lw-account-field="email|password|…" ou détection par id/name/placeholder (comme le contact).
- Erreurs : {{​​​​account_error_text}} dans votre HTML, ou <div data-lw-account-error></div>.
- Succès : {{​​​​account_success_text}} ou data-lw-account-success.
- Remplacez {{​​​​account_login}} par votre markup sur la page coquille /connexion/ si vous ne voulez pas le formulaire lw-admin par défaut.
- Inscription : emplacement <div class="lw-account-captcha-slot"></div> pour le captcha.
- OAuth optionnel : <div data-lw-account-oauth></div>.

Pourquoi
- DormezChezNous et autres thèmes importés gardent leur design Bootstrap sans dupliquer la logique compte.

Détail technique
- account_forms.php (même principe que data-lw-contact).
- CSRF + lw_account_action injectés ; action POST vers /connexion/, /inscription/, etc.
v1.1.32026-08-08 12:47:55Éditeurs HTML avec coloration et tabulationTous les champs HTML et code de l’admin bénéficient de la coloration syntaxique et de l’indentation à la touche Tab (4 espaces), y compris la vue « code source » de TinyMCE.
Pour les utilisateurs
- Champs HTML bruts (en-tête, pied de page, snippets, templates, CSS personnalisé, etc.) : numéros de ligne, coloration, Tab pour indenter.
- Éditeur riche TinyMCE : le bouton « code source » ouvre la même expérience colorée.
- Thèmes importés : édition HTML directe avec coloration.

Pourquoi
- Faciliter la lecture et l’édition du markup sans IDE externe.
- Tab insère une indentation cohérente ; Maj+Tab la réduit.

Détail technique
- Module lw-code-editor.js (CodeMirror 5 via CDN).
- Modes html, css et php selon le champ.
- Compatible navigation app-shell (réinit après changement de page).
v1.1.22026-08-08 11:37:45Mise à jour CMS in-app et alerte footerLes installations distantes voient un avertissement visible dans le pied de page admin lorsqu’un package plus récent existe, et peuvent installer la mise à jour depuis Réglages → Versions sans ré-uploader manuellement les fichiers.
Pour les utilisateurs
- Pied de page admin : badge « Mise à jour disponible (vX.Y.Z) » lorsqu’un paquet VersionLog plus récent est publié sur repo.ludiware.com.
- Réglages → Versions : bandeau avec bouton « Mettre à jour maintenant » (téléchargement + déploiement automatique).
- Fichiers locaux préservés : config.local.php, config.php (seule la ligne Version est mise à jour), uploads/, storage/, extensions installées.

Pourquoi
- Éviter les mises à jour manuelles FTP/SFTP sur chaque site hébergé.
- Rendre visible une version obsolète (ex. 1.0.53 vs 1.1.x) sans fouiller l’historique.

Détail technique
- lw_cms_update_apply() : télécharge ZIP/tar.gz depuis repo.ludiware.com, extrait et copie le core.
- lw_versionlog_check_update() inchangé (cache 30 min).
- Badge sidebar Réglages + alerte chrome pour les gestionnaires.
v1.1.12026-08-08 11:30:24Historique : jetons et accolades lisiblesLes entrées VersionLog n’affichent plus de codes HTML bruts ({) : les jetons {{​​​​account_login}} et similaires apparaissent normalement.
Pour les visiteurs
- Page Historique : les exemples de jetons CMS s’affichent comme du texte (accolades visibles), sans entités HTML encodées en double.

Pourquoi
- Certaines entrées VersionLog mentionnaient des entités HTML ({) dans leur texte ; htmlspecialchars() les affichait telles quelles à l’écran.

Détail technique
- lw_versionlog_prepare_display_source() : décodage des entités d’accolades avant neutralisation zero-width space et lw_e().
v1.1.0 Package2026-08-08 11:28:14ludiWARE 1.1.0 — distribution publiqueRelease mineure 1.1.0 : package d’installation complet (ZIP + tar.gz), comptes publics OAuth, historique des versions sur la vitrine, formulaire contact prérempli, et plugins MarketPlace à jour.
Pour les utilisateurs
- Téléchargement : ludiware-1.1.0.tar.gz + ludiware-1.1.0.zip
- Dépôt : https://repo.ludiware.com/releases/1.1.0/
- Assistant /install/ inclus (base de données, schéma, compte admin)

Depuis la distribution 1.0.40
- Comptes membres locaux : inscription, connexion, mot de passe oublié, Mon compte (onglets profil / sécurité)
- OAuth Google et Facebook sur la vitrine
- Header public reconnaît la session lw-admin et les membres OAuth
- Jeton {{​​​​versionlog}} : historique des versions sur le site public
- Formulaire contact : nom et courriel préremplis si connecté
- Bootstrap Icons + sélecteur d’icônes admin
- Plugins MarketPlace : FAQ, Témoignages, Galerie, Formulaires, Réservation, Annonces classées, Forums

Plugins republication (MarketPlace)
- Forums 1.0.16
- Annonces classées 1.0.15

Détail technique
- Export OSS sans secrets ni outils usine ; FileName VersionLog → tar.gz public.

Télécharger le package

v1.0.612026-08-08 11:25:48Historique : jetons affichés normalementLes exemples {{​​​​account_login}} dans l’historique des versions s’affichent comme du texte lisible, sans entités HTML visibles ({).
Pour les visiteurs / administrateurs
- Page Historique et Réglages → Versions : les jetons cités en exemple apparaissent comme {{​​​​account_login}}, pas comme {{​​account_login}}.

Pourquoi
- L’échappement HTML des accolades en entités, puis htmlspecialchars(), doublait l’encodage et affichait les codes bruts à l’écran.

Détail technique
- Neutralisation zero-width space seule (sans entités {) dans lw_versionlog_format_display_text() et lw_versionlog_shield_public_html().
v1.0.602026-08-08 11:24:31Contact : nom et courriel préremplis si connectéSur le formulaire de contact, les champs Nom et Courriel sont remplis automatiquement lorsque le visiteur est déjà connecté (compte local, lw-admin ou portail CDS).
Pour les utilisateurs
- Formulaire {{​​​​contact_form}} et formulaires contact des thèmes ZIP : Nom et Courriel préremplis si vous êtes connecté.
- Les champs déjà remplis dans le gabarit ne sont pas écrasés.

Pourquoi
- Éviter de ressaisir son identité à chaque message contact.

Sources
- Portail CDS (session SSO) : nom complet + courriel du contact.
- Compte membre public ou cookie lw-admin : display_name + courriel lw_users.

Détail technique
- lw_contact_prefill_identity(), lw_contact_apply_prefill_to_form(), lw_contact_form_html().
v1.0.592026-08-08 11:20:46Jeton {{​​​​versionlog}} actif sur la vitrineLe jeton {{​​​​versionlog}} est désormais reconnu sur le site public : la page Historique affiche la liste des versions au lieu du texte brut du jeton.
Pour les visiteurs
- Page Historique : le contenu {{​​​​versionlog}} est remplacé par la liste des versions (styles et textes sécurisés).

Pourquoi
- Le module VersionLog n’était chargé que dans lw-admin ; sur index.php (front public), lw_versionlog_prepare_public_html() n’existait pas et le jeton restait affiché tel quel.

Détail technique
- require versionlog.php dans www/index.php avant public_render.php.
v1.0.582026-08-08 11:07:13Historique public : jetons CMS affichés en texteSur la page Historique du site ludiware.com, les mentions {{​​​​account_login}}, {{​​​​menu:main}}, etc. dans les entrées VersionLog s’affichent en texte au lieu d’injecter formulaires ou menus.
Pour les visiteurs
- Page Historique (/historique/) : titre, description et détails d’une version montrent les jetons cités en exemple (documentation), sans formulaire de connexion ni menu injecté au milieu du texte.

Pourquoi
- Le contenu VersionLog est rendu via un snippet PHP puis repasse dans le moteur de jetons CMS ; les exemples {{​​​​account_login}} étaient exécutés comme de vrais jetons.

Détail technique
- Jeton {{​​​​versionlog}} / {{​​​​versionlog_list}} natif ; protection des blocs .lw-vl-* avant le pipeline de jetons ; entités HTML pour {{​​​​ et }} à l’affichage.
v1.0.572026-08-08 10:58:52Historique des versions : jetons CMS affichés en texteLes mentions {{​​​​account_login}}, {{​​​​menu:main}}, etc. dans les détails techniques du VersionLog ne sont plus interprétées comme des jetons CMS.
Pour les administrateurs
- Réglages → Historique des versions : titre, description et détails complets affichent les jetons tels quels (documentation), sans formulaire ni contenu injecté.

Pourquoi
- Les entrées VersionLog citent souvent des jetons en exemple dans la section « Détail technique » ; le moteur de jetons ne doit pas les exécuter à l’affichage.

Détail technique
- Neutralisation {{​​​​ → {{​​​​ + zero-width space à la sortie API et côté lw-admin ; affichage HTML échappé.
v1.0.562026-08-08 10:54:16Header public : reconnaissance de la session lw-adminConnecté à lw-admin, vous apparaissez aussi comme membre sur le site public (header, Mon compte), comme pour les commentaires au blogue.
Pour les visiteurs / administrateurs
- Si vous êtes connecté à lw-admin (cookies), le bandeau {{​​​​account_strip}} affiche votre nom et le lien « Accéder à mon compte ».
- /mon-compte/ est accessible sans repasser par /connexion/.
- /connexion/ et /inscription/ redirigent vers Mon compte si vous êtes déjà reconnu.

Priorité d’identité (inchangée pour le blogue si session Facebook active)
1. Session membre public (connexion / OAuth)
2. Cookie lw-admin

Déconnexion sur le site public : ferme la session membre ; si seul lw-admin reste actif, vous restez connecté (comportement voulu).
v1.0.552026-08-08 10:38:20Blogue et forums : identité membre public prioritaireSur le site public, la session membre (connexion / Facebook / Google) prime désormais sur les cookies admin lw-admin pour commenter au blogue.
Problème corrigé
- Header « Vous êtes connecté en tant que… » (session membre) et blogue « Vous commentez en tant que… » (cookies admin) pouvaient afficher deux personnes différentes si vous étiez connecté à lw-admin et via Facebook sur le site public.

Comportement
- Priorité : portail CDS → membre public (session) → staff admin (cookie lw-admin).
- Le blogue propose le lien Connexion vers /connexion/ lorsque les comptes locaux sont actifs (sans CDS).

Note
- Si Facebook a créé un second compte lw_users (courriel différent de l’admin), c’est normal : deux profils distincts. Vous pouvez fusionner manuellement ou supprimer le doublon dans Utilisateurs.
v1.0.542026-08-08 10:11:29OAuth — URL de redirection stableL’URL de callback Google/Facebook affichée dans les réglages utilise désormais le domaine du site (ex. ludiware.com), pas l’hôte de l’admin.
Pour les administrateurs
- Dans Réglages → Comptes membres, l’URL « redirection autorisée » correspond au domaine public du site.
- Note d’aide pour l’enregistrement de l’URI dans Facebook Login → Valid OAuth Redirect URIs.

Pourquoi
- Depuis le panneau admin (autre sous-domaine), l’URL générée pouvait différer de celle réellement utilisée sur le site public.
v1.0.532026-08-08 10:03:23Connexion Google et Facebook pour les membresLes visiteurs peuvent se connecter ou s'inscrire avec Google ou Facebook sur les pages connexion et inscription, sans portail CentreDeService. Un compte local est créé automatiquement s'il n'existe pas encore.
Pour les visiteurs
- Boutons « Se connecter avec Google » et « Se connecter avec Facebook » sur /connexion/ et /inscription/.
- Si le courriel n'est pas encore inscrit, un profil membre est créé et la session est ouverte.
- Si un compte existe déjà avec le même courriel, le profil OAuth est lié au compte existant.

Pour les administrateurs
- Onglet Comptes membres des réglages site : activation, identifiants OAuth et URL de redirection à copier dans Google Cloud / Facebook Developer.
- Désactivé automatiquement lorsque le portail CentreDeService gère l'authentification.

Détail technique
- Colonnes lw_users google_id / facebook_id, module oauth_accounts.php, callbacks /oauth/{provider}/callback/.
v1.0.522026-08-08 08:35:18Sélecteur d'icônes — catalogue completLe sélecteur d'icônes affiche d'abord une sélection utile, puis toutes les icônes Bootstrap (~1 600) via la recherche.
Pour les administrateurs
- À l'ouverture : grille de favoris (maison, commerce, transport, etc.).
- Recherche : filtre sur l'ensemble des ~1 683 icônes Bootstrap Icons installées.
- Compteur de résultats et message si la liste est tronquée.

Correction
- La liste n'était limitée qu'à 120 icônes en ordre alphabétique (123, alarm…), ce qui paraissait incomplet.
v1.0.512026-08-08 08:29:09Bootstrap Icons et sélecteur d'icônesLes icônes Bootstrap s'affichent correctement partout dans l'admin grâce aux polices complètes. Un sélecteur d'icônes réutilisable est disponible pour les formulaires (recherche, grille, aperçu).
Pour les administrateurs
- Polices Bootstrap Icons (woff/woff2) installées : les icônes `bi-*` déjà utilisées dans lw-admin s'affichent de façon fiable.
- Nouveau composant « sélecteur d'icônes » (`lw_icon_picker_field`) utilisable dans tout formulaire admin.

Utilisation
- Bouton avec aperçu de l'icône, recherche par nom, grille cliquable, option « Aucune icône ».
- Fonction PHP `lw_bootstrap_icon_names()` et normalisation `lw_bootstrap_icon_class()`.

Détail technique
- Fichiers : `functions/icon_picker.php`, `js/lw-icon-picker.js`, styles dans `lw-admin.css`.
v1.0.502026-08-08 07:27:10Mon compte — onglets profil et sécuritéLa page Mon compte propose deux onglets : Mes informations (prénom, nom, avatar) et Accès et sécurité (courriel, mot de passe). Nouveaux jetons pour gabarits ZIP.
Pour les utilisateurs
- Onglet Mes informations : prénom, nom de famille, téléversement d’avatar.
- Onglet Accès et sécurité : changement de courriel et/ou mot de passe (mot de passe actuel requis).

Jetons ZIP
- {{​​​​account_panel}} : panneau complet avec onglets.
- {{​​​​account_tabs}}, {{​​​​account_profile}}, {{​​​​account_security}} : mise en page personnalisée.
- {{​​​​account_avatar}}, {{​​​​account_avatar_url}}, {{​​​​account_first_name}}, {{​​​​account_last_name}}, {{​​​​account_email}}.
- {{​​​​account_profile_url}}, {{​​​​account_security_url}} : liens directs vers chaque onglet.

Détail technique
- Colonne lw_users.avatar_path, fichiers dans uploads/users/, session vitrine synchronisée après mise à jour.
v1.0.492026-08-08 07:17:18Comptes vitrine unifiés dans lw_usersInscription, connexion et mot de passe oublié sur la vitrine utilisent désormais la table lw_users (comme lw-admin). Seuls les comptes avec accès admin peuvent ouvrir lw-admin.
Pour les utilisateurs
- Même courriel et mot de passe partout : admin ou visiteur inscrit sur /inscription/.
- Les comptes créés sur la vitrine ont le rôle user et ne peuvent pas accéder à lw-admin.
- Les administrateurs se connectent aussi sur /connexion/ avec leurs identifiants habituels.

Pourquoi
- Suppression du double système lw_site_members / lw_users introduit par erreur.

Détail technique
- public_accounts.php : auth, inscription et reset sur lw_users ; session vitrine par site.
- auth.php inchangé : can_access_admin requis pour lw-admin.
- Table obsolète lw_site_members : peut être supprimée en base (DROP TABLE).
v1.0.482026-08-08 07:11:33Connexion vitrine avec un compte administrateurLes administrateurs du site peuvent se connecter sur la vitrine publique (/connexion/) avec le même courriel et mot de passe que lw-admin, sans inscription séparée.
Pour les utilisateurs
- Sur /connexion/, un compte administrateur global ou assigné au site est accepté avec les identifiants lw-admin.
- La première connexion crée automatiquement le profil membre local du site ; les connexions suivantes réutilisent ce profil.

Pourquoi
- Avant ce correctif, seuls les comptes inscrits via /inscription/ (table lw_site_members) étaient reconnus ; le premier admin recevait « Courriel ou mot de passe incorrect ».

Détail technique
- Pont lw_users → lw_site_members dans lw_public_accounts_login() : vérification mot de passe admin, accès site (global_admin ou local_admin membre du site), synchronisation du hash et de la session membre.
v1.0.472026-08-08 06:52:34Comptes membres locaux sur la vitrineLes sites sans portail CentreDeService peuvent proposer inscription, connexion, mot de passe oublié et espace membre sur la vitrine publique, avec jetons pour gabarits ZIP et pages coquilles CMS.
Pour les utilisateurs
- Inscription sur /inscription/ avec captcha et confirmation du mot de passe.
- Connexion sur /connexion/, récupération sur /mot-de-passe-oublie/ et réinitialisation par lien courriel.
- Espace « Mon compte » une fois connecté ; bandeau {{​​​​account_strip}} dans le header.

Pour les administrateurs
- Onglet Réglages → Comptes membres : coquilles CMS et bouton « Générer les pages système ».
- Menu éditeur : Ajouter membre (Connexion, Mot de passe oublié, Inscription, Mon compte) si CDS inactif.
- Jetons ZIP : {{​​​​account_login}}, {{​​​​account_register}}, {{​​​​account_panel}}, {{​​​​account_forgot}}, {{​​​​account_reset}} et URLs associées.

Pourquoi
- Permettre aux vitrines ludiWARE autonomes (sans CDS) d’offrir des comptes visiteurs pour commentaires, contenus réservés ou personnalisation future.

Détail technique
- Table lw_site_members, CSRF session, captcha inscription distinct du contact, routes try_serve, public_render apply_tokens.
v1.0.462026-08-07 12:59:32Captcha contact : correction des réponses valides rejetéesLorsqu’une page ou un gabarit contient plusieurs formulaires contact, la même question de vérification s’affiche partout et la bonne réponse est acceptée.
Pour les utilisateurs
- Le captcha « Combien font X + Y ? » est identique sur tous les formulaires contact d’une même page.
- Une réponse correcte n’est plus rejetée avec « Vérification de sécurité incorrecte ».

Pourquoi
- Chaque formulaire recevait parfois une question différente alors que la session ne mémorise qu’une seule réponse (contenu + gabarit finalisés séparément).

Détail technique
- lw_contact_captcha_issue() réutilise le défi session valide ; finalisation contact une seule fois sur le HTML complet (public_render.php).
v1.0.452026-08-07 12:15:48Jetons blogue : derniers articles (footer / sidebar)Placez dans un gabarit ou une page les jetons {{​​​​blog-latest-title-1}}, {{​​​​blog-latest-image-1}}, {{​​​​blog-latest-excerpt-1}}, etc. (jusqu’à 10) pour afficher les articles les plus récents.
Pour les utilisateurs
- {{​​​​blog-latest-title-N}} : titre (N=1 = plus récent, 2 = avant-dernier, … jusqu’à 10)
- {{​​​​blog-latest-image-N}} : URL de l’image à la une
- {{​​​​blog-latest-excerpt-N}} : extrait du corps de l’article
- {{​​​​blog-latest-date-N}} : date courte (ex. 15 avril 2020)
- {{​​​​blog-latest-date-long-N}} : date longue
- {{​​​​blog-latest-url-N}} : lien vers l’article
- Idéal pour un bloc « Blogue » en pied de page ou barre latérale, comme dans un thème ZIP importé.

Pourquoi
- Personnaliser le footer sans dupliquer manuellement les titres et images des articles.

Détail technique
- lw_blog_apply_latest_tokens() dans blog.php, appelé depuis lw_blog_apply_tokens() sur gabarits et pages.
v1.0.442026-08-07 12:10:34Contact thème : messages d’erreur et champ SujetLes formulaires contact des thèmes ZIP affichent à nouveau le vrai message d’erreur (captcha, champs manquants, etc.) et le champ Sujet du thème est bien pris en charge.
Pour les utilisateurs
- Après un envoi raté, le message précis s’affiche (ex. captcha incorrect) au lieu du générique « Envoi impossible. Vérifiez les champs. »
- Le champ Sujet des formulaires de thème (ex. msg_subject, placeholder ou label « Sujet ») est enregistré et reçu par courriel.
- Les champs sans attribut name mais avec placeholder/label (Votre nom, Votre courriel…) sont reconnus à l’import et au rendu.

Pourquoi
- lw_contact_form_html() effaçait le flash session avant l’affichage des formulaires thème.
- Certains thèmes nomment le sujet autrement que subject.

Détail technique
- public_render.php : lw_contact_form_html() seulement si {{​​​​contact_form}} est présent.
- contact_forms.php : alias msg_subject, détection placeholder/label, fallbacks nom/courriel.
v1.0.432026-08-07 12:04:45Correction erreur 500 sur les pages contact (thèmes ZIP)Les pages « Nous joindre » importées depuis un template ZIP ne provoquent plus d’erreur serveur lorsque le bouton Envoyer est imbriqué dans la grille du thème (Bootstrap, etc.).
Pour les utilisateurs
- Les pages contact personnalisées d’un thème importé s’affichent à nouveau normalement, avec captcha et envoi vers la boîte Messages.
- Avant la correction, certaines pages (ex. formulaire dans des colonnes Bootstrap) renvoyaient une erreur HTTP 500.

Pourquoi
- Lors du branchement du formulaire thème, l’emplacement du captcha était inséré au mauvais niveau du DOM lorsque le bouton Envoyer n’était pas enfant direct du <form>.

Détail technique
- contact_forms.php : lw_contact_wire_form_element() insère le slot captcha via le parent immédiat du bouton submit au lieu de form->insertBefore() sur un nœud imbriqué.
v1.0.422026-08-07 09:41:46Pages boutique CDS personnalisables (coquilles et jetons)Comme pour le blogue, vous pouvez choisir des pages CMS comme coquilles pour le magasin, les catégories, les fiches produit, le panier et les commandes, puis y placer des jetons granulaires (titre, prix, image, liste, etc.).
Pour les utilisateurs
- Dans Réglages du site → CentreDeService.NET, section « Pages coquilles boutique », associez une page CMS à chaque type d’écran (/boutique/, catégorie, produit, panier, commande).
- Sans coquille, le rendu CDS par défaut reste inchangé.
- Sur une coquille produit : {{​​​​cds_product_title}}, {{​​​​cds_product_image}}, {{​​​​cds_product_price}}, {{​​​​cds_product_desc}}, {{​​​​cds_product_add_cart}}, ou {{​​​​cds_product}} pour la fiche complète.
- Sur une liste / catégorie : {{​​​​cds_shop_list}} (bloc complet), ou {{​​​​cds_shop_categories}}, {{​​​​cds_shop_products}}, {{​​​​cds_shop_pager}}, {{​​​​cds_category_title}}.
- Panier / commande : {{​​​​cds_cart}}, {{​​​​cds_order}}, {{​​​​cds_cart_count}}.

Pourquoi
- Permettre une mise en page boutique alignée sur le thème du site, sur le même modèle que les jetons blogue.

Détail technique
- Coquilles : cds_shop_*_page_uid ; lw_cds_resolve_shell_page dans lw_cds_try_serve.
- Jetons : lw_cds_apply_shop_field_tokens + contexte dans lw_cds_apply_tokens.
v1.0.412026-08-07 09:03:11Formulaires contact des templates ZIP reliés au CMSLes formulaires de contact déjà présents dans un thème importé peuvent envoyer leurs messages via le moteur contact de lw-admin, sans remplacer le design du thème. À l’import, la détection est automatique ; vous pouvez aussi forcer avec data-lw-contact="1".
Pour les utilisateurs
- Un formulaire contact du thème (classes / mailto / champs nom-email-message) est branché sur la boîte Messages et l’e-mail de notification.
- L’apparence du formulaire (HTML/CSS du thème) est conservée.
- Marqueur manuel : data-lw-contact="1" force le branchement ; data-lw-contact="0" l’exclut.
- Captcha et messages de succès/erreur s’affichent comme pour {{​​​​contact_form}}.

Pourquoi
- Éviter de remplacer un beau formulaire de thème par le HTML générique {{​​​​contact_form}}.

Détail technique
- lw_contact_wire_form_html (import) ; lw_contact_finalize_bound_forms (rendu) ; alias de champs dans lw_contact_submit.
v1.0.40 Package2026-08-06 13:07:30ludiWARE 1.0.40 — package d’installationDistribution publique complète (ZIP + tar.gz) avec installateur. Inclut les évolutions récentes : blogue (jetons, URLs par catégories, sous-catégories), page 404 CMS, médiathèque globale, menus / import ZIP, et corrections d’affichage.
Pour les utilisateurs
- Package téléchargeable pour installer ou mettre à jour ludiWARE.
- Archives : ludiware-1.0.40.tar.gz et ludiware-1.0.40.zip
- Dépôt : https://repo.ludiware.com/releases/1.0.40/
- Assistant /install/ inclus (base de données, schéma, compte admin)

Contenu notable depuis la dernière distribution
- Blogue : jetons auteur / date longue / heure / commentaires / catégories ; URLs /blogue/catégorie/sous-catégorie/slug ; sous-catégories en admin ; accord « commentaire »
- Page 404 CMS désignée + pastille ; import ZIP (chrome, méga-menus, détection 404)
- Médiathèque globale et dossiers ; menus actifs ; déduplication header

Pourquoi
- Fournir un paquet installable aligné sur la version courante du CMS.

Détail technique
- Export OSS (sans secrets, sans api/admin usine) ; FileName VersionLog pointant vers le tar.gz public.

Télécharger le package

v1.0.392026-08-06 13:01:02Singulier « commentaire » quand il y en a 0 ou 1Dans la liste des articles du blogue, on affiche « 0 commentaire » ou « 1 commentaire » (sans s), et le pluriel seulement à partir de 2.
Pour les utilisateurs
- Meta des cartes d’articles : accord correct du mot commentaire (0/1 au singulier).

Pourquoi
- « 0 commentaires » était grammaticalement incorrect en français.

Détail technique
- lw_blog_format_comments_count : singulier si count <= 1 (FR).
v1.0.382026-08-06 13:00:31Sous-catégories de blogue plus simples à créerDans lw-admin, chaque catégorie propose un bouton pour ajouter une sous-catégorie. Le champ « Catégorie parente » est mis en avant, avec la liste en arborescence.
Pour les utilisateurs
- Liste des catégories : icône « diagramme » pour créer une sous-catégorie déjà rattachée à la bonne parente.
- Formulaire : champ parent en premier, aide sur l’URL /blogue/parente/enfant/…
- Pastille « Sous-catégorie » et colonne Parente dans le tableau.

Pourquoi
- La hiérarchie existait déjà en base, mais était trop discrète dans l’interface.

Détail technique
- blogcats.php (?new=1&parent=uid) ; clés i18n blog.cat_* ; invalidation cache catégories.
v1.0.372026-08-06 12:51:12URLs blogue avec catégories imbriquéesLes articles sont désormais accessibles via /blogue/catégorie/sous-catégorie/slug-article. Les anciennes adresses /blogue/slug redirigent automatiquement vers la nouvelle URL.
Pour les utilisateurs
- URL d’un article : /blogue/{catégorie}/{sous-catégorie}/{slug} selon la hiérarchie des catégories.
- Sans catégorie : /blogue/{slug} comme avant.
- Listes de catégories : /blogue/{catégorie}/{sous-catégorie} (l’ancien préfixe /blogue/categorie/… redirige).
- Les liens liste, commentaires, sitemap et l’admin utilisent la nouvelle structure.

Pourquoi
- Refléter l’arborescence des catégories dans l’URL, plus claire pour le SEO et la navigation.

Détail technique
- lw_blog_post_url / lw_blog_post_path_extra ; résolution de chemin dans lw_blog_try_serve ; redirections 301.
v1.0.362026-08-06 12:48:37Nouveaux jetons blogue (auteur, date, commentaires…)Les gabarits d’article peuvent afficher le nombre de commentaires, l’auteur, une date longue, l’heure de publication et la liste des catégories. Un champ Auteur a été ajouté à l’édition des articles.
Pour les utilisateurs
- Nouveaux jetons : {{​​​​blog_comments_count}} (chiffre), {{​​​​blog_author}}, {{​​​​blog_date_long}} (ex. Jeudi le 3 septembre 2024), {{​​​​blog_time}} (HH:MM), {{​​​​blog_categories}} (liste des catégories publiées).
- {{​​​​blog_date}} reste au format AAAA-MM-JJ.
- Champ « Auteur » à la création / édition d’un article, utilisé par {{​​​​blog_author}}.

Pourquoi
- Permettre des mises en page d’articles plus riches sans HTML figé.

Détail technique
- Colonne author_name ; helpers lw_blog_format_date_long / lw_blog_render_categories_token_list ; jetons documentés dans templates.php.
v1.0.352026-08-06 11:32:25Page 404 CMS : affichage corrigé + pastilleLa page désignée comme 404 s’affiche correctement (y compris sur un site encore en brouillon / en aperçu). Dans la liste des pages, une pastille « 404 » apparaît comme pour l’accueil. À l’import ZIP, les pages d’erreur 404 sont détectées automatiquement.
Pour les utilisateurs
- Si vous cochez « Utiliser comme page 404 », une URL inconnue affiche cette page (thème du site), et non le 404 sombre générique.
- Cela fonctionne aussi en aperçu et tant que le site est en brouillon.
- Liste des pages : pastille orange « 404 » à côté du statut, comme la pastille Accueil.
- Nouveaux imports ZIP : une page nommée 404 / not-found est assignée automatiquement.

Pourquoi
- Le rendu de la page 404 ignorait le mode aperçu et refusait les sites brouillon (« Site non publié »), ce qui forçait le repli générique.

Détail technique
- lw_public_site_404(..., $preview) ; rendu forcé en mode aperçu si site brouillon ; badge pages.badge_404 ; auto page_404_page_uid à l’import ZIP.
v1.0.342026-08-06 11:26:54Import ZIP : plus de header en double dans les pagesÀ l’import d’un template, le header (et les wrappers du même type) est retiré du contenu des pages lorsqu’il est déjà placé dans l’en-tête global. Les sites déjà importés sont nettoyés à l’affichage.
Pour les utilisateurs
- Les pages importées ne gardent plus une copie du menu/header dans leur contenu si le chrome global est actif.
- Les templates sans balise <header> (ex. #header / .header-area) sont aussi pris en charge.

Pourquoi
- Le strip était trop strict (vote majoritaire, wrappers non sémantiques ignorés) ; des restes restaient dans le HTML des pages.

Détail technique
- Détection structurelle + affixe normalisé (ignore active) ; strip/dedupe DOM élargi ; nettoyage au rendu public.
v1.0.332026-08-06 11:16:07Menu : item courant correctement mis en évidenceSur les sites (y compris templates importés), l’item de menu actif suit la page affichée au lieu de rester figé sur Accueil.
Pour les utilisateurs
- En visitant « À propos » (ou une autre page), c’est cet item qui apparaît sélectionné, plus Accueil.
- Les parents d’un sous-menu actif restent aussi mis en évidence.

Pourquoi
- À l’import, la classe active de la page d’accueil était recopiée telle quelle dans le menu CMS, sans recalcul selon l’URL.

Détail technique
- Rendu menu : strip des classes active/current importées, marquage selon page_uid ou chemin courant, aria-current=page.
v1.0.322026-08-06 11:00:39Correction « Nouveau dossier » médiasChoisir « Nouveau dossier » dans la médiathèque affiche correctement le champ pour nommer le dossier, y compris après navigation dans l’admin.
Pour les utilisateurs
- Le champ texte sous « Nouveau dossier » réapparaît bien à la sélection.

Pourquoi
- Le script ne se rattachait pas après le chargement des pages en mode app (navigation sans rechargement complet).

Détail technique
- Délégation d’événements + réinit sur lw:fragment-loaded (lw-media-folder.js v2).
v1.0.312026-08-06 10:50:19Médiathèque globale et dossiersVous pouvez déposer des images partagées (logos, etc.) une seule fois dans Bibliothèque → Médias globaux, puis les réutiliser sur tous les sites. Le choix du dossier à l’upload propose la liste des dossiers existants ou « Nouveau dossier ».
Pour les utilisateurs
- Nouvelle section Bibliothèque → Médias globaux : upload et gestion des images partagées.
- Dans la médiathèque d’un site, l’onglet Globaux affiche ces fichiers en lecture (copie d’URL) ; les admins plateforme peuvent ouvrir Gérer.
- À l’upload ou à l’édition, le champ Dossier est une liste déroulante (aucun / existants / Nouveau dossier + champ texte).

Pourquoi
- Éviter de réimporter le même logo dans chaque site.
- Clarifier le classement par dossiers sans taper le nom à chaque fois.

Détail technique
- lw_media.site_id NULL = global ; fichiers sous uploads/global/ ; référence unique (pas de copie par site).
v1.0.302026-08-06 09:59:30Import ZIP : mega-menus préservésÀ l’import d’un template ZIP, les mega-menus (panneaux riches avec colonnes, images, CTA) et les attributs Bootstrap des menus déroulants sont conservés et restitués correctement.
Pour les utilisateurs
- Les templates avec mega-menus (ex. panneaux pleine largeur, grilles, images) gardent leur apparence après import.
- Les menus déroulants Bootstrap conservent leurs options (data-bs-toggle, etc.).
- Si un item a un panneau mega, une zone HTML dédiée apparaît dans Menus pour l’ajuster (en attendant l’extension mega-menu).

Pourquoi
- L’import ne lisait que les sous-listes <ul> ; les panneaux en <div class="dropdown-menu"> étaient perdus à la tokenisation {{​​​​menu:…}}.

Détail technique
- Nouveaux champs item : panel_html, link_attrs, label_html ; détection à l’harvest ; rendu a+panneau ; rewrite des URLs du panneau à la persistance.
v1.0.292026-08-06 09:42:25Correction sauvegarde en-tête / pied (doublon)Enregistrer l’en-tête et le pied de page d’un template ZIP ne duplique plus le footer sous le copyright.
Pour les utilisateurs
- La sauvegarde de « En-tête & pied de page » ne laisse plus apparaître un second footer non stylé.
- Les sites déjà touchés par le bug sont corrigés à l’affichage (et définitivement en réenregistrant le chrome).

Pourquoi
- Le parseur prenait le premier </div> interne du footer pour couper le bloc, puis recopait le reste après le pied de page.

Détail technique
- Extraction after_footer via DOM ; seuls script/style/link/noscript sont conservés ; repair au rendu public.
: historique des versions sur le site public - Formulaire contact : nom et courriel préremplis si connecté - Bootstrap Icons + sélecteur d’icônes admin - Plugins MarketPlace : FAQ, Témoignages, Galerie, Formulaires, Réservation, Annonces classées, Forums Plugins republication (MarketPlace) - Forums 1.0.16 - Annonces classées 1.0.15 Détail technique - Export OSS sans secrets ni outils usine ; FileName VersionLog → tar.gz public.

Télécharger le package

v1.0.612026-08-08 11:25:48Historique : jetons affichés normalementLes exemples {{​account_login}} dans l’historique des versions s’affichent comme du texte lisible, sans entités HTML visibles ({).
Pour les visiteurs / administrateurs
- Page Historique et Réglages → Versions : les jetons cités en exemple apparaissent comme {{​account_login}}, pas comme {{​account_login}}.

Pourquoi
- L’échappement HTML des accolades en entités, puis htmlspecialchars(), doublait l’encodage et affichait les codes bruts à l’écran.

Détail technique
- Neutralisation zero-width space seule (sans entités {) dans lw_versionlog_format_display_text() et lw_versionlog_shield_public_html().
v1.0.602026-08-08 11:24:31Contact : nom et courriel préremplis si connectéSur le formulaire de contact, les champs Nom et Courriel sont remplis automatiquement lorsque le visiteur est déjà connecté (compte local, lw-admin ou portail CDS).
Pour les utilisateurs
- Formulaire {{​contact_form}} et formulaires contact des thèmes ZIP : Nom et Courriel préremplis si vous êtes connecté.
- Les champs déjà remplis dans le gabarit ne sont pas écrasés.

Pourquoi
- Éviter de ressaisir son identité à chaque message contact.

Sources
- Portail CDS (session SSO) : nom complet + courriel du contact.
- Compte membre public ou cookie lw-admin : display_name + courriel lw_users.

Détail technique
- lw_contact_prefill_identity(), lw_contact_apply_prefill_to_form(), lw_contact_form_html().
v1.0.592026-08-08 11:20:46Jeton

Historique des versions de la plateforme ludiWARE (plus récent en premier).

v1.2.12026-08-09 16:47:35Mon compte extensible et lightbox annoncesLes plugins peuvent ajouter des onglets à Mon compte (ex. Mes annonces). Les pages publiques injectent correctement le script de la galerie photos en fin de HTML.
Pour les utilisateurs
- Mon compte : les extensions peuvent proposer de nouveaux onglets via le CMS (URL ?tab=…).
- Annonces classées 1.2.12 : onglet « Mes annonces » avec modifier, supprimer et marquer comme vendue.
- Lightbox des photos d’annonce : fonctionne aussi sur les fiches intégrées via jetons CMS (pas seulement les routes /annonces/…).

Pourquoi ce changement
- Centraliser la gestion des annonces dans Mon compte, là où les membres gèrent déjà leur profil.
- Corriger la galerie lorsque le HTML de l’annonce est rendu dans une page du site sans passer par le routeur du plugin.

Détail technique
- Filtres CMS : public_account_tabs, public_account_tab_panels, public_account_post_actions, public_accounts_handle_post, public_page_html.
- Plugin classifieds : statut sold, actions propriétaire, JS galerie defer v4.
v1.2.0 Package2026-08-09 15:29:10ludiWARE 1.2.0 — profils publics et identité membreRelease mineure 1.2.0 : packages d’installation complets (ZIP + tar.gz), profils publics des membres, noms cliquables partout, historique d’activité unifié sur le profil, et plugins Forums / Annonces classées republiés.
Pour les utilisateurs
- Téléchargement : ludiware-1.2.0.tar.gz + ludiware-1.2.0.zip
- Dépôt : https://repo.ludiware.com/releases/1.2.0/
- Assistant /install/ inclus

Nouveautés CMS (depuis 1.1.x)
- Profil public membre : /membre/{uid} (avatar, nom, date d’inscription)
- Noms des membres cliquables vers le profil (blogue, bandeau compte, extensions)
- Historique d’activité sur le profil : commentaires blogue, sujets/réponses forum, annonces et commentaires
- Filtre `public_member_profile_activity` pour les extensions

Plugins MarketPlace republiés
- Forums 1.0.18 (liens profil + activité forum)
- Annonces classées 1.2.9 (commentaires liés, activité annonces)

Détail technique
- Export OSS sans secrets ni outils usine
- FileName VersionLog → tar.gz public sur repo.ludiware.com

Télécharger le package

v1.1.142026-08-09 15:26:40Historique d’activité sur le profil publicLa page profil d’un membre affiche désormais une chronologie unifiée de ses contributions publiques : commentaires de blogue, sujets et réponses forum, annonces et commentaires sur annonces.
Pour les visiteurs
- Section « Historique d’activité » sous l’en-tête du profil (/membre/{uid}).
- Chaque ligne : date, type d’action, titre cliquable vers le contenu, extrait court si pertinent.
- Tri antichronologique (60 entrées max.), mélangeant blogue, forums et plugins actifs.

Pour les développeurs / extensions
- Nouveau filtre `public_member_profile_activity` — retourne des items `{at, kind, label, title, url, excerpt?}`.
- Helpers : `lw_public_accounts_collect_member_activity()`, `lw_public_accounts_render_member_activity_html()`, `lw_public_accounts_member_activity_item()`.
- Blogue : `lw_blog_member_public_activity()` (commentaires publiés).
- Les plugins enregistrent leurs sources via le filtre (Forums, Annonces classées).

Pourquoi
- Donner une vue d’ensemble de la présence publique d’un membre au lieu de sections isolées par extension.
v1.1.132026-08-09 15:23:12Noms des membres cliquables vers le profil publicPartout où un membre inscrit apparaît (commentaires du blogue, bandeau compte, etc.), son nom mène désormais à sa page profil publique lorsque celle-ci est visible.
Pour les visiteurs
- Clic sur le nom d’un membre local actif → page /membre/{uid} (ou /member/{uid} en anglais).
- Bandeau « Vous êtes connecté en tant que … » : le nom affiché est aussi un lien vers votre profil.
- Commentaires d’articles de blogue : auteurs membres identifiés par leur compte local.
- Invités, comptes CDS ou auteurs sans compte membre : nom affiché sans lien (comportement inchangé).

Pour les développeurs / extensions
- Helpers centralisés : `lw_public_accounts_author_context_from_row()`, `lw_public_accounts_resolve_content_author()`, `lw_public_accounts_render_author_name_html()`.
- Classe CSS partagée `lw-member-profile-link` pour les liens vers profil.

Pourquoi
- Uniformiser l’identité publique des membres sur tout le site (blogue, forums, annonces, etc.) après l’introduction des profils publics en 1.1.12.
v1.1.122026-08-09 15:17:27Profil public des membres inscritsChaque membre inscrit sur un site (comptes locaux) dispose d’une page profil publique avec avatar et nom. Les extensions peuvent y ajouter du contenu (ex. annonces publiées).
Pour les visiteurs
- URL publique : /membre/{uid} (FR) ou /member/{uid} (EN) — avatar, nom affiché, date d’inscription.
- Les profils ne sont visibles que pour les comptes membres actifs (inscription locale), pas pour les administrateurs ni le portail CentreDeService.

Pour les développeurs / extensions
- Nouveau filtre `public_member_profile_html` pour enrichir la page (le plugin Annonces classées y liste les annonces publiées).
- Helpers : `lw_public_accounts_public_profile_url()`, `lw_public_accounts_user_by_uid_public()`.

Pourquoi
- Permettre de reconnaître qui publie (annonces, forums, etc.) et de consolider l’identité publique des membres du site.
v1.1.112026-08-09 14:33:21Alertes standardisées pour l’admin et les pluginsNouveau système d’alertes unifié : messages de succès, erreur, avertissement et info affichés de façon cohérente dans lw-admin et sur le site public. Les plugins peuvent y contribuer via des hooks dédiés.
Pour les utilisateurs
- Les confirmations et erreurs dans l’administration (ex. « Annonce supprimée », « Réglages enregistrés ») s’affichent désormais en haut de page dans un bandeau uniforme, plus lisible.
- Sur le site public, les plugins peuvent afficher des messages utilisateur avec le même style visuel.

Pourquoi
- Chaque module et plugin gérait ses propres alertes (variables différentes, query strings, classes CSS propres), ce qui créait des doublons et des incohérences.

Détail technique
- Nouveau module lw-admin/functions/flash.php : lw_flash_add(), lw_flash_redirect(), lw_flash_render_html(), lw_public_flash_html().
- Hooks admin_flash et public_flash pour les extensions.
- Rétrocompatibilité avec $lwFlash et $lwPageFlashError.
- Feuille de style lw-flash.css partagée admin/public.
- Plugin Annonces classées migré en exemple (v1.2.2).
v1.1.102026-08-08 18:52:20Configuration portable site à siteconfig.php ne contient plus de secrets ni de domaine usine : base de données, courriels et surcharges d’environnement vivent dans config.local.php ; le domaine et les valeurs par défaut sont déduits automatiquement.
Pour les utilisateurs
- Copier le CMS d’un site à l’autre sans retoucher config.php : seul config.local.php (ou l’assistant /install/) doit être adapté au nouvel hébergement.
- Les cookies et le nom du site suivent le domaine réel si HTTPpath / COOKIEpath ne sont pas définis.

Pourquoi
- config.php mélangeait identifiants MySQL, domaine ludiware.com et courriels usine, ce qui compliquait chaque déploiement client.

Détail technique
- lw_config_detect_http_host() + lw_config_apply_runtime_defaults() après config.local.php.
- Connexion MySQL uniquement si DBhost / DBname / DBusername sont renseignés.
- config.local.example.php et installateur mis à jour (domaine optionnel).
v1.1.92026-08-08 17:58:54Correction connexion modal (champs POST + SQL)La connexion depuis le modal envoie désormais courriel et mot de passe de façon fiable (POST vers la page courante, champs lus explicitement) et fonctionne aussi sur hébergements sans mysqlnd.
Pour les utilisateurs
- Le modal login/register poste vers la page où vous êtes (pas seulement /connexion/), ce qui évite les échecs silencieux.
- Si le compte n’a pas de mot de passe (connexion Google/Facebook admin), un message explicite s’affiche au lieu de « courriel ou mot de passe incorrect ».

Pourquoi
- Sur certains thèmes, les champs n’avaient pas toujours d’attribut name au moment du FormData ; sur certains hébergeurs, la lecture SQL des utilisateurs échouait sans mysqlnd.

Détail technique
- lw-account-forms.js v4 : buildFormData explicite ; action = page courante en modal.
- lw_public_accounts_stmt_fetch_one_assoc() ; formulaires modal : post_url injecté au rendu.
v1.1.82026-08-08 17:51:46Reconnaissance admin sur le site public + cookies domaineUn administrateur connecté à lw-admin est de nouveau reconnu sur le site vitrine (header Mon compte). Les cookies s’alignent sur le domaine réel du site (ex. dormezcheznous.com).
Pour les utilisateurs
- Si vous êtes connecté à lw-admin sur le même domaine que le site public, le header affiche « Mon compte » sans reconnecter via le modal.
- Après connexion via le modal, la session publique est conservée.
- Vérifiez config.local.php : COOKIEpath doit être le domaine du site (pas ludiware.com si le site est sur un autre nom).

Pourquoi
- Les cookies admin étaient parfois posés pour ludiware.com alors que le site tourne sur un domaine custom ; le site public ne recevait pas les cookies. La connexion modal échouait aussi si les cookies admin invalides perturbaient la session.

Détail technique
- lw_cookie_domain() utilise l’hôte HTTP courant si différent de COOKIEpath.
- lw_public_accounts_auth_from_cookies() + sync session membre.
- Bootstrap auth dès index.php public.
v1.1.72026-08-08 17:31:50Header compte conditionnel (snippets / jetons)Affichez « Connexion » ou « Mon compte » dans le header selon l’état de session, via un snippet HTML et les jetons {{​​​​account_if_guest}} / {{​​​​account_if_logged_in}}.
Pour les utilisateurs
- Dans un snippet HTML (ou le gabarit) : entourez le bouton Connexion avec {{​​​​account_if_guest}}…{{​​​​/account_if_guest}} et Mon compte avec {{​​​​account_if_logged_in}}…{{​​​​/account_if_logged_in}}.
- Jetons utiles : {{​​​​account_account_url}}, {{​​​​account_user_name}}, {{​​​​account_logout_url}}, {{​​​​account_logged_in}} (1 ou vide).
- Placez {{​​​​snippet:votre_cle}} dans le header du gabarit.
- Alternative prête à l’emploi : {{​​​​account_strip}} (bandeau lw-admin).
- Snippets PHP : variable $lw_db + lw_public_accounts_viewer().

Pourquoi
- DormezChezNous et thèmes importés veulent un bouton Bootstrap/modal personnalisé, pas le bandeau générique.

Détail technique
- lw_public_accounts_apply_conditional_blocks() dans apply_tokens ; $lw_db exposé aux snippets PHP.
v1.1.62026-08-08 17:25:08Correction AJAX modals compte (thèmes Homelengo)La connexion depuis un modal ne réagissait pas au clic : le script compte intercepte maintenant le clic avant les scripts du thème, affiche les erreurs (retrait de d-none) et indique le chargement sur le bouton.
Pour les utilisateurs
- Le bouton « Connexion » dans le modal répond de nouveau : texte « … » pendant l’envoi, message d’erreur visible en rouge si échec, rechargement de la page si succès.
- Aucun changement requis dans votre HTML si data-lw-account et data-lw-account-error sont déjà en place.

Pourquoi
- Les thèmes importés (Homelengo / DormezChezNous) enregistrent des écouteurs qui bloquaient l’événement submit avant notre script ; les erreurs restaient aussi cachées par la classe Bootstrap d-none.

Détail technique
- lw-account-forms.js v3 : capture click + submit, chargé en dernier avant </body>.
- Retrait automatique de d-none sur data-lw-account-error.
v1.1.52026-08-08 17:13:29Connexion et inscription en AJAX (modals)Les formulaires compte dans une fenêtre modale (Bootstrap ou autre) peuvent être envoyés sans recharger toute la page : les erreurs s’affichent dans le modal, et la page se met à jour après une connexion réussie.
Pour les utilisateurs
- Si votre formulaire login/register est dans un modal (.modal ou role="dialog"), la soumission se fait en AJAX automatiquement — plus de redirection vers /connexion/ qui casse l’expérience.
- Placez un emplacement d’erreur : <div data-lw-account-error></div> dans le modal.
- Forcer ou désactiver : data-lw-account-ajax="1" ou "0" sur le <form>.
- Après succès : par défaut rechargement de la page (menu compte à jour) ; data-lw-account-on-success="redirect" pour aller vers Mon compte.
- Le captcha inscription est rafraîchi automatiquement après une erreur.

Pourquoi
- DormezChezNous et thèmes similaires ouvrent login/inscription en popup : un POST classique rechargeait toute la page.

Détail technique
- lw-account-forms.js injecté quand data-lw-account est présent.
- Réponses JSON côté serveur (lw_public_accounts_handle_post) ; hook index.php pour POST depuis n’importe quelle page.
v1.1.42026-08-08 16:54:04Formulaires compte personnalisés (data-lw-account)Vous pouvez utiliser vos propres formulaires HTML de connexion et d’inscription dans le template : le moteur les branche automatiquement et expose les messages d’erreur via des jetons ou des emplacements dédiés.
Pour les utilisateurs
- Marqueur sur le <form> : data-lw-account="login" ou "register" (aussi forgot, reset, profile, security).
- Champs : data-lw-account-field="email|password|…" ou détection par id/name/placeholder (comme le contact).
- Erreurs : {{​​​​account_error_text}} dans votre HTML, ou <div data-lw-account-error></div>.
- Succès : {{​​​​account_success_text}} ou data-lw-account-success.
- Remplacez {{​​​​account_login}} par votre markup sur la page coquille /connexion/ si vous ne voulez pas le formulaire lw-admin par défaut.
- Inscription : emplacement <div class="lw-account-captcha-slot"></div> pour le captcha.
- OAuth optionnel : <div data-lw-account-oauth></div>.

Pourquoi
- DormezChezNous et autres thèmes importés gardent leur design Bootstrap sans dupliquer la logique compte.

Détail technique
- account_forms.php (même principe que data-lw-contact).
- CSRF + lw_account_action injectés ; action POST vers /connexion/, /inscription/, etc.
v1.1.32026-08-08 12:47:55Éditeurs HTML avec coloration et tabulationTous les champs HTML et code de l’admin bénéficient de la coloration syntaxique et de l’indentation à la touche Tab (4 espaces), y compris la vue « code source » de TinyMCE.
Pour les utilisateurs
- Champs HTML bruts (en-tête, pied de page, snippets, templates, CSS personnalisé, etc.) : numéros de ligne, coloration, Tab pour indenter.
- Éditeur riche TinyMCE : le bouton « code source » ouvre la même expérience colorée.
- Thèmes importés : édition HTML directe avec coloration.

Pourquoi
- Faciliter la lecture et l’édition du markup sans IDE externe.
- Tab insère une indentation cohérente ; Maj+Tab la réduit.

Détail technique
- Module lw-code-editor.js (CodeMirror 5 via CDN).
- Modes html, css et php selon le champ.
- Compatible navigation app-shell (réinit après changement de page).
v1.1.22026-08-08 11:37:45Mise à jour CMS in-app et alerte footerLes installations distantes voient un avertissement visible dans le pied de page admin lorsqu’un package plus récent existe, et peuvent installer la mise à jour depuis Réglages → Versions sans ré-uploader manuellement les fichiers.
Pour les utilisateurs
- Pied de page admin : badge « Mise à jour disponible (vX.Y.Z) » lorsqu’un paquet VersionLog plus récent est publié sur repo.ludiware.com.
- Réglages → Versions : bandeau avec bouton « Mettre à jour maintenant » (téléchargement + déploiement automatique).
- Fichiers locaux préservés : config.local.php, config.php (seule la ligne Version est mise à jour), uploads/, storage/, extensions installées.

Pourquoi
- Éviter les mises à jour manuelles FTP/SFTP sur chaque site hébergé.
- Rendre visible une version obsolète (ex. 1.0.53 vs 1.1.x) sans fouiller l’historique.

Détail technique
- lw_cms_update_apply() : télécharge ZIP/tar.gz depuis repo.ludiware.com, extrait et copie le core.
- lw_versionlog_check_update() inchangé (cache 30 min).
- Badge sidebar Réglages + alerte chrome pour les gestionnaires.
v1.1.12026-08-08 11:30:24Historique : jetons et accolades lisiblesLes entrées VersionLog n’affichent plus de codes HTML bruts ({) : les jetons {{​​​​account_login}} et similaires apparaissent normalement.
Pour les visiteurs
- Page Historique : les exemples de jetons CMS s’affichent comme du texte (accolades visibles), sans entités HTML encodées en double.

Pourquoi
- Certaines entrées VersionLog mentionnaient des entités HTML ({) dans leur texte ; htmlspecialchars() les affichait telles quelles à l’écran.

Détail technique
- lw_versionlog_prepare_display_source() : décodage des entités d’accolades avant neutralisation zero-width space et lw_e().
v1.1.0 Package2026-08-08 11:28:14ludiWARE 1.1.0 — distribution publiqueRelease mineure 1.1.0 : package d’installation complet (ZIP + tar.gz), comptes publics OAuth, historique des versions sur la vitrine, formulaire contact prérempli, et plugins MarketPlace à jour.
Pour les utilisateurs
- Téléchargement : ludiware-1.1.0.tar.gz + ludiware-1.1.0.zip
- Dépôt : https://repo.ludiware.com/releases/1.1.0/
- Assistant /install/ inclus (base de données, schéma, compte admin)

Depuis la distribution 1.0.40
- Comptes membres locaux : inscription, connexion, mot de passe oublié, Mon compte (onglets profil / sécurité)
- OAuth Google et Facebook sur la vitrine
- Header public reconnaît la session lw-admin et les membres OAuth
- Jeton {{​​​​versionlog}} : historique des versions sur le site public
- Formulaire contact : nom et courriel préremplis si connecté
- Bootstrap Icons + sélecteur d’icônes admin
- Plugins MarketPlace : FAQ, Témoignages, Galerie, Formulaires, Réservation, Annonces classées, Forums

Plugins republication (MarketPlace)
- Forums 1.0.16
- Annonces classées 1.0.15

Détail technique
- Export OSS sans secrets ni outils usine ; FileName VersionLog → tar.gz public.

Télécharger le package

v1.0.612026-08-08 11:25:48Historique : jetons affichés normalementLes exemples {{​​​​account_login}} dans l’historique des versions s’affichent comme du texte lisible, sans entités HTML visibles ({).
Pour les visiteurs / administrateurs
- Page Historique et Réglages → Versions : les jetons cités en exemple apparaissent comme {{​​​​account_login}}, pas comme {{​​account_login}}.

Pourquoi
- L’échappement HTML des accolades en entités, puis htmlspecialchars(), doublait l’encodage et affichait les codes bruts à l’écran.

Détail technique
- Neutralisation zero-width space seule (sans entités {) dans lw_versionlog_format_display_text() et lw_versionlog_shield_public_html().
v1.0.602026-08-08 11:24:31Contact : nom et courriel préremplis si connectéSur le formulaire de contact, les champs Nom et Courriel sont remplis automatiquement lorsque le visiteur est déjà connecté (compte local, lw-admin ou portail CDS).
Pour les utilisateurs
- Formulaire {{​​​​contact_form}} et formulaires contact des thèmes ZIP : Nom et Courriel préremplis si vous êtes connecté.
- Les champs déjà remplis dans le gabarit ne sont pas écrasés.

Pourquoi
- Éviter de ressaisir son identité à chaque message contact.

Sources
- Portail CDS (session SSO) : nom complet + courriel du contact.
- Compte membre public ou cookie lw-admin : display_name + courriel lw_users.

Détail technique
- lw_contact_prefill_identity(), lw_contact_apply_prefill_to_form(), lw_contact_form_html().
v1.0.592026-08-08 11:20:46Jeton {{​​​​versionlog}} actif sur la vitrineLe jeton {{​​​​versionlog}} est désormais reconnu sur le site public : la page Historique affiche la liste des versions au lieu du texte brut du jeton.
Pour les visiteurs
- Page Historique : le contenu {{​​​​versionlog}} est remplacé par la liste des versions (styles et textes sécurisés).

Pourquoi
- Le module VersionLog n’était chargé que dans lw-admin ; sur index.php (front public), lw_versionlog_prepare_public_html() n’existait pas et le jeton restait affiché tel quel.

Détail technique
- require versionlog.php dans www/index.php avant public_render.php.
v1.0.582026-08-08 11:07:13Historique public : jetons CMS affichés en texteSur la page Historique du site ludiware.com, les mentions {{​​​​account_login}}, {{​​​​menu:main}}, etc. dans les entrées VersionLog s’affichent en texte au lieu d’injecter formulaires ou menus.
Pour les visiteurs
- Page Historique (/historique/) : titre, description et détails d’une version montrent les jetons cités en exemple (documentation), sans formulaire de connexion ni menu injecté au milieu du texte.

Pourquoi
- Le contenu VersionLog est rendu via un snippet PHP puis repasse dans le moteur de jetons CMS ; les exemples {{​​​​account_login}} étaient exécutés comme de vrais jetons.

Détail technique
- Jeton {{​​​​versionlog}} / {{​​​​versionlog_list}} natif ; protection des blocs .lw-vl-* avant le pipeline de jetons ; entités HTML pour {{​​​​ et }} à l’affichage.
v1.0.572026-08-08 10:58:52Historique des versions : jetons CMS affichés en texteLes mentions {{​​​​account_login}}, {{​​​​menu:main}}, etc. dans les détails techniques du VersionLog ne sont plus interprétées comme des jetons CMS.
Pour les administrateurs
- Réglages → Historique des versions : titre, description et détails complets affichent les jetons tels quels (documentation), sans formulaire ni contenu injecté.

Pourquoi
- Les entrées VersionLog citent souvent des jetons en exemple dans la section « Détail technique » ; le moteur de jetons ne doit pas les exécuter à l’affichage.

Détail technique
- Neutralisation {{​​​​ → {{​​​​ + zero-width space à la sortie API et côté lw-admin ; affichage HTML échappé.
v1.0.562026-08-08 10:54:16Header public : reconnaissance de la session lw-adminConnecté à lw-admin, vous apparaissez aussi comme membre sur le site public (header, Mon compte), comme pour les commentaires au blogue.
Pour les visiteurs / administrateurs
- Si vous êtes connecté à lw-admin (cookies), le bandeau {{​​​​account_strip}} affiche votre nom et le lien « Accéder à mon compte ».
- /mon-compte/ est accessible sans repasser par /connexion/.
- /connexion/ et /inscription/ redirigent vers Mon compte si vous êtes déjà reconnu.

Priorité d’identité (inchangée pour le blogue si session Facebook active)
1. Session membre public (connexion / OAuth)
2. Cookie lw-admin

Déconnexion sur le site public : ferme la session membre ; si seul lw-admin reste actif, vous restez connecté (comportement voulu).
v1.0.552026-08-08 10:38:20Blogue et forums : identité membre public prioritaireSur le site public, la session membre (connexion / Facebook / Google) prime désormais sur les cookies admin lw-admin pour commenter au blogue.
Problème corrigé
- Header « Vous êtes connecté en tant que… » (session membre) et blogue « Vous commentez en tant que… » (cookies admin) pouvaient afficher deux personnes différentes si vous étiez connecté à lw-admin et via Facebook sur le site public.

Comportement
- Priorité : portail CDS → membre public (session) → staff admin (cookie lw-admin).
- Le blogue propose le lien Connexion vers /connexion/ lorsque les comptes locaux sont actifs (sans CDS).

Note
- Si Facebook a créé un second compte lw_users (courriel différent de l’admin), c’est normal : deux profils distincts. Vous pouvez fusionner manuellement ou supprimer le doublon dans Utilisateurs.
v1.0.542026-08-08 10:11:29OAuth — URL de redirection stableL’URL de callback Google/Facebook affichée dans les réglages utilise désormais le domaine du site (ex. ludiware.com), pas l’hôte de l’admin.
Pour les administrateurs
- Dans Réglages → Comptes membres, l’URL « redirection autorisée » correspond au domaine public du site.
- Note d’aide pour l’enregistrement de l’URI dans Facebook Login → Valid OAuth Redirect URIs.

Pourquoi
- Depuis le panneau admin (autre sous-domaine), l’URL générée pouvait différer de celle réellement utilisée sur le site public.
v1.0.532026-08-08 10:03:23Connexion Google et Facebook pour les membresLes visiteurs peuvent se connecter ou s'inscrire avec Google ou Facebook sur les pages connexion et inscription, sans portail CentreDeService. Un compte local est créé automatiquement s'il n'existe pas encore.
Pour les visiteurs
- Boutons « Se connecter avec Google » et « Se connecter avec Facebook » sur /connexion/ et /inscription/.
- Si le courriel n'est pas encore inscrit, un profil membre est créé et la session est ouverte.
- Si un compte existe déjà avec le même courriel, le profil OAuth est lié au compte existant.

Pour les administrateurs
- Onglet Comptes membres des réglages site : activation, identifiants OAuth et URL de redirection à copier dans Google Cloud / Facebook Developer.
- Désactivé automatiquement lorsque le portail CentreDeService gère l'authentification.

Détail technique
- Colonnes lw_users google_id / facebook_id, module oauth_accounts.php, callbacks /oauth/{provider}/callback/.
v1.0.522026-08-08 08:35:18Sélecteur d'icônes — catalogue completLe sélecteur d'icônes affiche d'abord une sélection utile, puis toutes les icônes Bootstrap (~1 600) via la recherche.
Pour les administrateurs
- À l'ouverture : grille de favoris (maison, commerce, transport, etc.).
- Recherche : filtre sur l'ensemble des ~1 683 icônes Bootstrap Icons installées.
- Compteur de résultats et message si la liste est tronquée.

Correction
- La liste n'était limitée qu'à 120 icônes en ordre alphabétique (123, alarm…), ce qui paraissait incomplet.
v1.0.512026-08-08 08:29:09Bootstrap Icons et sélecteur d'icônesLes icônes Bootstrap s'affichent correctement partout dans l'admin grâce aux polices complètes. Un sélecteur d'icônes réutilisable est disponible pour les formulaires (recherche, grille, aperçu).
Pour les administrateurs
- Polices Bootstrap Icons (woff/woff2) installées : les icônes `bi-*` déjà utilisées dans lw-admin s'affichent de façon fiable.
- Nouveau composant « sélecteur d'icônes » (`lw_icon_picker_field`) utilisable dans tout formulaire admin.

Utilisation
- Bouton avec aperçu de l'icône, recherche par nom, grille cliquable, option « Aucune icône ».
- Fonction PHP `lw_bootstrap_icon_names()` et normalisation `lw_bootstrap_icon_class()`.

Détail technique
- Fichiers : `functions/icon_picker.php`, `js/lw-icon-picker.js`, styles dans `lw-admin.css`.
v1.0.502026-08-08 07:27:10Mon compte — onglets profil et sécuritéLa page Mon compte propose deux onglets : Mes informations (prénom, nom, avatar) et Accès et sécurité (courriel, mot de passe). Nouveaux jetons pour gabarits ZIP.
Pour les utilisateurs
- Onglet Mes informations : prénom, nom de famille, téléversement d’avatar.
- Onglet Accès et sécurité : changement de courriel et/ou mot de passe (mot de passe actuel requis).

Jetons ZIP
- {{​​​​account_panel}} : panneau complet avec onglets.
- {{​​​​account_tabs}}, {{​​​​account_profile}}, {{​​​​account_security}} : mise en page personnalisée.
- {{​​​​account_avatar}}, {{​​​​account_avatar_url}}, {{​​​​account_first_name}}, {{​​​​account_last_name}}, {{​​​​account_email}}.
- {{​​​​account_profile_url}}, {{​​​​account_security_url}} : liens directs vers chaque onglet.

Détail technique
- Colonne lw_users.avatar_path, fichiers dans uploads/users/, session vitrine synchronisée après mise à jour.
v1.0.492026-08-08 07:17:18Comptes vitrine unifiés dans lw_usersInscription, connexion et mot de passe oublié sur la vitrine utilisent désormais la table lw_users (comme lw-admin). Seuls les comptes avec accès admin peuvent ouvrir lw-admin.
Pour les utilisateurs
- Même courriel et mot de passe partout : admin ou visiteur inscrit sur /inscription/.
- Les comptes créés sur la vitrine ont le rôle user et ne peuvent pas accéder à lw-admin.
- Les administrateurs se connectent aussi sur /connexion/ avec leurs identifiants habituels.

Pourquoi
- Suppression du double système lw_site_members / lw_users introduit par erreur.

Détail technique
- public_accounts.php : auth, inscription et reset sur lw_users ; session vitrine par site.
- auth.php inchangé : can_access_admin requis pour lw-admin.
- Table obsolète lw_site_members : peut être supprimée en base (DROP TABLE).
v1.0.482026-08-08 07:11:33Connexion vitrine avec un compte administrateurLes administrateurs du site peuvent se connecter sur la vitrine publique (/connexion/) avec le même courriel et mot de passe que lw-admin, sans inscription séparée.
Pour les utilisateurs
- Sur /connexion/, un compte administrateur global ou assigné au site est accepté avec les identifiants lw-admin.
- La première connexion crée automatiquement le profil membre local du site ; les connexions suivantes réutilisent ce profil.

Pourquoi
- Avant ce correctif, seuls les comptes inscrits via /inscription/ (table lw_site_members) étaient reconnus ; le premier admin recevait « Courriel ou mot de passe incorrect ».

Détail technique
- Pont lw_users → lw_site_members dans lw_public_accounts_login() : vérification mot de passe admin, accès site (global_admin ou local_admin membre du site), synchronisation du hash et de la session membre.
v1.0.472026-08-08 06:52:34Comptes membres locaux sur la vitrineLes sites sans portail CentreDeService peuvent proposer inscription, connexion, mot de passe oublié et espace membre sur la vitrine publique, avec jetons pour gabarits ZIP et pages coquilles CMS.
Pour les utilisateurs
- Inscription sur /inscription/ avec captcha et confirmation du mot de passe.
- Connexion sur /connexion/, récupération sur /mot-de-passe-oublie/ et réinitialisation par lien courriel.
- Espace « Mon compte » une fois connecté ; bandeau {{​​​​account_strip}} dans le header.

Pour les administrateurs
- Onglet Réglages → Comptes membres : coquilles CMS et bouton « Générer les pages système ».
- Menu éditeur : Ajouter membre (Connexion, Mot de passe oublié, Inscription, Mon compte) si CDS inactif.
- Jetons ZIP : {{​​​​account_login}}, {{​​​​account_register}}, {{​​​​account_panel}}, {{​​​​account_forgot}}, {{​​​​account_reset}} et URLs associées.

Pourquoi
- Permettre aux vitrines ludiWARE autonomes (sans CDS) d’offrir des comptes visiteurs pour commentaires, contenus réservés ou personnalisation future.

Détail technique
- Table lw_site_members, CSRF session, captcha inscription distinct du contact, routes try_serve, public_render apply_tokens.
v1.0.462026-08-07 12:59:32Captcha contact : correction des réponses valides rejetéesLorsqu’une page ou un gabarit contient plusieurs formulaires contact, la même question de vérification s’affiche partout et la bonne réponse est acceptée.
Pour les utilisateurs
- Le captcha « Combien font X + Y ? » est identique sur tous les formulaires contact d’une même page.
- Une réponse correcte n’est plus rejetée avec « Vérification de sécurité incorrecte ».

Pourquoi
- Chaque formulaire recevait parfois une question différente alors que la session ne mémorise qu’une seule réponse (contenu + gabarit finalisés séparément).

Détail technique
- lw_contact_captcha_issue() réutilise le défi session valide ; finalisation contact une seule fois sur le HTML complet (public_render.php).
v1.0.452026-08-07 12:15:48Jetons blogue : derniers articles (footer / sidebar)Placez dans un gabarit ou une page les jetons {{​​​​blog-latest-title-1}}, {{​​​​blog-latest-image-1}}, {{​​​​blog-latest-excerpt-1}}, etc. (jusqu’à 10) pour afficher les articles les plus récents.
Pour les utilisateurs
- {{​​​​blog-latest-title-N}} : titre (N=1 = plus récent, 2 = avant-dernier, … jusqu’à 10)
- {{​​​​blog-latest-image-N}} : URL de l’image à la une
- {{​​​​blog-latest-excerpt-N}} : extrait du corps de l’article
- {{​​​​blog-latest-date-N}} : date courte (ex. 15 avril 2020)
- {{​​​​blog-latest-date-long-N}} : date longue
- {{​​​​blog-latest-url-N}} : lien vers l’article
- Idéal pour un bloc « Blogue » en pied de page ou barre latérale, comme dans un thème ZIP importé.

Pourquoi
- Personnaliser le footer sans dupliquer manuellement les titres et images des articles.

Détail technique
- lw_blog_apply_latest_tokens() dans blog.php, appelé depuis lw_blog_apply_tokens() sur gabarits et pages.
v1.0.442026-08-07 12:10:34Contact thème : messages d’erreur et champ SujetLes formulaires contact des thèmes ZIP affichent à nouveau le vrai message d’erreur (captcha, champs manquants, etc.) et le champ Sujet du thème est bien pris en charge.
Pour les utilisateurs
- Après un envoi raté, le message précis s’affiche (ex. captcha incorrect) au lieu du générique « Envoi impossible. Vérifiez les champs. »
- Le champ Sujet des formulaires de thème (ex. msg_subject, placeholder ou label « Sujet ») est enregistré et reçu par courriel.
- Les champs sans attribut name mais avec placeholder/label (Votre nom, Votre courriel…) sont reconnus à l’import et au rendu.

Pourquoi
- lw_contact_form_html() effaçait le flash session avant l’affichage des formulaires thème.
- Certains thèmes nomment le sujet autrement que subject.

Détail technique
- public_render.php : lw_contact_form_html() seulement si {{​​​​contact_form}} est présent.
- contact_forms.php : alias msg_subject, détection placeholder/label, fallbacks nom/courriel.
v1.0.432026-08-07 12:04:45Correction erreur 500 sur les pages contact (thèmes ZIP)Les pages « Nous joindre » importées depuis un template ZIP ne provoquent plus d’erreur serveur lorsque le bouton Envoyer est imbriqué dans la grille du thème (Bootstrap, etc.).
Pour les utilisateurs
- Les pages contact personnalisées d’un thème importé s’affichent à nouveau normalement, avec captcha et envoi vers la boîte Messages.
- Avant la correction, certaines pages (ex. formulaire dans des colonnes Bootstrap) renvoyaient une erreur HTTP 500.

Pourquoi
- Lors du branchement du formulaire thème, l’emplacement du captcha était inséré au mauvais niveau du DOM lorsque le bouton Envoyer n’était pas enfant direct du <form>.

Détail technique
- contact_forms.php : lw_contact_wire_form_element() insère le slot captcha via le parent immédiat du bouton submit au lieu de form->insertBefore() sur un nœud imbriqué.
v1.0.422026-08-07 09:41:46Pages boutique CDS personnalisables (coquilles et jetons)Comme pour le blogue, vous pouvez choisir des pages CMS comme coquilles pour le magasin, les catégories, les fiches produit, le panier et les commandes, puis y placer des jetons granulaires (titre, prix, image, liste, etc.).
Pour les utilisateurs
- Dans Réglages du site → CentreDeService.NET, section « Pages coquilles boutique », associez une page CMS à chaque type d’écran (/boutique/, catégorie, produit, panier, commande).
- Sans coquille, le rendu CDS par défaut reste inchangé.
- Sur une coquille produit : {{​​​​cds_product_title}}, {{​​​​cds_product_image}}, {{​​​​cds_product_price}}, {{​​​​cds_product_desc}}, {{​​​​cds_product_add_cart}}, ou {{​​​​cds_product}} pour la fiche complète.
- Sur une liste / catégorie : {{​​​​cds_shop_list}} (bloc complet), ou {{​​​​cds_shop_categories}}, {{​​​​cds_shop_products}}, {{​​​​cds_shop_pager}}, {{​​​​cds_category_title}}.
- Panier / commande : {{​​​​cds_cart}}, {{​​​​cds_order}}, {{​​​​cds_cart_count}}.

Pourquoi
- Permettre une mise en page boutique alignée sur le thème du site, sur le même modèle que les jetons blogue.

Détail technique
- Coquilles : cds_shop_*_page_uid ; lw_cds_resolve_shell_page dans lw_cds_try_serve.
- Jetons : lw_cds_apply_shop_field_tokens + contexte dans lw_cds_apply_tokens.
v1.0.412026-08-07 09:03:11Formulaires contact des templates ZIP reliés au CMSLes formulaires de contact déjà présents dans un thème importé peuvent envoyer leurs messages via le moteur contact de lw-admin, sans remplacer le design du thème. À l’import, la détection est automatique ; vous pouvez aussi forcer avec data-lw-contact="1".
Pour les utilisateurs
- Un formulaire contact du thème (classes / mailto / champs nom-email-message) est branché sur la boîte Messages et l’e-mail de notification.
- L’apparence du formulaire (HTML/CSS du thème) est conservée.
- Marqueur manuel : data-lw-contact="1" force le branchement ; data-lw-contact="0" l’exclut.
- Captcha et messages de succès/erreur s’affichent comme pour {{​​​​contact_form}}.

Pourquoi
- Éviter de remplacer un beau formulaire de thème par le HTML générique {{​​​​contact_form}}.

Détail technique
- lw_contact_wire_form_html (import) ; lw_contact_finalize_bound_forms (rendu) ; alias de champs dans lw_contact_submit.
v1.0.40 Package2026-08-06 13:07:30ludiWARE 1.0.40 — package d’installationDistribution publique complète (ZIP + tar.gz) avec installateur. Inclut les évolutions récentes : blogue (jetons, URLs par catégories, sous-catégories), page 404 CMS, médiathèque globale, menus / import ZIP, et corrections d’affichage.
Pour les utilisateurs
- Package téléchargeable pour installer ou mettre à jour ludiWARE.
- Archives : ludiware-1.0.40.tar.gz et ludiware-1.0.40.zip
- Dépôt : https://repo.ludiware.com/releases/1.0.40/
- Assistant /install/ inclus (base de données, schéma, compte admin)

Contenu notable depuis la dernière distribution
- Blogue : jetons auteur / date longue / heure / commentaires / catégories ; URLs /blogue/catégorie/sous-catégorie/slug ; sous-catégories en admin ; accord « commentaire »
- Page 404 CMS désignée + pastille ; import ZIP (chrome, méga-menus, détection 404)
- Médiathèque globale et dossiers ; menus actifs ; déduplication header

Pourquoi
- Fournir un paquet installable aligné sur la version courante du CMS.

Détail technique
- Export OSS (sans secrets, sans api/admin usine) ; FileName VersionLog pointant vers le tar.gz public.

Télécharger le package

v1.0.392026-08-06 13:01:02Singulier « commentaire » quand il y en a 0 ou 1Dans la liste des articles du blogue, on affiche « 0 commentaire » ou « 1 commentaire » (sans s), et le pluriel seulement à partir de 2.
Pour les utilisateurs
- Meta des cartes d’articles : accord correct du mot commentaire (0/1 au singulier).

Pourquoi
- « 0 commentaires » était grammaticalement incorrect en français.

Détail technique
- lw_blog_format_comments_count : singulier si count <= 1 (FR).
v1.0.382026-08-06 13:00:31Sous-catégories de blogue plus simples à créerDans lw-admin, chaque catégorie propose un bouton pour ajouter une sous-catégorie. Le champ « Catégorie parente » est mis en avant, avec la liste en arborescence.
Pour les utilisateurs
- Liste des catégories : icône « diagramme » pour créer une sous-catégorie déjà rattachée à la bonne parente.
- Formulaire : champ parent en premier, aide sur l’URL /blogue/parente/enfant/…
- Pastille « Sous-catégorie » et colonne Parente dans le tableau.

Pourquoi
- La hiérarchie existait déjà en base, mais était trop discrète dans l’interface.

Détail technique
- blogcats.php (?new=1&parent=uid) ; clés i18n blog.cat_* ; invalidation cache catégories.
v1.0.372026-08-06 12:51:12URLs blogue avec catégories imbriquéesLes articles sont désormais accessibles via /blogue/catégorie/sous-catégorie/slug-article. Les anciennes adresses /blogue/slug redirigent automatiquement vers la nouvelle URL.
Pour les utilisateurs
- URL d’un article : /blogue/{catégorie}/{sous-catégorie}/{slug} selon la hiérarchie des catégories.
- Sans catégorie : /blogue/{slug} comme avant.
- Listes de catégories : /blogue/{catégorie}/{sous-catégorie} (l’ancien préfixe /blogue/categorie/… redirige).
- Les liens liste, commentaires, sitemap et l’admin utilisent la nouvelle structure.

Pourquoi
- Refléter l’arborescence des catégories dans l’URL, plus claire pour le SEO et la navigation.

Détail technique
- lw_blog_post_url / lw_blog_post_path_extra ; résolution de chemin dans lw_blog_try_serve ; redirections 301.
v1.0.362026-08-06 12:48:37Nouveaux jetons blogue (auteur, date, commentaires…)Les gabarits d’article peuvent afficher le nombre de commentaires, l’auteur, une date longue, l’heure de publication et la liste des catégories. Un champ Auteur a été ajouté à l’édition des articles.
Pour les utilisateurs
- Nouveaux jetons : {{​​​​blog_comments_count}} (chiffre), {{​​​​blog_author}}, {{​​​​blog_date_long}} (ex. Jeudi le 3 septembre 2024), {{​​​​blog_time}} (HH:MM), {{​​​​blog_categories}} (liste des catégories publiées).
- {{​​​​blog_date}} reste au format AAAA-MM-JJ.
- Champ « Auteur » à la création / édition d’un article, utilisé par {{​​​​blog_author}}.

Pourquoi
- Permettre des mises en page d’articles plus riches sans HTML figé.

Détail technique
- Colonne author_name ; helpers lw_blog_format_date_long / lw_blog_render_categories_token_list ; jetons documentés dans templates.php.
v1.0.352026-08-06 11:32:25Page 404 CMS : affichage corrigé + pastilleLa page désignée comme 404 s’affiche correctement (y compris sur un site encore en brouillon / en aperçu). Dans la liste des pages, une pastille « 404 » apparaît comme pour l’accueil. À l’import ZIP, les pages d’erreur 404 sont détectées automatiquement.
Pour les utilisateurs
- Si vous cochez « Utiliser comme page 404 », une URL inconnue affiche cette page (thème du site), et non le 404 sombre générique.
- Cela fonctionne aussi en aperçu et tant que le site est en brouillon.
- Liste des pages : pastille orange « 404 » à côté du statut, comme la pastille Accueil.
- Nouveaux imports ZIP : une page nommée 404 / not-found est assignée automatiquement.

Pourquoi
- Le rendu de la page 404 ignorait le mode aperçu et refusait les sites brouillon (« Site non publié »), ce qui forçait le repli générique.

Détail technique
- lw_public_site_404(..., $preview) ; rendu forcé en mode aperçu si site brouillon ; badge pages.badge_404 ; auto page_404_page_uid à l’import ZIP.
v1.0.342026-08-06 11:26:54Import ZIP : plus de header en double dans les pagesÀ l’import d’un template, le header (et les wrappers du même type) est retiré du contenu des pages lorsqu’il est déjà placé dans l’en-tête global. Les sites déjà importés sont nettoyés à l’affichage.
Pour les utilisateurs
- Les pages importées ne gardent plus une copie du menu/header dans leur contenu si le chrome global est actif.
- Les templates sans balise <header> (ex. #header / .header-area) sont aussi pris en charge.

Pourquoi
- Le strip était trop strict (vote majoritaire, wrappers non sémantiques ignorés) ; des restes restaient dans le HTML des pages.

Détail technique
- Détection structurelle + affixe normalisé (ignore active) ; strip/dedupe DOM élargi ; nettoyage au rendu public.
v1.0.332026-08-06 11:16:07Menu : item courant correctement mis en évidenceSur les sites (y compris templates importés), l’item de menu actif suit la page affichée au lieu de rester figé sur Accueil.
Pour les utilisateurs
- En visitant « À propos » (ou une autre page), c’est cet item qui apparaît sélectionné, plus Accueil.
- Les parents d’un sous-menu actif restent aussi mis en évidence.

Pourquoi
- À l’import, la classe active de la page d’accueil était recopiée telle quelle dans le menu CMS, sans recalcul selon l’URL.

Détail technique
- Rendu menu : strip des classes active/current importées, marquage selon page_uid ou chemin courant, aria-current=page.
v1.0.322026-08-06 11:00:39Correction « Nouveau dossier » médiasChoisir « Nouveau dossier » dans la médiathèque affiche correctement le champ pour nommer le dossier, y compris après navigation dans l’admin.
Pour les utilisateurs
- Le champ texte sous « Nouveau dossier » réapparaît bien à la sélection.

Pourquoi
- Le script ne se rattachait pas après le chargement des pages en mode app (navigation sans rechargement complet).

Détail technique
- Délégation d’événements + réinit sur lw:fragment-loaded (lw-media-folder.js v2).
v1.0.312026-08-06 10:50:19Médiathèque globale et dossiersVous pouvez déposer des images partagées (logos, etc.) une seule fois dans Bibliothèque → Médias globaux, puis les réutiliser sur tous les sites. Le choix du dossier à l’upload propose la liste des dossiers existants ou « Nouveau dossier ».
Pour les utilisateurs
- Nouvelle section Bibliothèque → Médias globaux : upload et gestion des images partagées.
- Dans la médiathèque d’un site, l’onglet Globaux affiche ces fichiers en lecture (copie d’URL) ; les admins plateforme peuvent ouvrir Gérer.
- À l’upload ou à l’édition, le champ Dossier est une liste déroulante (aucun / existants / Nouveau dossier + champ texte).

Pourquoi
- Éviter de réimporter le même logo dans chaque site.
- Clarifier le classement par dossiers sans taper le nom à chaque fois.

Détail technique
- lw_media.site_id NULL = global ; fichiers sous uploads/global/ ; référence unique (pas de copie par site).
v1.0.302026-08-06 09:59:30Import ZIP : mega-menus préservésÀ l’import d’un template ZIP, les mega-menus (panneaux riches avec colonnes, images, CTA) et les attributs Bootstrap des menus déroulants sont conservés et restitués correctement.
Pour les utilisateurs
- Les templates avec mega-menus (ex. panneaux pleine largeur, grilles, images) gardent leur apparence après import.
- Les menus déroulants Bootstrap conservent leurs options (data-bs-toggle, etc.).
- Si un item a un panneau mega, une zone HTML dédiée apparaît dans Menus pour l’ajuster (en attendant l’extension mega-menu).

Pourquoi
- L’import ne lisait que les sous-listes <ul> ; les panneaux en <div class="dropdown-menu"> étaient perdus à la tokenisation {{​​​​menu:…}}.

Détail technique
- Nouveaux champs item : panel_html, link_attrs, label_html ; détection à l’harvest ; rendu a+panneau ; rewrite des URLs du panneau à la persistance.
v1.0.292026-08-06 09:42:25Correction sauvegarde en-tête / pied (doublon)Enregistrer l’en-tête et le pied de page d’un template ZIP ne duplique plus le footer sous le copyright.
Pour les utilisateurs
- La sauvegarde de « En-tête & pied de page » ne laisse plus apparaître un second footer non stylé.
- Les sites déjà touchés par le bug sont corrigés à l’affichage (et définitivement en réenregistrant le chrome).

Pourquoi
- Le parseur prenait le premier </div> interne du footer pour couper le bloc, puis recopait le reste après le pied de page.

Détail technique
- Extraction after_footer via DOM ; seuls script/style/link/noscript sont conservés ; repair au rendu public.
actif sur la vitrine
Le jeton

Historique des versions de la plateforme ludiWARE (plus récent en premier).

v1.2.12026-08-09 16:47:35Mon compte extensible et lightbox annoncesLes plugins peuvent ajouter des onglets à Mon compte (ex. Mes annonces). Les pages publiques injectent correctement le script de la galerie photos en fin de HTML.
Pour les utilisateurs
- Mon compte : les extensions peuvent proposer de nouveaux onglets via le CMS (URL ?tab=…).
- Annonces classées 1.2.12 : onglet « Mes annonces » avec modifier, supprimer et marquer comme vendue.
- Lightbox des photos d’annonce : fonctionne aussi sur les fiches intégrées via jetons CMS (pas seulement les routes /annonces/…).

Pourquoi ce changement
- Centraliser la gestion des annonces dans Mon compte, là où les membres gèrent déjà leur profil.
- Corriger la galerie lorsque le HTML de l’annonce est rendu dans une page du site sans passer par le routeur du plugin.

Détail technique
- Filtres CMS : public_account_tabs, public_account_tab_panels, public_account_post_actions, public_accounts_handle_post, public_page_html.
- Plugin classifieds : statut sold, actions propriétaire, JS galerie defer v4.
v1.2.0 Package2026-08-09 15:29:10ludiWARE 1.2.0 — profils publics et identité membreRelease mineure 1.2.0 : packages d’installation complets (ZIP + tar.gz), profils publics des membres, noms cliquables partout, historique d’activité unifié sur le profil, et plugins Forums / Annonces classées republiés.
Pour les utilisateurs
- Téléchargement : ludiware-1.2.0.tar.gz + ludiware-1.2.0.zip
- Dépôt : https://repo.ludiware.com/releases/1.2.0/
- Assistant /install/ inclus

Nouveautés CMS (depuis 1.1.x)
- Profil public membre : /membre/{uid} (avatar, nom, date d’inscription)
- Noms des membres cliquables vers le profil (blogue, bandeau compte, extensions)
- Historique d’activité sur le profil : commentaires blogue, sujets/réponses forum, annonces et commentaires
- Filtre `public_member_profile_activity` pour les extensions

Plugins MarketPlace republiés
- Forums 1.0.18 (liens profil + activité forum)
- Annonces classées 1.2.9 (commentaires liés, activité annonces)

Détail technique
- Export OSS sans secrets ni outils usine
- FileName VersionLog → tar.gz public sur repo.ludiware.com

Télécharger le package

v1.1.142026-08-09 15:26:40Historique d’activité sur le profil publicLa page profil d’un membre affiche désormais une chronologie unifiée de ses contributions publiques : commentaires de blogue, sujets et réponses forum, annonces et commentaires sur annonces.
Pour les visiteurs
- Section « Historique d’activité » sous l’en-tête du profil (/membre/{uid}).
- Chaque ligne : date, type d’action, titre cliquable vers le contenu, extrait court si pertinent.
- Tri antichronologique (60 entrées max.), mélangeant blogue, forums et plugins actifs.

Pour les développeurs / extensions
- Nouveau filtre `public_member_profile_activity` — retourne des items `{at, kind, label, title, url, excerpt?}`.
- Helpers : `lw_public_accounts_collect_member_activity()`, `lw_public_accounts_render_member_activity_html()`, `lw_public_accounts_member_activity_item()`.
- Blogue : `lw_blog_member_public_activity()` (commentaires publiés).
- Les plugins enregistrent leurs sources via le filtre (Forums, Annonces classées).

Pourquoi
- Donner une vue d’ensemble de la présence publique d’un membre au lieu de sections isolées par extension.
v1.1.132026-08-09 15:23:12Noms des membres cliquables vers le profil publicPartout où un membre inscrit apparaît (commentaires du blogue, bandeau compte, etc.), son nom mène désormais à sa page profil publique lorsque celle-ci est visible.
Pour les visiteurs
- Clic sur le nom d’un membre local actif → page /membre/{uid} (ou /member/{uid} en anglais).
- Bandeau « Vous êtes connecté en tant que … » : le nom affiché est aussi un lien vers votre profil.
- Commentaires d’articles de blogue : auteurs membres identifiés par leur compte local.
- Invités, comptes CDS ou auteurs sans compte membre : nom affiché sans lien (comportement inchangé).

Pour les développeurs / extensions
- Helpers centralisés : `lw_public_accounts_author_context_from_row()`, `lw_public_accounts_resolve_content_author()`, `lw_public_accounts_render_author_name_html()`.
- Classe CSS partagée `lw-member-profile-link` pour les liens vers profil.

Pourquoi
- Uniformiser l’identité publique des membres sur tout le site (blogue, forums, annonces, etc.) après l’introduction des profils publics en 1.1.12.
v1.1.122026-08-09 15:17:27Profil public des membres inscritsChaque membre inscrit sur un site (comptes locaux) dispose d’une page profil publique avec avatar et nom. Les extensions peuvent y ajouter du contenu (ex. annonces publiées).
Pour les visiteurs
- URL publique : /membre/{uid} (FR) ou /member/{uid} (EN) — avatar, nom affiché, date d’inscription.
- Les profils ne sont visibles que pour les comptes membres actifs (inscription locale), pas pour les administrateurs ni le portail CentreDeService.

Pour les développeurs / extensions
- Nouveau filtre `public_member_profile_html` pour enrichir la page (le plugin Annonces classées y liste les annonces publiées).
- Helpers : `lw_public_accounts_public_profile_url()`, `lw_public_accounts_user_by_uid_public()`.

Pourquoi
- Permettre de reconnaître qui publie (annonces, forums, etc.) et de consolider l’identité publique des membres du site.
v1.1.112026-08-09 14:33:21Alertes standardisées pour l’admin et les pluginsNouveau système d’alertes unifié : messages de succès, erreur, avertissement et info affichés de façon cohérente dans lw-admin et sur le site public. Les plugins peuvent y contribuer via des hooks dédiés.
Pour les utilisateurs
- Les confirmations et erreurs dans l’administration (ex. « Annonce supprimée », « Réglages enregistrés ») s’affichent désormais en haut de page dans un bandeau uniforme, plus lisible.
- Sur le site public, les plugins peuvent afficher des messages utilisateur avec le même style visuel.

Pourquoi
- Chaque module et plugin gérait ses propres alertes (variables différentes, query strings, classes CSS propres), ce qui créait des doublons et des incohérences.

Détail technique
- Nouveau module lw-admin/functions/flash.php : lw_flash_add(), lw_flash_redirect(), lw_flash_render_html(), lw_public_flash_html().
- Hooks admin_flash et public_flash pour les extensions.
- Rétrocompatibilité avec $lwFlash et $lwPageFlashError.
- Feuille de style lw-flash.css partagée admin/public.
- Plugin Annonces classées migré en exemple (v1.2.2).
v1.1.102026-08-08 18:52:20Configuration portable site à siteconfig.php ne contient plus de secrets ni de domaine usine : base de données, courriels et surcharges d’environnement vivent dans config.local.php ; le domaine et les valeurs par défaut sont déduits automatiquement.
Pour les utilisateurs
- Copier le CMS d’un site à l’autre sans retoucher config.php : seul config.local.php (ou l’assistant /install/) doit être adapté au nouvel hébergement.
- Les cookies et le nom du site suivent le domaine réel si HTTPpath / COOKIEpath ne sont pas définis.

Pourquoi
- config.php mélangeait identifiants MySQL, domaine ludiware.com et courriels usine, ce qui compliquait chaque déploiement client.

Détail technique
- lw_config_detect_http_host() + lw_config_apply_runtime_defaults() après config.local.php.
- Connexion MySQL uniquement si DBhost / DBname / DBusername sont renseignés.
- config.local.example.php et installateur mis à jour (domaine optionnel).
v1.1.92026-08-08 17:58:54Correction connexion modal (champs POST + SQL)La connexion depuis le modal envoie désormais courriel et mot de passe de façon fiable (POST vers la page courante, champs lus explicitement) et fonctionne aussi sur hébergements sans mysqlnd.
Pour les utilisateurs
- Le modal login/register poste vers la page où vous êtes (pas seulement /connexion/), ce qui évite les échecs silencieux.
- Si le compte n’a pas de mot de passe (connexion Google/Facebook admin), un message explicite s’affiche au lieu de « courriel ou mot de passe incorrect ».

Pourquoi
- Sur certains thèmes, les champs n’avaient pas toujours d’attribut name au moment du FormData ; sur certains hébergeurs, la lecture SQL des utilisateurs échouait sans mysqlnd.

Détail technique
- lw-account-forms.js v4 : buildFormData explicite ; action = page courante en modal.
- lw_public_accounts_stmt_fetch_one_assoc() ; formulaires modal : post_url injecté au rendu.
v1.1.82026-08-08 17:51:46Reconnaissance admin sur le site public + cookies domaineUn administrateur connecté à lw-admin est de nouveau reconnu sur le site vitrine (header Mon compte). Les cookies s’alignent sur le domaine réel du site (ex. dormezcheznous.com).
Pour les utilisateurs
- Si vous êtes connecté à lw-admin sur le même domaine que le site public, le header affiche « Mon compte » sans reconnecter via le modal.
- Après connexion via le modal, la session publique est conservée.
- Vérifiez config.local.php : COOKIEpath doit être le domaine du site (pas ludiware.com si le site est sur un autre nom).

Pourquoi
- Les cookies admin étaient parfois posés pour ludiware.com alors que le site tourne sur un domaine custom ; le site public ne recevait pas les cookies. La connexion modal échouait aussi si les cookies admin invalides perturbaient la session.

Détail technique
- lw_cookie_domain() utilise l’hôte HTTP courant si différent de COOKIEpath.
- lw_public_accounts_auth_from_cookies() + sync session membre.
- Bootstrap auth dès index.php public.
v1.1.72026-08-08 17:31:50Header compte conditionnel (snippets / jetons)Affichez « Connexion » ou « Mon compte » dans le header selon l’état de session, via un snippet HTML et les jetons {{​​​​account_if_guest}} / {{​​​​account_if_logged_in}}.
Pour les utilisateurs
- Dans un snippet HTML (ou le gabarit) : entourez le bouton Connexion avec {{​​​​account_if_guest}}…{{​​​​/account_if_guest}} et Mon compte avec {{​​​​account_if_logged_in}}…{{​​​​/account_if_logged_in}}.
- Jetons utiles : {{​​​​account_account_url}}, {{​​​​account_user_name}}, {{​​​​account_logout_url}}, {{​​​​account_logged_in}} (1 ou vide).
- Placez {{​​​​snippet:votre_cle}} dans le header du gabarit.
- Alternative prête à l’emploi : {{​​​​account_strip}} (bandeau lw-admin).
- Snippets PHP : variable $lw_db + lw_public_accounts_viewer().

Pourquoi
- DormezChezNous et thèmes importés veulent un bouton Bootstrap/modal personnalisé, pas le bandeau générique.

Détail technique
- lw_public_accounts_apply_conditional_blocks() dans apply_tokens ; $lw_db exposé aux snippets PHP.
v1.1.62026-08-08 17:25:08Correction AJAX modals compte (thèmes Homelengo)La connexion depuis un modal ne réagissait pas au clic : le script compte intercepte maintenant le clic avant les scripts du thème, affiche les erreurs (retrait de d-none) et indique le chargement sur le bouton.
Pour les utilisateurs
- Le bouton « Connexion » dans le modal répond de nouveau : texte « … » pendant l’envoi, message d’erreur visible en rouge si échec, rechargement de la page si succès.
- Aucun changement requis dans votre HTML si data-lw-account et data-lw-account-error sont déjà en place.

Pourquoi
- Les thèmes importés (Homelengo / DormezChezNous) enregistrent des écouteurs qui bloquaient l’événement submit avant notre script ; les erreurs restaient aussi cachées par la classe Bootstrap d-none.

Détail technique
- lw-account-forms.js v3 : capture click + submit, chargé en dernier avant </body>.
- Retrait automatique de d-none sur data-lw-account-error.
v1.1.52026-08-08 17:13:29Connexion et inscription en AJAX (modals)Les formulaires compte dans une fenêtre modale (Bootstrap ou autre) peuvent être envoyés sans recharger toute la page : les erreurs s’affichent dans le modal, et la page se met à jour après une connexion réussie.
Pour les utilisateurs
- Si votre formulaire login/register est dans un modal (.modal ou role="dialog"), la soumission se fait en AJAX automatiquement — plus de redirection vers /connexion/ qui casse l’expérience.
- Placez un emplacement d’erreur : <div data-lw-account-error></div> dans le modal.
- Forcer ou désactiver : data-lw-account-ajax="1" ou "0" sur le <form>.
- Après succès : par défaut rechargement de la page (menu compte à jour) ; data-lw-account-on-success="redirect" pour aller vers Mon compte.
- Le captcha inscription est rafraîchi automatiquement après une erreur.

Pourquoi
- DormezChezNous et thèmes similaires ouvrent login/inscription en popup : un POST classique rechargeait toute la page.

Détail technique
- lw-account-forms.js injecté quand data-lw-account est présent.
- Réponses JSON côté serveur (lw_public_accounts_handle_post) ; hook index.php pour POST depuis n’importe quelle page.
v1.1.42026-08-08 16:54:04Formulaires compte personnalisés (data-lw-account)Vous pouvez utiliser vos propres formulaires HTML de connexion et d’inscription dans le template : le moteur les branche automatiquement et expose les messages d’erreur via des jetons ou des emplacements dédiés.
Pour les utilisateurs
- Marqueur sur le <form> : data-lw-account="login" ou "register" (aussi forgot, reset, profile, security).
- Champs : data-lw-account-field="email|password|…" ou détection par id/name/placeholder (comme le contact).
- Erreurs : {{​​​​account_error_text}} dans votre HTML, ou <div data-lw-account-error></div>.
- Succès : {{​​​​account_success_text}} ou data-lw-account-success.
- Remplacez {{​​​​account_login}} par votre markup sur la page coquille /connexion/ si vous ne voulez pas le formulaire lw-admin par défaut.
- Inscription : emplacement <div class="lw-account-captcha-slot"></div> pour le captcha.
- OAuth optionnel : <div data-lw-account-oauth></div>.

Pourquoi
- DormezChezNous et autres thèmes importés gardent leur design Bootstrap sans dupliquer la logique compte.

Détail technique
- account_forms.php (même principe que data-lw-contact).
- CSRF + lw_account_action injectés ; action POST vers /connexion/, /inscription/, etc.
v1.1.32026-08-08 12:47:55Éditeurs HTML avec coloration et tabulationTous les champs HTML et code de l’admin bénéficient de la coloration syntaxique et de l’indentation à la touche Tab (4 espaces), y compris la vue « code source » de TinyMCE.
Pour les utilisateurs
- Champs HTML bruts (en-tête, pied de page, snippets, templates, CSS personnalisé, etc.) : numéros de ligne, coloration, Tab pour indenter.
- Éditeur riche TinyMCE : le bouton « code source » ouvre la même expérience colorée.
- Thèmes importés : édition HTML directe avec coloration.

Pourquoi
- Faciliter la lecture et l’édition du markup sans IDE externe.
- Tab insère une indentation cohérente ; Maj+Tab la réduit.

Détail technique
- Module lw-code-editor.js (CodeMirror 5 via CDN).
- Modes html, css et php selon le champ.
- Compatible navigation app-shell (réinit après changement de page).
v1.1.22026-08-08 11:37:45Mise à jour CMS in-app et alerte footerLes installations distantes voient un avertissement visible dans le pied de page admin lorsqu’un package plus récent existe, et peuvent installer la mise à jour depuis Réglages → Versions sans ré-uploader manuellement les fichiers.
Pour les utilisateurs
- Pied de page admin : badge « Mise à jour disponible (vX.Y.Z) » lorsqu’un paquet VersionLog plus récent est publié sur repo.ludiware.com.
- Réglages → Versions : bandeau avec bouton « Mettre à jour maintenant » (téléchargement + déploiement automatique).
- Fichiers locaux préservés : config.local.php, config.php (seule la ligne Version est mise à jour), uploads/, storage/, extensions installées.

Pourquoi
- Éviter les mises à jour manuelles FTP/SFTP sur chaque site hébergé.
- Rendre visible une version obsolète (ex. 1.0.53 vs 1.1.x) sans fouiller l’historique.

Détail technique
- lw_cms_update_apply() : télécharge ZIP/tar.gz depuis repo.ludiware.com, extrait et copie le core.
- lw_versionlog_check_update() inchangé (cache 30 min).
- Badge sidebar Réglages + alerte chrome pour les gestionnaires.
v1.1.12026-08-08 11:30:24Historique : jetons et accolades lisiblesLes entrées VersionLog n’affichent plus de codes HTML bruts ({) : les jetons {{​​​​account_login}} et similaires apparaissent normalement.
Pour les visiteurs
- Page Historique : les exemples de jetons CMS s’affichent comme du texte (accolades visibles), sans entités HTML encodées en double.

Pourquoi
- Certaines entrées VersionLog mentionnaient des entités HTML ({) dans leur texte ; htmlspecialchars() les affichait telles quelles à l’écran.

Détail technique
- lw_versionlog_prepare_display_source() : décodage des entités d’accolades avant neutralisation zero-width space et lw_e().
v1.1.0 Package2026-08-08 11:28:14ludiWARE 1.1.0 — distribution publiqueRelease mineure 1.1.0 : package d’installation complet (ZIP + tar.gz), comptes publics OAuth, historique des versions sur la vitrine, formulaire contact prérempli, et plugins MarketPlace à jour.
Pour les utilisateurs
- Téléchargement : ludiware-1.1.0.tar.gz + ludiware-1.1.0.zip
- Dépôt : https://repo.ludiware.com/releases/1.1.0/
- Assistant /install/ inclus (base de données, schéma, compte admin)

Depuis la distribution 1.0.40
- Comptes membres locaux : inscription, connexion, mot de passe oublié, Mon compte (onglets profil / sécurité)
- OAuth Google et Facebook sur la vitrine
- Header public reconnaît la session lw-admin et les membres OAuth
- Jeton {{​​​​versionlog}} : historique des versions sur le site public
- Formulaire contact : nom et courriel préremplis si connecté
- Bootstrap Icons + sélecteur d’icônes admin
- Plugins MarketPlace : FAQ, Témoignages, Galerie, Formulaires, Réservation, Annonces classées, Forums

Plugins republication (MarketPlace)
- Forums 1.0.16
- Annonces classées 1.0.15

Détail technique
- Export OSS sans secrets ni outils usine ; FileName VersionLog → tar.gz public.

Télécharger le package

v1.0.612026-08-08 11:25:48Historique : jetons affichés normalementLes exemples {{​​​​account_login}} dans l’historique des versions s’affichent comme du texte lisible, sans entités HTML visibles ({).
Pour les visiteurs / administrateurs
- Page Historique et Réglages → Versions : les jetons cités en exemple apparaissent comme {{​​​​account_login}}, pas comme {{​​account_login}}.

Pourquoi
- L’échappement HTML des accolades en entités, puis htmlspecialchars(), doublait l’encodage et affichait les codes bruts à l’écran.

Détail technique
- Neutralisation zero-width space seule (sans entités {) dans lw_versionlog_format_display_text() et lw_versionlog_shield_public_html().
v1.0.602026-08-08 11:24:31Contact : nom et courriel préremplis si connectéSur le formulaire de contact, les champs Nom et Courriel sont remplis automatiquement lorsque le visiteur est déjà connecté (compte local, lw-admin ou portail CDS).
Pour les utilisateurs
- Formulaire {{​​​​contact_form}} et formulaires contact des thèmes ZIP : Nom et Courriel préremplis si vous êtes connecté.
- Les champs déjà remplis dans le gabarit ne sont pas écrasés.

Pourquoi
- Éviter de ressaisir son identité à chaque message contact.

Sources
- Portail CDS (session SSO) : nom complet + courriel du contact.
- Compte membre public ou cookie lw-admin : display_name + courriel lw_users.

Détail technique
- lw_contact_prefill_identity(), lw_contact_apply_prefill_to_form(), lw_contact_form_html().
v1.0.592026-08-08 11:20:46Jeton {{​​​​versionlog}} actif sur la vitrineLe jeton {{​​​​versionlog}} est désormais reconnu sur le site public : la page Historique affiche la liste des versions au lieu du texte brut du jeton.
Pour les visiteurs
- Page Historique : le contenu {{​​​​versionlog}} est remplacé par la liste des versions (styles et textes sécurisés).

Pourquoi
- Le module VersionLog n’était chargé que dans lw-admin ; sur index.php (front public), lw_versionlog_prepare_public_html() n’existait pas et le jeton restait affiché tel quel.

Détail technique
- require versionlog.php dans www/index.php avant public_render.php.
v1.0.582026-08-08 11:07:13Historique public : jetons CMS affichés en texteSur la page Historique du site ludiware.com, les mentions {{​​​​account_login}}, {{​​​​menu:main}}, etc. dans les entrées VersionLog s’affichent en texte au lieu d’injecter formulaires ou menus.
Pour les visiteurs
- Page Historique (/historique/) : titre, description et détails d’une version montrent les jetons cités en exemple (documentation), sans formulaire de connexion ni menu injecté au milieu du texte.

Pourquoi
- Le contenu VersionLog est rendu via un snippet PHP puis repasse dans le moteur de jetons CMS ; les exemples {{​​​​account_login}} étaient exécutés comme de vrais jetons.

Détail technique
- Jeton {{​​​​versionlog}} / {{​​​​versionlog_list}} natif ; protection des blocs .lw-vl-* avant le pipeline de jetons ; entités HTML pour {{​​​​ et }} à l’affichage.
v1.0.572026-08-08 10:58:52Historique des versions : jetons CMS affichés en texteLes mentions {{​​​​account_login}}, {{​​​​menu:main}}, etc. dans les détails techniques du VersionLog ne sont plus interprétées comme des jetons CMS.
Pour les administrateurs
- Réglages → Historique des versions : titre, description et détails complets affichent les jetons tels quels (documentation), sans formulaire ni contenu injecté.

Pourquoi
- Les entrées VersionLog citent souvent des jetons en exemple dans la section « Détail technique » ; le moteur de jetons ne doit pas les exécuter à l’affichage.

Détail technique
- Neutralisation {{​​​​ → {{​​​​ + zero-width space à la sortie API et côté lw-admin ; affichage HTML échappé.
v1.0.562026-08-08 10:54:16Header public : reconnaissance de la session lw-adminConnecté à lw-admin, vous apparaissez aussi comme membre sur le site public (header, Mon compte), comme pour les commentaires au blogue.
Pour les visiteurs / administrateurs
- Si vous êtes connecté à lw-admin (cookies), le bandeau {{​​​​account_strip}} affiche votre nom et le lien « Accéder à mon compte ».
- /mon-compte/ est accessible sans repasser par /connexion/.
- /connexion/ et /inscription/ redirigent vers Mon compte si vous êtes déjà reconnu.

Priorité d’identité (inchangée pour le blogue si session Facebook active)
1. Session membre public (connexion / OAuth)
2. Cookie lw-admin

Déconnexion sur le site public : ferme la session membre ; si seul lw-admin reste actif, vous restez connecté (comportement voulu).
v1.0.552026-08-08 10:38:20Blogue et forums : identité membre public prioritaireSur le site public, la session membre (connexion / Facebook / Google) prime désormais sur les cookies admin lw-admin pour commenter au blogue.
Problème corrigé
- Header « Vous êtes connecté en tant que… » (session membre) et blogue « Vous commentez en tant que… » (cookies admin) pouvaient afficher deux personnes différentes si vous étiez connecté à lw-admin et via Facebook sur le site public.

Comportement
- Priorité : portail CDS → membre public (session) → staff admin (cookie lw-admin).
- Le blogue propose le lien Connexion vers /connexion/ lorsque les comptes locaux sont actifs (sans CDS).

Note
- Si Facebook a créé un second compte lw_users (courriel différent de l’admin), c’est normal : deux profils distincts. Vous pouvez fusionner manuellement ou supprimer le doublon dans Utilisateurs.
v1.0.542026-08-08 10:11:29OAuth — URL de redirection stableL’URL de callback Google/Facebook affichée dans les réglages utilise désormais le domaine du site (ex. ludiware.com), pas l’hôte de l’admin.
Pour les administrateurs
- Dans Réglages → Comptes membres, l’URL « redirection autorisée » correspond au domaine public du site.
- Note d’aide pour l’enregistrement de l’URI dans Facebook Login → Valid OAuth Redirect URIs.

Pourquoi
- Depuis le panneau admin (autre sous-domaine), l’URL générée pouvait différer de celle réellement utilisée sur le site public.
v1.0.532026-08-08 10:03:23Connexion Google et Facebook pour les membresLes visiteurs peuvent se connecter ou s'inscrire avec Google ou Facebook sur les pages connexion et inscription, sans portail CentreDeService. Un compte local est créé automatiquement s'il n'existe pas encore.
Pour les visiteurs
- Boutons « Se connecter avec Google » et « Se connecter avec Facebook » sur /connexion/ et /inscription/.
- Si le courriel n'est pas encore inscrit, un profil membre est créé et la session est ouverte.
- Si un compte existe déjà avec le même courriel, le profil OAuth est lié au compte existant.

Pour les administrateurs
- Onglet Comptes membres des réglages site : activation, identifiants OAuth et URL de redirection à copier dans Google Cloud / Facebook Developer.
- Désactivé automatiquement lorsque le portail CentreDeService gère l'authentification.

Détail technique
- Colonnes lw_users google_id / facebook_id, module oauth_accounts.php, callbacks /oauth/{provider}/callback/.
v1.0.522026-08-08 08:35:18Sélecteur d'icônes — catalogue completLe sélecteur d'icônes affiche d'abord une sélection utile, puis toutes les icônes Bootstrap (~1 600) via la recherche.
Pour les administrateurs
- À l'ouverture : grille de favoris (maison, commerce, transport, etc.).
- Recherche : filtre sur l'ensemble des ~1 683 icônes Bootstrap Icons installées.
- Compteur de résultats et message si la liste est tronquée.

Correction
- La liste n'était limitée qu'à 120 icônes en ordre alphabétique (123, alarm…), ce qui paraissait incomplet.
v1.0.512026-08-08 08:29:09Bootstrap Icons et sélecteur d'icônesLes icônes Bootstrap s'affichent correctement partout dans l'admin grâce aux polices complètes. Un sélecteur d'icônes réutilisable est disponible pour les formulaires (recherche, grille, aperçu).
Pour les administrateurs
- Polices Bootstrap Icons (woff/woff2) installées : les icônes `bi-*` déjà utilisées dans lw-admin s'affichent de façon fiable.
- Nouveau composant « sélecteur d'icônes » (`lw_icon_picker_field`) utilisable dans tout formulaire admin.

Utilisation
- Bouton avec aperçu de l'icône, recherche par nom, grille cliquable, option « Aucune icône ».
- Fonction PHP `lw_bootstrap_icon_names()` et normalisation `lw_bootstrap_icon_class()`.

Détail technique
- Fichiers : `functions/icon_picker.php`, `js/lw-icon-picker.js`, styles dans `lw-admin.css`.
v1.0.502026-08-08 07:27:10Mon compte — onglets profil et sécuritéLa page Mon compte propose deux onglets : Mes informations (prénom, nom, avatar) et Accès et sécurité (courriel, mot de passe). Nouveaux jetons pour gabarits ZIP.
Pour les utilisateurs
- Onglet Mes informations : prénom, nom de famille, téléversement d’avatar.
- Onglet Accès et sécurité : changement de courriel et/ou mot de passe (mot de passe actuel requis).

Jetons ZIP
- {{​​​​account_panel}} : panneau complet avec onglets.
- {{​​​​account_tabs}}, {{​​​​account_profile}}, {{​​​​account_security}} : mise en page personnalisée.
- {{​​​​account_avatar}}, {{​​​​account_avatar_url}}, {{​​​​account_first_name}}, {{​​​​account_last_name}}, {{​​​​account_email}}.
- {{​​​​account_profile_url}}, {{​​​​account_security_url}} : liens directs vers chaque onglet.

Détail technique
- Colonne lw_users.avatar_path, fichiers dans uploads/users/, session vitrine synchronisée après mise à jour.
v1.0.492026-08-08 07:17:18Comptes vitrine unifiés dans lw_usersInscription, connexion et mot de passe oublié sur la vitrine utilisent désormais la table lw_users (comme lw-admin). Seuls les comptes avec accès admin peuvent ouvrir lw-admin.
Pour les utilisateurs
- Même courriel et mot de passe partout : admin ou visiteur inscrit sur /inscription/.
- Les comptes créés sur la vitrine ont le rôle user et ne peuvent pas accéder à lw-admin.
- Les administrateurs se connectent aussi sur /connexion/ avec leurs identifiants habituels.

Pourquoi
- Suppression du double système lw_site_members / lw_users introduit par erreur.

Détail technique
- public_accounts.php : auth, inscription et reset sur lw_users ; session vitrine par site.
- auth.php inchangé : can_access_admin requis pour lw-admin.
- Table obsolète lw_site_members : peut être supprimée en base (DROP TABLE).
v1.0.482026-08-08 07:11:33Connexion vitrine avec un compte administrateurLes administrateurs du site peuvent se connecter sur la vitrine publique (/connexion/) avec le même courriel et mot de passe que lw-admin, sans inscription séparée.
Pour les utilisateurs
- Sur /connexion/, un compte administrateur global ou assigné au site est accepté avec les identifiants lw-admin.
- La première connexion crée automatiquement le profil membre local du site ; les connexions suivantes réutilisent ce profil.

Pourquoi
- Avant ce correctif, seuls les comptes inscrits via /inscription/ (table lw_site_members) étaient reconnus ; le premier admin recevait « Courriel ou mot de passe incorrect ».

Détail technique
- Pont lw_users → lw_site_members dans lw_public_accounts_login() : vérification mot de passe admin, accès site (global_admin ou local_admin membre du site), synchronisation du hash et de la session membre.
v1.0.472026-08-08 06:52:34Comptes membres locaux sur la vitrineLes sites sans portail CentreDeService peuvent proposer inscription, connexion, mot de passe oublié et espace membre sur la vitrine publique, avec jetons pour gabarits ZIP et pages coquilles CMS.
Pour les utilisateurs
- Inscription sur /inscription/ avec captcha et confirmation du mot de passe.
- Connexion sur /connexion/, récupération sur /mot-de-passe-oublie/ et réinitialisation par lien courriel.
- Espace « Mon compte » une fois connecté ; bandeau {{​​​​account_strip}} dans le header.

Pour les administrateurs
- Onglet Réglages → Comptes membres : coquilles CMS et bouton « Générer les pages système ».
- Menu éditeur : Ajouter membre (Connexion, Mot de passe oublié, Inscription, Mon compte) si CDS inactif.
- Jetons ZIP : {{​​​​account_login}}, {{​​​​account_register}}, {{​​​​account_panel}}, {{​​​​account_forgot}}, {{​​​​account_reset}} et URLs associées.

Pourquoi
- Permettre aux vitrines ludiWARE autonomes (sans CDS) d’offrir des comptes visiteurs pour commentaires, contenus réservés ou personnalisation future.

Détail technique
- Table lw_site_members, CSRF session, captcha inscription distinct du contact, routes try_serve, public_render apply_tokens.
v1.0.462026-08-07 12:59:32Captcha contact : correction des réponses valides rejetéesLorsqu’une page ou un gabarit contient plusieurs formulaires contact, la même question de vérification s’affiche partout et la bonne réponse est acceptée.
Pour les utilisateurs
- Le captcha « Combien font X + Y ? » est identique sur tous les formulaires contact d’une même page.
- Une réponse correcte n’est plus rejetée avec « Vérification de sécurité incorrecte ».

Pourquoi
- Chaque formulaire recevait parfois une question différente alors que la session ne mémorise qu’une seule réponse (contenu + gabarit finalisés séparément).

Détail technique
- lw_contact_captcha_issue() réutilise le défi session valide ; finalisation contact une seule fois sur le HTML complet (public_render.php).
v1.0.452026-08-07 12:15:48Jetons blogue : derniers articles (footer / sidebar)Placez dans un gabarit ou une page les jetons {{​​​​blog-latest-title-1}}, {{​​​​blog-latest-image-1}}, {{​​​​blog-latest-excerpt-1}}, etc. (jusqu’à 10) pour afficher les articles les plus récents.
Pour les utilisateurs
- {{​​​​blog-latest-title-N}} : titre (N=1 = plus récent, 2 = avant-dernier, … jusqu’à 10)
- {{​​​​blog-latest-image-N}} : URL de l’image à la une
- {{​​​​blog-latest-excerpt-N}} : extrait du corps de l’article
- {{​​​​blog-latest-date-N}} : date courte (ex. 15 avril 2020)
- {{​​​​blog-latest-date-long-N}} : date longue
- {{​​​​blog-latest-url-N}} : lien vers l’article
- Idéal pour un bloc « Blogue » en pied de page ou barre latérale, comme dans un thème ZIP importé.

Pourquoi
- Personnaliser le footer sans dupliquer manuellement les titres et images des articles.

Détail technique
- lw_blog_apply_latest_tokens() dans blog.php, appelé depuis lw_blog_apply_tokens() sur gabarits et pages.
v1.0.442026-08-07 12:10:34Contact thème : messages d’erreur et champ SujetLes formulaires contact des thèmes ZIP affichent à nouveau le vrai message d’erreur (captcha, champs manquants, etc.) et le champ Sujet du thème est bien pris en charge.
Pour les utilisateurs
- Après un envoi raté, le message précis s’affiche (ex. captcha incorrect) au lieu du générique « Envoi impossible. Vérifiez les champs. »
- Le champ Sujet des formulaires de thème (ex. msg_subject, placeholder ou label « Sujet ») est enregistré et reçu par courriel.
- Les champs sans attribut name mais avec placeholder/label (Votre nom, Votre courriel…) sont reconnus à l’import et au rendu.

Pourquoi
- lw_contact_form_html() effaçait le flash session avant l’affichage des formulaires thème.
- Certains thèmes nomment le sujet autrement que subject.

Détail technique
- public_render.php : lw_contact_form_html() seulement si {{​​​​contact_form}} est présent.
- contact_forms.php : alias msg_subject, détection placeholder/label, fallbacks nom/courriel.
v1.0.432026-08-07 12:04:45Correction erreur 500 sur les pages contact (thèmes ZIP)Les pages « Nous joindre » importées depuis un template ZIP ne provoquent plus d’erreur serveur lorsque le bouton Envoyer est imbriqué dans la grille du thème (Bootstrap, etc.).
Pour les utilisateurs
- Les pages contact personnalisées d’un thème importé s’affichent à nouveau normalement, avec captcha et envoi vers la boîte Messages.
- Avant la correction, certaines pages (ex. formulaire dans des colonnes Bootstrap) renvoyaient une erreur HTTP 500.

Pourquoi
- Lors du branchement du formulaire thème, l’emplacement du captcha était inséré au mauvais niveau du DOM lorsque le bouton Envoyer n’était pas enfant direct du <form>.

Détail technique
- contact_forms.php : lw_contact_wire_form_element() insère le slot captcha via le parent immédiat du bouton submit au lieu de form->insertBefore() sur un nœud imbriqué.
v1.0.422026-08-07 09:41:46Pages boutique CDS personnalisables (coquilles et jetons)Comme pour le blogue, vous pouvez choisir des pages CMS comme coquilles pour le magasin, les catégories, les fiches produit, le panier et les commandes, puis y placer des jetons granulaires (titre, prix, image, liste, etc.).
Pour les utilisateurs
- Dans Réglages du site → CentreDeService.NET, section « Pages coquilles boutique », associez une page CMS à chaque type d’écran (/boutique/, catégorie, produit, panier, commande).
- Sans coquille, le rendu CDS par défaut reste inchangé.
- Sur une coquille produit : {{​​​​cds_product_title}}, {{​​​​cds_product_image}}, {{​​​​cds_product_price}}, {{​​​​cds_product_desc}}, {{​​​​cds_product_add_cart}}, ou {{​​​​cds_product}} pour la fiche complète.
- Sur une liste / catégorie : {{​​​​cds_shop_list}} (bloc complet), ou {{​​​​cds_shop_categories}}, {{​​​​cds_shop_products}}, {{​​​​cds_shop_pager}}, {{​​​​cds_category_title}}.
- Panier / commande : {{​​​​cds_cart}}, {{​​​​cds_order}}, {{​​​​cds_cart_count}}.

Pourquoi
- Permettre une mise en page boutique alignée sur le thème du site, sur le même modèle que les jetons blogue.

Détail technique
- Coquilles : cds_shop_*_page_uid ; lw_cds_resolve_shell_page dans lw_cds_try_serve.
- Jetons : lw_cds_apply_shop_field_tokens + contexte dans lw_cds_apply_tokens.
v1.0.412026-08-07 09:03:11Formulaires contact des templates ZIP reliés au CMSLes formulaires de contact déjà présents dans un thème importé peuvent envoyer leurs messages via le moteur contact de lw-admin, sans remplacer le design du thème. À l’import, la détection est automatique ; vous pouvez aussi forcer avec data-lw-contact="1".
Pour les utilisateurs
- Un formulaire contact du thème (classes / mailto / champs nom-email-message) est branché sur la boîte Messages et l’e-mail de notification.
- L’apparence du formulaire (HTML/CSS du thème) est conservée.
- Marqueur manuel : data-lw-contact="1" force le branchement ; data-lw-contact="0" l’exclut.
- Captcha et messages de succès/erreur s’affichent comme pour {{​​​​contact_form}}.

Pourquoi
- Éviter de remplacer un beau formulaire de thème par le HTML générique {{​​​​contact_form}}.

Détail technique
- lw_contact_wire_form_html (import) ; lw_contact_finalize_bound_forms (rendu) ; alias de champs dans lw_contact_submit.
v1.0.40 Package2026-08-06 13:07:30ludiWARE 1.0.40 — package d’installationDistribution publique complète (ZIP + tar.gz) avec installateur. Inclut les évolutions récentes : blogue (jetons, URLs par catégories, sous-catégories), page 404 CMS, médiathèque globale, menus / import ZIP, et corrections d’affichage.
Pour les utilisateurs
- Package téléchargeable pour installer ou mettre à jour ludiWARE.
- Archives : ludiware-1.0.40.tar.gz et ludiware-1.0.40.zip
- Dépôt : https://repo.ludiware.com/releases/1.0.40/
- Assistant /install/ inclus (base de données, schéma, compte admin)

Contenu notable depuis la dernière distribution
- Blogue : jetons auteur / date longue / heure / commentaires / catégories ; URLs /blogue/catégorie/sous-catégorie/slug ; sous-catégories en admin ; accord « commentaire »
- Page 404 CMS désignée + pastille ; import ZIP (chrome, méga-menus, détection 404)
- Médiathèque globale et dossiers ; menus actifs ; déduplication header

Pourquoi
- Fournir un paquet installable aligné sur la version courante du CMS.

Détail technique
- Export OSS (sans secrets, sans api/admin usine) ; FileName VersionLog pointant vers le tar.gz public.

Télécharger le package

v1.0.392026-08-06 13:01:02Singulier « commentaire » quand il y en a 0 ou 1Dans la liste des articles du blogue, on affiche « 0 commentaire » ou « 1 commentaire » (sans s), et le pluriel seulement à partir de 2.
Pour les utilisateurs
- Meta des cartes d’articles : accord correct du mot commentaire (0/1 au singulier).

Pourquoi
- « 0 commentaires » était grammaticalement incorrect en français.

Détail technique
- lw_blog_format_comments_count : singulier si count <= 1 (FR).
v1.0.382026-08-06 13:00:31Sous-catégories de blogue plus simples à créerDans lw-admin, chaque catégorie propose un bouton pour ajouter une sous-catégorie. Le champ « Catégorie parente » est mis en avant, avec la liste en arborescence.
Pour les utilisateurs
- Liste des catégories : icône « diagramme » pour créer une sous-catégorie déjà rattachée à la bonne parente.
- Formulaire : champ parent en premier, aide sur l’URL /blogue/parente/enfant/…
- Pastille « Sous-catégorie » et colonne Parente dans le tableau.

Pourquoi
- La hiérarchie existait déjà en base, mais était trop discrète dans l’interface.

Détail technique
- blogcats.php (?new=1&parent=uid) ; clés i18n blog.cat_* ; invalidation cache catégories.
v1.0.372026-08-06 12:51:12URLs blogue avec catégories imbriquéesLes articles sont désormais accessibles via /blogue/catégorie/sous-catégorie/slug-article. Les anciennes adresses /blogue/slug redirigent automatiquement vers la nouvelle URL.
Pour les utilisateurs
- URL d’un article : /blogue/{catégorie}/{sous-catégorie}/{slug} selon la hiérarchie des catégories.
- Sans catégorie : /blogue/{slug} comme avant.
- Listes de catégories : /blogue/{catégorie}/{sous-catégorie} (l’ancien préfixe /blogue/categorie/… redirige).
- Les liens liste, commentaires, sitemap et l’admin utilisent la nouvelle structure.

Pourquoi
- Refléter l’arborescence des catégories dans l’URL, plus claire pour le SEO et la navigation.

Détail technique
- lw_blog_post_url / lw_blog_post_path_extra ; résolution de chemin dans lw_blog_try_serve ; redirections 301.
v1.0.362026-08-06 12:48:37Nouveaux jetons blogue (auteur, date, commentaires…)Les gabarits d’article peuvent afficher le nombre de commentaires, l’auteur, une date longue, l’heure de publication et la liste des catégories. Un champ Auteur a été ajouté à l’édition des articles.
Pour les utilisateurs
- Nouveaux jetons : {{​​​​blog_comments_count}} (chiffre), {{​​​​blog_author}}, {{​​​​blog_date_long}} (ex. Jeudi le 3 septembre 2024), {{​​​​blog_time}} (HH:MM), {{​​​​blog_categories}} (liste des catégories publiées).
- {{​​​​blog_date}} reste au format AAAA-MM-JJ.
- Champ « Auteur » à la création / édition d’un article, utilisé par {{​​​​blog_author}}.

Pourquoi
- Permettre des mises en page d’articles plus riches sans HTML figé.

Détail technique
- Colonne author_name ; helpers lw_blog_format_date_long / lw_blog_render_categories_token_list ; jetons documentés dans templates.php.
v1.0.352026-08-06 11:32:25Page 404 CMS : affichage corrigé + pastilleLa page désignée comme 404 s’affiche correctement (y compris sur un site encore en brouillon / en aperçu). Dans la liste des pages, une pastille « 404 » apparaît comme pour l’accueil. À l’import ZIP, les pages d’erreur 404 sont détectées automatiquement.
Pour les utilisateurs
- Si vous cochez « Utiliser comme page 404 », une URL inconnue affiche cette page (thème du site), et non le 404 sombre générique.
- Cela fonctionne aussi en aperçu et tant que le site est en brouillon.
- Liste des pages : pastille orange « 404 » à côté du statut, comme la pastille Accueil.
- Nouveaux imports ZIP : une page nommée 404 / not-found est assignée automatiquement.

Pourquoi
- Le rendu de la page 404 ignorait le mode aperçu et refusait les sites brouillon (« Site non publié »), ce qui forçait le repli générique.

Détail technique
- lw_public_site_404(..., $preview) ; rendu forcé en mode aperçu si site brouillon ; badge pages.badge_404 ; auto page_404_page_uid à l’import ZIP.
v1.0.342026-08-06 11:26:54Import ZIP : plus de header en double dans les pagesÀ l’import d’un template, le header (et les wrappers du même type) est retiré du contenu des pages lorsqu’il est déjà placé dans l’en-tête global. Les sites déjà importés sont nettoyés à l’affichage.
Pour les utilisateurs
- Les pages importées ne gardent plus une copie du menu/header dans leur contenu si le chrome global est actif.
- Les templates sans balise <header> (ex. #header / .header-area) sont aussi pris en charge.

Pourquoi
- Le strip était trop strict (vote majoritaire, wrappers non sémantiques ignorés) ; des restes restaient dans le HTML des pages.

Détail technique
- Détection structurelle + affixe normalisé (ignore active) ; strip/dedupe DOM élargi ; nettoyage au rendu public.
v1.0.332026-08-06 11:16:07Menu : item courant correctement mis en évidenceSur les sites (y compris templates importés), l’item de menu actif suit la page affichée au lieu de rester figé sur Accueil.
Pour les utilisateurs
- En visitant « À propos » (ou une autre page), c’est cet item qui apparaît sélectionné, plus Accueil.
- Les parents d’un sous-menu actif restent aussi mis en évidence.

Pourquoi
- À l’import, la classe active de la page d’accueil était recopiée telle quelle dans le menu CMS, sans recalcul selon l’URL.

Détail technique
- Rendu menu : strip des classes active/current importées, marquage selon page_uid ou chemin courant, aria-current=page.
v1.0.322026-08-06 11:00:39Correction « Nouveau dossier » médiasChoisir « Nouveau dossier » dans la médiathèque affiche correctement le champ pour nommer le dossier, y compris après navigation dans l’admin.
Pour les utilisateurs
- Le champ texte sous « Nouveau dossier » réapparaît bien à la sélection.

Pourquoi
- Le script ne se rattachait pas après le chargement des pages en mode app (navigation sans rechargement complet).

Détail technique
- Délégation d’événements + réinit sur lw:fragment-loaded (lw-media-folder.js v2).
v1.0.312026-08-06 10:50:19Médiathèque globale et dossiersVous pouvez déposer des images partagées (logos, etc.) une seule fois dans Bibliothèque → Médias globaux, puis les réutiliser sur tous les sites. Le choix du dossier à l’upload propose la liste des dossiers existants ou « Nouveau dossier ».
Pour les utilisateurs
- Nouvelle section Bibliothèque → Médias globaux : upload et gestion des images partagées.
- Dans la médiathèque d’un site, l’onglet Globaux affiche ces fichiers en lecture (copie d’URL) ; les admins plateforme peuvent ouvrir Gérer.
- À l’upload ou à l’édition, le champ Dossier est une liste déroulante (aucun / existants / Nouveau dossier + champ texte).

Pourquoi
- Éviter de réimporter le même logo dans chaque site.
- Clarifier le classement par dossiers sans taper le nom à chaque fois.

Détail technique
- lw_media.site_id NULL = global ; fichiers sous uploads/global/ ; référence unique (pas de copie par site).
v1.0.302026-08-06 09:59:30Import ZIP : mega-menus préservésÀ l’import d’un template ZIP, les mega-menus (panneaux riches avec colonnes, images, CTA) et les attributs Bootstrap des menus déroulants sont conservés et restitués correctement.
Pour les utilisateurs
- Les templates avec mega-menus (ex. panneaux pleine largeur, grilles, images) gardent leur apparence après import.
- Les menus déroulants Bootstrap conservent leurs options (data-bs-toggle, etc.).
- Si un item a un panneau mega, une zone HTML dédiée apparaît dans Menus pour l’ajuster (en attendant l’extension mega-menu).

Pourquoi
- L’import ne lisait que les sous-listes <ul> ; les panneaux en <div class="dropdown-menu"> étaient perdus à la tokenisation {{​​​​menu:…}}.

Détail technique
- Nouveaux champs item : panel_html, link_attrs, label_html ; détection à l’harvest ; rendu a+panneau ; rewrite des URLs du panneau à la persistance.
v1.0.292026-08-06 09:42:25Correction sauvegarde en-tête / pied (doublon)Enregistrer l’en-tête et le pied de page d’un template ZIP ne duplique plus le footer sous le copyright.
Pour les utilisateurs
- La sauvegarde de « En-tête & pied de page » ne laisse plus apparaître un second footer non stylé.
- Les sites déjà touchés par le bug sont corrigés à l’affichage (et définitivement en réenregistrant le chrome).

Pourquoi
- Le parseur prenait le premier </div> interne du footer pour couper le bloc, puis recopait le reste après le pied de page.

Détail technique
- Extraction after_footer via DOM ; seuls script/style/link/noscript sont conservés ; repair au rendu public.
est désormais reconnu sur le site public : la page Historique affiche la liste des versions au lieu du texte brut du jeton.
Pour les visiteurs
- Page Historique : le contenu 

Historique des versions de la plateforme ludiWARE (plus récent en premier).

v1.2.12026-08-09 16:47:35Mon compte extensible et lightbox annoncesLes plugins peuvent ajouter des onglets à Mon compte (ex. Mes annonces). Les pages publiques injectent correctement le script de la galerie photos en fin de HTML.
Pour les utilisateurs
- Mon compte : les extensions peuvent proposer de nouveaux onglets via le CMS (URL ?tab=…).
- Annonces classées 1.2.12 : onglet « Mes annonces » avec modifier, supprimer et marquer comme vendue.
- Lightbox des photos d’annonce : fonctionne aussi sur les fiches intégrées via jetons CMS (pas seulement les routes /annonces/…).

Pourquoi ce changement
- Centraliser la gestion des annonces dans Mon compte, là où les membres gèrent déjà leur profil.
- Corriger la galerie lorsque le HTML de l’annonce est rendu dans une page du site sans passer par le routeur du plugin.

Détail technique
- Filtres CMS : public_account_tabs, public_account_tab_panels, public_account_post_actions, public_accounts_handle_post, public_page_html.
- Plugin classifieds : statut sold, actions propriétaire, JS galerie defer v4.
v1.2.0 Package2026-08-09 15:29:10ludiWARE 1.2.0 — profils publics et identité membreRelease mineure 1.2.0 : packages d’installation complets (ZIP + tar.gz), profils publics des membres, noms cliquables partout, historique d’activité unifié sur le profil, et plugins Forums / Annonces classées republiés.
Pour les utilisateurs
- Téléchargement : ludiware-1.2.0.tar.gz + ludiware-1.2.0.zip
- Dépôt : https://repo.ludiware.com/releases/1.2.0/
- Assistant /install/ inclus

Nouveautés CMS (depuis 1.1.x)
- Profil public membre : /membre/{uid} (avatar, nom, date d’inscription)
- Noms des membres cliquables vers le profil (blogue, bandeau compte, extensions)
- Historique d’activité sur le profil : commentaires blogue, sujets/réponses forum, annonces et commentaires
- Filtre `public_member_profile_activity` pour les extensions

Plugins MarketPlace republiés
- Forums 1.0.18 (liens profil + activité forum)
- Annonces classées 1.2.9 (commentaires liés, activité annonces)

Détail technique
- Export OSS sans secrets ni outils usine
- FileName VersionLog → tar.gz public sur repo.ludiware.com

Télécharger le package

v1.1.142026-08-09 15:26:40Historique d’activité sur le profil publicLa page profil d’un membre affiche désormais une chronologie unifiée de ses contributions publiques : commentaires de blogue, sujets et réponses forum, annonces et commentaires sur annonces.
Pour les visiteurs
- Section « Historique d’activité » sous l’en-tête du profil (/membre/{uid}).
- Chaque ligne : date, type d’action, titre cliquable vers le contenu, extrait court si pertinent.
- Tri antichronologique (60 entrées max.), mélangeant blogue, forums et plugins actifs.

Pour les développeurs / extensions
- Nouveau filtre `public_member_profile_activity` — retourne des items `{at, kind, label, title, url, excerpt?}`.
- Helpers : `lw_public_accounts_collect_member_activity()`, `lw_public_accounts_render_member_activity_html()`, `lw_public_accounts_member_activity_item()`.
- Blogue : `lw_blog_member_public_activity()` (commentaires publiés).
- Les plugins enregistrent leurs sources via le filtre (Forums, Annonces classées).

Pourquoi
- Donner une vue d’ensemble de la présence publique d’un membre au lieu de sections isolées par extension.
v1.1.132026-08-09 15:23:12Noms des membres cliquables vers le profil publicPartout où un membre inscrit apparaît (commentaires du blogue, bandeau compte, etc.), son nom mène désormais à sa page profil publique lorsque celle-ci est visible.
Pour les visiteurs
- Clic sur le nom d’un membre local actif → page /membre/{uid} (ou /member/{uid} en anglais).
- Bandeau « Vous êtes connecté en tant que … » : le nom affiché est aussi un lien vers votre profil.
- Commentaires d’articles de blogue : auteurs membres identifiés par leur compte local.
- Invités, comptes CDS ou auteurs sans compte membre : nom affiché sans lien (comportement inchangé).

Pour les développeurs / extensions
- Helpers centralisés : `lw_public_accounts_author_context_from_row()`, `lw_public_accounts_resolve_content_author()`, `lw_public_accounts_render_author_name_html()`.
- Classe CSS partagée `lw-member-profile-link` pour les liens vers profil.

Pourquoi
- Uniformiser l’identité publique des membres sur tout le site (blogue, forums, annonces, etc.) après l’introduction des profils publics en 1.1.12.
v1.1.122026-08-09 15:17:27Profil public des membres inscritsChaque membre inscrit sur un site (comptes locaux) dispose d’une page profil publique avec avatar et nom. Les extensions peuvent y ajouter du contenu (ex. annonces publiées).
Pour les visiteurs
- URL publique : /membre/{uid} (FR) ou /member/{uid} (EN) — avatar, nom affiché, date d’inscription.
- Les profils ne sont visibles que pour les comptes membres actifs (inscription locale), pas pour les administrateurs ni le portail CentreDeService.

Pour les développeurs / extensions
- Nouveau filtre `public_member_profile_html` pour enrichir la page (le plugin Annonces classées y liste les annonces publiées).
- Helpers : `lw_public_accounts_public_profile_url()`, `lw_public_accounts_user_by_uid_public()`.

Pourquoi
- Permettre de reconnaître qui publie (annonces, forums, etc.) et de consolider l’identité publique des membres du site.
v1.1.112026-08-09 14:33:21Alertes standardisées pour l’admin et les pluginsNouveau système d’alertes unifié : messages de succès, erreur, avertissement et info affichés de façon cohérente dans lw-admin et sur le site public. Les plugins peuvent y contribuer via des hooks dédiés.
Pour les utilisateurs
- Les confirmations et erreurs dans l’administration (ex. « Annonce supprimée », « Réglages enregistrés ») s’affichent désormais en haut de page dans un bandeau uniforme, plus lisible.
- Sur le site public, les plugins peuvent afficher des messages utilisateur avec le même style visuel.

Pourquoi
- Chaque module et plugin gérait ses propres alertes (variables différentes, query strings, classes CSS propres), ce qui créait des doublons et des incohérences.

Détail technique
- Nouveau module lw-admin/functions/flash.php : lw_flash_add(), lw_flash_redirect(), lw_flash_render_html(), lw_public_flash_html().
- Hooks admin_flash et public_flash pour les extensions.
- Rétrocompatibilité avec $lwFlash et $lwPageFlashError.
- Feuille de style lw-flash.css partagée admin/public.
- Plugin Annonces classées migré en exemple (v1.2.2).
v1.1.102026-08-08 18:52:20Configuration portable site à siteconfig.php ne contient plus de secrets ni de domaine usine : base de données, courriels et surcharges d’environnement vivent dans config.local.php ; le domaine et les valeurs par défaut sont déduits automatiquement.
Pour les utilisateurs
- Copier le CMS d’un site à l’autre sans retoucher config.php : seul config.local.php (ou l’assistant /install/) doit être adapté au nouvel hébergement.
- Les cookies et le nom du site suivent le domaine réel si HTTPpath / COOKIEpath ne sont pas définis.

Pourquoi
- config.php mélangeait identifiants MySQL, domaine ludiware.com et courriels usine, ce qui compliquait chaque déploiement client.

Détail technique
- lw_config_detect_http_host() + lw_config_apply_runtime_defaults() après config.local.php.
- Connexion MySQL uniquement si DBhost / DBname / DBusername sont renseignés.
- config.local.example.php et installateur mis à jour (domaine optionnel).
v1.1.92026-08-08 17:58:54Correction connexion modal (champs POST + SQL)La connexion depuis le modal envoie désormais courriel et mot de passe de façon fiable (POST vers la page courante, champs lus explicitement) et fonctionne aussi sur hébergements sans mysqlnd.
Pour les utilisateurs
- Le modal login/register poste vers la page où vous êtes (pas seulement /connexion/), ce qui évite les échecs silencieux.
- Si le compte n’a pas de mot de passe (connexion Google/Facebook admin), un message explicite s’affiche au lieu de « courriel ou mot de passe incorrect ».

Pourquoi
- Sur certains thèmes, les champs n’avaient pas toujours d’attribut name au moment du FormData ; sur certains hébergeurs, la lecture SQL des utilisateurs échouait sans mysqlnd.

Détail technique
- lw-account-forms.js v4 : buildFormData explicite ; action = page courante en modal.
- lw_public_accounts_stmt_fetch_one_assoc() ; formulaires modal : post_url injecté au rendu.
v1.1.82026-08-08 17:51:46Reconnaissance admin sur le site public + cookies domaineUn administrateur connecté à lw-admin est de nouveau reconnu sur le site vitrine (header Mon compte). Les cookies s’alignent sur le domaine réel du site (ex. dormezcheznous.com).
Pour les utilisateurs
- Si vous êtes connecté à lw-admin sur le même domaine que le site public, le header affiche « Mon compte » sans reconnecter via le modal.
- Après connexion via le modal, la session publique est conservée.
- Vérifiez config.local.php : COOKIEpath doit être le domaine du site (pas ludiware.com si le site est sur un autre nom).

Pourquoi
- Les cookies admin étaient parfois posés pour ludiware.com alors que le site tourne sur un domaine custom ; le site public ne recevait pas les cookies. La connexion modal échouait aussi si les cookies admin invalides perturbaient la session.

Détail technique
- lw_cookie_domain() utilise l’hôte HTTP courant si différent de COOKIEpath.
- lw_public_accounts_auth_from_cookies() + sync session membre.
- Bootstrap auth dès index.php public.
v1.1.72026-08-08 17:31:50Header compte conditionnel (snippets / jetons)Affichez « Connexion » ou « Mon compte » dans le header selon l’état de session, via un snippet HTML et les jetons {{​​​​account_if_guest}} / {{​​​​account_if_logged_in}}.
Pour les utilisateurs
- Dans un snippet HTML (ou le gabarit) : entourez le bouton Connexion avec {{​​​​account_if_guest}}…{{​​​​/account_if_guest}} et Mon compte avec {{​​​​account_if_logged_in}}…{{​​​​/account_if_logged_in}}.
- Jetons utiles : {{​​​​account_account_url}}, {{​​​​account_user_name}}, {{​​​​account_logout_url}}, {{​​​​account_logged_in}} (1 ou vide).
- Placez {{​​​​snippet:votre_cle}} dans le header du gabarit.
- Alternative prête à l’emploi : {{​​​​account_strip}} (bandeau lw-admin).
- Snippets PHP : variable $lw_db + lw_public_accounts_viewer().

Pourquoi
- DormezChezNous et thèmes importés veulent un bouton Bootstrap/modal personnalisé, pas le bandeau générique.

Détail technique
- lw_public_accounts_apply_conditional_blocks() dans apply_tokens ; $lw_db exposé aux snippets PHP.
v1.1.62026-08-08 17:25:08Correction AJAX modals compte (thèmes Homelengo)La connexion depuis un modal ne réagissait pas au clic : le script compte intercepte maintenant le clic avant les scripts du thème, affiche les erreurs (retrait de d-none) et indique le chargement sur le bouton.
Pour les utilisateurs
- Le bouton « Connexion » dans le modal répond de nouveau : texte « … » pendant l’envoi, message d’erreur visible en rouge si échec, rechargement de la page si succès.
- Aucun changement requis dans votre HTML si data-lw-account et data-lw-account-error sont déjà en place.

Pourquoi
- Les thèmes importés (Homelengo / DormezChezNous) enregistrent des écouteurs qui bloquaient l’événement submit avant notre script ; les erreurs restaient aussi cachées par la classe Bootstrap d-none.

Détail technique
- lw-account-forms.js v3 : capture click + submit, chargé en dernier avant </body>.
- Retrait automatique de d-none sur data-lw-account-error.
v1.1.52026-08-08 17:13:29Connexion et inscription en AJAX (modals)Les formulaires compte dans une fenêtre modale (Bootstrap ou autre) peuvent être envoyés sans recharger toute la page : les erreurs s’affichent dans le modal, et la page se met à jour après une connexion réussie.
Pour les utilisateurs
- Si votre formulaire login/register est dans un modal (.modal ou role="dialog"), la soumission se fait en AJAX automatiquement — plus de redirection vers /connexion/ qui casse l’expérience.
- Placez un emplacement d’erreur : <div data-lw-account-error></div> dans le modal.
- Forcer ou désactiver : data-lw-account-ajax="1" ou "0" sur le <form>.
- Après succès : par défaut rechargement de la page (menu compte à jour) ; data-lw-account-on-success="redirect" pour aller vers Mon compte.
- Le captcha inscription est rafraîchi automatiquement après une erreur.

Pourquoi
- DormezChezNous et thèmes similaires ouvrent login/inscription en popup : un POST classique rechargeait toute la page.

Détail technique
- lw-account-forms.js injecté quand data-lw-account est présent.
- Réponses JSON côté serveur (lw_public_accounts_handle_post) ; hook index.php pour POST depuis n’importe quelle page.
v1.1.42026-08-08 16:54:04Formulaires compte personnalisés (data-lw-account)Vous pouvez utiliser vos propres formulaires HTML de connexion et d’inscription dans le template : le moteur les branche automatiquement et expose les messages d’erreur via des jetons ou des emplacements dédiés.
Pour les utilisateurs
- Marqueur sur le <form> : data-lw-account="login" ou "register" (aussi forgot, reset, profile, security).
- Champs : data-lw-account-field="email|password|…" ou détection par id/name/placeholder (comme le contact).
- Erreurs : {{​​​​account_error_text}} dans votre HTML, ou <div data-lw-account-error></div>.
- Succès : {{​​​​account_success_text}} ou data-lw-account-success.
- Remplacez {{​​​​account_login}} par votre markup sur la page coquille /connexion/ si vous ne voulez pas le formulaire lw-admin par défaut.
- Inscription : emplacement <div class="lw-account-captcha-slot"></div> pour le captcha.
- OAuth optionnel : <div data-lw-account-oauth></div>.

Pourquoi
- DormezChezNous et autres thèmes importés gardent leur design Bootstrap sans dupliquer la logique compte.

Détail technique
- account_forms.php (même principe que data-lw-contact).
- CSRF + lw_account_action injectés ; action POST vers /connexion/, /inscription/, etc.
v1.1.32026-08-08 12:47:55Éditeurs HTML avec coloration et tabulationTous les champs HTML et code de l’admin bénéficient de la coloration syntaxique et de l’indentation à la touche Tab (4 espaces), y compris la vue « code source » de TinyMCE.
Pour les utilisateurs
- Champs HTML bruts (en-tête, pied de page, snippets, templates, CSS personnalisé, etc.) : numéros de ligne, coloration, Tab pour indenter.
- Éditeur riche TinyMCE : le bouton « code source » ouvre la même expérience colorée.
- Thèmes importés : édition HTML directe avec coloration.

Pourquoi
- Faciliter la lecture et l’édition du markup sans IDE externe.
- Tab insère une indentation cohérente ; Maj+Tab la réduit.

Détail technique
- Module lw-code-editor.js (CodeMirror 5 via CDN).
- Modes html, css et php selon le champ.
- Compatible navigation app-shell (réinit après changement de page).
v1.1.22026-08-08 11:37:45Mise à jour CMS in-app et alerte footerLes installations distantes voient un avertissement visible dans le pied de page admin lorsqu’un package plus récent existe, et peuvent installer la mise à jour depuis Réglages → Versions sans ré-uploader manuellement les fichiers.
Pour les utilisateurs
- Pied de page admin : badge « Mise à jour disponible (vX.Y.Z) » lorsqu’un paquet VersionLog plus récent est publié sur repo.ludiware.com.
- Réglages → Versions : bandeau avec bouton « Mettre à jour maintenant » (téléchargement + déploiement automatique).
- Fichiers locaux préservés : config.local.php, config.php (seule la ligne Version est mise à jour), uploads/, storage/, extensions installées.

Pourquoi
- Éviter les mises à jour manuelles FTP/SFTP sur chaque site hébergé.
- Rendre visible une version obsolète (ex. 1.0.53 vs 1.1.x) sans fouiller l’historique.

Détail technique
- lw_cms_update_apply() : télécharge ZIP/tar.gz depuis repo.ludiware.com, extrait et copie le core.
- lw_versionlog_check_update() inchangé (cache 30 min).
- Badge sidebar Réglages + alerte chrome pour les gestionnaires.
v1.1.12026-08-08 11:30:24Historique : jetons et accolades lisiblesLes entrées VersionLog n’affichent plus de codes HTML bruts ({) : les jetons {{​​​​account_login}} et similaires apparaissent normalement.
Pour les visiteurs
- Page Historique : les exemples de jetons CMS s’affichent comme du texte (accolades visibles), sans entités HTML encodées en double.

Pourquoi
- Certaines entrées VersionLog mentionnaient des entités HTML ({) dans leur texte ; htmlspecialchars() les affichait telles quelles à l’écran.

Détail technique
- lw_versionlog_prepare_display_source() : décodage des entités d’accolades avant neutralisation zero-width space et lw_e().
v1.1.0 Package2026-08-08 11:28:14ludiWARE 1.1.0 — distribution publiqueRelease mineure 1.1.0 : package d’installation complet (ZIP + tar.gz), comptes publics OAuth, historique des versions sur la vitrine, formulaire contact prérempli, et plugins MarketPlace à jour.
Pour les utilisateurs
- Téléchargement : ludiware-1.1.0.tar.gz + ludiware-1.1.0.zip
- Dépôt : https://repo.ludiware.com/releases/1.1.0/
- Assistant /install/ inclus (base de données, schéma, compte admin)

Depuis la distribution 1.0.40
- Comptes membres locaux : inscription, connexion, mot de passe oublié, Mon compte (onglets profil / sécurité)
- OAuth Google et Facebook sur la vitrine
- Header public reconnaît la session lw-admin et les membres OAuth
- Jeton {{​​​​versionlog}} : historique des versions sur le site public
- Formulaire contact : nom et courriel préremplis si connecté
- Bootstrap Icons + sélecteur d’icônes admin
- Plugins MarketPlace : FAQ, Témoignages, Galerie, Formulaires, Réservation, Annonces classées, Forums

Plugins republication (MarketPlace)
- Forums 1.0.16
- Annonces classées 1.0.15

Détail technique
- Export OSS sans secrets ni outils usine ; FileName VersionLog → tar.gz public.

Télécharger le package

v1.0.612026-08-08 11:25:48Historique : jetons affichés normalementLes exemples {{​​​​account_login}} dans l’historique des versions s’affichent comme du texte lisible, sans entités HTML visibles ({).
Pour les visiteurs / administrateurs
- Page Historique et Réglages → Versions : les jetons cités en exemple apparaissent comme {{​​​​account_login}}, pas comme {{​​account_login}}.

Pourquoi
- L’échappement HTML des accolades en entités, puis htmlspecialchars(), doublait l’encodage et affichait les codes bruts à l’écran.

Détail technique
- Neutralisation zero-width space seule (sans entités {) dans lw_versionlog_format_display_text() et lw_versionlog_shield_public_html().
v1.0.602026-08-08 11:24:31Contact : nom et courriel préremplis si connectéSur le formulaire de contact, les champs Nom et Courriel sont remplis automatiquement lorsque le visiteur est déjà connecté (compte local, lw-admin ou portail CDS).
Pour les utilisateurs
- Formulaire {{​​​​contact_form}} et formulaires contact des thèmes ZIP : Nom et Courriel préremplis si vous êtes connecté.
- Les champs déjà remplis dans le gabarit ne sont pas écrasés.

Pourquoi
- Éviter de ressaisir son identité à chaque message contact.

Sources
- Portail CDS (session SSO) : nom complet + courriel du contact.
- Compte membre public ou cookie lw-admin : display_name + courriel lw_users.

Détail technique
- lw_contact_prefill_identity(), lw_contact_apply_prefill_to_form(), lw_contact_form_html().
v1.0.592026-08-08 11:20:46Jeton {{​​​​versionlog}} actif sur la vitrineLe jeton {{​​​​versionlog}} est désormais reconnu sur le site public : la page Historique affiche la liste des versions au lieu du texte brut du jeton.
Pour les visiteurs
- Page Historique : le contenu {{​​​​versionlog}} est remplacé par la liste des versions (styles et textes sécurisés).

Pourquoi
- Le module VersionLog n’était chargé que dans lw-admin ; sur index.php (front public), lw_versionlog_prepare_public_html() n’existait pas et le jeton restait affiché tel quel.

Détail technique
- require versionlog.php dans www/index.php avant public_render.php.
v1.0.582026-08-08 11:07:13Historique public : jetons CMS affichés en texteSur la page Historique du site ludiware.com, les mentions {{​​​​account_login}}, {{​​​​menu:main}}, etc. dans les entrées VersionLog s’affichent en texte au lieu d’injecter formulaires ou menus.
Pour les visiteurs
- Page Historique (/historique/) : titre, description et détails d’une version montrent les jetons cités en exemple (documentation), sans formulaire de connexion ni menu injecté au milieu du texte.

Pourquoi
- Le contenu VersionLog est rendu via un snippet PHP puis repasse dans le moteur de jetons CMS ; les exemples {{​​​​account_login}} étaient exécutés comme de vrais jetons.

Détail technique
- Jeton {{​​​​versionlog}} / {{​​​​versionlog_list}} natif ; protection des blocs .lw-vl-* avant le pipeline de jetons ; entités HTML pour {{​​​​ et }} à l’affichage.
v1.0.572026-08-08 10:58:52Historique des versions : jetons CMS affichés en texteLes mentions {{​​​​account_login}}, {{​​​​menu:main}}, etc. dans les détails techniques du VersionLog ne sont plus interprétées comme des jetons CMS.
Pour les administrateurs
- Réglages → Historique des versions : titre, description et détails complets affichent les jetons tels quels (documentation), sans formulaire ni contenu injecté.

Pourquoi
- Les entrées VersionLog citent souvent des jetons en exemple dans la section « Détail technique » ; le moteur de jetons ne doit pas les exécuter à l’affichage.

Détail technique
- Neutralisation {{​​​​ → {{​​​​ + zero-width space à la sortie API et côté lw-admin ; affichage HTML échappé.
v1.0.562026-08-08 10:54:16Header public : reconnaissance de la session lw-adminConnecté à lw-admin, vous apparaissez aussi comme membre sur le site public (header, Mon compte), comme pour les commentaires au blogue.
Pour les visiteurs / administrateurs
- Si vous êtes connecté à lw-admin (cookies), le bandeau {{​​​​account_strip}} affiche votre nom et le lien « Accéder à mon compte ».
- /mon-compte/ est accessible sans repasser par /connexion/.
- /connexion/ et /inscription/ redirigent vers Mon compte si vous êtes déjà reconnu.

Priorité d’identité (inchangée pour le blogue si session Facebook active)
1. Session membre public (connexion / OAuth)
2. Cookie lw-admin

Déconnexion sur le site public : ferme la session membre ; si seul lw-admin reste actif, vous restez connecté (comportement voulu).
v1.0.552026-08-08 10:38:20Blogue et forums : identité membre public prioritaireSur le site public, la session membre (connexion / Facebook / Google) prime désormais sur les cookies admin lw-admin pour commenter au blogue.
Problème corrigé
- Header « Vous êtes connecté en tant que… » (session membre) et blogue « Vous commentez en tant que… » (cookies admin) pouvaient afficher deux personnes différentes si vous étiez connecté à lw-admin et via Facebook sur le site public.

Comportement
- Priorité : portail CDS → membre public (session) → staff admin (cookie lw-admin).
- Le blogue propose le lien Connexion vers /connexion/ lorsque les comptes locaux sont actifs (sans CDS).

Note
- Si Facebook a créé un second compte lw_users (courriel différent de l’admin), c’est normal : deux profils distincts. Vous pouvez fusionner manuellement ou supprimer le doublon dans Utilisateurs.
v1.0.542026-08-08 10:11:29OAuth — URL de redirection stableL’URL de callback Google/Facebook affichée dans les réglages utilise désormais le domaine du site (ex. ludiware.com), pas l’hôte de l’admin.
Pour les administrateurs
- Dans Réglages → Comptes membres, l’URL « redirection autorisée » correspond au domaine public du site.
- Note d’aide pour l’enregistrement de l’URI dans Facebook Login → Valid OAuth Redirect URIs.

Pourquoi
- Depuis le panneau admin (autre sous-domaine), l’URL générée pouvait différer de celle réellement utilisée sur le site public.
v1.0.532026-08-08 10:03:23Connexion Google et Facebook pour les membresLes visiteurs peuvent se connecter ou s'inscrire avec Google ou Facebook sur les pages connexion et inscription, sans portail CentreDeService. Un compte local est créé automatiquement s'il n'existe pas encore.
Pour les visiteurs
- Boutons « Se connecter avec Google » et « Se connecter avec Facebook » sur /connexion/ et /inscription/.
- Si le courriel n'est pas encore inscrit, un profil membre est créé et la session est ouverte.
- Si un compte existe déjà avec le même courriel, le profil OAuth est lié au compte existant.

Pour les administrateurs
- Onglet Comptes membres des réglages site : activation, identifiants OAuth et URL de redirection à copier dans Google Cloud / Facebook Developer.
- Désactivé automatiquement lorsque le portail CentreDeService gère l'authentification.

Détail technique
- Colonnes lw_users google_id / facebook_id, module oauth_accounts.php, callbacks /oauth/{provider}/callback/.
v1.0.522026-08-08 08:35:18Sélecteur d'icônes — catalogue completLe sélecteur d'icônes affiche d'abord une sélection utile, puis toutes les icônes Bootstrap (~1 600) via la recherche.
Pour les administrateurs
- À l'ouverture : grille de favoris (maison, commerce, transport, etc.).
- Recherche : filtre sur l'ensemble des ~1 683 icônes Bootstrap Icons installées.
- Compteur de résultats et message si la liste est tronquée.

Correction
- La liste n'était limitée qu'à 120 icônes en ordre alphabétique (123, alarm…), ce qui paraissait incomplet.
v1.0.512026-08-08 08:29:09Bootstrap Icons et sélecteur d'icônesLes icônes Bootstrap s'affichent correctement partout dans l'admin grâce aux polices complètes. Un sélecteur d'icônes réutilisable est disponible pour les formulaires (recherche, grille, aperçu).
Pour les administrateurs
- Polices Bootstrap Icons (woff/woff2) installées : les icônes `bi-*` déjà utilisées dans lw-admin s'affichent de façon fiable.
- Nouveau composant « sélecteur d'icônes » (`lw_icon_picker_field`) utilisable dans tout formulaire admin.

Utilisation
- Bouton avec aperçu de l'icône, recherche par nom, grille cliquable, option « Aucune icône ».
- Fonction PHP `lw_bootstrap_icon_names()` et normalisation `lw_bootstrap_icon_class()`.

Détail technique
- Fichiers : `functions/icon_picker.php`, `js/lw-icon-picker.js`, styles dans `lw-admin.css`.
v1.0.502026-08-08 07:27:10Mon compte — onglets profil et sécuritéLa page Mon compte propose deux onglets : Mes informations (prénom, nom, avatar) et Accès et sécurité (courriel, mot de passe). Nouveaux jetons pour gabarits ZIP.
Pour les utilisateurs
- Onglet Mes informations : prénom, nom de famille, téléversement d’avatar.
- Onglet Accès et sécurité : changement de courriel et/ou mot de passe (mot de passe actuel requis).

Jetons ZIP
- {{​​​​account_panel}} : panneau complet avec onglets.
- {{​​​​account_tabs}}, {{​​​​account_profile}}, {{​​​​account_security}} : mise en page personnalisée.
- {{​​​​account_avatar}}, {{​​​​account_avatar_url}}, {{​​​​account_first_name}}, {{​​​​account_last_name}}, {{​​​​account_email}}.
- {{​​​​account_profile_url}}, {{​​​​account_security_url}} : liens directs vers chaque onglet.

Détail technique
- Colonne lw_users.avatar_path, fichiers dans uploads/users/, session vitrine synchronisée après mise à jour.
v1.0.492026-08-08 07:17:18Comptes vitrine unifiés dans lw_usersInscription, connexion et mot de passe oublié sur la vitrine utilisent désormais la table lw_users (comme lw-admin). Seuls les comptes avec accès admin peuvent ouvrir lw-admin.
Pour les utilisateurs
- Même courriel et mot de passe partout : admin ou visiteur inscrit sur /inscription/.
- Les comptes créés sur la vitrine ont le rôle user et ne peuvent pas accéder à lw-admin.
- Les administrateurs se connectent aussi sur /connexion/ avec leurs identifiants habituels.

Pourquoi
- Suppression du double système lw_site_members / lw_users introduit par erreur.

Détail technique
- public_accounts.php : auth, inscription et reset sur lw_users ; session vitrine par site.
- auth.php inchangé : can_access_admin requis pour lw-admin.
- Table obsolète lw_site_members : peut être supprimée en base (DROP TABLE).
v1.0.482026-08-08 07:11:33Connexion vitrine avec un compte administrateurLes administrateurs du site peuvent se connecter sur la vitrine publique (/connexion/) avec le même courriel et mot de passe que lw-admin, sans inscription séparée.
Pour les utilisateurs
- Sur /connexion/, un compte administrateur global ou assigné au site est accepté avec les identifiants lw-admin.
- La première connexion crée automatiquement le profil membre local du site ; les connexions suivantes réutilisent ce profil.

Pourquoi
- Avant ce correctif, seuls les comptes inscrits via /inscription/ (table lw_site_members) étaient reconnus ; le premier admin recevait « Courriel ou mot de passe incorrect ».

Détail technique
- Pont lw_users → lw_site_members dans lw_public_accounts_login() : vérification mot de passe admin, accès site (global_admin ou local_admin membre du site), synchronisation du hash et de la session membre.
v1.0.472026-08-08 06:52:34Comptes membres locaux sur la vitrineLes sites sans portail CentreDeService peuvent proposer inscription, connexion, mot de passe oublié et espace membre sur la vitrine publique, avec jetons pour gabarits ZIP et pages coquilles CMS.
Pour les utilisateurs
- Inscription sur /inscription/ avec captcha et confirmation du mot de passe.
- Connexion sur /connexion/, récupération sur /mot-de-passe-oublie/ et réinitialisation par lien courriel.
- Espace « Mon compte » une fois connecté ; bandeau {{​​​​account_strip}} dans le header.

Pour les administrateurs
- Onglet Réglages → Comptes membres : coquilles CMS et bouton « Générer les pages système ».
- Menu éditeur : Ajouter membre (Connexion, Mot de passe oublié, Inscription, Mon compte) si CDS inactif.
- Jetons ZIP : {{​​​​account_login}}, {{​​​​account_register}}, {{​​​​account_panel}}, {{​​​​account_forgot}}, {{​​​​account_reset}} et URLs associées.

Pourquoi
- Permettre aux vitrines ludiWARE autonomes (sans CDS) d’offrir des comptes visiteurs pour commentaires, contenus réservés ou personnalisation future.

Détail technique
- Table lw_site_members, CSRF session, captcha inscription distinct du contact, routes try_serve, public_render apply_tokens.
v1.0.462026-08-07 12:59:32Captcha contact : correction des réponses valides rejetéesLorsqu’une page ou un gabarit contient plusieurs formulaires contact, la même question de vérification s’affiche partout et la bonne réponse est acceptée.
Pour les utilisateurs
- Le captcha « Combien font X + Y ? » est identique sur tous les formulaires contact d’une même page.
- Une réponse correcte n’est plus rejetée avec « Vérification de sécurité incorrecte ».

Pourquoi
- Chaque formulaire recevait parfois une question différente alors que la session ne mémorise qu’une seule réponse (contenu + gabarit finalisés séparément).

Détail technique
- lw_contact_captcha_issue() réutilise le défi session valide ; finalisation contact une seule fois sur le HTML complet (public_render.php).
v1.0.452026-08-07 12:15:48Jetons blogue : derniers articles (footer / sidebar)Placez dans un gabarit ou une page les jetons {{​​​​blog-latest-title-1}}, {{​​​​blog-latest-image-1}}, {{​​​​blog-latest-excerpt-1}}, etc. (jusqu’à 10) pour afficher les articles les plus récents.
Pour les utilisateurs
- {{​​​​blog-latest-title-N}} : titre (N=1 = plus récent, 2 = avant-dernier, … jusqu’à 10)
- {{​​​​blog-latest-image-N}} : URL de l’image à la une
- {{​​​​blog-latest-excerpt-N}} : extrait du corps de l’article
- {{​​​​blog-latest-date-N}} : date courte (ex. 15 avril 2020)
- {{​​​​blog-latest-date-long-N}} : date longue
- {{​​​​blog-latest-url-N}} : lien vers l’article
- Idéal pour un bloc « Blogue » en pied de page ou barre latérale, comme dans un thème ZIP importé.

Pourquoi
- Personnaliser le footer sans dupliquer manuellement les titres et images des articles.

Détail technique
- lw_blog_apply_latest_tokens() dans blog.php, appelé depuis lw_blog_apply_tokens() sur gabarits et pages.
v1.0.442026-08-07 12:10:34Contact thème : messages d’erreur et champ SujetLes formulaires contact des thèmes ZIP affichent à nouveau le vrai message d’erreur (captcha, champs manquants, etc.) et le champ Sujet du thème est bien pris en charge.
Pour les utilisateurs
- Après un envoi raté, le message précis s’affiche (ex. captcha incorrect) au lieu du générique « Envoi impossible. Vérifiez les champs. »
- Le champ Sujet des formulaires de thème (ex. msg_subject, placeholder ou label « Sujet ») est enregistré et reçu par courriel.
- Les champs sans attribut name mais avec placeholder/label (Votre nom, Votre courriel…) sont reconnus à l’import et au rendu.

Pourquoi
- lw_contact_form_html() effaçait le flash session avant l’affichage des formulaires thème.
- Certains thèmes nomment le sujet autrement que subject.

Détail technique
- public_render.php : lw_contact_form_html() seulement si {{​​​​contact_form}} est présent.
- contact_forms.php : alias msg_subject, détection placeholder/label, fallbacks nom/courriel.
v1.0.432026-08-07 12:04:45Correction erreur 500 sur les pages contact (thèmes ZIP)Les pages « Nous joindre » importées depuis un template ZIP ne provoquent plus d’erreur serveur lorsque le bouton Envoyer est imbriqué dans la grille du thème (Bootstrap, etc.).
Pour les utilisateurs
- Les pages contact personnalisées d’un thème importé s’affichent à nouveau normalement, avec captcha et envoi vers la boîte Messages.
- Avant la correction, certaines pages (ex. formulaire dans des colonnes Bootstrap) renvoyaient une erreur HTTP 500.

Pourquoi
- Lors du branchement du formulaire thème, l’emplacement du captcha était inséré au mauvais niveau du DOM lorsque le bouton Envoyer n’était pas enfant direct du <form>.

Détail technique
- contact_forms.php : lw_contact_wire_form_element() insère le slot captcha via le parent immédiat du bouton submit au lieu de form->insertBefore() sur un nœud imbriqué.
v1.0.422026-08-07 09:41:46Pages boutique CDS personnalisables (coquilles et jetons)Comme pour le blogue, vous pouvez choisir des pages CMS comme coquilles pour le magasin, les catégories, les fiches produit, le panier et les commandes, puis y placer des jetons granulaires (titre, prix, image, liste, etc.).
Pour les utilisateurs
- Dans Réglages du site → CentreDeService.NET, section « Pages coquilles boutique », associez une page CMS à chaque type d’écran (/boutique/, catégorie, produit, panier, commande).
- Sans coquille, le rendu CDS par défaut reste inchangé.
- Sur une coquille produit : {{​​​​cds_product_title}}, {{​​​​cds_product_image}}, {{​​​​cds_product_price}}, {{​​​​cds_product_desc}}, {{​​​​cds_product_add_cart}}, ou {{​​​​cds_product}} pour la fiche complète.
- Sur une liste / catégorie : {{​​​​cds_shop_list}} (bloc complet), ou {{​​​​cds_shop_categories}}, {{​​​​cds_shop_products}}, {{​​​​cds_shop_pager}}, {{​​​​cds_category_title}}.
- Panier / commande : {{​​​​cds_cart}}, {{​​​​cds_order}}, {{​​​​cds_cart_count}}.

Pourquoi
- Permettre une mise en page boutique alignée sur le thème du site, sur le même modèle que les jetons blogue.

Détail technique
- Coquilles : cds_shop_*_page_uid ; lw_cds_resolve_shell_page dans lw_cds_try_serve.
- Jetons : lw_cds_apply_shop_field_tokens + contexte dans lw_cds_apply_tokens.
v1.0.412026-08-07 09:03:11Formulaires contact des templates ZIP reliés au CMSLes formulaires de contact déjà présents dans un thème importé peuvent envoyer leurs messages via le moteur contact de lw-admin, sans remplacer le design du thème. À l’import, la détection est automatique ; vous pouvez aussi forcer avec data-lw-contact="1".
Pour les utilisateurs
- Un formulaire contact du thème (classes / mailto / champs nom-email-message) est branché sur la boîte Messages et l’e-mail de notification.
- L’apparence du formulaire (HTML/CSS du thème) est conservée.
- Marqueur manuel : data-lw-contact="1" force le branchement ; data-lw-contact="0" l’exclut.
- Captcha et messages de succès/erreur s’affichent comme pour {{​​​​contact_form}}.

Pourquoi
- Éviter de remplacer un beau formulaire de thème par le HTML générique {{​​​​contact_form}}.

Détail technique
- lw_contact_wire_form_html (import) ; lw_contact_finalize_bound_forms (rendu) ; alias de champs dans lw_contact_submit.
v1.0.40 Package2026-08-06 13:07:30ludiWARE 1.0.40 — package d’installationDistribution publique complète (ZIP + tar.gz) avec installateur. Inclut les évolutions récentes : blogue (jetons, URLs par catégories, sous-catégories), page 404 CMS, médiathèque globale, menus / import ZIP, et corrections d’affichage.
Pour les utilisateurs
- Package téléchargeable pour installer ou mettre à jour ludiWARE.
- Archives : ludiware-1.0.40.tar.gz et ludiware-1.0.40.zip
- Dépôt : https://repo.ludiware.com/releases/1.0.40/
- Assistant /install/ inclus (base de données, schéma, compte admin)

Contenu notable depuis la dernière distribution
- Blogue : jetons auteur / date longue / heure / commentaires / catégories ; URLs /blogue/catégorie/sous-catégorie/slug ; sous-catégories en admin ; accord « commentaire »
- Page 404 CMS désignée + pastille ; import ZIP (chrome, méga-menus, détection 404)
- Médiathèque globale et dossiers ; menus actifs ; déduplication header

Pourquoi
- Fournir un paquet installable aligné sur la version courante du CMS.

Détail technique
- Export OSS (sans secrets, sans api/admin usine) ; FileName VersionLog pointant vers le tar.gz public.

Télécharger le package

v1.0.392026-08-06 13:01:02Singulier « commentaire » quand il y en a 0 ou 1Dans la liste des articles du blogue, on affiche « 0 commentaire » ou « 1 commentaire » (sans s), et le pluriel seulement à partir de 2.
Pour les utilisateurs
- Meta des cartes d’articles : accord correct du mot commentaire (0/1 au singulier).

Pourquoi
- « 0 commentaires » était grammaticalement incorrect en français.

Détail technique
- lw_blog_format_comments_count : singulier si count <= 1 (FR).
v1.0.382026-08-06 13:00:31Sous-catégories de blogue plus simples à créerDans lw-admin, chaque catégorie propose un bouton pour ajouter une sous-catégorie. Le champ « Catégorie parente » est mis en avant, avec la liste en arborescence.
Pour les utilisateurs
- Liste des catégories : icône « diagramme » pour créer une sous-catégorie déjà rattachée à la bonne parente.
- Formulaire : champ parent en premier, aide sur l’URL /blogue/parente/enfant/…
- Pastille « Sous-catégorie » et colonne Parente dans le tableau.

Pourquoi
- La hiérarchie existait déjà en base, mais était trop discrète dans l’interface.

Détail technique
- blogcats.php (?new=1&parent=uid) ; clés i18n blog.cat_* ; invalidation cache catégories.
v1.0.372026-08-06 12:51:12URLs blogue avec catégories imbriquéesLes articles sont désormais accessibles via /blogue/catégorie/sous-catégorie/slug-article. Les anciennes adresses /blogue/slug redirigent automatiquement vers la nouvelle URL.
Pour les utilisateurs
- URL d’un article : /blogue/{catégorie}/{sous-catégorie}/{slug} selon la hiérarchie des catégories.
- Sans catégorie : /blogue/{slug} comme avant.
- Listes de catégories : /blogue/{catégorie}/{sous-catégorie} (l’ancien préfixe /blogue/categorie/… redirige).
- Les liens liste, commentaires, sitemap et l’admin utilisent la nouvelle structure.

Pourquoi
- Refléter l’arborescence des catégories dans l’URL, plus claire pour le SEO et la navigation.

Détail technique
- lw_blog_post_url / lw_blog_post_path_extra ; résolution de chemin dans lw_blog_try_serve ; redirections 301.
v1.0.362026-08-06 12:48:37Nouveaux jetons blogue (auteur, date, commentaires…)Les gabarits d’article peuvent afficher le nombre de commentaires, l’auteur, une date longue, l’heure de publication et la liste des catégories. Un champ Auteur a été ajouté à l’édition des articles.
Pour les utilisateurs
- Nouveaux jetons : {{​​​​blog_comments_count}} (chiffre), {{​​​​blog_author}}, {{​​​​blog_date_long}} (ex. Jeudi le 3 septembre 2024), {{​​​​blog_time}} (HH:MM), {{​​​​blog_categories}} (liste des catégories publiées).
- {{​​​​blog_date}} reste au format AAAA-MM-JJ.
- Champ « Auteur » à la création / édition d’un article, utilisé par {{​​​​blog_author}}.

Pourquoi
- Permettre des mises en page d’articles plus riches sans HTML figé.

Détail technique
- Colonne author_name ; helpers lw_blog_format_date_long / lw_blog_render_categories_token_list ; jetons documentés dans templates.php.
v1.0.352026-08-06 11:32:25Page 404 CMS : affichage corrigé + pastilleLa page désignée comme 404 s’affiche correctement (y compris sur un site encore en brouillon / en aperçu). Dans la liste des pages, une pastille « 404 » apparaît comme pour l’accueil. À l’import ZIP, les pages d’erreur 404 sont détectées automatiquement.
Pour les utilisateurs
- Si vous cochez « Utiliser comme page 404 », une URL inconnue affiche cette page (thème du site), et non le 404 sombre générique.
- Cela fonctionne aussi en aperçu et tant que le site est en brouillon.
- Liste des pages : pastille orange « 404 » à côté du statut, comme la pastille Accueil.
- Nouveaux imports ZIP : une page nommée 404 / not-found est assignée automatiquement.

Pourquoi
- Le rendu de la page 404 ignorait le mode aperçu et refusait les sites brouillon (« Site non publié »), ce qui forçait le repli générique.

Détail technique
- lw_public_site_404(..., $preview) ; rendu forcé en mode aperçu si site brouillon ; badge pages.badge_404 ; auto page_404_page_uid à l’import ZIP.
v1.0.342026-08-06 11:26:54Import ZIP : plus de header en double dans les pagesÀ l’import d’un template, le header (et les wrappers du même type) est retiré du contenu des pages lorsqu’il est déjà placé dans l’en-tête global. Les sites déjà importés sont nettoyés à l’affichage.
Pour les utilisateurs
- Les pages importées ne gardent plus une copie du menu/header dans leur contenu si le chrome global est actif.
- Les templates sans balise <header> (ex. #header / .header-area) sont aussi pris en charge.

Pourquoi
- Le strip était trop strict (vote majoritaire, wrappers non sémantiques ignorés) ; des restes restaient dans le HTML des pages.

Détail technique
- Détection structurelle + affixe normalisé (ignore active) ; strip/dedupe DOM élargi ; nettoyage au rendu public.
v1.0.332026-08-06 11:16:07Menu : item courant correctement mis en évidenceSur les sites (y compris templates importés), l’item de menu actif suit la page affichée au lieu de rester figé sur Accueil.
Pour les utilisateurs
- En visitant « À propos » (ou une autre page), c’est cet item qui apparaît sélectionné, plus Accueil.
- Les parents d’un sous-menu actif restent aussi mis en évidence.

Pourquoi
- À l’import, la classe active de la page d’accueil était recopiée telle quelle dans le menu CMS, sans recalcul selon l’URL.

Détail technique
- Rendu menu : strip des classes active/current importées, marquage selon page_uid ou chemin courant, aria-current=page.
v1.0.322026-08-06 11:00:39Correction « Nouveau dossier » médiasChoisir « Nouveau dossier » dans la médiathèque affiche correctement le champ pour nommer le dossier, y compris après navigation dans l’admin.
Pour les utilisateurs
- Le champ texte sous « Nouveau dossier » réapparaît bien à la sélection.

Pourquoi
- Le script ne se rattachait pas après le chargement des pages en mode app (navigation sans rechargement complet).

Détail technique
- Délégation d’événements + réinit sur lw:fragment-loaded (lw-media-folder.js v2).
v1.0.312026-08-06 10:50:19Médiathèque globale et dossiersVous pouvez déposer des images partagées (logos, etc.) une seule fois dans Bibliothèque → Médias globaux, puis les réutiliser sur tous les sites. Le choix du dossier à l’upload propose la liste des dossiers existants ou « Nouveau dossier ».
Pour les utilisateurs
- Nouvelle section Bibliothèque → Médias globaux : upload et gestion des images partagées.
- Dans la médiathèque d’un site, l’onglet Globaux affiche ces fichiers en lecture (copie d’URL) ; les admins plateforme peuvent ouvrir Gérer.
- À l’upload ou à l’édition, le champ Dossier est une liste déroulante (aucun / existants / Nouveau dossier + champ texte).

Pourquoi
- Éviter de réimporter le même logo dans chaque site.
- Clarifier le classement par dossiers sans taper le nom à chaque fois.

Détail technique
- lw_media.site_id NULL = global ; fichiers sous uploads/global/ ; référence unique (pas de copie par site).
v1.0.302026-08-06 09:59:30Import ZIP : mega-menus préservésÀ l’import d’un template ZIP, les mega-menus (panneaux riches avec colonnes, images, CTA) et les attributs Bootstrap des menus déroulants sont conservés et restitués correctement.
Pour les utilisateurs
- Les templates avec mega-menus (ex. panneaux pleine largeur, grilles, images) gardent leur apparence après import.
- Les menus déroulants Bootstrap conservent leurs options (data-bs-toggle, etc.).
- Si un item a un panneau mega, une zone HTML dédiée apparaît dans Menus pour l’ajuster (en attendant l’extension mega-menu).

Pourquoi
- L’import ne lisait que les sous-listes <ul> ; les panneaux en <div class="dropdown-menu"> étaient perdus à la tokenisation {{​​​​menu:…}}.

Détail technique
- Nouveaux champs item : panel_html, link_attrs, label_html ; détection à l’harvest ; rendu a+panneau ; rewrite des URLs du panneau à la persistance.
v1.0.292026-08-06 09:42:25Correction sauvegarde en-tête / pied (doublon)Enregistrer l’en-tête et le pied de page d’un template ZIP ne duplique plus le footer sous le copyright.
Pour les utilisateurs
- La sauvegarde de « En-tête & pied de page » ne laisse plus apparaître un second footer non stylé.
- Les sites déjà touchés par le bug sont corrigés à l’affichage (et définitivement en réenregistrant le chrome).

Pourquoi
- Le parseur prenait le premier </div> interne du footer pour couper le bloc, puis recopait le reste après le pied de page.

Détail technique
- Extraction after_footer via DOM ; seuls script/style/link/noscript sont conservés ; repair au rendu public.
est remplacé par la liste des versions (styles et textes sécurisés). Pourquoi - Le module VersionLog n’était chargé que dans lw-admin ; sur index.php (front public), lw_versionlog_prepare_public_html() n’existait pas et le jeton restait affiché tel quel. Détail technique - require versionlog.php dans www/index.php avant public_render.php.
v1.0.582026-08-08 11:07:13Historique public : jetons CMS affichés en texteSur la page Historique du site ludiware.com, les mentions {{​account_login}}, {{​menu:main}}, etc. dans les entrées VersionLog s’affichent en texte au lieu d’injecter formulaires ou menus.
Pour les visiteurs
- Page Historique (/historique/) : titre, description et détails d’une version montrent les jetons cités en exemple (documentation), sans formulaire de connexion ni menu injecté au milieu du texte.

Pourquoi
- Le contenu VersionLog est rendu via un snippet PHP puis repasse dans le moteur de jetons CMS ; les exemples {{​account_login}} étaient exécutés comme de vrais jetons.

Détail technique
- Jeton 

Historique des versions de la plateforme ludiWARE (plus récent en premier).

v1.2.12026-08-09 16:47:35Mon compte extensible et lightbox annoncesLes plugins peuvent ajouter des onglets à Mon compte (ex. Mes annonces). Les pages publiques injectent correctement le script de la galerie photos en fin de HTML.
Pour les utilisateurs
- Mon compte : les extensions peuvent proposer de nouveaux onglets via le CMS (URL ?tab=…).
- Annonces classées 1.2.12 : onglet « Mes annonces » avec modifier, supprimer et marquer comme vendue.
- Lightbox des photos d’annonce : fonctionne aussi sur les fiches intégrées via jetons CMS (pas seulement les routes /annonces/…).

Pourquoi ce changement
- Centraliser la gestion des annonces dans Mon compte, là où les membres gèrent déjà leur profil.
- Corriger la galerie lorsque le HTML de l’annonce est rendu dans une page du site sans passer par le routeur du plugin.

Détail technique
- Filtres CMS : public_account_tabs, public_account_tab_panels, public_account_post_actions, public_accounts_handle_post, public_page_html.
- Plugin classifieds : statut sold, actions propriétaire, JS galerie defer v4.
v1.2.0 Package2026-08-09 15:29:10ludiWARE 1.2.0 — profils publics et identité membreRelease mineure 1.2.0 : packages d’installation complets (ZIP + tar.gz), profils publics des membres, noms cliquables partout, historique d’activité unifié sur le profil, et plugins Forums / Annonces classées republiés.
Pour les utilisateurs
- Téléchargement : ludiware-1.2.0.tar.gz + ludiware-1.2.0.zip
- Dépôt : https://repo.ludiware.com/releases/1.2.0/
- Assistant /install/ inclus

Nouveautés CMS (depuis 1.1.x)
- Profil public membre : /membre/{uid} (avatar, nom, date d’inscription)
- Noms des membres cliquables vers le profil (blogue, bandeau compte, extensions)
- Historique d’activité sur le profil : commentaires blogue, sujets/réponses forum, annonces et commentaires
- Filtre `public_member_profile_activity` pour les extensions

Plugins MarketPlace republiés
- Forums 1.0.18 (liens profil + activité forum)
- Annonces classées 1.2.9 (commentaires liés, activité annonces)

Détail technique
- Export OSS sans secrets ni outils usine
- FileName VersionLog → tar.gz public sur repo.ludiware.com

Télécharger le package

v1.1.142026-08-09 15:26:40Historique d’activité sur le profil publicLa page profil d’un membre affiche désormais une chronologie unifiée de ses contributions publiques : commentaires de blogue, sujets et réponses forum, annonces et commentaires sur annonces.
Pour les visiteurs
- Section « Historique d’activité » sous l’en-tête du profil (/membre/{uid}).
- Chaque ligne : date, type d’action, titre cliquable vers le contenu, extrait court si pertinent.
- Tri antichronologique (60 entrées max.), mélangeant blogue, forums et plugins actifs.

Pour les développeurs / extensions
- Nouveau filtre `public_member_profile_activity` — retourne des items `{at, kind, label, title, url, excerpt?}`.
- Helpers : `lw_public_accounts_collect_member_activity()`, `lw_public_accounts_render_member_activity_html()`, `lw_public_accounts_member_activity_item()`.
- Blogue : `lw_blog_member_public_activity()` (commentaires publiés).
- Les plugins enregistrent leurs sources via le filtre (Forums, Annonces classées).

Pourquoi
- Donner une vue d’ensemble de la présence publique d’un membre au lieu de sections isolées par extension.
v1.1.132026-08-09 15:23:12Noms des membres cliquables vers le profil publicPartout où un membre inscrit apparaît (commentaires du blogue, bandeau compte, etc.), son nom mène désormais à sa page profil publique lorsque celle-ci est visible.
Pour les visiteurs
- Clic sur le nom d’un membre local actif → page /membre/{uid} (ou /member/{uid} en anglais).
- Bandeau « Vous êtes connecté en tant que … » : le nom affiché est aussi un lien vers votre profil.
- Commentaires d’articles de blogue : auteurs membres identifiés par leur compte local.
- Invités, comptes CDS ou auteurs sans compte membre : nom affiché sans lien (comportement inchangé).

Pour les développeurs / extensions
- Helpers centralisés : `lw_public_accounts_author_context_from_row()`, `lw_public_accounts_resolve_content_author()`, `lw_public_accounts_render_author_name_html()`.
- Classe CSS partagée `lw-member-profile-link` pour les liens vers profil.

Pourquoi
- Uniformiser l’identité publique des membres sur tout le site (blogue, forums, annonces, etc.) après l’introduction des profils publics en 1.1.12.
v1.1.122026-08-09 15:17:27Profil public des membres inscritsChaque membre inscrit sur un site (comptes locaux) dispose d’une page profil publique avec avatar et nom. Les extensions peuvent y ajouter du contenu (ex. annonces publiées).
Pour les visiteurs
- URL publique : /membre/{uid} (FR) ou /member/{uid} (EN) — avatar, nom affiché, date d’inscription.
- Les profils ne sont visibles que pour les comptes membres actifs (inscription locale), pas pour les administrateurs ni le portail CentreDeService.

Pour les développeurs / extensions
- Nouveau filtre `public_member_profile_html` pour enrichir la page (le plugin Annonces classées y liste les annonces publiées).
- Helpers : `lw_public_accounts_public_profile_url()`, `lw_public_accounts_user_by_uid_public()`.

Pourquoi
- Permettre de reconnaître qui publie (annonces, forums, etc.) et de consolider l’identité publique des membres du site.
v1.1.112026-08-09 14:33:21Alertes standardisées pour l’admin et les pluginsNouveau système d’alertes unifié : messages de succès, erreur, avertissement et info affichés de façon cohérente dans lw-admin et sur le site public. Les plugins peuvent y contribuer via des hooks dédiés.
Pour les utilisateurs
- Les confirmations et erreurs dans l’administration (ex. « Annonce supprimée », « Réglages enregistrés ») s’affichent désormais en haut de page dans un bandeau uniforme, plus lisible.
- Sur le site public, les plugins peuvent afficher des messages utilisateur avec le même style visuel.

Pourquoi
- Chaque module et plugin gérait ses propres alertes (variables différentes, query strings, classes CSS propres), ce qui créait des doublons et des incohérences.

Détail technique
- Nouveau module lw-admin/functions/flash.php : lw_flash_add(), lw_flash_redirect(), lw_flash_render_html(), lw_public_flash_html().
- Hooks admin_flash et public_flash pour les extensions.
- Rétrocompatibilité avec $lwFlash et $lwPageFlashError.
- Feuille de style lw-flash.css partagée admin/public.
- Plugin Annonces classées migré en exemple (v1.2.2).
v1.1.102026-08-08 18:52:20Configuration portable site à siteconfig.php ne contient plus de secrets ni de domaine usine : base de données, courriels et surcharges d’environnement vivent dans config.local.php ; le domaine et les valeurs par défaut sont déduits automatiquement.
Pour les utilisateurs
- Copier le CMS d’un site à l’autre sans retoucher config.php : seul config.local.php (ou l’assistant /install/) doit être adapté au nouvel hébergement.
- Les cookies et le nom du site suivent le domaine réel si HTTPpath / COOKIEpath ne sont pas définis.

Pourquoi
- config.php mélangeait identifiants MySQL, domaine ludiware.com et courriels usine, ce qui compliquait chaque déploiement client.

Détail technique
- lw_config_detect_http_host() + lw_config_apply_runtime_defaults() après config.local.php.
- Connexion MySQL uniquement si DBhost / DBname / DBusername sont renseignés.
- config.local.example.php et installateur mis à jour (domaine optionnel).
v1.1.92026-08-08 17:58:54Correction connexion modal (champs POST + SQL)La connexion depuis le modal envoie désormais courriel et mot de passe de façon fiable (POST vers la page courante, champs lus explicitement) et fonctionne aussi sur hébergements sans mysqlnd.
Pour les utilisateurs
- Le modal login/register poste vers la page où vous êtes (pas seulement /connexion/), ce qui évite les échecs silencieux.
- Si le compte n’a pas de mot de passe (connexion Google/Facebook admin), un message explicite s’affiche au lieu de « courriel ou mot de passe incorrect ».

Pourquoi
- Sur certains thèmes, les champs n’avaient pas toujours d’attribut name au moment du FormData ; sur certains hébergeurs, la lecture SQL des utilisateurs échouait sans mysqlnd.

Détail technique
- lw-account-forms.js v4 : buildFormData explicite ; action = page courante en modal.
- lw_public_accounts_stmt_fetch_one_assoc() ; formulaires modal : post_url injecté au rendu.
v1.1.82026-08-08 17:51:46Reconnaissance admin sur le site public + cookies domaineUn administrateur connecté à lw-admin est de nouveau reconnu sur le site vitrine (header Mon compte). Les cookies s’alignent sur le domaine réel du site (ex. dormezcheznous.com).
Pour les utilisateurs
- Si vous êtes connecté à lw-admin sur le même domaine que le site public, le header affiche « Mon compte » sans reconnecter via le modal.
- Après connexion via le modal, la session publique est conservée.
- Vérifiez config.local.php : COOKIEpath doit être le domaine du site (pas ludiware.com si le site est sur un autre nom).

Pourquoi
- Les cookies admin étaient parfois posés pour ludiware.com alors que le site tourne sur un domaine custom ; le site public ne recevait pas les cookies. La connexion modal échouait aussi si les cookies admin invalides perturbaient la session.

Détail technique
- lw_cookie_domain() utilise l’hôte HTTP courant si différent de COOKIEpath.
- lw_public_accounts_auth_from_cookies() + sync session membre.
- Bootstrap auth dès index.php public.
v1.1.72026-08-08 17:31:50Header compte conditionnel (snippets / jetons)Affichez « Connexion » ou « Mon compte » dans le header selon l’état de session, via un snippet HTML et les jetons {{​​​​account_if_guest}} / {{​​​​account_if_logged_in}}.
Pour les utilisateurs
- Dans un snippet HTML (ou le gabarit) : entourez le bouton Connexion avec {{​​​​account_if_guest}}…{{​​​​/account_if_guest}} et Mon compte avec {{​​​​account_if_logged_in}}…{{​​​​/account_if_logged_in}}.
- Jetons utiles : {{​​​​account_account_url}}, {{​​​​account_user_name}}, {{​​​​account_logout_url}}, {{​​​​account_logged_in}} (1 ou vide).
- Placez {{​​​​snippet:votre_cle}} dans le header du gabarit.
- Alternative prête à l’emploi : {{​​​​account_strip}} (bandeau lw-admin).
- Snippets PHP : variable $lw_db + lw_public_accounts_viewer().

Pourquoi
- DormezChezNous et thèmes importés veulent un bouton Bootstrap/modal personnalisé, pas le bandeau générique.

Détail technique
- lw_public_accounts_apply_conditional_blocks() dans apply_tokens ; $lw_db exposé aux snippets PHP.
v1.1.62026-08-08 17:25:08Correction AJAX modals compte (thèmes Homelengo)La connexion depuis un modal ne réagissait pas au clic : le script compte intercepte maintenant le clic avant les scripts du thème, affiche les erreurs (retrait de d-none) et indique le chargement sur le bouton.
Pour les utilisateurs
- Le bouton « Connexion » dans le modal répond de nouveau : texte « … » pendant l’envoi, message d’erreur visible en rouge si échec, rechargement de la page si succès.
- Aucun changement requis dans votre HTML si data-lw-account et data-lw-account-error sont déjà en place.

Pourquoi
- Les thèmes importés (Homelengo / DormezChezNous) enregistrent des écouteurs qui bloquaient l’événement submit avant notre script ; les erreurs restaient aussi cachées par la classe Bootstrap d-none.

Détail technique
- lw-account-forms.js v3 : capture click + submit, chargé en dernier avant </body>.
- Retrait automatique de d-none sur data-lw-account-error.
v1.1.52026-08-08 17:13:29Connexion et inscription en AJAX (modals)Les formulaires compte dans une fenêtre modale (Bootstrap ou autre) peuvent être envoyés sans recharger toute la page : les erreurs s’affichent dans le modal, et la page se met à jour après une connexion réussie.
Pour les utilisateurs
- Si votre formulaire login/register est dans un modal (.modal ou role="dialog"), la soumission se fait en AJAX automatiquement — plus de redirection vers /connexion/ qui casse l’expérience.
- Placez un emplacement d’erreur : <div data-lw-account-error></div> dans le modal.
- Forcer ou désactiver : data-lw-account-ajax="1" ou "0" sur le <form>.
- Après succès : par défaut rechargement de la page (menu compte à jour) ; data-lw-account-on-success="redirect" pour aller vers Mon compte.
- Le captcha inscription est rafraîchi automatiquement après une erreur.

Pourquoi
- DormezChezNous et thèmes similaires ouvrent login/inscription en popup : un POST classique rechargeait toute la page.

Détail technique
- lw-account-forms.js injecté quand data-lw-account est présent.
- Réponses JSON côté serveur (lw_public_accounts_handle_post) ; hook index.php pour POST depuis n’importe quelle page.
v1.1.42026-08-08 16:54:04Formulaires compte personnalisés (data-lw-account)Vous pouvez utiliser vos propres formulaires HTML de connexion et d’inscription dans le template : le moteur les branche automatiquement et expose les messages d’erreur via des jetons ou des emplacements dédiés.
Pour les utilisateurs
- Marqueur sur le <form> : data-lw-account="login" ou "register" (aussi forgot, reset, profile, security).
- Champs : data-lw-account-field="email|password|…" ou détection par id/name/placeholder (comme le contact).
- Erreurs : {{​​​​account_error_text}} dans votre HTML, ou <div data-lw-account-error></div>.
- Succès : {{​​​​account_success_text}} ou data-lw-account-success.
- Remplacez {{​​​​account_login}} par votre markup sur la page coquille /connexion/ si vous ne voulez pas le formulaire lw-admin par défaut.
- Inscription : emplacement <div class="lw-account-captcha-slot"></div> pour le captcha.
- OAuth optionnel : <div data-lw-account-oauth></div>.

Pourquoi
- DormezChezNous et autres thèmes importés gardent leur design Bootstrap sans dupliquer la logique compte.

Détail technique
- account_forms.php (même principe que data-lw-contact).
- CSRF + lw_account_action injectés ; action POST vers /connexion/, /inscription/, etc.
v1.1.32026-08-08 12:47:55Éditeurs HTML avec coloration et tabulationTous les champs HTML et code de l’admin bénéficient de la coloration syntaxique et de l’indentation à la touche Tab (4 espaces), y compris la vue « code source » de TinyMCE.
Pour les utilisateurs
- Champs HTML bruts (en-tête, pied de page, snippets, templates, CSS personnalisé, etc.) : numéros de ligne, coloration, Tab pour indenter.
- Éditeur riche TinyMCE : le bouton « code source » ouvre la même expérience colorée.
- Thèmes importés : édition HTML directe avec coloration.

Pourquoi
- Faciliter la lecture et l’édition du markup sans IDE externe.
- Tab insère une indentation cohérente ; Maj+Tab la réduit.

Détail technique
- Module lw-code-editor.js (CodeMirror 5 via CDN).
- Modes html, css et php selon le champ.
- Compatible navigation app-shell (réinit après changement de page).
v1.1.22026-08-08 11:37:45Mise à jour CMS in-app et alerte footerLes installations distantes voient un avertissement visible dans le pied de page admin lorsqu’un package plus récent existe, et peuvent installer la mise à jour depuis Réglages → Versions sans ré-uploader manuellement les fichiers.
Pour les utilisateurs
- Pied de page admin : badge « Mise à jour disponible (vX.Y.Z) » lorsqu’un paquet VersionLog plus récent est publié sur repo.ludiware.com.
- Réglages → Versions : bandeau avec bouton « Mettre à jour maintenant » (téléchargement + déploiement automatique).
- Fichiers locaux préservés : config.local.php, config.php (seule la ligne Version est mise à jour), uploads/, storage/, extensions installées.

Pourquoi
- Éviter les mises à jour manuelles FTP/SFTP sur chaque site hébergé.
- Rendre visible une version obsolète (ex. 1.0.53 vs 1.1.x) sans fouiller l’historique.

Détail technique
- lw_cms_update_apply() : télécharge ZIP/tar.gz depuis repo.ludiware.com, extrait et copie le core.
- lw_versionlog_check_update() inchangé (cache 30 min).
- Badge sidebar Réglages + alerte chrome pour les gestionnaires.
v1.1.12026-08-08 11:30:24Historique : jetons et accolades lisiblesLes entrées VersionLog n’affichent plus de codes HTML bruts ({) : les jetons {{​​​​account_login}} et similaires apparaissent normalement.
Pour les visiteurs
- Page Historique : les exemples de jetons CMS s’affichent comme du texte (accolades visibles), sans entités HTML encodées en double.

Pourquoi
- Certaines entrées VersionLog mentionnaient des entités HTML ({) dans leur texte ; htmlspecialchars() les affichait telles quelles à l’écran.

Détail technique
- lw_versionlog_prepare_display_source() : décodage des entités d’accolades avant neutralisation zero-width space et lw_e().
v1.1.0 Package2026-08-08 11:28:14ludiWARE 1.1.0 — distribution publiqueRelease mineure 1.1.0 : package d’installation complet (ZIP + tar.gz), comptes publics OAuth, historique des versions sur la vitrine, formulaire contact prérempli, et plugins MarketPlace à jour.
Pour les utilisateurs
- Téléchargement : ludiware-1.1.0.tar.gz + ludiware-1.1.0.zip
- Dépôt : https://repo.ludiware.com/releases/1.1.0/
- Assistant /install/ inclus (base de données, schéma, compte admin)

Depuis la distribution 1.0.40
- Comptes membres locaux : inscription, connexion, mot de passe oublié, Mon compte (onglets profil / sécurité)
- OAuth Google et Facebook sur la vitrine
- Header public reconnaît la session lw-admin et les membres OAuth
- Jeton {{​​​​versionlog}} : historique des versions sur le site public
- Formulaire contact : nom et courriel préremplis si connecté
- Bootstrap Icons + sélecteur d’icônes admin
- Plugins MarketPlace : FAQ, Témoignages, Galerie, Formulaires, Réservation, Annonces classées, Forums

Plugins republication (MarketPlace)
- Forums 1.0.16
- Annonces classées 1.0.15

Détail technique
- Export OSS sans secrets ni outils usine ; FileName VersionLog → tar.gz public.

Télécharger le package

v1.0.612026-08-08 11:25:48Historique : jetons affichés normalementLes exemples {{​​​​account_login}} dans l’historique des versions s’affichent comme du texte lisible, sans entités HTML visibles ({).
Pour les visiteurs / administrateurs
- Page Historique et Réglages → Versions : les jetons cités en exemple apparaissent comme {{​​​​account_login}}, pas comme {{​​account_login}}.

Pourquoi
- L’échappement HTML des accolades en entités, puis htmlspecialchars(), doublait l’encodage et affichait les codes bruts à l’écran.

Détail technique
- Neutralisation zero-width space seule (sans entités {) dans lw_versionlog_format_display_text() et lw_versionlog_shield_public_html().
v1.0.602026-08-08 11:24:31Contact : nom et courriel préremplis si connectéSur le formulaire de contact, les champs Nom et Courriel sont remplis automatiquement lorsque le visiteur est déjà connecté (compte local, lw-admin ou portail CDS).
Pour les utilisateurs
- Formulaire {{​​​​contact_form}} et formulaires contact des thèmes ZIP : Nom et Courriel préremplis si vous êtes connecté.
- Les champs déjà remplis dans le gabarit ne sont pas écrasés.

Pourquoi
- Éviter de ressaisir son identité à chaque message contact.

Sources
- Portail CDS (session SSO) : nom complet + courriel du contact.
- Compte membre public ou cookie lw-admin : display_name + courriel lw_users.

Détail technique
- lw_contact_prefill_identity(), lw_contact_apply_prefill_to_form(), lw_contact_form_html().
v1.0.592026-08-08 11:20:46Jeton {{​​​​versionlog}} actif sur la vitrineLe jeton {{​​​​versionlog}} est désormais reconnu sur le site public : la page Historique affiche la liste des versions au lieu du texte brut du jeton.
Pour les visiteurs
- Page Historique : le contenu {{​​​​versionlog}} est remplacé par la liste des versions (styles et textes sécurisés).

Pourquoi
- Le module VersionLog n’était chargé que dans lw-admin ; sur index.php (front public), lw_versionlog_prepare_public_html() n’existait pas et le jeton restait affiché tel quel.

Détail technique
- require versionlog.php dans www/index.php avant public_render.php.
v1.0.582026-08-08 11:07:13Historique public : jetons CMS affichés en texteSur la page Historique du site ludiware.com, les mentions {{​​​​account_login}}, {{​​​​menu:main}}, etc. dans les entrées VersionLog s’affichent en texte au lieu d’injecter formulaires ou menus.
Pour les visiteurs
- Page Historique (/historique/) : titre, description et détails d’une version montrent les jetons cités en exemple (documentation), sans formulaire de connexion ni menu injecté au milieu du texte.

Pourquoi
- Le contenu VersionLog est rendu via un snippet PHP puis repasse dans le moteur de jetons CMS ; les exemples {{​​​​account_login}} étaient exécutés comme de vrais jetons.

Détail technique
- Jeton {{​​​​versionlog}} / {{​​​​versionlog_list}} natif ; protection des blocs .lw-vl-* avant le pipeline de jetons ; entités HTML pour {{​​​​ et }} à l’affichage.
v1.0.572026-08-08 10:58:52Historique des versions : jetons CMS affichés en texteLes mentions {{​​​​account_login}}, {{​​​​menu:main}}, etc. dans les détails techniques du VersionLog ne sont plus interprétées comme des jetons CMS.
Pour les administrateurs
- Réglages → Historique des versions : titre, description et détails complets affichent les jetons tels quels (documentation), sans formulaire ni contenu injecté.

Pourquoi
- Les entrées VersionLog citent souvent des jetons en exemple dans la section « Détail technique » ; le moteur de jetons ne doit pas les exécuter à l’affichage.

Détail technique
- Neutralisation {{​​​​ → {{​​​​ + zero-width space à la sortie API et côté lw-admin ; affichage HTML échappé.
v1.0.562026-08-08 10:54:16Header public : reconnaissance de la session lw-adminConnecté à lw-admin, vous apparaissez aussi comme membre sur le site public (header, Mon compte), comme pour les commentaires au blogue.
Pour les visiteurs / administrateurs
- Si vous êtes connecté à lw-admin (cookies), le bandeau {{​​​​account_strip}} affiche votre nom et le lien « Accéder à mon compte ».
- /mon-compte/ est accessible sans repasser par /connexion/.
- /connexion/ et /inscription/ redirigent vers Mon compte si vous êtes déjà reconnu.

Priorité d’identité (inchangée pour le blogue si session Facebook active)
1. Session membre public (connexion / OAuth)
2. Cookie lw-admin

Déconnexion sur le site public : ferme la session membre ; si seul lw-admin reste actif, vous restez connecté (comportement voulu).
v1.0.552026-08-08 10:38:20Blogue et forums : identité membre public prioritaireSur le site public, la session membre (connexion / Facebook / Google) prime désormais sur les cookies admin lw-admin pour commenter au blogue.
Problème corrigé
- Header « Vous êtes connecté en tant que… » (session membre) et blogue « Vous commentez en tant que… » (cookies admin) pouvaient afficher deux personnes différentes si vous étiez connecté à lw-admin et via Facebook sur le site public.

Comportement
- Priorité : portail CDS → membre public (session) → staff admin (cookie lw-admin).
- Le blogue propose le lien Connexion vers /connexion/ lorsque les comptes locaux sont actifs (sans CDS).

Note
- Si Facebook a créé un second compte lw_users (courriel différent de l’admin), c’est normal : deux profils distincts. Vous pouvez fusionner manuellement ou supprimer le doublon dans Utilisateurs.
v1.0.542026-08-08 10:11:29OAuth — URL de redirection stableL’URL de callback Google/Facebook affichée dans les réglages utilise désormais le domaine du site (ex. ludiware.com), pas l’hôte de l’admin.
Pour les administrateurs
- Dans Réglages → Comptes membres, l’URL « redirection autorisée » correspond au domaine public du site.
- Note d’aide pour l’enregistrement de l’URI dans Facebook Login → Valid OAuth Redirect URIs.

Pourquoi
- Depuis le panneau admin (autre sous-domaine), l’URL générée pouvait différer de celle réellement utilisée sur le site public.
v1.0.532026-08-08 10:03:23Connexion Google et Facebook pour les membresLes visiteurs peuvent se connecter ou s'inscrire avec Google ou Facebook sur les pages connexion et inscription, sans portail CentreDeService. Un compte local est créé automatiquement s'il n'existe pas encore.
Pour les visiteurs
- Boutons « Se connecter avec Google » et « Se connecter avec Facebook » sur /connexion/ et /inscription/.
- Si le courriel n'est pas encore inscrit, un profil membre est créé et la session est ouverte.
- Si un compte existe déjà avec le même courriel, le profil OAuth est lié au compte existant.

Pour les administrateurs
- Onglet Comptes membres des réglages site : activation, identifiants OAuth et URL de redirection à copier dans Google Cloud / Facebook Developer.
- Désactivé automatiquement lorsque le portail CentreDeService gère l'authentification.

Détail technique
- Colonnes lw_users google_id / facebook_id, module oauth_accounts.php, callbacks /oauth/{provider}/callback/.
v1.0.522026-08-08 08:35:18Sélecteur d'icônes — catalogue completLe sélecteur d'icônes affiche d'abord une sélection utile, puis toutes les icônes Bootstrap (~1 600) via la recherche.
Pour les administrateurs
- À l'ouverture : grille de favoris (maison, commerce, transport, etc.).
- Recherche : filtre sur l'ensemble des ~1 683 icônes Bootstrap Icons installées.
- Compteur de résultats et message si la liste est tronquée.

Correction
- La liste n'était limitée qu'à 120 icônes en ordre alphabétique (123, alarm…), ce qui paraissait incomplet.
v1.0.512026-08-08 08:29:09Bootstrap Icons et sélecteur d'icônesLes icônes Bootstrap s'affichent correctement partout dans l'admin grâce aux polices complètes. Un sélecteur d'icônes réutilisable est disponible pour les formulaires (recherche, grille, aperçu).
Pour les administrateurs
- Polices Bootstrap Icons (woff/woff2) installées : les icônes `bi-*` déjà utilisées dans lw-admin s'affichent de façon fiable.
- Nouveau composant « sélecteur d'icônes » (`lw_icon_picker_field`) utilisable dans tout formulaire admin.

Utilisation
- Bouton avec aperçu de l'icône, recherche par nom, grille cliquable, option « Aucune icône ».
- Fonction PHP `lw_bootstrap_icon_names()` et normalisation `lw_bootstrap_icon_class()`.

Détail technique
- Fichiers : `functions/icon_picker.php`, `js/lw-icon-picker.js`, styles dans `lw-admin.css`.
v1.0.502026-08-08 07:27:10Mon compte — onglets profil et sécuritéLa page Mon compte propose deux onglets : Mes informations (prénom, nom, avatar) et Accès et sécurité (courriel, mot de passe). Nouveaux jetons pour gabarits ZIP.
Pour les utilisateurs
- Onglet Mes informations : prénom, nom de famille, téléversement d’avatar.
- Onglet Accès et sécurité : changement de courriel et/ou mot de passe (mot de passe actuel requis).

Jetons ZIP
- {{​​​​account_panel}} : panneau complet avec onglets.
- {{​​​​account_tabs}}, {{​​​​account_profile}}, {{​​​​account_security}} : mise en page personnalisée.
- {{​​​​account_avatar}}, {{​​​​account_avatar_url}}, {{​​​​account_first_name}}, {{​​​​account_last_name}}, {{​​​​account_email}}.
- {{​​​​account_profile_url}}, {{​​​​account_security_url}} : liens directs vers chaque onglet.

Détail technique
- Colonne lw_users.avatar_path, fichiers dans uploads/users/, session vitrine synchronisée après mise à jour.
v1.0.492026-08-08 07:17:18Comptes vitrine unifiés dans lw_usersInscription, connexion et mot de passe oublié sur la vitrine utilisent désormais la table lw_users (comme lw-admin). Seuls les comptes avec accès admin peuvent ouvrir lw-admin.
Pour les utilisateurs
- Même courriel et mot de passe partout : admin ou visiteur inscrit sur /inscription/.
- Les comptes créés sur la vitrine ont le rôle user et ne peuvent pas accéder à lw-admin.
- Les administrateurs se connectent aussi sur /connexion/ avec leurs identifiants habituels.

Pourquoi
- Suppression du double système lw_site_members / lw_users introduit par erreur.

Détail technique
- public_accounts.php : auth, inscription et reset sur lw_users ; session vitrine par site.
- auth.php inchangé : can_access_admin requis pour lw-admin.
- Table obsolète lw_site_members : peut être supprimée en base (DROP TABLE).
v1.0.482026-08-08 07:11:33Connexion vitrine avec un compte administrateurLes administrateurs du site peuvent se connecter sur la vitrine publique (/connexion/) avec le même courriel et mot de passe que lw-admin, sans inscription séparée.
Pour les utilisateurs
- Sur /connexion/, un compte administrateur global ou assigné au site est accepté avec les identifiants lw-admin.
- La première connexion crée automatiquement le profil membre local du site ; les connexions suivantes réutilisent ce profil.

Pourquoi
- Avant ce correctif, seuls les comptes inscrits via /inscription/ (table lw_site_members) étaient reconnus ; le premier admin recevait « Courriel ou mot de passe incorrect ».

Détail technique
- Pont lw_users → lw_site_members dans lw_public_accounts_login() : vérification mot de passe admin, accès site (global_admin ou local_admin membre du site), synchronisation du hash et de la session membre.
v1.0.472026-08-08 06:52:34Comptes membres locaux sur la vitrineLes sites sans portail CentreDeService peuvent proposer inscription, connexion, mot de passe oublié et espace membre sur la vitrine publique, avec jetons pour gabarits ZIP et pages coquilles CMS.
Pour les utilisateurs
- Inscription sur /inscription/ avec captcha et confirmation du mot de passe.
- Connexion sur /connexion/, récupération sur /mot-de-passe-oublie/ et réinitialisation par lien courriel.
- Espace « Mon compte » une fois connecté ; bandeau {{​​​​account_strip}} dans le header.

Pour les administrateurs
- Onglet Réglages → Comptes membres : coquilles CMS et bouton « Générer les pages système ».
- Menu éditeur : Ajouter membre (Connexion, Mot de passe oublié, Inscription, Mon compte) si CDS inactif.
- Jetons ZIP : {{​​​​account_login}}, {{​​​​account_register}}, {{​​​​account_panel}}, {{​​​​account_forgot}}, {{​​​​account_reset}} et URLs associées.

Pourquoi
- Permettre aux vitrines ludiWARE autonomes (sans CDS) d’offrir des comptes visiteurs pour commentaires, contenus réservés ou personnalisation future.

Détail technique
- Table lw_site_members, CSRF session, captcha inscription distinct du contact, routes try_serve, public_render apply_tokens.
v1.0.462026-08-07 12:59:32Captcha contact : correction des réponses valides rejetéesLorsqu’une page ou un gabarit contient plusieurs formulaires contact, la même question de vérification s’affiche partout et la bonne réponse est acceptée.
Pour les utilisateurs
- Le captcha « Combien font X + Y ? » est identique sur tous les formulaires contact d’une même page.
- Une réponse correcte n’est plus rejetée avec « Vérification de sécurité incorrecte ».

Pourquoi
- Chaque formulaire recevait parfois une question différente alors que la session ne mémorise qu’une seule réponse (contenu + gabarit finalisés séparément).

Détail technique
- lw_contact_captcha_issue() réutilise le défi session valide ; finalisation contact une seule fois sur le HTML complet (public_render.php).
v1.0.452026-08-07 12:15:48Jetons blogue : derniers articles (footer / sidebar)Placez dans un gabarit ou une page les jetons {{​​​​blog-latest-title-1}}, {{​​​​blog-latest-image-1}}, {{​​​​blog-latest-excerpt-1}}, etc. (jusqu’à 10) pour afficher les articles les plus récents.
Pour les utilisateurs
- {{​​​​blog-latest-title-N}} : titre (N=1 = plus récent, 2 = avant-dernier, … jusqu’à 10)
- {{​​​​blog-latest-image-N}} : URL de l’image à la une
- {{​​​​blog-latest-excerpt-N}} : extrait du corps de l’article
- {{​​​​blog-latest-date-N}} : date courte (ex. 15 avril 2020)
- {{​​​​blog-latest-date-long-N}} : date longue
- {{​​​​blog-latest-url-N}} : lien vers l’article
- Idéal pour un bloc « Blogue » en pied de page ou barre latérale, comme dans un thème ZIP importé.

Pourquoi
- Personnaliser le footer sans dupliquer manuellement les titres et images des articles.

Détail technique
- lw_blog_apply_latest_tokens() dans blog.php, appelé depuis lw_blog_apply_tokens() sur gabarits et pages.
v1.0.442026-08-07 12:10:34Contact thème : messages d’erreur et champ SujetLes formulaires contact des thèmes ZIP affichent à nouveau le vrai message d’erreur (captcha, champs manquants, etc.) et le champ Sujet du thème est bien pris en charge.
Pour les utilisateurs
- Après un envoi raté, le message précis s’affiche (ex. captcha incorrect) au lieu du générique « Envoi impossible. Vérifiez les champs. »
- Le champ Sujet des formulaires de thème (ex. msg_subject, placeholder ou label « Sujet ») est enregistré et reçu par courriel.
- Les champs sans attribut name mais avec placeholder/label (Votre nom, Votre courriel…) sont reconnus à l’import et au rendu.

Pourquoi
- lw_contact_form_html() effaçait le flash session avant l’affichage des formulaires thème.
- Certains thèmes nomment le sujet autrement que subject.

Détail technique
- public_render.php : lw_contact_form_html() seulement si {{​​​​contact_form}} est présent.
- contact_forms.php : alias msg_subject, détection placeholder/label, fallbacks nom/courriel.
v1.0.432026-08-07 12:04:45Correction erreur 500 sur les pages contact (thèmes ZIP)Les pages « Nous joindre » importées depuis un template ZIP ne provoquent plus d’erreur serveur lorsque le bouton Envoyer est imbriqué dans la grille du thème (Bootstrap, etc.).
Pour les utilisateurs
- Les pages contact personnalisées d’un thème importé s’affichent à nouveau normalement, avec captcha et envoi vers la boîte Messages.
- Avant la correction, certaines pages (ex. formulaire dans des colonnes Bootstrap) renvoyaient une erreur HTTP 500.

Pourquoi
- Lors du branchement du formulaire thème, l’emplacement du captcha était inséré au mauvais niveau du DOM lorsque le bouton Envoyer n’était pas enfant direct du <form>.

Détail technique
- contact_forms.php : lw_contact_wire_form_element() insère le slot captcha via le parent immédiat du bouton submit au lieu de form->insertBefore() sur un nœud imbriqué.
v1.0.422026-08-07 09:41:46Pages boutique CDS personnalisables (coquilles et jetons)Comme pour le blogue, vous pouvez choisir des pages CMS comme coquilles pour le magasin, les catégories, les fiches produit, le panier et les commandes, puis y placer des jetons granulaires (titre, prix, image, liste, etc.).
Pour les utilisateurs
- Dans Réglages du site → CentreDeService.NET, section « Pages coquilles boutique », associez une page CMS à chaque type d’écran (/boutique/, catégorie, produit, panier, commande).
- Sans coquille, le rendu CDS par défaut reste inchangé.
- Sur une coquille produit : {{​​​​cds_product_title}}, {{​​​​cds_product_image}}, {{​​​​cds_product_price}}, {{​​​​cds_product_desc}}, {{​​​​cds_product_add_cart}}, ou {{​​​​cds_product}} pour la fiche complète.
- Sur une liste / catégorie : {{​​​​cds_shop_list}} (bloc complet), ou {{​​​​cds_shop_categories}}, {{​​​​cds_shop_products}}, {{​​​​cds_shop_pager}}, {{​​​​cds_category_title}}.
- Panier / commande : {{​​​​cds_cart}}, {{​​​​cds_order}}, {{​​​​cds_cart_count}}.

Pourquoi
- Permettre une mise en page boutique alignée sur le thème du site, sur le même modèle que les jetons blogue.

Détail technique
- Coquilles : cds_shop_*_page_uid ; lw_cds_resolve_shell_page dans lw_cds_try_serve.
- Jetons : lw_cds_apply_shop_field_tokens + contexte dans lw_cds_apply_tokens.
v1.0.412026-08-07 09:03:11Formulaires contact des templates ZIP reliés au CMSLes formulaires de contact déjà présents dans un thème importé peuvent envoyer leurs messages via le moteur contact de lw-admin, sans remplacer le design du thème. À l’import, la détection est automatique ; vous pouvez aussi forcer avec data-lw-contact="1".
Pour les utilisateurs
- Un formulaire contact du thème (classes / mailto / champs nom-email-message) est branché sur la boîte Messages et l’e-mail de notification.
- L’apparence du formulaire (HTML/CSS du thème) est conservée.
- Marqueur manuel : data-lw-contact="1" force le branchement ; data-lw-contact="0" l’exclut.
- Captcha et messages de succès/erreur s’affichent comme pour {{​​​​contact_form}}.

Pourquoi
- Éviter de remplacer un beau formulaire de thème par le HTML générique {{​​​​contact_form}}.

Détail technique
- lw_contact_wire_form_html (import) ; lw_contact_finalize_bound_forms (rendu) ; alias de champs dans lw_contact_submit.
v1.0.40 Package2026-08-06 13:07:30ludiWARE 1.0.40 — package d’installationDistribution publique complète (ZIP + tar.gz) avec installateur. Inclut les évolutions récentes : blogue (jetons, URLs par catégories, sous-catégories), page 404 CMS, médiathèque globale, menus / import ZIP, et corrections d’affichage.
Pour les utilisateurs
- Package téléchargeable pour installer ou mettre à jour ludiWARE.
- Archives : ludiware-1.0.40.tar.gz et ludiware-1.0.40.zip
- Dépôt : https://repo.ludiware.com/releases/1.0.40/
- Assistant /install/ inclus (base de données, schéma, compte admin)

Contenu notable depuis la dernière distribution
- Blogue : jetons auteur / date longue / heure / commentaires / catégories ; URLs /blogue/catégorie/sous-catégorie/slug ; sous-catégories en admin ; accord « commentaire »
- Page 404 CMS désignée + pastille ; import ZIP (chrome, méga-menus, détection 404)
- Médiathèque globale et dossiers ; menus actifs ; déduplication header

Pourquoi
- Fournir un paquet installable aligné sur la version courante du CMS.

Détail technique
- Export OSS (sans secrets, sans api/admin usine) ; FileName VersionLog pointant vers le tar.gz public.

Télécharger le package

v1.0.392026-08-06 13:01:02Singulier « commentaire » quand il y en a 0 ou 1Dans la liste des articles du blogue, on affiche « 0 commentaire » ou « 1 commentaire » (sans s), et le pluriel seulement à partir de 2.
Pour les utilisateurs
- Meta des cartes d’articles : accord correct du mot commentaire (0/1 au singulier).

Pourquoi
- « 0 commentaires » était grammaticalement incorrect en français.

Détail technique
- lw_blog_format_comments_count : singulier si count <= 1 (FR).
v1.0.382026-08-06 13:00:31Sous-catégories de blogue plus simples à créerDans lw-admin, chaque catégorie propose un bouton pour ajouter une sous-catégorie. Le champ « Catégorie parente » est mis en avant, avec la liste en arborescence.
Pour les utilisateurs
- Liste des catégories : icône « diagramme » pour créer une sous-catégorie déjà rattachée à la bonne parente.
- Formulaire : champ parent en premier, aide sur l’URL /blogue/parente/enfant/…
- Pastille « Sous-catégorie » et colonne Parente dans le tableau.

Pourquoi
- La hiérarchie existait déjà en base, mais était trop discrète dans l’interface.

Détail technique
- blogcats.php (?new=1&parent=uid) ; clés i18n blog.cat_* ; invalidation cache catégories.
v1.0.372026-08-06 12:51:12URLs blogue avec catégories imbriquéesLes articles sont désormais accessibles via /blogue/catégorie/sous-catégorie/slug-article. Les anciennes adresses /blogue/slug redirigent automatiquement vers la nouvelle URL.
Pour les utilisateurs
- URL d’un article : /blogue/{catégorie}/{sous-catégorie}/{slug} selon la hiérarchie des catégories.
- Sans catégorie : /blogue/{slug} comme avant.
- Listes de catégories : /blogue/{catégorie}/{sous-catégorie} (l’ancien préfixe /blogue/categorie/… redirige).
- Les liens liste, commentaires, sitemap et l’admin utilisent la nouvelle structure.

Pourquoi
- Refléter l’arborescence des catégories dans l’URL, plus claire pour le SEO et la navigation.

Détail technique
- lw_blog_post_url / lw_blog_post_path_extra ; résolution de chemin dans lw_blog_try_serve ; redirections 301.
v1.0.362026-08-06 12:48:37Nouveaux jetons blogue (auteur, date, commentaires…)Les gabarits d’article peuvent afficher le nombre de commentaires, l’auteur, une date longue, l’heure de publication et la liste des catégories. Un champ Auteur a été ajouté à l’édition des articles.
Pour les utilisateurs
- Nouveaux jetons : {{​​​​blog_comments_count}} (chiffre), {{​​​​blog_author}}, {{​​​​blog_date_long}} (ex. Jeudi le 3 septembre 2024), {{​​​​blog_time}} (HH:MM), {{​​​​blog_categories}} (liste des catégories publiées).
- {{​​​​blog_date}} reste au format AAAA-MM-JJ.
- Champ « Auteur » à la création / édition d’un article, utilisé par {{​​​​blog_author}}.

Pourquoi
- Permettre des mises en page d’articles plus riches sans HTML figé.

Détail technique
- Colonne author_name ; helpers lw_blog_format_date_long / lw_blog_render_categories_token_list ; jetons documentés dans templates.php.
v1.0.352026-08-06 11:32:25Page 404 CMS : affichage corrigé + pastilleLa page désignée comme 404 s’affiche correctement (y compris sur un site encore en brouillon / en aperçu). Dans la liste des pages, une pastille « 404 » apparaît comme pour l’accueil. À l’import ZIP, les pages d’erreur 404 sont détectées automatiquement.
Pour les utilisateurs
- Si vous cochez « Utiliser comme page 404 », une URL inconnue affiche cette page (thème du site), et non le 404 sombre générique.
- Cela fonctionne aussi en aperçu et tant que le site est en brouillon.
- Liste des pages : pastille orange « 404 » à côté du statut, comme la pastille Accueil.
- Nouveaux imports ZIP : une page nommée 404 / not-found est assignée automatiquement.

Pourquoi
- Le rendu de la page 404 ignorait le mode aperçu et refusait les sites brouillon (« Site non publié »), ce qui forçait le repli générique.

Détail technique
- lw_public_site_404(..., $preview) ; rendu forcé en mode aperçu si site brouillon ; badge pages.badge_404 ; auto page_404_page_uid à l’import ZIP.
v1.0.342026-08-06 11:26:54Import ZIP : plus de header en double dans les pagesÀ l’import d’un template, le header (et les wrappers du même type) est retiré du contenu des pages lorsqu’il est déjà placé dans l’en-tête global. Les sites déjà importés sont nettoyés à l’affichage.
Pour les utilisateurs
- Les pages importées ne gardent plus une copie du menu/header dans leur contenu si le chrome global est actif.
- Les templates sans balise <header> (ex. #header / .header-area) sont aussi pris en charge.

Pourquoi
- Le strip était trop strict (vote majoritaire, wrappers non sémantiques ignorés) ; des restes restaient dans le HTML des pages.

Détail technique
- Détection structurelle + affixe normalisé (ignore active) ; strip/dedupe DOM élargi ; nettoyage au rendu public.
v1.0.332026-08-06 11:16:07Menu : item courant correctement mis en évidenceSur les sites (y compris templates importés), l’item de menu actif suit la page affichée au lieu de rester figé sur Accueil.
Pour les utilisateurs
- En visitant « À propos » (ou une autre page), c’est cet item qui apparaît sélectionné, plus Accueil.
- Les parents d’un sous-menu actif restent aussi mis en évidence.

Pourquoi
- À l’import, la classe active de la page d’accueil était recopiée telle quelle dans le menu CMS, sans recalcul selon l’URL.

Détail technique
- Rendu menu : strip des classes active/current importées, marquage selon page_uid ou chemin courant, aria-current=page.
v1.0.322026-08-06 11:00:39Correction « Nouveau dossier » médiasChoisir « Nouveau dossier » dans la médiathèque affiche correctement le champ pour nommer le dossier, y compris après navigation dans l’admin.
Pour les utilisateurs
- Le champ texte sous « Nouveau dossier » réapparaît bien à la sélection.

Pourquoi
- Le script ne se rattachait pas après le chargement des pages en mode app (navigation sans rechargement complet).

Détail technique
- Délégation d’événements + réinit sur lw:fragment-loaded (lw-media-folder.js v2).
v1.0.312026-08-06 10:50:19Médiathèque globale et dossiersVous pouvez déposer des images partagées (logos, etc.) une seule fois dans Bibliothèque → Médias globaux, puis les réutiliser sur tous les sites. Le choix du dossier à l’upload propose la liste des dossiers existants ou « Nouveau dossier ».
Pour les utilisateurs
- Nouvelle section Bibliothèque → Médias globaux : upload et gestion des images partagées.
- Dans la médiathèque d’un site, l’onglet Globaux affiche ces fichiers en lecture (copie d’URL) ; les admins plateforme peuvent ouvrir Gérer.
- À l’upload ou à l’édition, le champ Dossier est une liste déroulante (aucun / existants / Nouveau dossier + champ texte).

Pourquoi
- Éviter de réimporter le même logo dans chaque site.
- Clarifier le classement par dossiers sans taper le nom à chaque fois.

Détail technique
- lw_media.site_id NULL = global ; fichiers sous uploads/global/ ; référence unique (pas de copie par site).
v1.0.302026-08-06 09:59:30Import ZIP : mega-menus préservésÀ l’import d’un template ZIP, les mega-menus (panneaux riches avec colonnes, images, CTA) et les attributs Bootstrap des menus déroulants sont conservés et restitués correctement.
Pour les utilisateurs
- Les templates avec mega-menus (ex. panneaux pleine largeur, grilles, images) gardent leur apparence après import.
- Les menus déroulants Bootstrap conservent leurs options (data-bs-toggle, etc.).
- Si un item a un panneau mega, une zone HTML dédiée apparaît dans Menus pour l’ajuster (en attendant l’extension mega-menu).

Pourquoi
- L’import ne lisait que les sous-listes <ul> ; les panneaux en <div class="dropdown-menu"> étaient perdus à la tokenisation {{​​​​menu:…}}.

Détail technique
- Nouveaux champs item : panel_html, link_attrs, label_html ; détection à l’harvest ; rendu a+panneau ; rewrite des URLs du panneau à la persistance.
v1.0.292026-08-06 09:42:25Correction sauvegarde en-tête / pied (doublon)Enregistrer l’en-tête et le pied de page d’un template ZIP ne duplique plus le footer sous le copyright.
Pour les utilisateurs
- La sauvegarde de « En-tête & pied de page » ne laisse plus apparaître un second footer non stylé.
- Les sites déjà touchés par le bug sont corrigés à l’affichage (et définitivement en réenregistrant le chrome).

Pourquoi
- Le parseur prenait le premier </div> interne du footer pour couper le bloc, puis recopait le reste après le pied de page.

Détail technique
- Extraction after_footer via DOM ; seuls script/style/link/noscript sont conservés ; repair au rendu public.
/

Historique des versions de la plateforme ludiWARE (plus récent en premier).

v1.2.12026-08-09 16:47:35Mon compte extensible et lightbox annoncesLes plugins peuvent ajouter des onglets à Mon compte (ex. Mes annonces). Les pages publiques injectent correctement le script de la galerie photos en fin de HTML.
Pour les utilisateurs
- Mon compte : les extensions peuvent proposer de nouveaux onglets via le CMS (URL ?tab=…).
- Annonces classées 1.2.12 : onglet « Mes annonces » avec modifier, supprimer et marquer comme vendue.
- Lightbox des photos d’annonce : fonctionne aussi sur les fiches intégrées via jetons CMS (pas seulement les routes /annonces/…).

Pourquoi ce changement
- Centraliser la gestion des annonces dans Mon compte, là où les membres gèrent déjà leur profil.
- Corriger la galerie lorsque le HTML de l’annonce est rendu dans une page du site sans passer par le routeur du plugin.

Détail technique
- Filtres CMS : public_account_tabs, public_account_tab_panels, public_account_post_actions, public_accounts_handle_post, public_page_html.
- Plugin classifieds : statut sold, actions propriétaire, JS galerie defer v4.
v1.2.0 Package2026-08-09 15:29:10ludiWARE 1.2.0 — profils publics et identité membreRelease mineure 1.2.0 : packages d’installation complets (ZIP + tar.gz), profils publics des membres, noms cliquables partout, historique d’activité unifié sur le profil, et plugins Forums / Annonces classées republiés.
Pour les utilisateurs
- Téléchargement : ludiware-1.2.0.tar.gz + ludiware-1.2.0.zip
- Dépôt : https://repo.ludiware.com/releases/1.2.0/
- Assistant /install/ inclus

Nouveautés CMS (depuis 1.1.x)
- Profil public membre : /membre/{uid} (avatar, nom, date d’inscription)
- Noms des membres cliquables vers le profil (blogue, bandeau compte, extensions)
- Historique d’activité sur le profil : commentaires blogue, sujets/réponses forum, annonces et commentaires
- Filtre `public_member_profile_activity` pour les extensions

Plugins MarketPlace republiés
- Forums 1.0.18 (liens profil + activité forum)
- Annonces classées 1.2.9 (commentaires liés, activité annonces)

Détail technique
- Export OSS sans secrets ni outils usine
- FileName VersionLog → tar.gz public sur repo.ludiware.com

Télécharger le package

v1.1.142026-08-09 15:26:40Historique d’activité sur le profil publicLa page profil d’un membre affiche désormais une chronologie unifiée de ses contributions publiques : commentaires de blogue, sujets et réponses forum, annonces et commentaires sur annonces.
Pour les visiteurs
- Section « Historique d’activité » sous l’en-tête du profil (/membre/{uid}).
- Chaque ligne : date, type d’action, titre cliquable vers le contenu, extrait court si pertinent.
- Tri antichronologique (60 entrées max.), mélangeant blogue, forums et plugins actifs.

Pour les développeurs / extensions
- Nouveau filtre `public_member_profile_activity` — retourne des items `{at, kind, label, title, url, excerpt?}`.
- Helpers : `lw_public_accounts_collect_member_activity()`, `lw_public_accounts_render_member_activity_html()`, `lw_public_accounts_member_activity_item()`.
- Blogue : `lw_blog_member_public_activity()` (commentaires publiés).
- Les plugins enregistrent leurs sources via le filtre (Forums, Annonces classées).

Pourquoi
- Donner une vue d’ensemble de la présence publique d’un membre au lieu de sections isolées par extension.
v1.1.132026-08-09 15:23:12Noms des membres cliquables vers le profil publicPartout où un membre inscrit apparaît (commentaires du blogue, bandeau compte, etc.), son nom mène désormais à sa page profil publique lorsque celle-ci est visible.
Pour les visiteurs
- Clic sur le nom d’un membre local actif → page /membre/{uid} (ou /member/{uid} en anglais).
- Bandeau « Vous êtes connecté en tant que … » : le nom affiché est aussi un lien vers votre profil.
- Commentaires d’articles de blogue : auteurs membres identifiés par leur compte local.
- Invités, comptes CDS ou auteurs sans compte membre : nom affiché sans lien (comportement inchangé).

Pour les développeurs / extensions
- Helpers centralisés : `lw_public_accounts_author_context_from_row()`, `lw_public_accounts_resolve_content_author()`, `lw_public_accounts_render_author_name_html()`.
- Classe CSS partagée `lw-member-profile-link` pour les liens vers profil.

Pourquoi
- Uniformiser l’identité publique des membres sur tout le site (blogue, forums, annonces, etc.) après l’introduction des profils publics en 1.1.12.
v1.1.122026-08-09 15:17:27Profil public des membres inscritsChaque membre inscrit sur un site (comptes locaux) dispose d’une page profil publique avec avatar et nom. Les extensions peuvent y ajouter du contenu (ex. annonces publiées).
Pour les visiteurs
- URL publique : /membre/{uid} (FR) ou /member/{uid} (EN) — avatar, nom affiché, date d’inscription.
- Les profils ne sont visibles que pour les comptes membres actifs (inscription locale), pas pour les administrateurs ni le portail CentreDeService.

Pour les développeurs / extensions
- Nouveau filtre `public_member_profile_html` pour enrichir la page (le plugin Annonces classées y liste les annonces publiées).
- Helpers : `lw_public_accounts_public_profile_url()`, `lw_public_accounts_user_by_uid_public()`.

Pourquoi
- Permettre de reconnaître qui publie (annonces, forums, etc.) et de consolider l’identité publique des membres du site.
v1.1.112026-08-09 14:33:21Alertes standardisées pour l’admin et les pluginsNouveau système d’alertes unifié : messages de succès, erreur, avertissement et info affichés de façon cohérente dans lw-admin et sur le site public. Les plugins peuvent y contribuer via des hooks dédiés.
Pour les utilisateurs
- Les confirmations et erreurs dans l’administration (ex. « Annonce supprimée », « Réglages enregistrés ») s’affichent désormais en haut de page dans un bandeau uniforme, plus lisible.
- Sur le site public, les plugins peuvent afficher des messages utilisateur avec le même style visuel.

Pourquoi
- Chaque module et plugin gérait ses propres alertes (variables différentes, query strings, classes CSS propres), ce qui créait des doublons et des incohérences.

Détail technique
- Nouveau module lw-admin/functions/flash.php : lw_flash_add(), lw_flash_redirect(), lw_flash_render_html(), lw_public_flash_html().
- Hooks admin_flash et public_flash pour les extensions.
- Rétrocompatibilité avec $lwFlash et $lwPageFlashError.
- Feuille de style lw-flash.css partagée admin/public.
- Plugin Annonces classées migré en exemple (v1.2.2).
v1.1.102026-08-08 18:52:20Configuration portable site à siteconfig.php ne contient plus de secrets ni de domaine usine : base de données, courriels et surcharges d’environnement vivent dans config.local.php ; le domaine et les valeurs par défaut sont déduits automatiquement.
Pour les utilisateurs
- Copier le CMS d’un site à l’autre sans retoucher config.php : seul config.local.php (ou l’assistant /install/) doit être adapté au nouvel hébergement.
- Les cookies et le nom du site suivent le domaine réel si HTTPpath / COOKIEpath ne sont pas définis.

Pourquoi
- config.php mélangeait identifiants MySQL, domaine ludiware.com et courriels usine, ce qui compliquait chaque déploiement client.

Détail technique
- lw_config_detect_http_host() + lw_config_apply_runtime_defaults() après config.local.php.
- Connexion MySQL uniquement si DBhost / DBname / DBusername sont renseignés.
- config.local.example.php et installateur mis à jour (domaine optionnel).
v1.1.92026-08-08 17:58:54Correction connexion modal (champs POST + SQL)La connexion depuis le modal envoie désormais courriel et mot de passe de façon fiable (POST vers la page courante, champs lus explicitement) et fonctionne aussi sur hébergements sans mysqlnd.
Pour les utilisateurs
- Le modal login/register poste vers la page où vous êtes (pas seulement /connexion/), ce qui évite les échecs silencieux.
- Si le compte n’a pas de mot de passe (connexion Google/Facebook admin), un message explicite s’affiche au lieu de « courriel ou mot de passe incorrect ».

Pourquoi
- Sur certains thèmes, les champs n’avaient pas toujours d’attribut name au moment du FormData ; sur certains hébergeurs, la lecture SQL des utilisateurs échouait sans mysqlnd.

Détail technique
- lw-account-forms.js v4 : buildFormData explicite ; action = page courante en modal.
- lw_public_accounts_stmt_fetch_one_assoc() ; formulaires modal : post_url injecté au rendu.
v1.1.82026-08-08 17:51:46Reconnaissance admin sur le site public + cookies domaineUn administrateur connecté à lw-admin est de nouveau reconnu sur le site vitrine (header Mon compte). Les cookies s’alignent sur le domaine réel du site (ex. dormezcheznous.com).
Pour les utilisateurs
- Si vous êtes connecté à lw-admin sur le même domaine que le site public, le header affiche « Mon compte » sans reconnecter via le modal.
- Après connexion via le modal, la session publique est conservée.
- Vérifiez config.local.php : COOKIEpath doit être le domaine du site (pas ludiware.com si le site est sur un autre nom).

Pourquoi
- Les cookies admin étaient parfois posés pour ludiware.com alors que le site tourne sur un domaine custom ; le site public ne recevait pas les cookies. La connexion modal échouait aussi si les cookies admin invalides perturbaient la session.

Détail technique
- lw_cookie_domain() utilise l’hôte HTTP courant si différent de COOKIEpath.
- lw_public_accounts_auth_from_cookies() + sync session membre.
- Bootstrap auth dès index.php public.
v1.1.72026-08-08 17:31:50Header compte conditionnel (snippets / jetons)Affichez « Connexion » ou « Mon compte » dans le header selon l’état de session, via un snippet HTML et les jetons {{​​​​account_if_guest}} / {{​​​​account_if_logged_in}}.
Pour les utilisateurs
- Dans un snippet HTML (ou le gabarit) : entourez le bouton Connexion avec {{​​​​account_if_guest}}…{{​​​​/account_if_guest}} et Mon compte avec {{​​​​account_if_logged_in}}…{{​​​​/account_if_logged_in}}.
- Jetons utiles : {{​​​​account_account_url}}, {{​​​​account_user_name}}, {{​​​​account_logout_url}}, {{​​​​account_logged_in}} (1 ou vide).
- Placez {{​​​​snippet:votre_cle}} dans le header du gabarit.
- Alternative prête à l’emploi : {{​​​​account_strip}} (bandeau lw-admin).
- Snippets PHP : variable $lw_db + lw_public_accounts_viewer().

Pourquoi
- DormezChezNous et thèmes importés veulent un bouton Bootstrap/modal personnalisé, pas le bandeau générique.

Détail technique
- lw_public_accounts_apply_conditional_blocks() dans apply_tokens ; $lw_db exposé aux snippets PHP.
v1.1.62026-08-08 17:25:08Correction AJAX modals compte (thèmes Homelengo)La connexion depuis un modal ne réagissait pas au clic : le script compte intercepte maintenant le clic avant les scripts du thème, affiche les erreurs (retrait de d-none) et indique le chargement sur le bouton.
Pour les utilisateurs
- Le bouton « Connexion » dans le modal répond de nouveau : texte « … » pendant l’envoi, message d’erreur visible en rouge si échec, rechargement de la page si succès.
- Aucun changement requis dans votre HTML si data-lw-account et data-lw-account-error sont déjà en place.

Pourquoi
- Les thèmes importés (Homelengo / DormezChezNous) enregistrent des écouteurs qui bloquaient l’événement submit avant notre script ; les erreurs restaient aussi cachées par la classe Bootstrap d-none.

Détail technique
- lw-account-forms.js v3 : capture click + submit, chargé en dernier avant </body>.
- Retrait automatique de d-none sur data-lw-account-error.
v1.1.52026-08-08 17:13:29Connexion et inscription en AJAX (modals)Les formulaires compte dans une fenêtre modale (Bootstrap ou autre) peuvent être envoyés sans recharger toute la page : les erreurs s’affichent dans le modal, et la page se met à jour après une connexion réussie.
Pour les utilisateurs
- Si votre formulaire login/register est dans un modal (.modal ou role="dialog"), la soumission se fait en AJAX automatiquement — plus de redirection vers /connexion/ qui casse l’expérience.
- Placez un emplacement d’erreur : <div data-lw-account-error></div> dans le modal.
- Forcer ou désactiver : data-lw-account-ajax="1" ou "0" sur le <form>.
- Après succès : par défaut rechargement de la page (menu compte à jour) ; data-lw-account-on-success="redirect" pour aller vers Mon compte.
- Le captcha inscription est rafraîchi automatiquement après une erreur.

Pourquoi
- DormezChezNous et thèmes similaires ouvrent login/inscription en popup : un POST classique rechargeait toute la page.

Détail technique
- lw-account-forms.js injecté quand data-lw-account est présent.
- Réponses JSON côté serveur (lw_public_accounts_handle_post) ; hook index.php pour POST depuis n’importe quelle page.
v1.1.42026-08-08 16:54:04Formulaires compte personnalisés (data-lw-account)Vous pouvez utiliser vos propres formulaires HTML de connexion et d’inscription dans le template : le moteur les branche automatiquement et expose les messages d’erreur via des jetons ou des emplacements dédiés.
Pour les utilisateurs
- Marqueur sur le <form> : data-lw-account="login" ou "register" (aussi forgot, reset, profile, security).
- Champs : data-lw-account-field="email|password|…" ou détection par id/name/placeholder (comme le contact).
- Erreurs : {{​​​​account_error_text}} dans votre HTML, ou <div data-lw-account-error></div>.
- Succès : {{​​​​account_success_text}} ou data-lw-account-success.
- Remplacez {{​​​​account_login}} par votre markup sur la page coquille /connexion/ si vous ne voulez pas le formulaire lw-admin par défaut.
- Inscription : emplacement <div class="lw-account-captcha-slot"></div> pour le captcha.
- OAuth optionnel : <div data-lw-account-oauth></div>.

Pourquoi
- DormezChezNous et autres thèmes importés gardent leur design Bootstrap sans dupliquer la logique compte.

Détail technique
- account_forms.php (même principe que data-lw-contact).
- CSRF + lw_account_action injectés ; action POST vers /connexion/, /inscription/, etc.
v1.1.32026-08-08 12:47:55Éditeurs HTML avec coloration et tabulationTous les champs HTML et code de l’admin bénéficient de la coloration syntaxique et de l’indentation à la touche Tab (4 espaces), y compris la vue « code source » de TinyMCE.
Pour les utilisateurs
- Champs HTML bruts (en-tête, pied de page, snippets, templates, CSS personnalisé, etc.) : numéros de ligne, coloration, Tab pour indenter.
- Éditeur riche TinyMCE : le bouton « code source » ouvre la même expérience colorée.
- Thèmes importés : édition HTML directe avec coloration.

Pourquoi
- Faciliter la lecture et l’édition du markup sans IDE externe.
- Tab insère une indentation cohérente ; Maj+Tab la réduit.

Détail technique
- Module lw-code-editor.js (CodeMirror 5 via CDN).
- Modes html, css et php selon le champ.
- Compatible navigation app-shell (réinit après changement de page).
v1.1.22026-08-08 11:37:45Mise à jour CMS in-app et alerte footerLes installations distantes voient un avertissement visible dans le pied de page admin lorsqu’un package plus récent existe, et peuvent installer la mise à jour depuis Réglages → Versions sans ré-uploader manuellement les fichiers.
Pour les utilisateurs
- Pied de page admin : badge « Mise à jour disponible (vX.Y.Z) » lorsqu’un paquet VersionLog plus récent est publié sur repo.ludiware.com.
- Réglages → Versions : bandeau avec bouton « Mettre à jour maintenant » (téléchargement + déploiement automatique).
- Fichiers locaux préservés : config.local.php, config.php (seule la ligne Version est mise à jour), uploads/, storage/, extensions installées.

Pourquoi
- Éviter les mises à jour manuelles FTP/SFTP sur chaque site hébergé.
- Rendre visible une version obsolète (ex. 1.0.53 vs 1.1.x) sans fouiller l’historique.

Détail technique
- lw_cms_update_apply() : télécharge ZIP/tar.gz depuis repo.ludiware.com, extrait et copie le core.
- lw_versionlog_check_update() inchangé (cache 30 min).
- Badge sidebar Réglages + alerte chrome pour les gestionnaires.
v1.1.12026-08-08 11:30:24Historique : jetons et accolades lisiblesLes entrées VersionLog n’affichent plus de codes HTML bruts ({) : les jetons {{​​​​account_login}} et similaires apparaissent normalement.
Pour les visiteurs
- Page Historique : les exemples de jetons CMS s’affichent comme du texte (accolades visibles), sans entités HTML encodées en double.

Pourquoi
- Certaines entrées VersionLog mentionnaient des entités HTML ({) dans leur texte ; htmlspecialchars() les affichait telles quelles à l’écran.

Détail technique
- lw_versionlog_prepare_display_source() : décodage des entités d’accolades avant neutralisation zero-width space et lw_e().
v1.1.0 Package2026-08-08 11:28:14ludiWARE 1.1.0 — distribution publiqueRelease mineure 1.1.0 : package d’installation complet (ZIP + tar.gz), comptes publics OAuth, historique des versions sur la vitrine, formulaire contact prérempli, et plugins MarketPlace à jour.
Pour les utilisateurs
- Téléchargement : ludiware-1.1.0.tar.gz + ludiware-1.1.0.zip
- Dépôt : https://repo.ludiware.com/releases/1.1.0/
- Assistant /install/ inclus (base de données, schéma, compte admin)

Depuis la distribution 1.0.40
- Comptes membres locaux : inscription, connexion, mot de passe oublié, Mon compte (onglets profil / sécurité)
- OAuth Google et Facebook sur la vitrine
- Header public reconnaît la session lw-admin et les membres OAuth
- Jeton {{​​​​versionlog}} : historique des versions sur le site public
- Formulaire contact : nom et courriel préremplis si connecté
- Bootstrap Icons + sélecteur d’icônes admin
- Plugins MarketPlace : FAQ, Témoignages, Galerie, Formulaires, Réservation, Annonces classées, Forums

Plugins republication (MarketPlace)
- Forums 1.0.16
- Annonces classées 1.0.15

Détail technique
- Export OSS sans secrets ni outils usine ; FileName VersionLog → tar.gz public.

Télécharger le package

v1.0.612026-08-08 11:25:48Historique : jetons affichés normalementLes exemples {{​​​​account_login}} dans l’historique des versions s’affichent comme du texte lisible, sans entités HTML visibles ({).
Pour les visiteurs / administrateurs
- Page Historique et Réglages → Versions : les jetons cités en exemple apparaissent comme {{​​​​account_login}}, pas comme {{​​account_login}}.

Pourquoi
- L’échappement HTML des accolades en entités, puis htmlspecialchars(), doublait l’encodage et affichait les codes bruts à l’écran.

Détail technique
- Neutralisation zero-width space seule (sans entités {) dans lw_versionlog_format_display_text() et lw_versionlog_shield_public_html().
v1.0.602026-08-08 11:24:31Contact : nom et courriel préremplis si connectéSur le formulaire de contact, les champs Nom et Courriel sont remplis automatiquement lorsque le visiteur est déjà connecté (compte local, lw-admin ou portail CDS).
Pour les utilisateurs
- Formulaire {{​​​​contact_form}} et formulaires contact des thèmes ZIP : Nom et Courriel préremplis si vous êtes connecté.
- Les champs déjà remplis dans le gabarit ne sont pas écrasés.

Pourquoi
- Éviter de ressaisir son identité à chaque message contact.

Sources
- Portail CDS (session SSO) : nom complet + courriel du contact.
- Compte membre public ou cookie lw-admin : display_name + courriel lw_users.

Détail technique
- lw_contact_prefill_identity(), lw_contact_apply_prefill_to_form(), lw_contact_form_html().
v1.0.592026-08-08 11:20:46Jeton {{​​​​versionlog}} actif sur la vitrineLe jeton {{​​​​versionlog}} est désormais reconnu sur le site public : la page Historique affiche la liste des versions au lieu du texte brut du jeton.
Pour les visiteurs
- Page Historique : le contenu {{​​​​versionlog}} est remplacé par la liste des versions (styles et textes sécurisés).

Pourquoi
- Le module VersionLog n’était chargé que dans lw-admin ; sur index.php (front public), lw_versionlog_prepare_public_html() n’existait pas et le jeton restait affiché tel quel.

Détail technique
- require versionlog.php dans www/index.php avant public_render.php.
v1.0.582026-08-08 11:07:13Historique public : jetons CMS affichés en texteSur la page Historique du site ludiware.com, les mentions {{​​​​account_login}}, {{​​​​menu:main}}, etc. dans les entrées VersionLog s’affichent en texte au lieu d’injecter formulaires ou menus.
Pour les visiteurs
- Page Historique (/historique/) : titre, description et détails d’une version montrent les jetons cités en exemple (documentation), sans formulaire de connexion ni menu injecté au milieu du texte.

Pourquoi
- Le contenu VersionLog est rendu via un snippet PHP puis repasse dans le moteur de jetons CMS ; les exemples {{​​​​account_login}} étaient exécutés comme de vrais jetons.

Détail technique
- Jeton {{​​​​versionlog}} / {{​​​​versionlog_list}} natif ; protection des blocs .lw-vl-* avant le pipeline de jetons ; entités HTML pour {{​​​​ et }} à l’affichage.
v1.0.572026-08-08 10:58:52Historique des versions : jetons CMS affichés en texteLes mentions {{​​​​account_login}}, {{​​​​menu:main}}, etc. dans les détails techniques du VersionLog ne sont plus interprétées comme des jetons CMS.
Pour les administrateurs
- Réglages → Historique des versions : titre, description et détails complets affichent les jetons tels quels (documentation), sans formulaire ni contenu injecté.

Pourquoi
- Les entrées VersionLog citent souvent des jetons en exemple dans la section « Détail technique » ; le moteur de jetons ne doit pas les exécuter à l’affichage.

Détail technique
- Neutralisation {{​​​​ → {{​​​​ + zero-width space à la sortie API et côté lw-admin ; affichage HTML échappé.
v1.0.562026-08-08 10:54:16Header public : reconnaissance de la session lw-adminConnecté à lw-admin, vous apparaissez aussi comme membre sur le site public (header, Mon compte), comme pour les commentaires au blogue.
Pour les visiteurs / administrateurs
- Si vous êtes connecté à lw-admin (cookies), le bandeau {{​​​​account_strip}} affiche votre nom et le lien « Accéder à mon compte ».
- /mon-compte/ est accessible sans repasser par /connexion/.
- /connexion/ et /inscription/ redirigent vers Mon compte si vous êtes déjà reconnu.

Priorité d’identité (inchangée pour le blogue si session Facebook active)
1. Session membre public (connexion / OAuth)
2. Cookie lw-admin

Déconnexion sur le site public : ferme la session membre ; si seul lw-admin reste actif, vous restez connecté (comportement voulu).
v1.0.552026-08-08 10:38:20Blogue et forums : identité membre public prioritaireSur le site public, la session membre (connexion / Facebook / Google) prime désormais sur les cookies admin lw-admin pour commenter au blogue.
Problème corrigé
- Header « Vous êtes connecté en tant que… » (session membre) et blogue « Vous commentez en tant que… » (cookies admin) pouvaient afficher deux personnes différentes si vous étiez connecté à lw-admin et via Facebook sur le site public.

Comportement
- Priorité : portail CDS → membre public (session) → staff admin (cookie lw-admin).
- Le blogue propose le lien Connexion vers /connexion/ lorsque les comptes locaux sont actifs (sans CDS).

Note
- Si Facebook a créé un second compte lw_users (courriel différent de l’admin), c’est normal : deux profils distincts. Vous pouvez fusionner manuellement ou supprimer le doublon dans Utilisateurs.
v1.0.542026-08-08 10:11:29OAuth — URL de redirection stableL’URL de callback Google/Facebook affichée dans les réglages utilise désormais le domaine du site (ex. ludiware.com), pas l’hôte de l’admin.
Pour les administrateurs
- Dans Réglages → Comptes membres, l’URL « redirection autorisée » correspond au domaine public du site.
- Note d’aide pour l’enregistrement de l’URI dans Facebook Login → Valid OAuth Redirect URIs.

Pourquoi
- Depuis le panneau admin (autre sous-domaine), l’URL générée pouvait différer de celle réellement utilisée sur le site public.
v1.0.532026-08-08 10:03:23Connexion Google et Facebook pour les membresLes visiteurs peuvent se connecter ou s'inscrire avec Google ou Facebook sur les pages connexion et inscription, sans portail CentreDeService. Un compte local est créé automatiquement s'il n'existe pas encore.
Pour les visiteurs
- Boutons « Se connecter avec Google » et « Se connecter avec Facebook » sur /connexion/ et /inscription/.
- Si le courriel n'est pas encore inscrit, un profil membre est créé et la session est ouverte.
- Si un compte existe déjà avec le même courriel, le profil OAuth est lié au compte existant.

Pour les administrateurs
- Onglet Comptes membres des réglages site : activation, identifiants OAuth et URL de redirection à copier dans Google Cloud / Facebook Developer.
- Désactivé automatiquement lorsque le portail CentreDeService gère l'authentification.

Détail technique
- Colonnes lw_users google_id / facebook_id, module oauth_accounts.php, callbacks /oauth/{provider}/callback/.
v1.0.522026-08-08 08:35:18Sélecteur d'icônes — catalogue completLe sélecteur d'icônes affiche d'abord une sélection utile, puis toutes les icônes Bootstrap (~1 600) via la recherche.
Pour les administrateurs
- À l'ouverture : grille de favoris (maison, commerce, transport, etc.).
- Recherche : filtre sur l'ensemble des ~1 683 icônes Bootstrap Icons installées.
- Compteur de résultats et message si la liste est tronquée.

Correction
- La liste n'était limitée qu'à 120 icônes en ordre alphabétique (123, alarm…), ce qui paraissait incomplet.
v1.0.512026-08-08 08:29:09Bootstrap Icons et sélecteur d'icônesLes icônes Bootstrap s'affichent correctement partout dans l'admin grâce aux polices complètes. Un sélecteur d'icônes réutilisable est disponible pour les formulaires (recherche, grille, aperçu).
Pour les administrateurs
- Polices Bootstrap Icons (woff/woff2) installées : les icônes `bi-*` déjà utilisées dans lw-admin s'affichent de façon fiable.
- Nouveau composant « sélecteur d'icônes » (`lw_icon_picker_field`) utilisable dans tout formulaire admin.

Utilisation
- Bouton avec aperçu de l'icône, recherche par nom, grille cliquable, option « Aucune icône ».
- Fonction PHP `lw_bootstrap_icon_names()` et normalisation `lw_bootstrap_icon_class()`.

Détail technique
- Fichiers : `functions/icon_picker.php`, `js/lw-icon-picker.js`, styles dans `lw-admin.css`.
v1.0.502026-08-08 07:27:10Mon compte — onglets profil et sécuritéLa page Mon compte propose deux onglets : Mes informations (prénom, nom, avatar) et Accès et sécurité (courriel, mot de passe). Nouveaux jetons pour gabarits ZIP.
Pour les utilisateurs
- Onglet Mes informations : prénom, nom de famille, téléversement d’avatar.
- Onglet Accès et sécurité : changement de courriel et/ou mot de passe (mot de passe actuel requis).

Jetons ZIP
- {{​​​​account_panel}} : panneau complet avec onglets.
- {{​​​​account_tabs}}, {{​​​​account_profile}}, {{​​​​account_security}} : mise en page personnalisée.
- {{​​​​account_avatar}}, {{​​​​account_avatar_url}}, {{​​​​account_first_name}}, {{​​​​account_last_name}}, {{​​​​account_email}}.
- {{​​​​account_profile_url}}, {{​​​​account_security_url}} : liens directs vers chaque onglet.

Détail technique
- Colonne lw_users.avatar_path, fichiers dans uploads/users/, session vitrine synchronisée après mise à jour.
v1.0.492026-08-08 07:17:18Comptes vitrine unifiés dans lw_usersInscription, connexion et mot de passe oublié sur la vitrine utilisent désormais la table lw_users (comme lw-admin). Seuls les comptes avec accès admin peuvent ouvrir lw-admin.
Pour les utilisateurs
- Même courriel et mot de passe partout : admin ou visiteur inscrit sur /inscription/.
- Les comptes créés sur la vitrine ont le rôle user et ne peuvent pas accéder à lw-admin.
- Les administrateurs se connectent aussi sur /connexion/ avec leurs identifiants habituels.

Pourquoi
- Suppression du double système lw_site_members / lw_users introduit par erreur.

Détail technique
- public_accounts.php : auth, inscription et reset sur lw_users ; session vitrine par site.
- auth.php inchangé : can_access_admin requis pour lw-admin.
- Table obsolète lw_site_members : peut être supprimée en base (DROP TABLE).
v1.0.482026-08-08 07:11:33Connexion vitrine avec un compte administrateurLes administrateurs du site peuvent se connecter sur la vitrine publique (/connexion/) avec le même courriel et mot de passe que lw-admin, sans inscription séparée.
Pour les utilisateurs
- Sur /connexion/, un compte administrateur global ou assigné au site est accepté avec les identifiants lw-admin.
- La première connexion crée automatiquement le profil membre local du site ; les connexions suivantes réutilisent ce profil.

Pourquoi
- Avant ce correctif, seuls les comptes inscrits via /inscription/ (table lw_site_members) étaient reconnus ; le premier admin recevait « Courriel ou mot de passe incorrect ».

Détail technique
- Pont lw_users → lw_site_members dans lw_public_accounts_login() : vérification mot de passe admin, accès site (global_admin ou local_admin membre du site), synchronisation du hash et de la session membre.
v1.0.472026-08-08 06:52:34Comptes membres locaux sur la vitrineLes sites sans portail CentreDeService peuvent proposer inscription, connexion, mot de passe oublié et espace membre sur la vitrine publique, avec jetons pour gabarits ZIP et pages coquilles CMS.
Pour les utilisateurs
- Inscription sur /inscription/ avec captcha et confirmation du mot de passe.
- Connexion sur /connexion/, récupération sur /mot-de-passe-oublie/ et réinitialisation par lien courriel.
- Espace « Mon compte » une fois connecté ; bandeau {{​​​​account_strip}} dans le header.

Pour les administrateurs
- Onglet Réglages → Comptes membres : coquilles CMS et bouton « Générer les pages système ».
- Menu éditeur : Ajouter membre (Connexion, Mot de passe oublié, Inscription, Mon compte) si CDS inactif.
- Jetons ZIP : {{​​​​account_login}}, {{​​​​account_register}}, {{​​​​account_panel}}, {{​​​​account_forgot}}, {{​​​​account_reset}} et URLs associées.

Pourquoi
- Permettre aux vitrines ludiWARE autonomes (sans CDS) d’offrir des comptes visiteurs pour commentaires, contenus réservés ou personnalisation future.

Détail technique
- Table lw_site_members, CSRF session, captcha inscription distinct du contact, routes try_serve, public_render apply_tokens.
v1.0.462026-08-07 12:59:32Captcha contact : correction des réponses valides rejetéesLorsqu’une page ou un gabarit contient plusieurs formulaires contact, la même question de vérification s’affiche partout et la bonne réponse est acceptée.
Pour les utilisateurs
- Le captcha « Combien font X + Y ? » est identique sur tous les formulaires contact d’une même page.
- Une réponse correcte n’est plus rejetée avec « Vérification de sécurité incorrecte ».

Pourquoi
- Chaque formulaire recevait parfois une question différente alors que la session ne mémorise qu’une seule réponse (contenu + gabarit finalisés séparément).

Détail technique
- lw_contact_captcha_issue() réutilise le défi session valide ; finalisation contact une seule fois sur le HTML complet (public_render.php).
v1.0.452026-08-07 12:15:48Jetons blogue : derniers articles (footer / sidebar)Placez dans un gabarit ou une page les jetons {{​​​​blog-latest-title-1}}, {{​​​​blog-latest-image-1}}, {{​​​​blog-latest-excerpt-1}}, etc. (jusqu’à 10) pour afficher les articles les plus récents.
Pour les utilisateurs
- {{​​​​blog-latest-title-N}} : titre (N=1 = plus récent, 2 = avant-dernier, … jusqu’à 10)
- {{​​​​blog-latest-image-N}} : URL de l’image à la une
- {{​​​​blog-latest-excerpt-N}} : extrait du corps de l’article
- {{​​​​blog-latest-date-N}} : date courte (ex. 15 avril 2020)
- {{​​​​blog-latest-date-long-N}} : date longue
- {{​​​​blog-latest-url-N}} : lien vers l’article
- Idéal pour un bloc « Blogue » en pied de page ou barre latérale, comme dans un thème ZIP importé.

Pourquoi
- Personnaliser le footer sans dupliquer manuellement les titres et images des articles.

Détail technique
- lw_blog_apply_latest_tokens() dans blog.php, appelé depuis lw_blog_apply_tokens() sur gabarits et pages.
v1.0.442026-08-07 12:10:34Contact thème : messages d’erreur et champ SujetLes formulaires contact des thèmes ZIP affichent à nouveau le vrai message d’erreur (captcha, champs manquants, etc.) et le champ Sujet du thème est bien pris en charge.
Pour les utilisateurs
- Après un envoi raté, le message précis s’affiche (ex. captcha incorrect) au lieu du générique « Envoi impossible. Vérifiez les champs. »
- Le champ Sujet des formulaires de thème (ex. msg_subject, placeholder ou label « Sujet ») est enregistré et reçu par courriel.
- Les champs sans attribut name mais avec placeholder/label (Votre nom, Votre courriel…) sont reconnus à l’import et au rendu.

Pourquoi
- lw_contact_form_html() effaçait le flash session avant l’affichage des formulaires thème.
- Certains thèmes nomment le sujet autrement que subject.

Détail technique
- public_render.php : lw_contact_form_html() seulement si {{​​​​contact_form}} est présent.
- contact_forms.php : alias msg_subject, détection placeholder/label, fallbacks nom/courriel.
v1.0.432026-08-07 12:04:45Correction erreur 500 sur les pages contact (thèmes ZIP)Les pages « Nous joindre » importées depuis un template ZIP ne provoquent plus d’erreur serveur lorsque le bouton Envoyer est imbriqué dans la grille du thème (Bootstrap, etc.).
Pour les utilisateurs
- Les pages contact personnalisées d’un thème importé s’affichent à nouveau normalement, avec captcha et envoi vers la boîte Messages.
- Avant la correction, certaines pages (ex. formulaire dans des colonnes Bootstrap) renvoyaient une erreur HTTP 500.

Pourquoi
- Lors du branchement du formulaire thème, l’emplacement du captcha était inséré au mauvais niveau du DOM lorsque le bouton Envoyer n’était pas enfant direct du <form>.

Détail technique
- contact_forms.php : lw_contact_wire_form_element() insère le slot captcha via le parent immédiat du bouton submit au lieu de form->insertBefore() sur un nœud imbriqué.
v1.0.422026-08-07 09:41:46Pages boutique CDS personnalisables (coquilles et jetons)Comme pour le blogue, vous pouvez choisir des pages CMS comme coquilles pour le magasin, les catégories, les fiches produit, le panier et les commandes, puis y placer des jetons granulaires (titre, prix, image, liste, etc.).
Pour les utilisateurs
- Dans Réglages du site → CentreDeService.NET, section « Pages coquilles boutique », associez une page CMS à chaque type d’écran (/boutique/, catégorie, produit, panier, commande).
- Sans coquille, le rendu CDS par défaut reste inchangé.
- Sur une coquille produit : {{​​​​cds_product_title}}, {{​​​​cds_product_image}}, {{​​​​cds_product_price}}, {{​​​​cds_product_desc}}, {{​​​​cds_product_add_cart}}, ou {{​​​​cds_product}} pour la fiche complète.
- Sur une liste / catégorie : {{​​​​cds_shop_list}} (bloc complet), ou {{​​​​cds_shop_categories}}, {{​​​​cds_shop_products}}, {{​​​​cds_shop_pager}}, {{​​​​cds_category_title}}.
- Panier / commande : {{​​​​cds_cart}}, {{​​​​cds_order}}, {{​​​​cds_cart_count}}.

Pourquoi
- Permettre une mise en page boutique alignée sur le thème du site, sur le même modèle que les jetons blogue.

Détail technique
- Coquilles : cds_shop_*_page_uid ; lw_cds_resolve_shell_page dans lw_cds_try_serve.
- Jetons : lw_cds_apply_shop_field_tokens + contexte dans lw_cds_apply_tokens.
v1.0.412026-08-07 09:03:11Formulaires contact des templates ZIP reliés au CMSLes formulaires de contact déjà présents dans un thème importé peuvent envoyer leurs messages via le moteur contact de lw-admin, sans remplacer le design du thème. À l’import, la détection est automatique ; vous pouvez aussi forcer avec data-lw-contact="1".
Pour les utilisateurs
- Un formulaire contact du thème (classes / mailto / champs nom-email-message) est branché sur la boîte Messages et l’e-mail de notification.
- L’apparence du formulaire (HTML/CSS du thème) est conservée.
- Marqueur manuel : data-lw-contact="1" force le branchement ; data-lw-contact="0" l’exclut.
- Captcha et messages de succès/erreur s’affichent comme pour {{​​​​contact_form}}.

Pourquoi
- Éviter de remplacer un beau formulaire de thème par le HTML générique {{​​​​contact_form}}.

Détail technique
- lw_contact_wire_form_html (import) ; lw_contact_finalize_bound_forms (rendu) ; alias de champs dans lw_contact_submit.
v1.0.40 Package2026-08-06 13:07:30ludiWARE 1.0.40 — package d’installationDistribution publique complète (ZIP + tar.gz) avec installateur. Inclut les évolutions récentes : blogue (jetons, URLs par catégories, sous-catégories), page 404 CMS, médiathèque globale, menus / import ZIP, et corrections d’affichage.
Pour les utilisateurs
- Package téléchargeable pour installer ou mettre à jour ludiWARE.
- Archives : ludiware-1.0.40.tar.gz et ludiware-1.0.40.zip
- Dépôt : https://repo.ludiware.com/releases/1.0.40/
- Assistant /install/ inclus (base de données, schéma, compte admin)

Contenu notable depuis la dernière distribution
- Blogue : jetons auteur / date longue / heure / commentaires / catégories ; URLs /blogue/catégorie/sous-catégorie/slug ; sous-catégories en admin ; accord « commentaire »
- Page 404 CMS désignée + pastille ; import ZIP (chrome, méga-menus, détection 404)
- Médiathèque globale et dossiers ; menus actifs ; déduplication header

Pourquoi
- Fournir un paquet installable aligné sur la version courante du CMS.

Détail technique
- Export OSS (sans secrets, sans api/admin usine) ; FileName VersionLog pointant vers le tar.gz public.

Télécharger le package

v1.0.392026-08-06 13:01:02Singulier « commentaire » quand il y en a 0 ou 1Dans la liste des articles du blogue, on affiche « 0 commentaire » ou « 1 commentaire » (sans s), et le pluriel seulement à partir de 2.
Pour les utilisateurs
- Meta des cartes d’articles : accord correct du mot commentaire (0/1 au singulier).

Pourquoi
- « 0 commentaires » était grammaticalement incorrect en français.

Détail technique
- lw_blog_format_comments_count : singulier si count <= 1 (FR).
v1.0.382026-08-06 13:00:31Sous-catégories de blogue plus simples à créerDans lw-admin, chaque catégorie propose un bouton pour ajouter une sous-catégorie. Le champ « Catégorie parente » est mis en avant, avec la liste en arborescence.
Pour les utilisateurs
- Liste des catégories : icône « diagramme » pour créer une sous-catégorie déjà rattachée à la bonne parente.
- Formulaire : champ parent en premier, aide sur l’URL /blogue/parente/enfant/…
- Pastille « Sous-catégorie » et colonne Parente dans le tableau.

Pourquoi
- La hiérarchie existait déjà en base, mais était trop discrète dans l’interface.

Détail technique
- blogcats.php (?new=1&parent=uid) ; clés i18n blog.cat_* ; invalidation cache catégories.
v1.0.372026-08-06 12:51:12URLs blogue avec catégories imbriquéesLes articles sont désormais accessibles via /blogue/catégorie/sous-catégorie/slug-article. Les anciennes adresses /blogue/slug redirigent automatiquement vers la nouvelle URL.
Pour les utilisateurs
- URL d’un article : /blogue/{catégorie}/{sous-catégorie}/{slug} selon la hiérarchie des catégories.
- Sans catégorie : /blogue/{slug} comme avant.
- Listes de catégories : /blogue/{catégorie}/{sous-catégorie} (l’ancien préfixe /blogue/categorie/… redirige).
- Les liens liste, commentaires, sitemap et l’admin utilisent la nouvelle structure.

Pourquoi
- Refléter l’arborescence des catégories dans l’URL, plus claire pour le SEO et la navigation.

Détail technique
- lw_blog_post_url / lw_blog_post_path_extra ; résolution de chemin dans lw_blog_try_serve ; redirections 301.
v1.0.362026-08-06 12:48:37Nouveaux jetons blogue (auteur, date, commentaires…)Les gabarits d’article peuvent afficher le nombre de commentaires, l’auteur, une date longue, l’heure de publication et la liste des catégories. Un champ Auteur a été ajouté à l’édition des articles.
Pour les utilisateurs
- Nouveaux jetons : {{​​​​blog_comments_count}} (chiffre), {{​​​​blog_author}}, {{​​​​blog_date_long}} (ex. Jeudi le 3 septembre 2024), {{​​​​blog_time}} (HH:MM), {{​​​​blog_categories}} (liste des catégories publiées).
- {{​​​​blog_date}} reste au format AAAA-MM-JJ.
- Champ « Auteur » à la création / édition d’un article, utilisé par {{​​​​blog_author}}.

Pourquoi
- Permettre des mises en page d’articles plus riches sans HTML figé.

Détail technique
- Colonne author_name ; helpers lw_blog_format_date_long / lw_blog_render_categories_token_list ; jetons documentés dans templates.php.
v1.0.352026-08-06 11:32:25Page 404 CMS : affichage corrigé + pastilleLa page désignée comme 404 s’affiche correctement (y compris sur un site encore en brouillon / en aperçu). Dans la liste des pages, une pastille « 404 » apparaît comme pour l’accueil. À l’import ZIP, les pages d’erreur 404 sont détectées automatiquement.
Pour les utilisateurs
- Si vous cochez « Utiliser comme page 404 », une URL inconnue affiche cette page (thème du site), et non le 404 sombre générique.
- Cela fonctionne aussi en aperçu et tant que le site est en brouillon.
- Liste des pages : pastille orange « 404 » à côté du statut, comme la pastille Accueil.
- Nouveaux imports ZIP : une page nommée 404 / not-found est assignée automatiquement.

Pourquoi
- Le rendu de la page 404 ignorait le mode aperçu et refusait les sites brouillon (« Site non publié »), ce qui forçait le repli générique.

Détail technique
- lw_public_site_404(..., $preview) ; rendu forcé en mode aperçu si site brouillon ; badge pages.badge_404 ; auto page_404_page_uid à l’import ZIP.
v1.0.342026-08-06 11:26:54Import ZIP : plus de header en double dans les pagesÀ l’import d’un template, le header (et les wrappers du même type) est retiré du contenu des pages lorsqu’il est déjà placé dans l’en-tête global. Les sites déjà importés sont nettoyés à l’affichage.
Pour les utilisateurs
- Les pages importées ne gardent plus une copie du menu/header dans leur contenu si le chrome global est actif.
- Les templates sans balise <header> (ex. #header / .header-area) sont aussi pris en charge.

Pourquoi
- Le strip était trop strict (vote majoritaire, wrappers non sémantiques ignorés) ; des restes restaient dans le HTML des pages.

Détail technique
- Détection structurelle + affixe normalisé (ignore active) ; strip/dedupe DOM élargi ; nettoyage au rendu public.
v1.0.332026-08-06 11:16:07Menu : item courant correctement mis en évidenceSur les sites (y compris templates importés), l’item de menu actif suit la page affichée au lieu de rester figé sur Accueil.
Pour les utilisateurs
- En visitant « À propos » (ou une autre page), c’est cet item qui apparaît sélectionné, plus Accueil.
- Les parents d’un sous-menu actif restent aussi mis en évidence.

Pourquoi
- À l’import, la classe active de la page d’accueil était recopiée telle quelle dans le menu CMS, sans recalcul selon l’URL.

Détail technique
- Rendu menu : strip des classes active/current importées, marquage selon page_uid ou chemin courant, aria-current=page.
v1.0.322026-08-06 11:00:39Correction « Nouveau dossier » médiasChoisir « Nouveau dossier » dans la médiathèque affiche correctement le champ pour nommer le dossier, y compris après navigation dans l’admin.
Pour les utilisateurs
- Le champ texte sous « Nouveau dossier » réapparaît bien à la sélection.

Pourquoi
- Le script ne se rattachait pas après le chargement des pages en mode app (navigation sans rechargement complet).

Détail technique
- Délégation d’événements + réinit sur lw:fragment-loaded (lw-media-folder.js v2).
v1.0.312026-08-06 10:50:19Médiathèque globale et dossiersVous pouvez déposer des images partagées (logos, etc.) une seule fois dans Bibliothèque → Médias globaux, puis les réutiliser sur tous les sites. Le choix du dossier à l’upload propose la liste des dossiers existants ou « Nouveau dossier ».
Pour les utilisateurs
- Nouvelle section Bibliothèque → Médias globaux : upload et gestion des images partagées.
- Dans la médiathèque d’un site, l’onglet Globaux affiche ces fichiers en lecture (copie d’URL) ; les admins plateforme peuvent ouvrir Gérer.
- À l’upload ou à l’édition, le champ Dossier est une liste déroulante (aucun / existants / Nouveau dossier + champ texte).

Pourquoi
- Éviter de réimporter le même logo dans chaque site.
- Clarifier le classement par dossiers sans taper le nom à chaque fois.

Détail technique
- lw_media.site_id NULL = global ; fichiers sous uploads/global/ ; référence unique (pas de copie par site).
v1.0.302026-08-06 09:59:30Import ZIP : mega-menus préservésÀ l’import d’un template ZIP, les mega-menus (panneaux riches avec colonnes, images, CTA) et les attributs Bootstrap des menus déroulants sont conservés et restitués correctement.
Pour les utilisateurs
- Les templates avec mega-menus (ex. panneaux pleine largeur, grilles, images) gardent leur apparence après import.
- Les menus déroulants Bootstrap conservent leurs options (data-bs-toggle, etc.).
- Si un item a un panneau mega, une zone HTML dédiée apparaît dans Menus pour l’ajuster (en attendant l’extension mega-menu).

Pourquoi
- L’import ne lisait que les sous-listes <ul> ; les panneaux en <div class="dropdown-menu"> étaient perdus à la tokenisation {{​​​​menu:…}}.

Détail technique
- Nouveaux champs item : panel_html, link_attrs, label_html ; détection à l’harvest ; rendu a+panneau ; rewrite des URLs du panneau à la persistance.
v1.0.292026-08-06 09:42:25Correction sauvegarde en-tête / pied (doublon)Enregistrer l’en-tête et le pied de page d’un template ZIP ne duplique plus le footer sous le copyright.
Pour les utilisateurs
- La sauvegarde de « En-tête & pied de page » ne laisse plus apparaître un second footer non stylé.
- Les sites déjà touchés par le bug sont corrigés à l’affichage (et définitivement en réenregistrant le chrome).

Pourquoi
- Le parseur prenait le premier </div> interne du footer pour couper le bloc, puis recopait le reste après le pied de page.

Détail technique
- Extraction after_footer via DOM ; seuls script/style/link/noscript sont conservés ; repair au rendu public.
natif ; protection des blocs .lw-vl-* avant le pipeline de jetons ; entités HTML pour {{ et }} à l’affichage.
v1.0.572026-08-08 10:58:52Historique des versions : jetons CMS affichés en texteLes mentions {{​account_login}}, {{​menu:main}}, etc. dans les détails techniques du VersionLog ne sont plus interprétées comme des jetons CMS.
Pour les administrateurs
- Réglages → Historique des versions : titre, description et détails complets affichent les jetons tels quels (documentation), sans formulaire ni contenu injecté.

Pourquoi
- Les entrées VersionLog citent souvent des jetons en exemple dans la section « Détail technique » ; le moteur de jetons ne doit pas les exécuter à l’affichage.

Détail technique
- Neutralisation {{​ → {{​ + zero-width space à la sortie API et côté lw-admin ; affichage HTML échappé.
v1.0.562026-08-08 10:54:16Header public : reconnaissance de la session lw-adminConnecté à lw-admin, vous apparaissez aussi comme membre sur le site public (header, Mon compte), comme pour les commentaires au blogue.
Pour les visiteurs / administrateurs
- Si vous êtes connecté à lw-admin (cookies), le bandeau {{​account_strip}} affiche votre nom et le lien « Accéder à mon compte ».
- /mon-compte/ est accessible sans repasser par /connexion/.
- /connexion/ et /inscription/ redirigent vers Mon compte si vous êtes déjà reconnu.

Priorité d’identité (inchangée pour le blogue si session Facebook active)
1. Session membre public (connexion / OAuth)
2. Cookie lw-admin

Déconnexion sur le site public : ferme la session membre ; si seul lw-admin reste actif, vous restez connecté (comportement voulu).
v1.0.552026-08-08 10:38:20Blogue et forums : identité membre public prioritaireSur le site public, la session membre (connexion / Facebook / Google) prime désormais sur les cookies admin lw-admin pour commenter au blogue.
Problème corrigé
- Header « Vous êtes connecté en tant que… » (session membre) et blogue « Vous commentez en tant que… » (cookies admin) pouvaient afficher deux personnes différentes si vous étiez connecté à lw-admin et via Facebook sur le site public.

Comportement
- Priorité : portail CDS → membre public (session) → staff admin (cookie lw-admin).
- Le blogue propose le lien Connexion vers /connexion/ lorsque les comptes locaux sont actifs (sans CDS).

Note
- Si Facebook a créé un second compte lw_users (courriel différent de l’admin), c’est normal : deux profils distincts. Vous pouvez fusionner manuellement ou supprimer le doublon dans Utilisateurs.
v1.0.542026-08-08 10:11:29OAuth — URL de redirection stableL’URL de callback Google/Facebook affichée dans les réglages utilise désormais le domaine du site (ex. ludiware.com), pas l’hôte de l’admin.
Pour les administrateurs
- Dans Réglages → Comptes membres, l’URL « redirection autorisée » correspond au domaine public du site.
- Note d’aide pour l’enregistrement de l’URI dans Facebook Login → Valid OAuth Redirect URIs.

Pourquoi
- Depuis le panneau admin (autre sous-domaine), l’URL générée pouvait différer de celle réellement utilisée sur le site public.
v1.0.532026-08-08 10:03:23Connexion Google et Facebook pour les membresLes visiteurs peuvent se connecter ou s'inscrire avec Google ou Facebook sur les pages connexion et inscription, sans portail CentreDeService. Un compte local est créé automatiquement s'il n'existe pas encore.
Pour les visiteurs
- Boutons « Se connecter avec Google » et « Se connecter avec Facebook » sur /connexion/ et /inscription/.
- Si le courriel n'est pas encore inscrit, un profil membre est créé et la session est ouverte.
- Si un compte existe déjà avec le même courriel, le profil OAuth est lié au compte existant.

Pour les administrateurs
- Onglet Comptes membres des réglages site : activation, identifiants OAuth et URL de redirection à copier dans Google Cloud / Facebook Developer.
- Désactivé automatiquement lorsque le portail CentreDeService gère l'authentification.

Détail technique
- Colonnes lw_users google_id / facebook_id, module oauth_accounts.php, callbacks /oauth/{provider}/callback/.
v1.0.522026-08-08 08:35:18Sélecteur d'icônes — catalogue completLe sélecteur d'icônes affiche d'abord une sélection utile, puis toutes les icônes Bootstrap (~1 600) via la recherche.
Pour les administrateurs
- À l'ouverture : grille de favoris (maison, commerce, transport, etc.).
- Recherche : filtre sur l'ensemble des ~1 683 icônes Bootstrap Icons installées.
- Compteur de résultats et message si la liste est tronquée.

Correction
- La liste n'était limitée qu'à 120 icônes en ordre alphabétique (123, alarm…), ce qui paraissait incomplet.
v1.0.512026-08-08 08:29:09Bootstrap Icons et sélecteur d'icônesLes icônes Bootstrap s'affichent correctement partout dans l'admin grâce aux polices complètes. Un sélecteur d'icônes réutilisable est disponible pour les formulaires (recherche, grille, aperçu).
Pour les administrateurs
- Polices Bootstrap Icons (woff/woff2) installées : les icônes `bi-*` déjà utilisées dans lw-admin s'affichent de façon fiable.
- Nouveau composant « sélecteur d'icônes » (`lw_icon_picker_field`) utilisable dans tout formulaire admin.

Utilisation
- Bouton avec aperçu de l'icône, recherche par nom, grille cliquable, option « Aucune icône ».
- Fonction PHP `lw_bootstrap_icon_names()` et normalisation `lw_bootstrap_icon_class()`.

Détail technique
- Fichiers : `functions/icon_picker.php`, `js/lw-icon-picker.js`, styles dans `lw-admin.css`.
v1.0.502026-08-08 07:27:10Mon compte — onglets profil et sécuritéLa page Mon compte propose deux onglets : Mes informations (prénom, nom, avatar) et Accès et sécurité (courriel, mot de passe). Nouveaux jetons pour gabarits ZIP.
Pour les utilisateurs
- Onglet Mes informations : prénom, nom de famille, téléversement d’avatar.
- Onglet Accès et sécurité : changement de courriel et/ou mot de passe (mot de passe actuel requis).

Jetons ZIP
- {{​account_panel}} : panneau complet avec onglets.
- {{​account_tabs}}, {{​account_profile}}, {{​account_security}} : mise en page personnalisée.
- {{​account_avatar}}, {{​account_avatar_url}}, {{​account_first_name}}, {{​account_last_name}}, {{​account_email}}.
- {{​account_profile_url}}, {{​account_security_url}} : liens directs vers chaque onglet.

Détail technique
- Colonne lw_users.avatar_path, fichiers dans uploads/users/, session vitrine synchronisée après mise à jour.
v1.0.492026-08-08 07:17:18Comptes vitrine unifiés dans lw_usersInscription, connexion et mot de passe oublié sur la vitrine utilisent désormais la table lw_users (comme lw-admin). Seuls les comptes avec accès admin peuvent ouvrir lw-admin.
Pour les utilisateurs
- Même courriel et mot de passe partout : admin ou visiteur inscrit sur /inscription/.
- Les comptes créés sur la vitrine ont le rôle user et ne peuvent pas accéder à lw-admin.
- Les administrateurs se connectent aussi sur /connexion/ avec leurs identifiants habituels.

Pourquoi
- Suppression du double système lw_site_members / lw_users introduit par erreur.

Détail technique
- public_accounts.php : auth, inscription et reset sur lw_users ; session vitrine par site.
- auth.php inchangé : can_access_admin requis pour lw-admin.
- Table obsolète lw_site_members : peut être supprimée en base (DROP TABLE).
v1.0.482026-08-08 07:11:33Connexion vitrine avec un compte administrateurLes administrateurs du site peuvent se connecter sur la vitrine publique (/connexion/) avec le même courriel et mot de passe que lw-admin, sans inscription séparée.
Pour les utilisateurs
- Sur /connexion/, un compte administrateur global ou assigné au site est accepté avec les identifiants lw-admin.
- La première connexion crée automatiquement le profil membre local du site ; les connexions suivantes réutilisent ce profil.

Pourquoi
- Avant ce correctif, seuls les comptes inscrits via /inscription/ (table lw_site_members) étaient reconnus ; le premier admin recevait « Courriel ou mot de passe incorrect ».

Détail technique
- Pont lw_users → lw_site_members dans lw_public_accounts_login() : vérification mot de passe admin, accès site (global_admin ou local_admin membre du site), synchronisation du hash et de la session membre.
v1.0.472026-08-08 06:52:34Comptes membres locaux sur la vitrineLes sites sans portail CentreDeService peuvent proposer inscription, connexion, mot de passe oublié et espace membre sur la vitrine publique, avec jetons pour gabarits ZIP et pages coquilles CMS.
Pour les utilisateurs
- Inscription sur /inscription/ avec captcha et confirmation du mot de passe.
- Connexion sur /connexion/, récupération sur /mot-de-passe-oublie/ et réinitialisation par lien courriel.
- Espace « Mon compte » une fois connecté ; bandeau {{​account_strip}} dans le header.

Pour les administrateurs
- Onglet Réglages → Comptes membres : coquilles CMS et bouton « Générer les pages système ».
- Menu éditeur : Ajouter membre (Connexion, Mot de passe oublié, Inscription, Mon compte) si CDS inactif.
- Jetons ZIP : {{​account_login}}, {{​account_register}}, {{​account_panel}}, {{​account_forgot}}, {{​account_reset}} et URLs associées.

Pourquoi
- Permettre aux vitrines ludiWARE autonomes (sans CDS) d’offrir des comptes visiteurs pour commentaires, contenus réservés ou personnalisation future.

Détail technique
- Table lw_site_members, CSRF session, captcha inscription distinct du contact, routes try_serve, public_render apply_tokens.
v1.0.462026-08-07 12:59:32Captcha contact : correction des réponses valides rejetéesLorsqu’une page ou un gabarit contient plusieurs formulaires contact, la même question de vérification s’affiche partout et la bonne réponse est acceptée.
Pour les utilisateurs
- Le captcha « Combien font X + Y ? » est identique sur tous les formulaires contact d’une même page.
- Une réponse correcte n’est plus rejetée avec « Vérification de sécurité incorrecte ».

Pourquoi
- Chaque formulaire recevait parfois une question différente alors que la session ne mémorise qu’une seule réponse (contenu + gabarit finalisés séparément).

Détail technique
- lw_contact_captcha_issue() réutilise le défi session valide ; finalisation contact une seule fois sur le HTML complet (public_render.php).
v1.0.452026-08-07 12:15:48Jetons blogue : derniers articles (footer / sidebar)Placez dans un gabarit ou une page les jetons {{​blog-latest-title-1}}, {{​blog-latest-image-1}}, {{​blog-latest-excerpt-1}}, etc. (jusqu’à 10) pour afficher les articles les plus récents.
Pour les utilisateurs
- {{​blog-latest-title-N}} : titre (N=1 = plus récent, 2 = avant-dernier, … jusqu’à 10)
- {{​blog-latest-image-N}} : URL de l’image à la une
- {{​blog-latest-excerpt-N}} : extrait du corps de l’article
- {{​blog-latest-date-N}} : date courte (ex. 15 avril 2020)
- {{​blog-latest-date-long-N}} : date longue
- {{​blog-latest-url-N}} : lien vers l’article
- Idéal pour un bloc « Blogue » en pied de page ou barre latérale, comme dans un thème ZIP importé.

Pourquoi
- Personnaliser le footer sans dupliquer manuellement les titres et images des articles.

Détail technique
- lw_blog_apply_latest_tokens() dans blog.php, appelé depuis lw_blog_apply_tokens() sur gabarits et pages.
v1.0.442026-08-07 12:10:34Contact thème : messages d’erreur et champ SujetLes formulaires contact des thèmes ZIP affichent à nouveau le vrai message d’erreur (captcha, champs manquants, etc.) et le champ Sujet du thème est bien pris en charge.
Pour les utilisateurs
- Après un envoi raté, le message précis s’affiche (ex. captcha incorrect) au lieu du générique « Envoi impossible. Vérifiez les champs. »
- Le champ Sujet des formulaires de thème (ex. msg_subject, placeholder ou label « Sujet ») est enregistré et reçu par courriel.
- Les champs sans attribut name mais avec placeholder/label (Votre nom, Votre courriel…) sont reconnus à l’import et au rendu.

Pourquoi
- lw_contact_form_html() effaçait le flash session avant l’affichage des formulaires thème.
- Certains thèmes nomment le sujet autrement que subject.

Détail technique
- public_render.php : lw_contact_form_html() seulement si {{​contact_form}} est présent.
- contact_forms.php : alias msg_subject, détection placeholder/label, fallbacks nom/courriel.
v1.0.432026-08-07 12:04:45Correction erreur 500 sur les pages contact (thèmes ZIP)Les pages « Nous joindre » importées depuis un template ZIP ne provoquent plus d’erreur serveur lorsque le bouton Envoyer est imbriqué dans la grille du thème (Bootstrap, etc.).
Pour les utilisateurs
- Les pages contact personnalisées d’un thème importé s’affichent à nouveau normalement, avec captcha et envoi vers la boîte Messages.
- Avant la correction, certaines pages (ex. formulaire dans des colonnes Bootstrap) renvoyaient une erreur HTTP 500.

Pourquoi
- Lors du branchement du formulaire thème, l’emplacement du captcha était inséré au mauvais niveau du DOM lorsque le bouton Envoyer n’était pas enfant direct du <form>.

Détail technique
- contact_forms.php : lw_contact_wire_form_element() insère le slot captcha via le parent immédiat du bouton submit au lieu de form->insertBefore() sur un nœud imbriqué.
v1.0.422026-08-07 09:41:46Pages boutique CDS personnalisables (coquilles et jetons)Comme pour le blogue, vous pouvez choisir des pages CMS comme coquilles pour le magasin, les catégories, les fiches produit, le panier et les commandes, puis y placer des jetons granulaires (titre, prix, image, liste, etc.).
Pour les utilisateurs
- Dans Réglages du site → CentreDeService.NET, section « Pages coquilles boutique », associez une page CMS à chaque type d’écran (/boutique/, catégorie, produit, panier, commande).
- Sans coquille, le rendu CDS par défaut reste inchangé.
- Sur une coquille produit : {{​cds_product_title}}, {{​cds_product_image}}, {{​cds_product_price}}, {{​cds_product_desc}}, {{​cds_product_add_cart}}, ou {{​cds_product}} pour la fiche complète.
- Sur une liste / catégorie : {{​cds_shop_list}} (bloc complet), ou {{​cds_shop_categories}}, {{​cds_shop_products}}, {{​cds_shop_pager}}, {{​cds_category_title}}.
- Panier / commande : {{​cds_cart}}, {{​cds_order}}, {{​cds_cart_count}}.

Pourquoi
- Permettre une mise en page boutique alignée sur le thème du site, sur le même modèle que les jetons blogue.

Détail technique
- Coquilles : cds_shop_*_page_uid ; lw_cds_resolve_shell_page dans lw_cds_try_serve.
- Jetons : lw_cds_apply_shop_field_tokens + contexte dans lw_cds_apply_tokens.
v1.0.412026-08-07 09:03:11Formulaires contact des templates ZIP reliés au CMSLes formulaires de contact déjà présents dans un thème importé peuvent envoyer leurs messages via le moteur contact de lw-admin, sans remplacer le design du thème. À l’import, la détection est automatique ; vous pouvez aussi forcer avec data-lw-contact="1".
Pour les utilisateurs
- Un formulaire contact du thème (classes / mailto / champs nom-email-message) est branché sur la boîte Messages et l’e-mail de notification.
- L’apparence du formulaire (HTML/CSS du thème) est conservée.
- Marqueur manuel : data-lw-contact="1" force le branchement ; data-lw-contact="0" l’exclut.
- Captcha et messages de succès/erreur s’affichent comme pour {{​contact_form}}.

Pourquoi
- Éviter de remplacer un beau formulaire de thème par le HTML générique {{​contact_form}}.

Détail technique
- lw_contact_wire_form_html (import) ; lw_contact_finalize_bound_forms (rendu) ; alias de champs dans lw_contact_submit.
v1.0.40 Package2026-08-06 13:07:30ludiWARE 1.0.40 — package d’installationDistribution publique complète (ZIP + tar.gz) avec installateur. Inclut les évolutions récentes : blogue (jetons, URLs par catégories, sous-catégories), page 404 CMS, médiathèque globale, menus / import ZIP, et corrections d’affichage.
Pour les utilisateurs
- Package téléchargeable pour installer ou mettre à jour ludiWARE.
- Archives : ludiware-1.0.40.tar.gz et ludiware-1.0.40.zip
- Dépôt : https://repo.ludiware.com/releases/1.0.40/
- Assistant /install/ inclus (base de données, schéma, compte admin)

Contenu notable depuis la dernière distribution
- Blogue : jetons auteur / date longue / heure / commentaires / catégories ; URLs /blogue/catégorie/sous-catégorie/slug ; sous-catégories en admin ; accord « commentaire »
- Page 404 CMS désignée + pastille ; import ZIP (chrome, méga-menus, détection 404)
- Médiathèque globale et dossiers ; menus actifs ; déduplication header

Pourquoi
- Fournir un paquet installable aligné sur la version courante du CMS.

Détail technique
- Export OSS (sans secrets, sans api/admin usine) ; FileName VersionLog pointant vers le tar.gz public.

Télécharger le package

v1.0.392026-08-06 13:01:02Singulier « commentaire » quand il y en a 0 ou 1Dans la liste des articles du blogue, on affiche « 0 commentaire » ou « 1 commentaire » (sans s), et le pluriel seulement à partir de 2.
Pour les utilisateurs
- Meta des cartes d’articles : accord correct du mot commentaire (0/1 au singulier).

Pourquoi
- « 0 commentaires » était grammaticalement incorrect en français.

Détail technique
- lw_blog_format_comments_count : singulier si count <= 1 (FR).
v1.0.382026-08-06 13:00:31Sous-catégories de blogue plus simples à créerDans lw-admin, chaque catégorie propose un bouton pour ajouter une sous-catégorie. Le champ « Catégorie parente » est mis en avant, avec la liste en arborescence.
Pour les utilisateurs
- Liste des catégories : icône « diagramme » pour créer une sous-catégorie déjà rattachée à la bonne parente.
- Formulaire : champ parent en premier, aide sur l’URL /blogue/parente/enfant/…
- Pastille « Sous-catégorie » et colonne Parente dans le tableau.

Pourquoi
- La hiérarchie existait déjà en base, mais était trop discrète dans l’interface.

Détail technique
- blogcats.php (?new=1&parent=uid) ; clés i18n blog.cat_* ; invalidation cache catégories.
v1.0.372026-08-06 12:51:12URLs blogue avec catégories imbriquéesLes articles sont désormais accessibles via /blogue/catégorie/sous-catégorie/slug-article. Les anciennes adresses /blogue/slug redirigent automatiquement vers la nouvelle URL.
Pour les utilisateurs
- URL d’un article : /blogue/{catégorie}/{sous-catégorie}/{slug} selon la hiérarchie des catégories.
- Sans catégorie : /blogue/{slug} comme avant.
- Listes de catégories : /blogue/{catégorie}/{sous-catégorie} (l’ancien préfixe /blogue/categorie/… redirige).
- Les liens liste, commentaires, sitemap et l’admin utilisent la nouvelle structure.

Pourquoi
- Refléter l’arborescence des catégories dans l’URL, plus claire pour le SEO et la navigation.

Détail technique
- lw_blog_post_url / lw_blog_post_path_extra ; résolution de chemin dans lw_blog_try_serve ; redirections 301.
v1.0.362026-08-06 12:48:37Nouveaux jetons blogue (auteur, date, commentaires…)Les gabarits d’article peuvent afficher le nombre de commentaires, l’auteur, une date longue, l’heure de publication et la liste des catégories. Un champ Auteur a été ajouté à l’édition des articles.
Pour les utilisateurs
- Nouveaux jetons : {{​blog_comments_count}} (chiffre), {{​blog_author}}, {{​blog_date_long}} (ex. Jeudi le 3 septembre 2024), {{​blog_time}} (HH:MM), {{​blog_categories}} (liste des catégories publiées).
- {{​blog_date}} reste au format AAAA-MM-JJ.
- Champ « Auteur » à la création / édition d’un article, utilisé par {{​blog_author}}.

Pourquoi
- Permettre des mises en page d’articles plus riches sans HTML figé.

Détail technique
- Colonne author_name ; helpers lw_blog_format_date_long / lw_blog_render_categories_token_list ; jetons documentés dans templates.php.
v1.0.352026-08-06 11:32:25Page 404 CMS : affichage corrigé + pastilleLa page désignée comme 404 s’affiche correctement (y compris sur un site encore en brouillon / en aperçu). Dans la liste des pages, une pastille « 404 » apparaît comme pour l’accueil. À l’import ZIP, les pages d’erreur 404 sont détectées automatiquement.
Pour les utilisateurs
- Si vous cochez « Utiliser comme page 404 », une URL inconnue affiche cette page (thème du site), et non le 404 sombre générique.
- Cela fonctionne aussi en aperçu et tant que le site est en brouillon.
- Liste des pages : pastille orange « 404 » à côté du statut, comme la pastille Accueil.
- Nouveaux imports ZIP : une page nommée 404 / not-found est assignée automatiquement.

Pourquoi
- Le rendu de la page 404 ignorait le mode aperçu et refusait les sites brouillon (« Site non publié »), ce qui forçait le repli générique.

Détail technique
- lw_public_site_404(..., $preview) ; rendu forcé en mode aperçu si site brouillon ; badge pages.badge_404 ; auto page_404_page_uid à l’import ZIP.
v1.0.342026-08-06 11:26:54Import ZIP : plus de header en double dans les pagesÀ l’import d’un template, le header (et les wrappers du même type) est retiré du contenu des pages lorsqu’il est déjà placé dans l’en-tête global. Les sites déjà importés sont nettoyés à l’affichage.
Pour les utilisateurs
- Les pages importées ne gardent plus une copie du menu/header dans leur contenu si le chrome global est actif.
- Les templates sans balise <header> (ex. #header / .header-area) sont aussi pris en charge.

Pourquoi
- Le strip était trop strict (vote majoritaire, wrappers non sémantiques ignorés) ; des restes restaient dans le HTML des pages.

Détail technique
- Détection structurelle + affixe normalisé (ignore active) ; strip/dedupe DOM élargi ; nettoyage au rendu public.
v1.0.332026-08-06 11:16:07Menu : item courant correctement mis en évidenceSur les sites (y compris templates importés), l’item de menu actif suit la page affichée au lieu de rester figé sur Accueil.
Pour les utilisateurs
- En visitant « À propos » (ou une autre page), c’est cet item qui apparaît sélectionné, plus Accueil.
- Les parents d’un sous-menu actif restent aussi mis en évidence.

Pourquoi
- À l’import, la classe active de la page d’accueil était recopiée telle quelle dans le menu CMS, sans recalcul selon l’URL.

Détail technique
- Rendu menu : strip des classes active/current importées, marquage selon page_uid ou chemin courant, aria-current=page.
v1.0.322026-08-06 11:00:39Correction « Nouveau dossier » médiasChoisir « Nouveau dossier » dans la médiathèque affiche correctement le champ pour nommer le dossier, y compris après navigation dans l’admin.
Pour les utilisateurs
- Le champ texte sous « Nouveau dossier » réapparaît bien à la sélection.

Pourquoi
- Le script ne se rattachait pas après le chargement des pages en mode app (navigation sans rechargement complet).

Détail technique
- Délégation d’événements + réinit sur lw:fragment-loaded (lw-media-folder.js v2).
v1.0.312026-08-06 10:50:19Médiathèque globale et dossiersVous pouvez déposer des images partagées (logos, etc.) une seule fois dans Bibliothèque → Médias globaux, puis les réutiliser sur tous les sites. Le choix du dossier à l’upload propose la liste des dossiers existants ou « Nouveau dossier ».
Pour les utilisateurs
- Nouvelle section Bibliothèque → Médias globaux : upload et gestion des images partagées.
- Dans la médiathèque d’un site, l’onglet Globaux affiche ces fichiers en lecture (copie d’URL) ; les admins plateforme peuvent ouvrir Gérer.
- À l’upload ou à l’édition, le champ Dossier est une liste déroulante (aucun / existants / Nouveau dossier + champ texte).

Pourquoi
- Éviter de réimporter le même logo dans chaque site.
- Clarifier le classement par dossiers sans taper le nom à chaque fois.

Détail technique
- lw_media.site_id NULL = global ; fichiers sous uploads/global/ ; référence unique (pas de copie par site).
v1.0.302026-08-06 09:59:30Import ZIP : mega-menus préservésÀ l’import d’un template ZIP, les mega-menus (panneaux riches avec colonnes, images, CTA) et les attributs Bootstrap des menus déroulants sont conservés et restitués correctement.
Pour les utilisateurs
- Les templates avec mega-menus (ex. panneaux pleine largeur, grilles, images) gardent leur apparence après import.
- Les menus déroulants Bootstrap conservent leurs options (data-bs-toggle, etc.).
- Si un item a un panneau mega, une zone HTML dédiée apparaît dans Menus pour l’ajuster (en attendant l’extension mega-menu).

Pourquoi
- L’import ne lisait que les sous-listes <ul> ; les panneaux en <div class="dropdown-menu"> étaient perdus à la tokenisation {{​menu:…}}.

Détail technique
- Nouveaux champs item : panel_html, link_attrs, label_html ; détection à l’harvest ; rendu a+panneau ; rewrite des URLs du panneau à la persistance.
v1.0.292026-08-06 09:42:25Correction sauvegarde en-tête / pied (doublon)Enregistrer l’en-tête et le pied de page d’un template ZIP ne duplique plus le footer sous le copyright.
Pour les utilisateurs
- La sauvegarde de « En-tête & pied de page » ne laisse plus apparaître un second footer non stylé.
- Les sites déjà touchés par le bug sont corrigés à l’affichage (et définitivement en réenregistrant le chrome).

Pourquoi
- Le parseur prenait le premier </div> interne du footer pour couper le bloc, puis recopait le reste après le pied de page.

Détail technique
- Extraction after_footer via DOM ; seuls script/style/link/noscript sont conservés ; repair au rendu public.