La società "Sviluppatore careliano" presenta l"aggiornamento 0.3.0 "Šuja" per il sistema di gestione dei contenuti "GIRVAS". La versione subentra alla fase di codice "Voitsy" e riceve il nome dal fiume Šuja — uno dei più grandi fiumi della Repubblica di Carelia, che nasce dal lago Suojärvi e sfocia nel lago Onega. La tradizione di assegnare alle versioni del CMS nomi di corpi idrici careliani sottolinea l"appartenenza regionale del prodotto e la sua integrazione nel panorama degli sviluppi tecnologici nazionali.
Questo rilascio si concentra sullo sviluppo degli strumenti di navigazione dei contenuti, delle capacità di ricerca e degli strumenti di ottimizzazione per i motori di ricerca, e contiene anche sostanziali miglioramenti tecnici del nucleo del sistema.
Motore di ricerca integrato

Una delle principali innovazioni della versione è l"implementazione di un motore di ricerca full-text che funziona senza servizi o plugin di terze parti.
La ricerca viene eseguita nei titoli, nelle descrizioni, nel contenuto principale e nelle parole chiave delle voci. È stata implementata una logica di ricerca AND con divisione automatica della query in singole parole e esclusione della punteggiatura, che consente di trovare materiali pertinenti anche con formulazioni imprecise. Il ranking dei risultati si basa su coefficienti di ponderazione configurabili: le corrispondenze nei titoli hanno priorità rispetto alle corrispondenze nel corpo del documento.
Nel pannello di amministrazione, le capacità di ricerca saranno ampliate nei prossimi aggiornamenti: gli utenti autenticati potranno effettuare ricerche tra voci, pagine statiche e utenti del sistema.
Archivio voci con navigazione per date
La versione 0.3.0 introduce un archivio integrato delle voci — uno strumento per la navigazione cronologica dei contenuti.
La funzione raggruppa automaticamente le voci per anni e mesi, mostrando il numero di pubblicazioni per ogni intervallo temporale. La navigazione supporta il filtraggio per categoria: l"utente può visualizzare sia l"archivio generale di tutte le voci del sito che l"archivio di una singola categoria. Le briciole di pane vengono generate dinamicamente in base al periodo e alla categoria selezionati, consentendo una comoda navigazione tra i livelli dell"archivio. Le pagine dell"archivio sono ottimizzate per i motori di ricerca — i meta-tag vengono generati automaticamente e gli URL delle pagine dell"archivio sono inclusi nella mappa del sito dinamica (sitemap).
Gerarchia delle categorie e navigazione migliorata

L"aggiornamento implementa il supporto per le categorie figlie con attraversamento ricorsivo dell"albero. La pagina della categoria ora visualizza le voci tenendo conto di tutte le sottocategorie nidificate, offrendo una rappresentazione più completa del contenuto.
Le briciole di pane sulle pagine delle categorie e delle voci mostrano la catena gerarchica completa dalla categoria radice alla posizione corrente. Questo miglioramento ottimizza sia la navigazione degli utenti che il linking interno del sito per i motori di ricerca.
Analizzatore SEO del contenuto integrato

Un analizzatore SEO lato client è integrato nell"editor di pagine e voci del pannello di amministrazione, funzionante senza richieste al server.
L"analizzatore esegue una verifica in cinque aree: titolo, meta-descrizione, parole chiave, contenuto e URL. Tra i parametri verificati figurano la lunghezza e il contenuto dei tag SEO, la presenza di parole chiave nei titoli, nel primo paragrafo e nel testo principale, la correttezza della gerarchia dei titoli, la presenza di testi alt nelle immagini, l"attributo rel="nofollow" dei link esterni, l"individuazione di URL "nudi" e raccomandazioni per formattarli in formato Markdown. I risultati dell"analisi vengono visualizzati istantaneamente con codifica a colori, barre di avanzamento e un blocco di raccomandazioni concrete per il miglioramento.

Blocchi di contenuto

