Versione di CMS «GIRVAS» del 3 ottobre 2026 nella fase di sviluppo «Segezha».
Ultime modifiche
QueryBuilder: supporto per JOIN, espressioni CASE e indici
Implementato:
- Aggiunto l"Enum
IndexTypecon i tipi di indice (BTREE,HASH,GIST,GIN,SPGIST,BRIN,FULLTEXT) - Aggiunta la classe
ClauseJoinper i JOIN inSELECT(INNER,LEFT,RIGHT,FULL) - Implementata la generazione adattiva delle condizioni JOIN per MySQL e PostgreSQL
- Aggiunta la classe
CaseExpressionper costruire espressioni CASE - Implementati i metodi
whenJsonLike()ewhenJsonArrayContains()per la ricerca JSON - Aggiunto il metodo statico
CaseExpression::sum() - Aggiunto il metodo factory
createCase()inQueryBuilder - Aggiunta la classe
StatementCreateIndexperCREATE INDEX - Aggiunta la classe
StatementDropIndexperDROP INDEX - Implementato il supporto per
UNIQUE,CONCURRENTLY,IF NOT EXISTS/IF EXISTS, indici parziali conWHERE - Aggiunti i metodi
setStatementCreateIndex()esetStatementDropIndex() - Aggiunta la cache dei dati inizializzati in
EntryCategory
Corretto:
- Escaping delle espressioni CASE in
addSelections()per PostgreSQL
Dialetti SQL: supporto per MySQL e PostgreSQL a livello di core
Implementato:
- Classe astratta
Dialecte implementazioniPostgreSql,MySql - Factory
DialectFactory - Tipi logici (
id,bigint,integer,boolean,string,string:N,text,json,timestamp) - Metodi JSON (
jsonExtractBoolean,jsonExtractInt,jsonBuildObject,jsonMergePatch,jsonMergePatches,jsonObjectMergeKey,jsonLike,jsonArrayContainsLike) - Metodi per le date (
extractYearFromUnixTimestamp,extractMonthFromUnixTimestamp) - Metodi
LIKE,IN,LIMIT/OFFSET,getLastInsertedIDCondition - Metodi di capacità (
supportsInsertReturning,supportsConcurrently,supportsIfNotExistsForIndex,supportsPartialIndex,supportsDropIndexConcurrently,supportsDropIndexIfExists,supportsIndexType,requiresUsingClause,supportsDefault) - Tutti gli Statement trasferiti sul dialetto (
CreateTable,CreateIndex,DropIndex,Insert,Select,Update,Delete) - Tutti i Clause trasferiti sul dialetto (
Returning,From,Join,Where,OrderBy,Limit,Set) - Installer adattato: 22 tabelle, 64 indici,
createIndexSafe() - Logica di business trasferita sul dialetto (13 file:
Entry,Entries,EntryCategory,EntriesCategories,EntryComment,EntryComments,User,Users,UserGroup,UsersGroups,PageStatic,PageStatic/Version,Pages)
152-FZ: copertura tecnica completa a livello di core
Implementato:
- Logging di tutte le azioni sui dati personali (voci, pagine, media, utenti, categorie, selezioni, moduli, blocchi, commenti, gruppi, feed, impostazioni CMS)
- Logging dell"accesso ai dati personali (scheda utente, elenco utenti, profilo altrui, login/logout, invio moduli, visualizzazione log, elenco consensi)
- Logging delle impostazioni CMS con registrazione solo dei campi effettivamente modificati
- Versionamento dei documenti legali (tabella
pages_static_versions, classePageStatic\Version, UI del pannello di amministrazione, lettura di?version=X.Ysul frontend) - Registrazione dei consensi nei moduli dinamici (classe
User\Consent, tipo di campoconsent, associazione a documento e versione) - Registrazione dei consensi durante la registrazione (
UserConsent::giveBatch) - Revoca del consenso nel profilo utente (handler
api/user/patch.handler.php, UI «I miei consensi») - Visualizzazione e gestione dei consensi nel pannello di amministrazione (
/admin/usersConsents, permessoPERMISSION_ADMIN_USERS_CONSENTS_MANAGEMENT) - Esportazione CSV dei consensi (14 colonne, BOM per Excel)
- Esportazione dei dati dell"interessato ai sensi dell"art. 14 (ZIP:
profile.json,consents.csv,reports.csv,manifest.json) - Protezione dalla falsificazione dell"indirizzo IP (
Client::getRealIPAddress, proxy attendibili, verifica CIDR IPv4/IPv6) - Anonimizzazione dei dati personali ai sensi dell"art. 5 (classe
User\Anonymizer,User::isAnonymized, handler/handler/user/anonymize) - Rotazione dei log ai sensi dell"art. 5 (tabella
reports_archive, classeReports\Rotator,cron/rotateReports.php, UI su/admin/settings/security) - Banner cookie per tutti i visitatori (inclusi gli anonimi) con registrazione del consenso e protezione dai duplicati
- Impostazione
security_legal_documentsnel pannello di amministrazione (selezione dei documenti legali) - Multilingua dei report (
entryTitles,pageTitles,categoryTitlesecc. per locale)
Provider OAuth: parte server
Implementato:
- Tre tabelle:
oauth_clients,oauth_auth_codes,oauth_access_tokens - Classi
Client,AuthCode,Tokenincore/PHPLibrary/OAuth/ - Endpoint
/handler/oauth/authorize(GET/POST) e/handler/oauth/token(POST) - Supporto ai grant
authorization_codeerefresh_token - Supporto obbligatorio di
PKCE(S256) - Validazione rigorosa di
redirect_uri(corrispondenza esatta, divieto di schemi non HTTP) - Codici di autorizzazione monouso con TTL di 60 secondi
- Rotazione dei refresh token a ogni aggiornamento
- Hashing di
client_secrettramiteBCrypt(cost=12) - Verifica dei client da parte di un amministratore prima della concessione dell"accesso
- Limiti al numero di token per applicazione
- Esclusione della verifica CSRF per
/handler/oauth/*(requisito del protocollo) - Test CLI
oauth_test.php(11 controlli) e test HTTPoauth_http_test.sh(ciclo completo)
Corretto:
RegenerateSecret()non salvava il nuovo secret- Scope vuoto nel refresh token
Multilingua delle impostazioni del sito
Implementato:
- Archiviazione JSON delle impostazioni per locale (
base_site_title,seo_site_description,seo_site_keywords) - Helper
getAdminLocaleNameegetLocalizedSettingValue - Supporto a tre formati di lettura: nuovo JSON, vecchio elenco piatto, vecchia stringa piatta
- Migrazione automatica dei vecchi dati al primo salvataggio
- Separazione della locale amministrativa e pubblica (
Configurator::getSiteTitle/Description/Keywords) - UI: select della locale nell"intestazione della pagina delle impostazioni, campo nascosto
_settings_locale
Corretto:
- Bug con la visualizzazione di «Array» nel titolo/descrizione/parole chiave dopo il primo salvataggio
- Bug con la rara impossibilità di ottenere i dati della locale
Creazione automatica degli indici durante l"installazione del CMS
Implementato:
- Aggiunto un blocco di creazione degli indici al passaggio 6 dell"installazione dopo la generazione delle tabelle
- Indici per le tabelle
entries,entries_categories,entries_comments,pages_static - Indici per le tabelle
users,users_sessions,forms_data,web_channels,metrics - Indici univoci su
name,login,email - Per PostgreSQL aggiunti indici GIN sui campi JSONB e un indice parziale per le voci pubblicate
- Tutti gli indici sono creati con
IF NOT EXISTS; gli errori vengono registrati senza interrompere l"installazione
Pannello di amministrazione: ricerca e ordinamento
Implementato:
- Ricerca e ordinamento in 10 sezioni:
users,usersGroups,usersConsents,entries,pages,entriesCategories,entriesComments,entriesSamples,forms,contentBlocks - Parametri GET
?value=...e?sort=...da whitelist - Conservazione dei parametri nella paginazione (
buildQueryString+startPart) - UI:
Choices+Input+Buttonnel contenitore#E8548530785 - Metodi
getAll($searchValue, $sortRule)egetCountTotal($searchValue)nei repository - 6 regole di ordinamento (per data di creazione/aggiornamento ↑↓, in ordine alfabetico ↑↓)
Corretto:
- Bug in
Users::getCountByGroupID()—ANDsuperfluo nel ramo MySQL - Quoting adattivo delle colonne per PostgreSQL
Yandex.Metrica
Implementato:
- Impostazione
seo_code_yandex_metrika(solo ID numerico) - Campo su
/admin/settings/seo - Inserimento dello script Metrica e di
<noscript>in<head>(temadefault) - Doppia validazione:
preg_replace("/\D/", "")al salvataggio,ctype_digit()in output - Inserimento tramite
createTextNode+appendChild(altrimentisaveHTML()rompe lo script inline)
Altro
Corretto:
- Il banner cookie veniva mostrato di nuovo in presenza del cookie
allowCookies - Inserimento batch su MySQL con
innodb_autoinc_lock_mode = 2 - Perdita di campi sensibili nell"output di debug
Versione precedente: 0.3.0 «Shuya»
Commenti