Aggiunto
-
Gli aggiornamenti del nucleo, in un solo clic (2026-09-23). A partire da questa versione, Amministrazione → Monitoraggio segnala le nuove versioni di NeoFrag Reborn e le installa: backup del sito, verifica dell'impronta del pacchetto, applicazione del pacchetto, aggiornamento del database, e ritorno al backup se qualcosa fallisce. È la prima versione pubblicata per questa via; è stata provata dall'inizio alla fine su un sito nuovo prima della pubblicazione. Un sito in 1.1.0 non ha ancora questo pulsante: passa alla 1.2.0 a mano, sostituendo i suoi file. Per i manutentori:
tools/build-release.phpproduce i tre file da pubblicare insieme (neofrag-reborn-update-<v>.zip,version.json,checksum.json); la procedura è indocs/guide/marketplace.md. -
Gli annunci su Discord (2026-09-23). Un webhook che punta a un canale Discord riceve ora un vero messaggio, con titolo, link e colore: nuova notizia, nuovo articolo, nuovo membro, nuovo commento, nuova discussione del forum. Finora Discord rifiutava ciò che il modulo inviava, benché la sua descrizione promettesse Discord.
-
«Tizio è in diretta» (2026-09-23). Quando un canale Twitch o YouTube seguito dal widget «Stato live» va in diretta, i webhook iscritti all'evento «Canale in diretta» lo annunciano, una sola volta per diretta, con la miniatura della diretta.
-
La demo parla inglese anche nei suoi contenuti (2026-09-23): le sue notizie, articoli, pagine, categorie e gallerie hanno una versione inglese, che mostra il multilinguismo.
-
Tutto il prodotto parla le sei lingue (2026-09-23). L'amministrazione, i moduli, i widget, i temi, le impostazioni, i pulsanti, i messaggi e gli script: quasi 800 stringhe erano scritte direttamente in francese e restavano così su un sito in inglese, tedesco, spagnolo, italiano o portoghese. Ora passano tutte dalle traduzioni, nelle sei lingue. In particolare:
- L'installer guidato è tradotto, con un selettore di lingua; segue all'inizio la lingua del browser.
L'installer da riga di comando accetta
--lang=en, o la lingua del terminale. - Il marketplace mostra il nome e la descrizione di ogni addon nella lingua del sito.
- I paesi (profilo, avversari) si mostrano nella lingua del sito.
- I ruoli e i modelli email inclusi si mostrano tradotti; un nome cambiato dall'amministratore resta come l'amministratore l'ha scritto.
- La moderazione mostra lo stato, il motivo e il tipo di una segnalazione, e il tipo di una sanzione, scritti per
intero — mostrava i codici (
pending,forum_message,ban_temp). - Un gruppo creato in una lingua non sparisce più quando il sito si mostra in un'altra — usciva dall'elenco, e i suoi permessi con lui.
- Il tema dell'amministrazione si dichiarava scritto in inglese: su un sito inglese, le sue stringhe francesi non venivano mai tradotte. È corretto, così come gli script dei moduli, che cercavano le loro traduzioni nel posto sbagliato.
- La conferma dell'eliminazione dell'account chiede di scrivere la parola nella lingua del sito («ELIMINA» in italiano), e non più «SUPPRIMER» ovunque.
Un controllo,
check-textes-en-dur, rifiuta ora nella CI ogni testo dell'interfaccia scritto nel codice. - L'installer guidato è tradotto, con un selettore di lingua; segue all'inizio la lingua del browser.
L'installer da riga di comando accetta
-
I browser dei visitatori possono conservare i file del sito, se lo chiedi (2026-09-22). Il manifest rendeva già il sito installabile; ora il sito può conservare le sue immagini, i suoi stili e i suoi script nei browser dei visitatori. Spento per impostazione predefinita, si accende in Amministrazione → Impostazioni → Preferenze generali («Applicazione installabile»).
Le pagine, invece, non vengono mai conservate. Una pagina tenuta in memoria sopravvivrebbe a una nuova messa online: a chi fosse già passato verrebbe servito un sito vecchio di giorni, senza che nulla lo segnali. Una modifica resta quindi visibile subito.
Togliere la spunta disinstalla davvero. È la parte delicata di questa tecnica: un componente di questo tipo, una volta installato in un browser, vi resta anche se il file viene tolto dal server. L'interruttore non toglie quindi nulla — serve una versione che si disinstalla da sola alla visita successiva. Per questo la funzione è spenta per impostazione predefinita, e per questo un aggiornamento del nucleo non la accende mai da solo.
-
Il sito si può installare come applicazione (2026-09-21).
/manifest.webmanifestè generato dal sito stesso — nome, descrizione, colore del tema, indirizzo di partenza e favicon vengono dalle impostazioni — invece di essere messo come file, che sarebbe sbagliato ovunque altrove. -
Le cartelle sensibili sono chiuse anche con Apache (2026-09-21). I
.htaccessdel pacchetto proteggevano meno della configurazione per Caddy inclusa: con Apache, l'installer restava raggiungibile una volta installato il sito (solo il suo controllo gli impediva di funzionare), e su un sito installato dal repository git, anchedocs/,tools/etests/erano raggiungibili — la documentazione si leggeva in chiaro.cache/,config/,install/,tools/,tests/edocs/hanno ora ciascuna la propria protezione, la radice blocca anche i file.neone.md, etools/check-htaccess.phprilegge l'elenco a ogni esecuzione, con il motivo di ogni riga. -
Un indirizzo sconosciuto non scrive più un errore nel registro del sito (2026-09-21). Il modulo
pages, che riceve in ultima istanza gli indirizzi che nient'altro riconosce, scriveva una riga di errore per ciascuno — ogni robot che sondava ne aggiungeva. Per gli sviluppatori di addon: un controller può ora dichiarare un rifiuto come ordinario (Module_Checker::refus_ordinaire()); la diagnosi resta mostrata sullo schermo in modalità debug. Il controllocheck-journalrifiuta ora ogni riga che il prodotto stesso scrive nel registro degli errori. -
Due controlli fanno rispettare le regole del repository (2026-09-21), per i contributori.
tools/check-tools.phpverifica che ogni strumento segua le regole comuni: intestazione descrittiva, ricorso alla libreria comune invece di codice copiato, verdetto e codici di uscita standard, porta riservata, catalogo aggiornato.tools/check-docs.phpcontrolla la documentazione: cifre esatte, link e ancore validi, nessun documento orfano, nessuna menzione di uno strumento che non esiste più, nessun passaggio copiato da un documento all'altro, documenti che restano leggibili. Entrambi girano nell'integrazione continua. -
Otto nuovi addon, tutti facoltativi (2026-09-20). Un aggiornamento non li installa: su un sito esistente, si aggiungono da Amministrazione → Temi & addon, e si tolgono allo stesso modo. Una nuova installazione li comprende con il profilo Completo, proposto per impostazione predefinita, ma non con gli altri profili.
Addon Cosa fa Effetto stagionale (widget) Neve, coriandoli o foglie su tutto lo schermo, durante un intervallo di date. Le date si scrivono MM-DDsenza anno — la stagione torna da sola — e possono passare per Capodanno (dal 12-15 al 01-06). Fuori stagione, la pagina non riceve assolutamente nulla: né immagine, né script. L'impostazione di sistema che chiede meno movimento (prefers-reduced-motion) è rispettata, e l'animazione si ferma quando la scheda passa in secondo piano.Lettore di feed (widget) Gli ultimi articoli di un feed RSS o Atom esterno. Una pagina non aspetta quasi mai un sito terzo: legge una cache, e serve perfino contenuti scaduti piuttosto che far aspettare i visitatori; l'aggiornamento avviene nell'attività pianificata. Solo la primissima visualizzazione, con la cache vuota, aspetta il feed, tre secondi al massimo. Un feed fuori servizio viene messo da parte dieci minuti invece di essere ritentato a ogni visita. Citazioni (modulo) Una raccolta per categorie, con autore e fonte. Ricette (modulo) Ingredienti e passaggi inseriti uno per riga, tempi e numero di porzioni, marcatura schema.org/Recipeche leggono i motori di ricerca.Glossario (modulo) Un lessico ordinato per lettera. «Éclaireur» va sotto la E, «Æther» sotto la A, «1v1» sotto #. La lettera è calcolata, mai inserita. Mappa dei luoghi (modulo) Luoghi su una mappa OpenStreetMap, con indirizzo, descrizione e link. La libreria della mappa è ospitata dal sito; solo le tessere della mappa di sfondo vengono da OpenStreetMap. La pagina resta utile senza JavaScript — l'elenco, gli indirizzi e i link ci sono. Web radio (modulo) Un lettore di flusso, ciò che va in onda, e il palinsesto della settimana. Una trasmissione può passare la mezzanotte: «sabato 22:00 → 02:00» resta la trasmissione del sabato. Sabbiera (modulo) Riservato ai membri: vi si prova una formattazione e si vede la resa esatta del sito. Soprattutto, mostra ciò che il sito ha tolto — è l'unica pagina che risponde a «perché la mia tabella è sparita?». I tre moduli di contenuto (citazioni, ricette, glossario) condividono lo schema delle FAQ: categorie, ricerca, filtro, ordinamento e bozze.
-
Scegliere i contenuti all'installazione. L'installer web propone ora un profilo del sito tra i requisiti e il database: Completo, Gaming / eSport, Community o Solo nucleo. I moduli si possono sempre togliere uno per uno, e quelli di cui un modulo ha bisogno vengono aggiunti automaticamente (il palmarès ha bisogno delle squadre), con un messaggio. Senza JavaScript, il modulo continua a funzionare — il server conserva solo ciò che appartiene al profilo scelto.
Nessun elenco di addon è scritto a mano: i profili sono costruiti a partire dalle dichiarazioni
presetsdi ogni addon. È la differenza dal tentativo di giugno 2026, abbandonato perché un'installazione alleggerita finiva in un errore del server (500): moduli del nucleo interrogavano le tabelle di moduli facoltativi senza verificare che esistessero. Questi controlli ora esistono e vengono verificati a ogni esecuzione della CI. -
Ogni modulo, widget e tema incluso dichiara il proprio ruolo: nel suo
__info(), dice se appartiene al nucleo, a quali profili di installazione partecipa, e di quali moduli ha bisogno. L'appartenenza al nucleo era finora un effetto collaterale della presenza nel pacchetto — è così cheemojis,filesewebhooksci erano finiti senza che fosse presa alcuna decisione. -
Tre nuove salvaguardie di integrazione continua:
Controllo Cosa rifiuta check-addon-declarations.phpun addon che non dichiara nulla, una dipendenza inesistente, un addon del nucleo che dipende da uno facoltativo, un addon non distribuibile pubblicato nel catalogo, una dichiarazione in disaccordo con seed.sqlcheck-addon-coupling.phpun accoppiamento fatale (tabella, classe) né dichiarato né annotato; un ciclo duro. Letto dal codice con il tokenizer di PHP, non con espressioni regolari — quindi nessun falso positivo sui commenti check-install-profiles.phpun profilo che non si avvia. Installa davvero su un database usa e getta, serve il sito e fallisce al minimo 5xx — anche sulle rotte dei moduli assenti, che devono restituire un 404 pulito -
Trovare un membro dalla barra di ricerca. La ricerca del sito trovava solo contenuti — forum, notizie, pagine. Cercare qualcuno obbligava ad aprire l'elenco dei membri e a sfogliarlo, benché sia una delle cose che si cercano più spesso su un sito di community. I membri compaiono ora nella ricerca globale e nei suggerimenti istantanei, per nome utente, nome o cognome.
Nulla di nuovo viene esposto per strada: questi tre campi sono già mostrati sul profilo pubblico di ogni membro, e la ricerca applica esattamente lo stesso filtro dell'elenco — un account eliminato non vi compare.
-
Gestire una serie di eventi in un colpo solo. Creare un evento ricorrente generava già tutte le sue occorrenze con un clic — tornarci sopra obbligava poi ad aprirle una per una.
Ora un'occorrenza di una serie ha un pulsante «Elimina tutta la serie», la cui conferma dice quante occorrenze se ne andranno, e il modulo di modifica propone «Applica a tutte le occorrenze della serie». Il titolo, il tipo, le descrizioni, il luogo, l'immagine e lo stato di pubblicazione vengono copiati su ciascuna; le date mai — sono loro a distinguere una sessione dalla successiva.
-
Annullare un aggiornamento e ripristinare un backup. Il CMS faceva già un backup completo — file e database — subito prima di ogni aggiornamento del nucleo. Non sapeva riutilizzarlo: la rete di sicurezza c'era, ma nessuno sapeva caderci.
Ora, se il posizionamento dei file o una migrazione fallisce, il sito viene rimesso automaticamente nello stato in cui era; il messaggio dice sia cosa è fallito sia se il ritorno indietro è riuscito. Ogni backup dell'elenco ha anche un pulsante Ripristina, per i casi in cui il danno non viene da un aggiornamento — un modulo di terze parti, un'azione di cui ci si pente. La conferma indica ciò che andrà perso.
Ciò che il ripristino non tocca, di proposito: la configurazione del sito (rimettere credenziali del database scadute taglierebbe il sito fuori dal proprio database), i registri (sono la memoria dell'incidente che si sta riparando) e la cache (svuotata perché si ricostruisca, invece di essere rimessa nello stato di un'altra versione).
Per strada, il backup comprende ora
vendor/, che il pacchetto di aggiornamento fornisce e che lui non comprendeva: senza, un ritorno indietro avrebbe rimesso il vecchio codice sopra le nuove dipendenze. -
Rispondere a un commento. Il pulsante «Rispondi», disattivato nel codice originale, funziona ora: la risposta si mostra rientrata sotto il commento a cui risponde. Si può rispondere solo a un commento di primo livello dello stesso contenuto che non sia stato eliminato (un livello di risposte); il server lo verifica.
-
Per i creatori di temi: zone chiamate per nome (idea presa da HiddenCMS). Una vista chiama ora una zona per nome —
$this->output->region('content')— invece che per numero —zone(2). Il tema dichiara la corrispondenza tra nomi e zone nel suo__info()(regions). La vecchia chiamatazone()funziona ancora, e un tema senza questa dichiarazione resta invariato. I cinque temi pubblici (Nebula, Forge, Granite, Blockcraft, Extend) usano i nomi. -
Installare da riga di comando (
install/cli.php, idea presa da HiddenCMS): un'alternativa all'installer web, pratica per installare un server in modo riproducibile o automatizzato. Le sue opzioni coprono il database (--db-*,--create-db), l'account amministratore (--admin-*), il nome e l'indirizzo del sito (--site-name,--site-url), la lingua (--lang), i dati di dimostrazione (--demo) e l'esecuzione (--force,--yes,--dry-run,--no-lock). Senza opzioni, fa le domande una per una e nasconde la password mentre la si digita;--admin-pass-envlegge la password da una variabile d'ambiente perché non compaia nell'elenco dei processi. Usa lo stesso codice dell'installer web e installa ogni addon incluso, come il profilo Completo. -
Un avviatore per tutta la batteria:
php tools/check-all.php. I controlli non avevano un punto d'ingresso comune — la CI li chiama uno per uno, e in locale ognuno scriveva il proprio ciclo a mano, mai lo stesso. L'avviatore scopre i controlli presenti (un nuovo controllo si aggiunge senza che nessuno lo tocchi), esegue primacomposer audit, limita la durata di ogni controllo, e dice alla fine ciò che non ha eseguito: i test nel browser (--navigateur) e i controlli con un obiettivo esplicito, tra cuicheck-restauration, che danneggia il sito di proposito. -
Ogni addon mostra il suo aspetto (2026-09-22). La pagina «Temi & addon» dell'amministrazione e il marketplace mostrano una miniatura: un vero screenshot del modulo, widget, tema o lingua come gira sulla demo. Tutti i 61 addon del marketplace ne hanno una, in 960×600 per i moduli e i widget. Per arrivarci, sulla demo sono stati installati sei moduli e due widget con contenuti di esempio — un glossario, citazioni, ricette, una mappa dei luoghi e un palinsesto di web radio —, e i widget che senza impostazioni non mostrano nulla sono stati catturati con impostazioni di esempio. Ciò che non ha nulla da mostrare conserva la sua icona, come i connettori Discord, GitHub e Google, la cui icona è il loro logo. La demo porta inoltre finalmente l'identità della sua community — nome, tipo, data di creazione e descrizione —, rimasta vuota.
-
Dieci addon hanno finalmente una descrizione (2026-09-22): le sei lingue e i quattro addon di accesso esterno (quello di base e i suoi connettori Discord, GitHub e Google). Viene mostrata nella lingua del sito.
-
Campi del profilo definiti dall'amministratore (2026-09-20). Il profilo di un membro aveva solo campi fissi. Amministrazione → Utenti → Campi del profilo permette di aggiungerne di propri — nome nel gioco, piattaforma, grado… —, tra otto tipi di campo. I membri li compilano nel pannello «Informazioni aggiuntive» del loro profilo. Un campo è privato per impostazione predefinita; una volta reso pubblico, si mostra sulla pagina del membro. I valori sono compresi nell'esportazione dei dati personali del membro e vengono eliminati con il suo account.
-
Il carattere del sito si sceglie nell'amministrazione (2026-09-20). Amministrazione → Impostazioni → Preferenze generali → Carattere del sito propone dodici caratteri, che sostituiscono quello di ogni tema. Per impostazione predefinita, «Carattere del tema» conserva il carattere proprio di ogni tema e non chiama alcun servizio esterno; i dodici caratteri proposti sono serviti da Google Fonts.
-
Lo storico degli accessi non è più conservato per sempre (2026-09-20). Registra l'indirizzo IP, il browser e la data di ogni accesso, e nulla lo cancellava mai. Viene ora ripulito oltre i 395 giorni (tredici mesi), una durata regolata in Amministrazione → Impostazioni → Preferenze generali; 0 disattiva la pulizia.
-
Promemoria per gli eventi seguiti del calendario (2026-09-20). Un membro che segue un evento del calendario riceve un promemoria prima del suo inizio, come i partecipanti di un evento del modulo Eventi. Il preavviso si regola nella configurazione del calendario («Promemoria prima di un evento seguito», 24 ore per impostazione predefinita, 0 per disattivarlo).
-
Il pacchetto di aggiornamento dice ciò che protegge e ciò che toglie (2026-09-20). Porta un file
nf-manifest.json: le cartelle del sito in cui un aggiornamento non scrive mai (config/,install/,upload/,logs/,backups/,cache/), e i file che la versione toglie. Finora l'aggiornamento deduceva da sé cosa eliminare; un pacchetto senza questo file è ancora accettato.
Modificato
-
Tutta l'interfaccia parla Bootstrap 5 (2026-09-23). Restavano circa 470 usi di classi di Bootstrap 3 e 4, tenuti in funzione da un foglio di stile di compatibilità: campi dei moduli, badge colorati, pulsanti di chiusura, pulsanti a tutta larghezza, blocchi «avatar e testo», gruppi di input, caselle, griglie dei moduli. Tutto il markup è migrato ai suoi equivalenti di Bootstrap 5; ciò che è proprio del prodotto porta ora un nome proprio del prodotto. Un controllo rifiuta ogni vecchio nome che ritorni, anche ridefinito. Ciò che si vede:
- gli elenchi a discesa ritrovano la loro freccia — un centinaio, nell'amministrazione e sul sito, sembravano campi di testo;
- i badge colorati (stati, gruppi, ruoli, sanzioni) sono leggibili in ogni tema, in chiaro come in scuro: il loro testo non superava il controllo del contrasto;
- i gruppi «Moderatore» e «Moderatore senior» si vedono: il loro nome era scritto in bianco su sfondo bianco;
- i pulsanti di chiusura delle finestre hanno un'area di clic sufficiente sui telefoni.
-
Il JavaScript è rivisto da un linter (2026-09-22). Settantuno file del progetto scritti nel corso degli anni, senza che nulla li controllasse oltre la loro sintassi e l'assenza di jQuery. ESLint vede ciò che la sintassi non dice: una variabile globale creata dimenticando un
var, unevalmascherato, codice dopo unreturn, uninnerHTMLalimentato da un valore calcolato. Nessun pacchetto npm viene messo online: è uno strumento di sviluppo, proprio come l'analisi statica di PHP.Le regole sono scelte con un solo criterio — aver già morso qui. È la famiglia di «
$is not defined», che aveva bloccato l'ordinamento delle tabelle in tutta l'amministrazione per tre mesi. Il disordine esistente (usi diinnerHTMLda ripulire) viene congelato così com'è invece di essere riscritto in un colpo: il suo numero non può più salire. -
La baseline di PHPStan si rigenera con un comando, e la classe
Configdel nucleo è annotata (2026-09-21). Tre nuovi errori hanno portato a riaprirephpstan-baseline.neon: le voci aggiunte a mano erano scritte diversamente da quelle di PHPStan stesso, e quasi trecento blocchi non corrispondevano più a nulla — un'intera famiglia «Function NeoFrag not found», morta da quando il file di bootstrap dichiara la funzione. La configurazione vive inphpstan-base.neon,phpstan.neonvi aggiunge solo la baseline, ecomposer stan:baselinela rigenera per intero.Configannota ora la lingua corrente, l'elenco delle lingue e le impostazioni del nucleo che i moduli leggono: questi accessi vengono analizzati invece di essere congelati. -
Gli strumenti di
tools/rifatti su una libreria comune (2026-09-21). Una sessantina di strumenti, scritti ciascuno a modo suo, copiavano le stesse tubature: avviare un server PHP, aprire una sessione da amministratore, lanciare Chrome, leggereconfig/db.php. Una lezione imparata in uno non arrivava agli altri.tools/lib/porta ora queste fondamenta — connessione, sessione, server, browser, attraversamento del repository, SQL, opzioni, verdetti —, e ogni strumento si riduce alla propria logica. Ne restano cinquantadue, senza perdita di funzioni:check-js-syntaxecheck-js-jqueryformanocheck-js-sources;check-docs-countsecheck-docs-liensformanocheck-docs;check-lang-argsconfluisce incheck-langs;seed-wiki-docsedump-wikiformanowiki-docs;smoke-testdiventacheck-smoke, come ogni controllo;addons-manifestetable-map, che sono dati, vivono nella libreria. Ogni strumento ha ora la propria porta riservata (diversi ne condividevano una), tre codici di uscita che distinguono «niente da segnalare», «rifiutato» e «non ha potuto giudicare», e un'intestazione da cui si genera il catalogo ditools/README.md.bs5-codemod, lo strumento della migrazione da Bootstrap 4 a 5 di giugno, è tolto:check-classes-bs4copre tutto ciò che controllava, compresi i breakpoint delle utility direzionali. -
declare(strict_types=1)su tutto il perimetro utile (2026-09-21): 1.365 file contro 78 il giorno prima. Il lavoro avanzava a piccoli lotti da giugno; è finito. I 209 file restanti sono i modelliviews/**.tpl.php, dove la dichiarazione sarebbe sintatticamente valida e non proteggerebbe nulla.La conversione è stata fatta in ordine di rischio decrescente — il numero di chiamate a funzioni native per file —, con la suite di test eseguita tra un lotto e l'altro.
Una conseguenza di fondo, propria di questo prodotto: PHP in modalità rigorosa rifiuta
__toString()per le funzioni interne. Ora,lang()restituisce un oggetto di traduzione differito, risolto al momento della resa, quando la lingua è finalmente nota, e anche le date sono oggetti. La barra dell'amministrazione, la pagina di ogni notizia e diverse schermate si bloccavano quindi con un errore fatale — modulo fuori uso, pagina troncata, senza una parola. La conversione avviene ora nel punto di escape (htmlspecialchars), cioè dove il valore deve diventare una stringa per definizione: quasi 500 punti in 86 file.L'ondata ha richiesto anche undici conversioni esplicite, tre delle quali su percorsi presi a ogni pagina — l'ordine di visualizzazione delle lingue e dei gruppi, letto all'inizio di ogni sessione, e il calcolo del token che protegge ogni modulo dalle richieste contraffatte (CSRF): senza di esse, un sito con due lingue attive avrebbe restituito un errore 500 su tutte le sue pagine.
-
Il registro dice ora DOVE, non solo cosa (2026-09-21). Quando un modulo solleva un'eccezione, la sua resa viene abbandonata e la pagina si mostra troncata — in silenzio. La riga del registro dava il messaggio senza mai nominare un file. Ora nomina il primo punto del codice proprio del prodotto nello stack delle chiamate. Risalire all'origine degli errori qui sopra è passato da un'indagine a una semplice lettura.
-
Il compilatore SCSS passa alla 2.1 (2026-09-20). Su PHP 8.5, ogni compilazione degli stili scriveva dieci avvisi di deprecazione nel registro; non ne resta nessuno. La 2.x minimizza un po' di più (
.25reminvece di0.25rem,#cccinvece di#CCCCCC), il che cambia tre fogli di stile — quelli dei moduli addon e palmarès e della pagina di manutenzione. L'equivalenza non è stata dedotta dal testo: i due insiemi di CSS sono stati dati al motore di Chrome, che vi vede esattamente le stesse regole, proprietà e valori calcolati. -
La documentazione è stata riletta per intero sul codice (2026-09-17). Le guide all'installazione, ai concetti e allo sviluppo (creare un modulo, un widget, un tema, il framework) risalivano a giugno e descrivevano il CMS di prima: un'installazione senza scelta di profilo, un tema che caricava jQuery, griglie di Bootstrap 4. Ora dicono ciò che fa il prodotto — profili di installazione, dichiarazioni degli addon, regioni con nome, front end senza jQuery sotto una politica di sicurezza rigorosa, impostazioni dei widget con valori di riserva, vocabolario di colori condiviso. Il README, la guida al contributo, la politica di sicurezza e il riferimento tecnico sono allineati allo stesso modo.
-
Ciò che un addon consente si legge dalla sua dichiarazione, non più da elenchi di nomi scritti nel codice. Tre di essi decidevano la sorte degli addon, e tutti e tre erano sbagliati: l'elenco dei widget proteggeva sette nomi che non sono widget; quello dei temi proteggeva un tema
defaultinesistente lasciandonebula, l'unico tema pubblico del nucleo, eliminabile appena era inattivo; quello dei moduli duplicava, in disaccordo, ciò che__info()diceva già. Verificato addon per addon rispetto alla vecchia logica: nessun cambiamento in ciò che si può disattivare, nessun cambiamento di stato attivo, e 39 addon diventano non eliminabili — che è lo scopo della correzione. -
Il Cestino non conosce più gli altri moduli. Aveva scritto nel codice l'elenco delle tabelle, chiavi primarie e metodi di ripristino di
news,articles,gallery,commentseforum: non poteva quindi appartenere al nucleo senza trascinare con sé quattro moduli facoltativi —commentsappartiene esso stesso al nucleo. Ogni modulo dichiara ora i suoi tipi ripristinabili; il nucleo li raccoglie. Stessa inversione per i descrittori di contenuto (reazioni, abbonamenti, revisioni). -
L'elenco degli addon del nucleo e facoltativi non è più mantenuto a mano.
tools/lib/addons-manifest.php, una tabella scritta a mano e congelata a giugno, è ora dedotta dalle dichiarazioni. Le due avevano già divergito:emojisera elencato come nucleo mentre si dichiara à la carte — si poteva quindi togliere all'installazione ma mancava nel catalogo, ed era perciò impossibile da reinstallare. Catalogo: 52 → 53 addon quel giorno (61 all'uscita della 1.2.0). -
L'installer, rifatto visivamente: impaginazione su due colonne, token di stile presi da
nebula(blu notte e verde acqua, accento#2dd4bf), sfumatura tolta da dietro il testo, logo messo in un badge.
Corretto
-
Il backup del Monitoraggio funziona di nuovo (2026-09-23). Dal 21 settembre, si fermava alla primissima riga del database: il pulsante «Avvia backup», e l'aggiornamento del nucleo, che comincia con un backup, fallivano su ogni sito. Trovato provando l'aggiornamento prima di pubblicarlo.
-
Cambiare lingua su una notizia tradotta non porta più a una pagina non trovata (2026-09-23). Il selettore di lingua conserva l'indirizzo, e con esso il titolo nella lingua precedente: la versione tradotta lo rifiutava. Ora reindirizza al proprio indirizzo.
-
Una pagina tradotta si mostra nella lingua giusta (2026-09-23). Le pagine pubbliche venivano servite nella versione che il database restituiva per prima, qualunque fosse la lingua del visitatore.
-
Il tema scelto da un visitatore non si estende più a un altro sito dello stesso dominio (2026-09-23). La scelta veniva ricordata per tutto il dominio: un visitatore che passava un sito a Forge vedeva anche in Forge un altro sito installato sotto lo stesso dominio. La scelta viene ora ricordata per ogni sito separatamente, e una nuova impostazione, Preferenze generali → Scelta del tema, permette di disattivarla: il menu sparisce e il tema predefinito vale per tutti.
-
La demo si ripristina di nuovo (2026-09-23). Un errore nel suo insieme di dati faceva fallire il ripristino ogni quarto d'ora dal giorno prima: ciò che i visitatori vi cambiavano restava. Un controllo rifiuta ora questo difetto prima che qualcosa vada online, e un ripristino fallito viene scritto nel registro invece di passare inosservato.
-
L'account di emergenza della demo non compare più da nessuna parte (2026-09-23): né nell'elenco dei membri, né nella ricerca, né tra i membri online, né nell'amministrazione; la sua pagina risponde «non trovato».
-
Il sito su un telefono (2026-09-23), sulla base di screenshot presi su un telefono:
- Il menu è sempre raggiungibile. Nel tema Nebula, spariva sotto gli 860 pixel di larghezza senza un pulsante per riaprirlo: ora lo apre un pulsante «hamburger». Negli altri temi, un menu troppo lungo per una riga si raccoglie dietro un pulsante «Menu», invece di andare a capo fino a riempire lo schermo; un menu corto resta aperto.
- I blocchi impilati non si toccano più: l'area membri era attaccata al blocco sopra.
- Il testo non si attacca più agli avatar dei membri (commenti, conversazioni, autore di una notizia, candidature, profilo).
- I punti del carosello sono veri pulsanti, centrati sotto l'immagine, e restano chiari sui temi scuri, come le frecce e la didascalia: Bootstrap li rendeva neri.
- La ricerca del tema Extend conserva il suo pulsante accanto al campo.
- Le foto di un album riempiono la loro scheda.
- L'intestazione dei commenti mostra il titolo prima del contatore, che prima lo precedeva.
- Le date abbreviate si scrivono nella lingua del sito («30 août 2026», «Sonntag»), e non più in inglese; la riga dell'autore di una notizia ritrova una dimensione di testo normale.
-
La pagina di una foto della galleria esiste (2026-09-23). Il widget «Immagine casuale», il carosello della galleria e il link di un commento scritto su una foto portavano tutti a una pagina non trovata: non era mai stata dichiarata. Mostra la foto, la sua descrizione, la via del ritorno all'album e i commenti. Una foto segue inoltre le regole del suo album: niente più accesso dal suo indirizzo quando l'album è nel cestino o non ancora pubblicato.
-
Gli ultimi resti di Bootstrap 3 e 4 (2026-09-23), che i loro nomi di classe non tradivano: la struttura del carosello, le croci di chiusura che mostravano una «×» sopra l'icona, due fisarmoniche (FAQ, link di navigazione) ancora costruite alla maniera di Bootstrap 4 (quella delle FAQ si apriva, ma senza l'aspetto né la freccia del componente), campi che si avvolgevano in un gruppo vuoto, la freccia dei fumetti rimasta bianca sotto un fumetto scuro, e due regole del widget dei partner.
check-classes-bs4legge ora anche la STRUTTURA dei componenti e gli stili scritti nelle viste. -
Pagine di errore che non lo erano (2026-09-23). Nella moderazione, e nella gestione dei ruoli, dei modelli email, dei membri e del carosello, un indirizzo che puntava a un elemento tolto doveva rispondere «pagina non trovata»: chiamava una funzione che non esiste, scriveva un avviso nel registro, e la pagina della moderazione si mostrava vuota. Trovato insegnando all'analisi statica le funzioni «magiche» del framework — il che ha tolto 455 occorrenze dalla sua lista di eccezioni.
-
Il pulsante delle email inviate ai membri è leggibile (2026-09-23): la convalida dell'account, la password persa e gli altri modelli avevano un pulsante bianco su turchese chiaro (contrasto di 2,3:1). La correzione vale per i modelli inclusi e per quelli già installati, tranne quelli che un amministratore ha personalizzato.
-
Ultimi ritocchi di visualizzazione (2026-09-23): i link del wiki nella tinta leggibile del tema; i pulsanti di «successo» sui temi scuri; lo stato di una candidatura, il cui riquadro non aveva sfondo (classi di un vecchio tema di amministrazione); i social network sulle schede dei membri; i titoli troncati nell'amministrazione; un visitatore che segue il link per partecipare a un evento riceve «Accesso non autorizzato» invece di una pagina non trovata.
-
Il testo è leggibile ovunque, in modalità chiara come in modalità scura (2026-09-23). I link e i pulsanti dell'amministrazione, gli avvisi, le date e le intestazioni delle tabelle dei temi, le categorie delle notizie, la pagina del marketplace sui temi chiari, il pulsante «Accetta tutto» del banner dei cookie, i badge di reputazione e di tipo di evento: tutti raggiungono ora il contrasto minimo raccomandato (4,5:1). In modalità scura, l'amministrazione ha i suoi colori di stato, e il pannello «Salute del sito» e la zona di caricamento delle immagini della galleria seguono il tema.
-
L'amministrazione su un telefono (2026-09-23). La barra in alto va a capo su due righe — le briciole di pane complete, poi i pulsanti — invece di troncare il titolo della pagina; i bersagli piccoli (icona della home, contatori) sono abbastanza grandi per un dito; l'intestazione delle categorie del forum non scivola più sotto i suoi pulsanti.
-
Il forum su un telefono (2026-09-23): in una discussione, l'autore passa sopra il messaggio invece di lasciargli solo 200 px di larghezza, e i pulsanti di un messaggio non coprono più la sua data.
-
I plurali tradotti (2026-09-23). 47 stringhe avevano perso la loro forma plurale nella traduzione: un sito in inglese mostrava «3 topic», «5 image», «2 year». Il contatore delle categorie del forum, scritto in francese in ogni lingua, è ora tradotto.
-
La documentazione del sito è aggiornata (2026-09-23). Le dieci pagine del wiki fornite con il prodotto e quelle della demo erano indietro di una settimana rispetto alle guide; «Creare un widget» insegnava ancora una classe di Bootstrap 4. Un controllo le confronta ora con le guide.
-
Il modulo di risposta del forum sta su un telefono (2026-09-23): l'elenco dei tipi di allegato consentiti, scritto senza spazi, formava una sola parola troppo larga per lo schermo.
-
Tutto il sito passato al vaglio, in ogni tema, ogni modalità e ogni larghezza (2026-09-23). Un controllo automatico mostra ora ogni pagina dell'amministrazione nel suo tema e ogni pagina pubblica in ogni tema pubblico, in chiaro e in scuro, connesso come amministratore e come visitatore, in otto larghezze da 360 a 2560 px, con e senza contenuti. Questo primo passaggio ha corretto:
- icone rotte negli elenchi di categorie della galleria, dei giochi, delle squadre e delle notizie, quando una categoria non aveva icona;
- il paese dei profili della demo, scritto per intero: il profilo non mostrava nessun paese e cercava una bandiera che non si trovava;
- gli oggetti dei modelli email, che mostravano
{{site_name}}così com'era nell'elenco; - tabelle troppo larghe per un telefono (Bug tracker, download, storico del wiki, moderazione, sessioni, partecipanti a un evento, palmarès): ora scorrono dentro la loro cornice invece di allargare tutta la pagina;
- gli elenchi del forum su un telefono: quattro colonne si dividevano 360 px e l'ultimo messaggio veniva tagliato; ogni voce ora si impila — icona e titolo, poi statistiche e ultimo messaggio;
- la barra del tema Nebula su un telefono, che debordava dallo schermo;
- tre file richiesti da pagine senza esistere, e due righe scritte nel registro a ogni controllo degli aggiornamenti finché nessuna versione è pubblicata.
-
I pulsanti «Modifica» ed «Elimina» non sono più sfalsati (2026-09-22). Negli elenchi dell'amministrazione a due colonne — categorie delle notizie, categorie della galleria… — il secondo pulsante andava a capo, spostato sotto il primo. Ora restano affiancati.
-
La scheda «Archiviazione» del monitoraggio si mostra correttamente (2026-09-22). L'indicatore veniva disegnato come un cerchio pieno invece del semicerchio previsto, con una cifra grezza al centro, e il valore e la percentuale, posti in alto, si sovrapponevano al tratto; ora stanno nell'incavo dell'indicatore. Il titolo «Informazioni server» della stessa pagina va a capo su due righe quando la colonna è stretta, invece di essere tagliato. Nel gruppo «Invio email», la riga «Trasporto email» mostrava
[object Object]invece del metodo usato. -
Un widget collocato senza impostazioni si mostra con i suoi valori predefiniti (2026-09-22). Quando un tema colloca un widget all'installazione, o una vecchia disposizione lo ripristina, arriva senza impostazioni: scriveva allora avvisi nel registro a ogni pagina mostrata, e il menu di navigazione semplicemente spariva. Ora riceve i valori che il suo modulo avrebbe salvato per impostazione predefinita. I widget già configurati non cambiano.
-
La pagina degli eventi si mostra di nuovo (2026-09-22). Mostrava una pagina di errore «non trovato» appena aveva eventi da distribuire su più pagine — sotto un titolo del tutto normale, il che rendeva difficile accorgersene. L'impostazione del numero di eventi per pagina veniva salvata come testo, e il codice, reso più rigoroso il giorno prima, la rifiutava. Tutti gli elenchi paginati accettano ora questa impostazione nelle sue due forme.
-
I voti dei sondaggi vengono registrati (2026-09-22). Chi votava leggeva «Grazie per il tuo voto!», e il voto non veniva mai contato: nessuna opzione veniva riconosciuta come appartenente al sondaggio. Un voto che non punta a nessuna opzione del sondaggio viene ora rifiutato con un messaggio che lo dice, invece di essere accolto.
-
Il widget «Forum» mostra finalmente discussioni e messaggi (2026-09-22). I suoi due tipi, «Ultimi argomenti» e «Ultimi messaggi», non selezionavano nessuna categoria del forum, e restavano quindi vuoti su ogni sito, quanti che fossero i messaggi.
-
Altre tre funzioni cadevano nella stessa trappola dei sondaggi (2026-09-22), trovate dal controllo scritto per questo difetto:
- aprire una candidatura con campi personalizzati faceva bloccare la pagina, dal lato del candidato come nell'amministrazione;
- una notifica che rimanda a un evento del calendario si bloccava costruendo il suo link;
- la profondità massima delle risposte del forum non veniva mai applicata: il calcolo si fermava al primo livello.
-
Tornare alla pagina 1 di un elenco non porta più a una pagina non trovata (2026-09-22). Negli elenchi dell'amministrazione il cui numero di elementi per pagina è regolabile, il pulsante «1» costruiva un indirizzo che il sito non riconosceva.
-
La schermata di modifica di un campo del profilo personalizzato si apre (2026-09-22). La schermata si bloccava a ogni apertura: non dava un'etichetta al suo pulsante di salvataggio.
-
Due pulsanti «Indietro» portavano a una pagina non trovata (2026-09-22): dalla pagina di un'immagine, verso il suo album; da una modalità di gioco, verso il suo gioco.
-
«Candidati» non compare più dove la candidatura verrebbe rifiutata (2026-09-22): su un'offerta chiusa o completa, e per chi non ha il diritto di candidarsi. Allo stesso modo, un amministratore che legge una conversazione riservata allo staff può ora invitarvi e segnalarvi un messaggio, invece di essere respinto dopo aver visto il pulsante.
-
I sottomenu del widget di navigazione si aprono (2026-09-22). Un link che raggruppa altri link non apriva nulla al clic: portava ancora l'attributo della vecchia versione di Bootstrap, che il suo stesso script non cercava più.
-
Gli altri fumetti di aiuto dei moduli compaiono al passaggio del mouse (2026-09-22). La correzione del giorno prima copriva solo una parte dei moduli: l'icona (i) accanto ai campi delle altre schermate dell'amministrazione, e i fumetti delle etichette, continuavano a non mostrare nulla — lo stesso difetto di attributo, nelle due librerie che li costruiscono.
-
Le etichette di menu accentate vengono tradotte (2026-09-22). Un link di menu salvato dall'amministrazione — «Actualités», «Équipes» — viene memorizzato in forma codificata, e la sua traduzione non si trovava più: restava in francese nelle altre cinque lingue, con un avviso nel registro a ogni pagina mostrata.
-
Gli archivi del marketplace sono riproducibili (2026-09-22). Portavano le source map
.map, che il compilatore degli stili rigenera a ogni installazione e che il repository ignora: due archivi dello stesso addon, costruiti su due macchine, differivano anche se il codice non era cambiato. Gli archivi non portano più questi file. -
Il widget «Palmarès» si può finalmente installare caricando un archivio (2026-09-22). Era l'unico dei 61 addon distribuibili a non dichiarare la sua dipendenza dal nucleo; l'installer, che la richiede per riconoscere un addon, lo saltava SENZA UNA PAROLA — nessun messaggio, nessuna traccia.
-
La pagina di manutenzione non è più bianca (2026-09-22). I due campi «Titolo» e «Contenuto» vengono forniti VUOTI, quindi la pagina non mostrava NULLA oltre al nome del sito — anche se l'anteprima dell'amministrazione prometteva un titolo e un testo. Un titolo e un messaggio predefiniti, tradotti nelle sei lingue, riempiono il vuoto; appena i campi sono compilati, sono loro a essere mostrati.
-
I pulsanti con contorno ritrovano il loro bordo (2026-09-22). I temi ridefinivano solo la variante «primary» del pulsante con contorno, e la loro regola cancellava il bordo delle altre: le altre sei varianti usate dal prodotto — 90 usi nel codice — sembravano semplici link. Il più visibile era «Apri il sito», nel banner di manutenzione, che aveva un bordo solo al passaggio del mouse.
-
Il codice tecnico non è più rosa nell'amministrazione (2026-09-22). Il tema impostava solo il carattere dei frammenti
<code>, che conservavano quindi il rosa di Bootstrap — un colore estraneo a tutte le tavolozze del prodotto. Molto visibile nell'elenco dei ruoli. -
Il pulsante «Chiudi» delle finestre chiude finalmente la finestra (2026-09-22). In TUTTE le finestre del prodotto, il pulsante «Chiudi» (o «Annulla») in basso non faceva nulla: serviva la croce in alto a destra. La causa: Bootstrap 5 ha rinominato l'attributo che fa scattare la chiusura, e il nucleo metteva ancora il vecchio nome; un browser ignora un attributo sconosciuto in silenzio. Il pulsante è anche diventato un vero pulsante — veniva reso come uno
<span>, ed era quindi irraggiungibile da tastiera. Due salvaguardie impediscono che torni: il controllo del codice rifiuta il vecchio nome, e un passaggio nel browser, lanciato a mano, CLICCA il pulsante. -
Il tema Nebula non mostra più il suo menu due volte (2026-09-22). Ogni nuova installazione mostrava due volte il nome del sito e due volte il menu: il tema disegna la propria barra, e l'installazione collocava IN PIÙ un titolo e un menu subito sotto. Il menu vive ora nella barra in alto, dove compare una sola volta — ed è configurabile dall'amministrazione, cosa che prima non era: i link della barra erano scritti nel codice, quindi mancava «Contatto» e un modulo disattivato conservava il suo link. I siti già installati vengono corretti da una migrazione, che tocca l'intestazione solo se è rimasta come fornita.
-
Cambiare lingua non porta più a una pagina di codice (2026-09-22). Il selettore di lingua del piè di pagina — quello di cinque temi, tra cui quello predefinito — mandava il visitatore su una pagina che mostrava
{"redirect":"/en/…"}come testo grezzo, invece di portarlo alla pagina tradotta. Bisognava tornare indietro per uscirne.La causa: questo selettore è un vero modulo, che nulla intercettava, e puntava a un indirizzo tecnico che risponde sempre in JSON. Il server distingue ora una chiamata dalla finestra «Scegli la mia lingua», che si aspetta JSON, da un invio di modulo ordinario, che si aspetta di essere portato alla pagina. Trovato seguendo il gesto in un browser vero, cosa che nessun controllo aveva fatto fino ad allora.
-
I contenuti scritti in una sola lingua non mandano più le altre lingue su una pagina di errore (2026-09-21). Una notizia scritta in francese proponeva ancora le altre cinque lingue nel suo selettore, e tutte e cinque rispondevano 404: misurato sulla demo, 60 indirizzi morti su 72. Il gesto più naturale di un visitatore straniero finiva su un errore. Ora viene servita la versione che esiste, con un avviso che lo dice nella lingua del visitatore e un link all'originale. Questo vale per le notizie, gli articoli e gli album (e le loro categorie), così come per le squadre.
Due precauzioni inseparabili, senza le quali il rimedio costerebbe più del male: la pagina annuncia ora ai motori di ricerca solo le lingue che esistono davvero, e designa l'originale come indirizzo canonico — altrimenti verrebbero indicizzati sei indirizzi per un solo testo. Nell'amministrazione, nessun ripiego: una versione vuota deve mostrarsi vuota, è proprio quello che si viene a compilare.
tools/check-langues-contenu.phpfa rispettare tutte e tre le proprietà, nell'integrazione continua. -
L'integrazione continua è di nuovo verde (2026-09-21); sul ramo principale, era rossa dal 10 giugno. Quasi tutte le cause stavano negli strumenti di test e nella configurazione della CI, non nel prodotto. L'eccezione: con il server integrato di PHP 8.3, il sito poteva calcolare male il suo indirizzo di base e reindirizzare fogli di stile e script; ora lo deduce solo da uno
SCRIPT_NAMEche finisce conindex.php. Una suite di test che non può essere eseguita ora fallisce invece di saltarsi in silenzio, e la maggior parte dei job della CI ha un limite di tempo. -
Il logo dell'installer non si mostrava in una nuova installazione (2026-09-21): il percorso era relativo alla cartella
install/, che il server non serve a quell'indirizzo. L'immagine è ora incorporata nella pagina. -
Componenti che non si aprivano più dal passaggio a Bootstrap 5 (2026-09-21). Bootstrap 5 ha dato il prefisso
bs-a tutti i suoi attributi di dati. Un attributo rimasto con il vecchio nome non provoca alcun errore: il componente semplicemente non fa nulla. Questi erano morti in silenzio:Cosa non funzionava più Dove La fisarmonica delle FAQ non si apriva modules/faqL'elenco dei partecipanti di un evento non si apriva modules/eventsI popover di aiuto di una parte dei moduli erano vuoti nucleo — neofrag/libraries/form.phpIl popover del profilo del forum, quello per eliminare un link di navigazione modules/forum,widgets/navigationIl posizionamento dei fumetti nell'Editor live, l'intervallo del carosello modules/live_editor,widgets/slider -
Impaginazioni rotte, anch'esse silenziose (2026-09-21). Bootstrap 5 ha rinominato le sue utility direzionali; una classe rinominata non è più definita da nessuna parte, e l'elemento conserva la sua impaginazione predefinita senza che nulla lo segnali.
- I piè dei pannelli e delle finestre modali non si allineavano a destra. Il nucleo costruiva la classe per
concatenazione (
'float-'.$align), quindi nessuna ricerca difloat-rightpoteva trovarla. L'unico ponte di compatibilità del prodotto copriva solo le tabelle del tema dell'amministrazione: niente per i temi pubblici. Stessa causa per l'allineamento delle celle delle tabelle, nelle due librerie. - Nessun campo di modulo rifiutato veniva segnato, in nessun tema. Le due librerie mettevano un nome superato —
has-error(Bootstrap 3) ehas-danger(una versione preliminare di Bootstrap 4) — che nessun foglio di stile servito definisce. Il messaggio si mostrava, ma nulla indicava il campo interessato. Sono sostituiti da un marcatore proprio, definito una volta sola. - Il piè di pagina portava
<div class="float-right">: «Realizzato con NeoFrag Reborn» scendeva su una nuova riga, a sinistra. Il valore viene da lontano — una migrazione di Alpha 0.2.2 l'aveva cambiato dapull-rightafloat-rightai tempi di Bootstrap 4, e il passo successivo non è mai stato fatto. Una migrazione (2026_09_20_bootstrap5_float) corregge i siti esistenti; il seed fornisce orafloat-end. - E le ultime classi morte nelle viste: la barra di debug su un telefono, lo spazio degli elenchi di eventi, le etichette dell'editor dei menu, le due barre del voto del reclutamento — che uscivano dello stesso colore, così il grafico non distingueva più i pareri favorevoli da quelli sfavorevoli.
- I piè dei pannelli e delle finestre modali non si allineavano a destra. Il nucleo costruiva la classe per
concatenazione (
-
Il corpo di un articolo poteva essere cancellato alla visualizzazione (2026-09-21). La costruzione dell'indice sostituiva il testo con il risultato di un trattamento che può arrendersi davanti a un articolo lungo: la pagina rispondeva allora normalmente, con un articolo vuoto, e nulla nei registri.
-
Un widget collocato in cima o in fondo alla pagina spariva. Il tema Nebula proponeva le posizioni «Intestazione» e «Piè di pagina» nell'editor delle disposizioni, ma non le mostrava. Il widget veniva sì salvato, e non compariva nulla — senza messaggio. Gli altri quattro temi pubblici non erano toccati.
-
Il widget di navigazione proponeva due moduli interni (
live_editorepages) che avrebbe dovuto nascondere. Lo stesso difetto faceva perdere il nome del modulo alle statistiche dell'amministrazione, senza effetto visibile finché due moduli non usano lo stesso nome di statistica. -
Il registro di debug cresceva senza limite quando era acceso. Ora ha un tetto: oltre i 64 MB, ricomincia conservando la generazione precedente.
-
Su un sito inglese, «No» restava in francese («Non»).
-
Cinque pagine dell'amministrazione non offrivano alcuna via di ritorno (2026-09-20): la scheda di un membro, il log di audit, l'aggiunta di un gruppo, l'elenco delle sessioni e i file del monitoraggio. Le briciole di pane rendono cliccabile il nome del modulo solo se il modulo dichiara di avere una pagina iniziale di amministrazione;
useremonitoringdichiaravano il contrario pur avendone una. Una volta su queste pagine, bisognava passare dal menu laterale o dal pulsante indietro del browser. -
I motori di ricerca ricevevano JSON invece della mappa del sito. Richiesta nella radice, senza prefisso di lingua — l'unico modo in cui la richiede un robot —,
/sitemap.xmlrispondeva{"redirect":"/fr/sitemap.xml"}con il codice di stato 200, erobots.txtehumans.txtfacevano lo stesso. Il reindirizzamento che aggiunge il prefisso di lingua rispondeva in JSON ogni volta che l'indirizzo finiva con.txt,.xmlo.json. Poiché questi file non hanno una versione per lingua, non passano più da questo reindirizzamento: vengono serviti direttamente, con il loro vero tipo di contenuto. -
/favicon.icorispondeva 404. I browser richiedono questo indirizzo qualunque cosa dichiari la pagina; ora porta alla favicon configurata nelle impostazioni, o a quella del CMS. -
Attivare l'autenticazione a due fattori si bloccava. Al salvataggio dei codici di recupero, un errore interrompeva la pagina: l'account finiva segnato come «protetto» senza un solo codice di emergenza. Trovato da un test scritto rafforzando la tipizzazione di questa libreria; corretto, e il test resta.
-
Un limite di «un solo tentativo» non bloccava mai. La soglia veniva controllata solo dal secondo tentativo. Nessun effetto sulle soglie fornite, ma il limite di segnalazioni della moderazione, che si può abbassare fino a 1, non bloccava allora mai. La soglia vale ora dal primo tentativo.
-
Alcuni testi restavano in francese nelle altre lingue, e il registro continuava a riempirsi. Tre cause, tutte corrette: il titolo di una pagina del wiki, di un tipo di evento o di una campagna di donazioni passava dalla traduzione come se fosse testo dell'interfaccia (non ha traduzione: è contenuto); un testo già tradotto passava di nuovo dalla traduzione — «Espace membre» diventava «Member area», poi «Member area» veniva cercato come chiave e segnalato mancante a ogni visualizzazione; e trenta stringhe dell'interfaccia (il campo «Nome utente o indirizzo e-mail» del modulo di accesso, titoli di pannello nell'amministrazione dei giochi e del reclutamento, i social network del profilo…) non avevano traduzione in nessuna lingua, perché il controllo che verifica le sei lingue guardava solo le chiamate di traduzione esplicite, non i titoli di campi e intestazioni tradotti più avanti. Il controllo ora li vede; le trenta stringhe sono tradotte in inglese, tedesco, spagnolo, italiano e portoghese.
-
Google Analytics aspetta ora il tuo consenso. Se è configurato un ID di Analytics, lo script di Google si carica ora solo dopo un clic su «Accetta tutto» nel banner dei cookie, mai prima. Inoltre, la politica di sicurezza del sito bloccava questo script in ogni caso: Analytics non funzionava, e nulla lo diceva. Ora funziona, e solo con il consenso del visitatore.
-
Tre funzioni dell'amministrazione non rispondevano più da giugno. L'ordinamento delle tabelle cliccando sull'intestazione di una colonna, il riordino per trascinamento di categorie, forum e sottoforum, e i pulsanti Aperto/Chiuso delle pagine Manutenzione e Iscrizioni: i loro script presupponevano ancora la presenza di jQuery, benché sia stato tolto dal CMS a giugno 2026, e si fermavano di colpo al caricamento della pagina — senza messaggio, i pulsanti restavano semplicemente inerti. Tutti e tre sono stati riscritti senza jQuery, sono coperti da test nel browser, e un controllo automatico rifiuta ora ogni script che richiami jQuery.
-
Un indirizzo malformato causava un errore del server. Una richiesta come
/fr/a:80o/:80, di quelle che mandano i robot, faceva bloccare il calcolo dell'estensione dell'indirizzo e restituiva un errore 500 al visitatore. Il sito risponde ora con un normale 404. -
Il modulo di contatto scriveva «Da:» con l'indirizzo del visitatore. Inviare un messaggio dal proprio server a nome di
visiteur@example.orgè esattamente ciò che rifiutano le protezioni contro la falsificazione dei fornitori di posta (SPF, DMARC): il messaggio finiva nello spam o veniva rifiutato. Il mittente è ora l'indirizzo di contatto del sito, e l'indirizzo del visitatore è messo in «Rispondi a», che in pratica è la stessa cosa. Stessa correzione per le risposte a una candidatura, che potevano partire con l'indirizzo personale dell'amministratore. -
L'installer poteva salvare un indirizzo di contatto non valido. Quando il sito veniva installato accedendovi dal suo indirizzo IP, l'indirizzo di contatto diventava
noreply@<IP>, che i fornitori di posta rifiutano — e non partiva più nessuna email, senza alcun messaggio di errore visibile. L'indirizzo viene ora dedotto solo da un vero nome di dominio. -
Un banner vuoto compariva nelle pagine in cui una zona della disposizione è vuota. Nel tema Extend, ogni pagina diversa dalla pagina iniziale mostrava un'ampia fascia colorata che non conteneva nulla, oltre a una sezione vuota sopra il contenuto.
La causa non era il tema: una zona dichiarata ma senza widget restituiva spazi invece di niente del tutto, quindi i temi disegnavano la loro cornice attorno al nulla. Corretto una volta per tutti i temi. Se costruisci un tema, puoi scrivere
if ($zone = $this->output->region('banner'))(ozone(n)): la condizione ora dice il vero. -
Il tema Extend mostrava due volte la sua menzione «Realizzato con NeoFrag Reborn». La sua disposizione fornita metteva nel piè di pagina un blocco che ripeteva ciò che il tema scrive già da sé. I siti già installati vengono corretti automaticamente all'aggiornamento; i nuovi non l'avranno mai.
-
Cercare una parola comune restituiva una pagina di errore. Una ricerca come «le» o «de» mostrava i suoi risultati sullo schermo, ma il server rispondeva 404 — che è ciò che vedono i motori di ricerca, gli strumenti di monitoraggio e i browser, e che faceva sembrare scomparsa una pagina perfettamente valida.
L'evidenziazione delle parole trovate presupponeva che la parola cercata comparisse per forza nel testo mostrato. È falso due volte: la ricerca esamina più campi e ne mostra uno solo — una discussione del forum intitolata «Salut tout le monde !» corrisponde a «le» per il suo titolo, non per il messaggio mostrato sotto — e il database confronta senza tenere conto degli accenti, mentre il codice ne teneva conto: «éléphant» usciva sì per la ricerca «ele», senza che vi venisse evidenziata alcuna parola.
Entrambi i casi sono trattati: l'evidenziazione riconosce ora le varianti accentate di una lettera, come fa il database, e quando la parola davvero non è nel testo mostrato, l'estratto comincia semplicemente dal suo inizio.
-
Gli aggiornamenti automatici del nucleo non potevano funzionare — cinque difetti, ciascuno sufficiente da solo: l'indirizzo per controllare le nuove versioni non era impostato da nessuna parte, quindi il pulsante non compariva mai; un interruttore globale, da impostare nella configurazione, bloccava l'operazione; il download puntava alle versioni del NeoFrag originale, che avrebbero sovrascritto NeoFrag Reborn; il pacchetto conservava i suoi file in una sottocartella, quindi un aggiornamento non avrebbe sostituito nulla, senza il minimo errore; e l'archivio veniva estratto con un'interfaccia PHP deprecata da PHP 8.0.
L'interruttore è sostituito da quattro garanzie: l'origine delle versioni deve essere in una lista bianca di indirizzi (la stessa del marketplace); il file della versione dà solo un nome di file, mai un indirizzo; l'impronta SHA-256 del pacchetto viene verificata prima di toccare un solo file; ogni file dell'archivio viene controllato (nessun percorso che esca dal sito, nessun link simbolico). Le cartelle
config/einstall/non vengono mai riscritte se esistono già. -
Il catalogo del marketplace era irraggiungibile da qualsiasi sito. Il server che lo distribuisce rispondeva
{"redirect":"/fr/…"}con il codice di stato 200 invece del file statico — un corpo perfettamente valido come JSON, e perfettamente sbagliato, quindi un fallimento silenzioso che faceva ricadere ogni sito sul suo catalogo locale. La causa era la configurazione di quel server, ora corretta: niente da fare sui siti. Nel codice, l'aggiornamento del nucleo convalida ora la forma dei suoi manifest, non più solo se si leggono come JSON. -
Il pulsante «Elimina» di un tema, in «Temi & addon», proteggeva solo il tema dell'amministrazione, con il suo nome scritto nel codice. Ora segue la dichiarazione del tema, e protegge quindi anche Nebula.
-
Accoppiamenti dal nucleo verso il facoltativo. Sette moduli interrogavano le tabelle di moduli facoltativi: cinque del nucleo (
admin,moderation,settings,statistics,user), piùgameseteams. Due query erano senza protezione: inteams, il controllo di esistenza direcruitsera posto dopo la query che doveva proteggere, e ingames, eliminare un gioco interrogava la tabella delle squadre senza verificare che esista. Le altre erano protette ma mute: portano ora un'annotazione verificata dalla CI. L'unico ciclo duro del pacchetto (games↔teams) è spezzato. -
Editor live: le modifiche compaiono senza ricaricare la pagina. Eliminare un widget lo lasciava sullo schermo e aggiungere una riga non la mostrava finché la pagina non veniva ricaricata, anche se il server aveva salvato la modifica. Lo script si aspettava un formato di risposta diverso da quello che invia il server; il difetto risaliva alla rimozione di jQuery.
-
Editor live: il trascinamento dei widget funziona di nuovo. Con la modalità Colonne attiva, un widget aggiunto restava bloccato in fondo alla sua colonna e non si poteva spostare sopra il contenuto della pagina. Le righe e le colonne non erano toccate.
-
Editor live: i widget senza impostazioni si possono di nuovo aggiungere. Dieci widget che non hanno una schermata di impostazioni (
breadcrumb,copyright,downloads,forum,module,news,newsletter,slider,surveys,teams) non si potevano aggiungere: l'aggiunta falliva con un errore 404 e nessun messaggio utile. -
Un errore del server non si mostra più come contenuto. Quando un'azione eseguita senza ricaricare la pagina riceveva un errore dal server (una pagina 404, per esempio), alcune schermate inserivano quella pagina di errore nell'interfaccia. L'errore viene ora trattato come un fallimento.
-
Editor live: il modulo delle impostazioni corrisponde sempre al widget scelto. Cambiando rapidamente widget o tipo, la risposta più lenta poteva mostrare il modulo di un altro widget. La richiesta superata viene ora annullata, e il modulo non viene più ricaricato (né l'inserimento in corso perso) quando la selezione non è cambiata.
-
La porta del database viene ora rispettata. Il CMS si collegava sempre sulla porta 3306, qualunque porta fosse stata inserita nell'installer guidato: non si poteva installare né far funzionare su un server MySQL o MariaDB in ascolto altrove. La porta viene ora salvata in
config/db.php(solo se diversa da 3306) e usata per ogni connessione. -
Un tema attivato non è più vuoto. Attivare Forge, Granite, Blockcraft o Extend cambiava il tema senza applicare la sua disposizione predefinita, che si applicava solo con il pulsante «Reinstalla predefinito»: il sito non mostrava nessun widget. L'attivazione applica ora la disposizione predefinita del tema se non ne ha ancora una, senza mai sovrascrivere una disposizione personalizzata.
-
Cambiare il tema predefinito vale ora anche per i visitatori che ne avevano scelto uno. Il selettore di tema del piè di pagina ricordava la scelta di un visitatore per un anno, e quella scelta prevaleva sul tema predefinito: quando l'amministratore cambiava tema, i visitatori, e anche l'amministratore, restavano sul vecchio, senza via d'uscita da un tema senza selettore. Una scelta fatta prima dell'ultimo cambio di tema predefinito viene ora dimenticata; una fatta dopo resta rispettata.
-
Il browser non conserva più copie scadute delle pagine. In mancanza di istruzioni, poteva rimostrare una vecchia versione di una pagina: un cambio di tema, per esempio, compariva solo dopo un ricaricamento forzato (Ctrl+F5). Le pagine e le risposte del sito vietano ora questa conservazione (
Cache-Control: no-store); immagini, stili e script, serviti direttamente dal server web, non sono toccati.
Sicurezza
-
Un valore salvato non può più iniettare tag in un modulo (2026-09-23). Il modulo di modifica metteva il valore di un campo nella pagina proteggendo le virgolette come farebbe una stringa PHP — il che in HTML non ha alcun effetto. Un valore che non fosse passato dal modulo stesso (importazione, dati di dimostrazione, un altro modulo) poteva quindi uscire dal suo campo e aggiungere codice alla schermata di amministrazione: una citazione la cui fonte era
"><img src=x>l'ha dimostrato. Campi di testo, aree di testo, elenchi, caselle e pulsanti di opzione codificano ora il loro valore; la resa di un valore inserito normalmente non cambia. Anche le notifiche («Citazione modificata», ecc.) vengono passate allo script della pagina in una forma che non può più romperlo. -
La politica di sicurezza dichiara ora una regola per i media (
media-src). Non ne aveva e ricadeva sulla regola generale (default-src 'self'). Ora consente i media del sito stesso e i media incorporati nella pagina ('self' data:); l'indirizzo del flusso di una web radio viene aggiunto solo se un flusso è configurato: un sito senza web radio non consente alcuna origine esterna aggiuntiva. -
Undici avvisi di sicurezza chiusi sulle dipendenze (2026-09-20):
league/commonmarkpassa dalla 2.8.2 alla 2.10.1 (dieci avvisi, otto dei quali gravi) ephpseclibdalla 3.0.52 alla 3.0.57 (un avviso di gravità media).Nove dei dieci avvisi di commonmark sono denial of service tramite Markdown costruito ad arte — analisi in tempo quadratico, titoli con ancore che collidono, note a piè di pagina duplicate, blocchi di attributi adiacenti, uscita XML profondamente annidata — e il decimo è una vulnerabilità XSS: il filtro degli attributi
on*si poteva aggirare con un salto pagina U+000C. La libreria rende il Markdown del wiki, degli articoli e delle FAQ, scritto dai membri. Diversi di questi avvisi riguardano estensioni che il prodotto non attiva (note a piè di pagina, attributi, ancore dei titoli, uscita XML); l'aggiornamento li chiude tutti.La resa non cambia, e non è solo un'impressione: dodici casi rappresentativi — titoli, tabella, elenco di attività, blocco di codice, HTML iniettato, link
javascript:, citazione, testo barrato, link automatico, elenchi annidati, immagine, entità e nota a piè di pagina, annidamento profondo —, resi dalle due versioni con la configurazione reale del prodotto, danno lo stesso HTML byte per byte (1568 byte, stessa impronta).Nota: Composer si rifiuta ora di installare la 2.8.2, proprio per questi dieci avvisi. Si è dovuta disattivare la politica in una cartella usa e getta per fare il confronto.