Nel pannello di amministrazione è apparsa una nuova sezione "Blocchi di contenuto", destinata alla gestione di elementi specializzati da incorporare nelle sezioni dei temi senza modificare i template.
Sono supportati diversi tipi di blocchi:
- "Personalizzato" — contenuto arbitrario con formattazione Markdown;
- "Cabinet" — mini-profilo utente con visualizzazione automatica del modulo di autenticazione per i visitatori non autenticati;
- "Elenco categorie" — elenco gerarchico di tutte le categorie di voci;
- "Vuoto" — tipo specializzato per l"integrazione da parte di moduli di terze parti.
Per ogni blocco vengono configurate regole di visualizzazione tramite espressioni regolari applicate all"URL. In caso di corrispondenza dell"indirizzo richiesto con il modello, il blocco viene visualizzato nella sezione corrispondente del tema.
Miglioramenti tecnici del nucleo
La versione 0.3.0 contiene miglioramenti sostanziali del componente QueryBuilder — il costruttore interno di query SQL:
- Aggiunto il supporto per JOIN (INNER, LEFT, RIGHT, FULL) con generazione adattiva delle condizioni per MySQL e PostgreSQL;
- Implementata la classe CaseExpression per la costruzione di espressioni CASE, inclusi metodi specializzati per la ricerca JSON;
- Aggiunto il supporto completo per gli indici: creazione e cancellazione con considerazione dei tipi
BTREE,HASH,GIST,GIN,SPGIST,BRIN,FULLTEXT, nonchéUNIQUE,CONCURRENTLY,IF NOT EXISTSe indici parziali con condizioni WHERE.
Durante l"installazione del CMS, vengono ora creati automaticamente indici di ottimizzazione per tutte le tabelle, inclusi indici GIN per i campi JSONB (PostgreSQL) e un indice parziale per le voci pubblicate. Gli errori di creazione degli indici vengono registrati senza interrompere il processo di installazione.
Alla classe EntryCategory è stata aggiunta la cache dei dati inizializzati, che impedisce query ripetute al database in caso di chiamate multiple del metodo initData().
Migrazione
Aggiornamento del file system
Raccomandiamo vivamente di ottenere l"aggiornamento tramite il repository ufficiale del CMS "GIRVAS". Se lo utilizzi per impostazione predefinita, esegui il comando console git pull nella radice del tuo progetto, dopo essere passato sul branch production (se in precedenza utilizzavi un altro branch).
Dopo l"aggiornamento del file system, svuota la cache: rm -R ./cache/* (il percorso può variare a seconda della tua effettiva posizione nel sistema).
Migrazione del database
Dopo il riuscito aggiornamento dei file del CMS, è necessario eseguire una migrazione del database. Per farlo, è necessario eseguire diverse query SQL sul database (basta copiare e incollare), a seconda del tipo di DBMS.
Per MySQL
-- Creazione della tabella per i blocchi di contenuto --
CREATE TABLE IF NOT EXISTS content_blocks (
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
name TEXT NOT NULL,
texts JSON,
metadata JSON,
createdUnixTimestamp INTEGER NOT NULL DEFAULT 0,
updatedUnixTimestamp INTEGER NOT NULL DEFAULT 0
);
-- Indici per la tabella entries
CREATE INDEX idx_entries_category ON entries (categoryID);
CREATE INDEX idx_entries_author ON entries (authorID);
CREATE INDEX idx_entries_created ON entries (createdUnixTimestamp DESC);
CREATE INDEX idx_entries_updated ON entries (updatedUnixTimestamp);
CREATE UNIQUE INDEX idx_entries_name_unique ON entries (name);
-- Indici per la tabella entries_categories
CREATE INDEX idx_entries_categories_parent ON entries_categories (parentID);
CREATE UNIQUE INDEX idx_entries_categories_name_unique ON entries_categories (name);
-- Indici per la tabella entries_comments
CREATE INDEX idx_entries_comments_entry ON entries_comments (entryID);
CREATE INDEX idx_entries_comments_author ON entries_comments (authorID);
CREATE INDEX idx_entries_comments_created ON entries_comments (createdUnixTimestamp DESC);
-- Indici per la tabella pages_static
CREATE UNIQUE INDEX idx_pages_static_name_unique ON pages_static (name);
CREATE INDEX idx_pages_static_author ON pages_static (authorID);
CREATE INDEX idx_pages_static_created ON pages_static (createdUnixTimestamp DESC);
-- Indici per la tabella users
CREATE UNIQUE INDEX idx_users_login_unique ON users (login);
CREATE UNIQUE INDEX idx_users_email_unique ON users (email);
-- Indici per la tabella users_sessions
CREATE INDEX idx_users_sessions_user ON users_sessions (userID);
CREATE INDEX idx_users_sessions_token ON users_sessions (token);
-- Indici per la tabella forms_data
CREATE INDEX idx_forms_data_form ON forms_data (formID);
CREATE INDEX idx_forms_data_created ON forms_data (createdUnixTimestamp DESC);
-- Indici per la tabella web_channels
CREATE UNIQUE INDEX idx_web_channels_name_unique ON web_channels (name);
-- Indici per la tabella metrics
CREATE INDEX idx_metrics_date ON metrics (date);
Per PostgreSQL
-- Creazione della tabella per i blocchi di contenuto --
CREATE TABLE IF NOT EXISTS content_blocks (
"id" SERIAL NOT NULL PRIMARY KEY,
"name" TEXT NOT NULL,
"texts" JSONB,
"metadata" JSONB,
"createdUnixTimestamp" INTEGER NOT NULL DEFAULT 0,
"updatedUnixTimestamp" INTEGER NOT NULL DEFAULT 0
);
-- Indici per la tabella entries
CREATE INDEX IF NOT EXISTS idx_entries_category ON entries ("categoryID");
CREATE INDEX IF NOT EXISTS idx_entries_author ON entries ("authorID");
CREATE INDEX IF NOT EXISTS idx_entries_created ON entries ("createdUnixTimestamp" DESC);
CREATE INDEX IF NOT EXISTS idx_entries_updated ON entries ("updatedUnixTimestamp");
CREATE UNIQUE INDEX IF NOT EXISTS idx_entries_name_unique ON entries ("name");
CREATE INDEX IF NOT EXISTS idx_entries_texts_gin ON entries USING GIN (texts);
CREATE INDEX IF NOT EXISTS idx_entries_metadata_gin ON entries USING GIN (metadata);
CREATE INDEX IF NOT EXISTS idx_entries_published ON entries ("createdUnixTimestamp" DESC) WHERE (metadata::jsonb->>"isPublished")::boolean = true;
-- Indici per la tabella entries_categories
CREATE INDEX IF NOT EXISTS idx_entries_categories_parent ON entries_categories ("parentID");
CREATE UNIQUE INDEX IF NOT EXISTS idx_entries_categories_name_unique ON entries_categories ("name");
-- Indici per la tabella entries_comments
CREATE INDEX IF NOT EXISTS idx_entries_comments_entry ON entries_comments ("entryID");
CREATE INDEX IF NOT EXISTS idx_entries_comments_author ON entries_comments ("authorID");
CREATE INDEX IF NOT EXISTS idx_entries_comments_created ON entries_comments ("createdUnixTimestamp" DESC);
-- Indici per la tabella pages_static
CREATE UNIQUE INDEX IF NOT EXISTS idx_pages_static_name_unique ON pages_static ("name");
CREATE INDEX IF NOT EXISTS idx_pages_static_author ON pages_static ("authorID");
CREATE INDEX IF NOT EXISTS idx_pages_static_created ON pages_static ("createdUnixTimestamp" DESC);
CREATE INDEX IF NOT EXISTS idx_pages_static_texts_gin ON pages_static USING GIN (texts);
-- Indici per la tabella users
CREATE UNIQUE INDEX IF NOT EXISTS idx_users_login_unique ON users ("login");
CREATE UNIQUE INDEX IF NOT EXISTS idx_users_email_unique ON users ("email");
-- Indici per la tabella users_sessions
CREATE INDEX IF NOT EXISTS idx_users_sessions_user ON users_sessions ("userID");
CREATE INDEX IF NOT EXISTS idx_users_sessions_token ON users_sessions ("token");
-- Indici per la tabella forms_data
CREATE INDEX IF NOT EXISTS idx_forms_data_form ON forms_data ("formID");
CREATE INDEX IF NOT EXISTS idx_forms_data_created ON forms_data ("createdUnixTimestamp" DESC);
-- Indici per la tabella web_channels
CREATE UNIQUE INDEX IF NOT EXISTS idx_web_channels_name_unique ON web_channels ("name");
-- Indici per la tabella metrics
CREATE INDEX IF NOT EXISTS idx_metrics_date ON metrics ("date");
Conclusione
L"aggiornamento 0.3.0 "Šuja" del CMS "GIRVAS" unisce lo sviluppo degli strumenti di navigazione e ricerca degli utenti con una profonda modernizzazione tecnica del nucleo. Raccomandiamo a tutti gli utenti di eseguire l"aggiornamento per valutare le migliorate capacità di ricerca, la comodità dell"archiviazione dei contenuti e i nuovi strumenti di ottimizzazione per i motori di ricerca.
Commenti