Version de CMS « GIRVAS » du 3 octobre 2026 à l"étape de développement « Segezha ».
Dernières modifications
QueryBuilder : prise en charge des JOIN, des expressions CASE et des index
Implémenté :
- Ajout de l"Enum
IndexTypeavec les types d"index (BTREE,HASH,GIST,GIN,SPGIST,BRIN,FULLTEXT) - Ajout de la classe
ClauseJoinpour les JOIN dansSELECT(INNER,LEFT,RIGHT,FULL) - Implémentation de la génération adaptative des conditions JOIN pour MySQL et PostgreSQL
- Ajout de la classe
CaseExpressionpour construire des expressions CASE - Implémentation des méthodes
whenJsonLike()etwhenJsonArrayContains()pour la recherche JSON - Ajout de la méthode statique
CaseExpression::sum() - Ajout de la méthode de fabrique
createCase()dansQueryBuilder - Ajout de la classe
StatementCreateIndexpourCREATE INDEX - Ajout de la classe
StatementDropIndexpourDROP INDEX - Implémentation de la prise en charge de
UNIQUE,CONCURRENTLY,IF NOT EXISTS/IF EXISTS, des index partiels avecWHERE - Ajout des méthodes
setStatementCreateIndex()etsetStatementDropIndex() - Ajout de la mise en cache des données initialisées dans
EntryCategory
Corrigé :
- Échappement des expressions CASE dans
addSelections()pour PostgreSQL
Dialectes SQL : prise en charge de MySQL et PostgreSQL au niveau du noyau
Implémenté :
- Classe abstraite
Dialectet implémentationsPostgreSql,MySql - Fabrique
DialectFactory - Types logiques (
id,bigint,integer,boolean,string,string:N,text,json,timestamp) - Méthodes JSON (
jsonExtractBoolean,jsonExtractInt,jsonBuildObject,jsonMergePatch,jsonMergePatches,jsonObjectMergeKey,jsonLike,jsonArrayContainsLike) - Méthodes de date (
extractYearFromUnixTimestamp,extractMonthFromUnixTimestamp) - Méthodes
LIKE,IN,LIMIT/OFFSET,getLastInsertedIDCondition - Méthodes de capacités (
supportsInsertReturning,supportsConcurrently,supportsIfNotExistsForIndex,supportsPartialIndex,supportsDropIndexConcurrently,supportsDropIndexIfExists,supportsIndexType,requiresUsingClause,supportsDefault) - Tous les Statement transférés vers le dialecte (
CreateTable,CreateIndex,DropIndex,Insert,Select,Update,Delete) - Tous les Clause transférés vers le dialecte (
Returning,From,Join,Where,OrderBy,Limit,Set) - Installateur adapté : 22 tables, 64 index,
createIndexSafe() - Logique métier transférée vers le dialecte (13 fichiers :
Entry,Entries,EntryCategory,EntriesCategories,EntryComment,EntryComments,User,Users,UserGroup,UsersGroups,PageStatic,PageStatic/Version,Pages)
152-FZ : couverture technique complète au niveau du noyau
Implémenté :
- Journalisation de toutes les actions sur les données personnelles (entrées, pages, médias, utilisateurs, catégories, sélections, formulaires, blocs, commentaires, groupes, flux, paramètres CMS)
- Journalisation de l"accès aux données personnelles (fiche utilisateur, liste des utilisateurs, profil d"autrui, connexion/déconnexion, envoi de formulaire, consultation des journaux, liste des consentements)
- Journalisation des paramètres CMS avec enregistrement uniquement des champs réellement modifiés
- Versionnage des documents juridiques (table
pages_static_versions, classePageStatic\Version, UI du panneau d"administration, lecture de?version=X.Ycôté frontend) - Enregistrement des consentements dans les formulaires dynamiques (classe
User\Consent, type de champconsent, liaison au document et à la version) - Enregistrement des consentements lors de l"inscription (
UserConsent::giveBatch) - Retrait du consentement dans le profil utilisateur (handler
api/user/patch.handler.php, UI « Mes consentements ») - Consultation et gestion des consentements dans le panneau d"administration (
/admin/usersConsents, droitPERMISSION_ADMIN_USERS_CONSENTS_MANAGEMENT) - Export CSV des consentements (14 colonnes, BOM pour Excel)
- Export des données de la personne concernée selon l"art. 14 (ZIP :
profile.json,consents.csv,reports.csv,manifest.json) - Protection contre la falsification de l"adresse IP (
Client::getRealIPAddress, proxys de confiance, vérification CIDR IPv4/IPv6) - Anonymisation des données personnelles selon l"art. 5 (classe
User\Anonymizer,User::isAnonymized, handler/handler/user/anonymize) - Rotation des journaux selon l"art. 5 (table
reports_archive, classeReports\Rotator,cron/rotateReports.php, UI à/admin/settings/security) - Bannière cookies pour tous les visiteurs (y compris anonymes) avec enregistrement du consentement et protection contre les doublons
- Paramètre
security_legal_documentsdans le panneau d"administration (sélection des documents juridiques) - Multilinguisme des rapports (
entryTitles,pageTitles,categoryTitles, etc. par locale)
Fournisseur OAuth : partie serveur
Implémenté :
- Trois tables :
oauth_clients,oauth_auth_codes,oauth_access_tokens - Classes
Client,AuthCode,Tokendanscore/PHPLibrary/OAuth/ - Points de terminaison
/handler/oauth/authorize(GET/POST) et/handler/oauth/token(POST) - Prise en charge des grants
authorization_codeetrefresh_token - Prise en charge obligatoire de
PKCE(S256) - Validation stricte de
redirect_uri(correspondance exacte, interdiction des schémas non HTTP) - Codes d"autorisation à usage unique avec TTL de 60 secondes
- Rotation des refresh tokens à chaque actualisation
- Hachage de
client_secretviaBCrypt(cost=12) - Vérification des clients par un administrateur avant l"octroi de l"accès
- Limites du nombre de tokens par application
- Exclusion de la vérification CSRF pour
/handler/oauth/*(exigence du protocole) - Test CLI
oauth_test.php(11 vérifications) et test HTTPoauth_http_test.sh(cycle complet)
Corrigé :
RegenerateSecret()ne sauvegardait pas le nouveau secret- Scope vide lors du refresh token
Multilinguisme des paramètres du site
Implémenté :
- Stockage JSON des paramètres par locale (
base_site_title,seo_site_description,seo_site_keywords) - Helpers
getAdminLocaleNameetgetLocalizedSettingValue - Prise en charge de trois formats de lecture : nouveau JSON, ancienne liste plate, ancienne chaîne plate
- Migration automatique des anciennes données lors de la première sauvegarde
- Séparation de la locale d"administration et de la locale publique (
Configurator::getSiteTitle/Description/Keywords) - UI : sélecteur de locale dans l"en-tête de la page des paramètres, champ caché
_settings_locale
Corrigé :
- Bug d"affichage de « Array » dans le titre/la description/les mots-clés après la première sauvegarde
- Bug de rare impossibilité d"obtenir les données de locale
Création automatique des index lors de l"installation du CMS
Implémenté :
- Ajout d"un bloc de création d"index à l"étape 6 de l"installation après la génération des tables
- Index pour les tables
entries,entries_categories,entries_comments,pages_static - Index pour les tables
users,users_sessions,forms_data,web_channels,metrics - Index uniques sur
name,login,email - Pour PostgreSQL, ajout d"index GIN sur les champs JSONB et d"un index partiel pour les entrées publiées
- Tous les index sont créés avec
IF NOT EXISTS; les erreurs sont journalisées sans interrompre l"installation
Panneau d"administration : recherche et tri
Implémenté :
- Recherche et tri dans 10 sections :
users,usersGroups,usersConsents,entries,pages,entriesCategories,entriesComments,entriesSamples,forms,contentBlocks - Paramètres GET
?value=...et?sort=...depuis une liste blanche - Conservation des paramètres dans la pagination (
buildQueryString+startPart) - UI :
Choices+Input+Buttondans le conteneur#E8548530785 - Méthodes
getAll($searchValue, $sortRule)etgetCountTotal($searchValue)dans les dépôts - 6 règles de tri (par date de création/mise à jour ↑↓, par ordre alphabétique ↑↓)
Corrigé :
- Bug dans
Users::getCountByGroupID()—ANDsuperflu dans la branche MySQL - Citation adaptative des colonnes pour PostgreSQL
Yandex.Metrica
Implémenté :
- Paramètre
seo_code_yandex_metrika(ID numérique uniquement) - Champ à
/admin/settings/seo - Insertion du script Metrica et de
<noscript>dans<head>(thèmedefault) - Double validation :
preg_replace("/\D/", "")à la sauvegarde,ctype_digit()à l"affichage - Insertion via
createTextNode+appendChild(sinonsaveHTML()casse le script inline)
Divers
Corrigé :
- La bannière cookies s"affichait à nouveau en présence du cookie
allowCookies - Insertion batch sur MySQL avec
innodb_autoinc_lock_mode = 2 - Fuite de champs sensibles dans la sortie de debug
Version précédente : 0.3.0 « Shuya »
Commentaires