PortLAB
PortLAB è la piattaforma con cui, al CNR-IFAC (Istituto di Fisica Applicata «Nello Carrara»), si realizzano e si gestiscono portali scientifici: un unico motore, scritto in PHP con database PostgreSQL, da cui nascono siti diversi — multilingua, adattivi e ricchi di contenuti interattivi — condividendo struttura, stile e strumenti.
Che cos'è
PortLAB è un framework leggero per la costruzione di portali. Ogni pagina è definita da una piccola configurazione dichiarativa (in formato JSON) che ne stabilisce struttura, lingue, librerie e livelli di accesso, mentre i contenuti vivono in file separati per lingua. Questo permette di aggiungere pagine e interi siti in tempi rapidi, mantenendo coerenza grafica e funzionale e senza dover toccare il motore.
Architettura a progetti e personalizzazione
PortLAB è organizzato attorno a un sito principale che funge da base condivisa per tutti i progetti secondari ospitati sulla piattaforma. Ogni progetto dispone dei propri contenuti e delle proprie personalizzazioni locali, ma eredita automaticamente dal sito principale sia il codice comune sia le librerie di terze parti, condivise una sola volta e mantenute in modo centralizzato: nessuna duplicazione e aggiornamenti immediati per tutti. Al tempo stesso ogni progetto può personalizzare qualunque elemento in qualsiasi punto, sostituendo in modo selettivo e indipendente la versione condivisa con una propria versione locale. Ne risulta un'architettura a livelli — elementi locali, comuni e librerie condivise, liberamente combinabili — che consente di avviare rapidamente nuovi portali mantenendo per ciascuno un'identità e un aspetto su misura.
Oltre al codice comune e alle librerie, anche i servizi e gli strumenti offerti da PortLAB (gestione e visualizzazione del database, diagramma dello schema, gestione utenti, consultazione dei log e altro) possono essere ereditati dai progetti secondari tramite collegamenti simbolici al progetto principale: ogni nuovo portale dispone così dell'intero corredo di strumenti senza duplicazione, potendo comunque sostituirne o estenderne qualunque parte in locale.
Interfaccia grafica (GUI)
L'interfaccia si compone di elementi standard basati su Bootstrap — intestazioni, barre di navigazione, menu, breadcrumb, piè di pagina e finestre modali: mattoni indipendenti e riutilizzabili da combinare fino a ottenere la struttura di pagina desiderata, con coerenza visiva e piena responsività.
Template
Il template è il modello di pagina: stabilisce quali elementi di interfaccia usare e come impaginarli, incluso il tipo di menu (orizzontale in alto oppure laterale) e lo stile complessivo. Ogni template è una combinazione predefinita e riutilizzabile di componenti, richiamata da una pagina con un semplice riferimento; cambiando template cambiano aspetto e layout dell'intera pagina senza toccarne i contenuti.
Utenti, accessi e navigazione
Gestione utenti multi-profilo
A ogni utente possono essere associati più profili di autorizzazione. Una risorsa è accessibile quando almeno uno dei profili dell'utente coincide con uno dei profili richiesti dalla risorsa; le pagine senza profili restano pubbliche. Lo stesso criterio governa in modo uniforme l'accesso a pagine e sezioni, le voci di menu, i file scaricabili e persino la visibilità di singole porzioni di una pagina: la stessa pagina può così mostrare contenuti diversi a utenti con profili diversi.
Area riservata
Le pagine pubbliche sono nettamente separate dal codice applicativo e dai contenuti riservati, custoditi in un'area collocata fuori dalla radice web e quindi non raggiungibile direttamente dal browser. I documenti riservati non vengono mai esposti come URL statici: sono consegnati esclusivamente da procedure lato server che, prima dell'invio, verificano identità e profili dell'utente.
Sicurezza e crittografia
Le difese sono trasversali: sessioni protette con token anti-CSRF, rigenerazione dell'identificativo di sessione e cookie con attributi di sicurezza (HttpOnly, Secure, SameSite); password custodite solo come hash; parametri delle query validati e vincolati. I contenuti riservati e i collegamenti «a capacità» sono protetti con crittografia standard (AES-256 con autenticazione HMAC) e chiavi mantenute fuori dal codice sorgente. Il controllo degli accessi è fail-closed: una pagina è raggiungibile solo se esplicitamente configurata, e anche gli endpoint di calcolo lato server sono soggetti ai profili dell'utente. Le richieste a risorse inesistenti vengono ricondotte a pagine di errore standard che riportano alla home.
Generazione dinamica dei menu di navigazione
Il menu non è scritto a mano: viene costruito automaticamente esplorando l'albero delle cartelle e delle pagine. Ogni nuova pagina compare da sola, con le voci ordinate (prima i file, poi le sottocartelle, in ordine alfabetico) e organizzate su più livelli secondo l'annidamento; le voci sono filtrate in base al profilo dell'utente e a un apposito flag di esclusione, e i titoli sono ricavati dalla pagina nella lingua scelta.
Contenuti, ricerca e privacy
Supporto multilingua
Le lingue disponibili si dichiarano pagina per pagina. Il corpo di ogni pagina risiede in un file separato per ciascuna lingua, mentre le stringhe dell'interfaccia sono gestite da un sistema di traduzione a dizionari che funziona in modo identico in PHP e in Javascript: la stessa funzione e gli stessi dizionari sono disponibili sia lato server sia nel browser. Così è possibile tradurre al volo qualunque stringa, proveniente da qualsiasi sezione della pagina — comprese quelle prodotte da programmi in Python o C++ eseguiti tramite il gateway (gw2py) e restituite alla pagina.
È inoltre disponibile un'estensione per le stringhe parametriche: il testo
tradotto contiene segnaposto numerati (es. {0}, {1})
sostituiti a runtime con i valori effettivi. È un dettaglio essenziale perché in
lingue diverse il parametro può occupare una posizione diversa nella frase:
il segnaposto viene collocato dove serve in ciascuna traduzione, così il testo
resta naturale (ad esempio «{0} elementi trovati» in italiano diventa
«found {0} items» in inglese, con il valore in punti diversi). Tutta la
pipeline è in UTF-8, quindi può ospitare qualsiasi alfabeto; attualmente i portali
sono in italiano e inglese, con un selettore di lingua a bandiera e sigla.
Ricerca testuale interna
Digitando almeno tre caratteri, il sistema esamina le pagine del sito nella lingua attualmente selezionata e mostra i risultati in una finestra dedicata. Per ogni pagina viene presentato un estratto con titolo, parole chiave, descrizione e testo in cui compare il termine cercato, evidenziato nel suo contesto, con collegamento diretto alla pagina. La ricerca gestisce correttamente alfabeti e caratteri internazionali (UTF-8) e può essere mirata, pagina per pagina, ai soli paragrafi rilevanti.
Gestione GDPR
PortLAB include una gestione GDPR pronta all'uso: un'informativa privacy/cookie dedicata e un avviso di consenso riusabile da tutti i siti. La piattaforma è predisposta per l'uso dei soli cookie tecnici, senza profilazione né terze parti; l'avviso è puramente informativo, non blocca la navigazione e ricorda la presa visione per un periodo prestabilito.
Strumenti per il database (PostgreSQL)
Gestione delle tabelle
Un'unica interfaccia riusabile consente di creare, modificare, eliminare e consultare le righe delle tabelle del database, con strumenti di filtro multi-criterio, ordinamento personalizzabile, paginazione e import/export dei criteri in formato JSON.
Visualizzazione ed esplorazione dei dati
Un completo visualizzatore del database riunisce quattro strumenti: un navigatore che esplora database, schemi, tabelle, viste, viste materializzate e funzioni tramite un albero interattivo e filtri a cascata (mostrando struttura, tipi, chiavi, dimensioni e definizioni); un esecutore di query SQL con editor evoluto, esecuzione diretta ed esportazione dei risultati in CSV; una libreria di query memorizzate richiamabili con un clic; e una ricerca per parole chiave su tutti i campi, con filtri per schema, tabella, campo e tipo di dato.
Diagramma grafico dello schema
Un visualizzatore grafico genera un diagramma interattivo dello schema: ogni tabella o vista è un nodo con l'elenco dei campi e la chiave primaria evidenziata. I nodi si trascinano liberamente sul piano di lavoro e i collegamenti tra i campi correlati si tracciano come linee; disposizione, colori e collegamenti vengono salvati e ripristinati a ogni accesso.
Amministrazione e diagnostica
Consultazione dei log del server
Una console di amministrazione permette di consultare i log di Apache — accessi ed errori — filtrando le righe per inclusione o esclusione di una stringa, con la possibilità di nascondere i messaggi informativi o di svuotare il log; una sezione dedicata mostra la configurazione PHP del server. L'accesso è riservato agli amministratori.
Messaggi d'errore standardizzati
Ogni punto critico del codice — query SQL, operazioni PHP, chiamate al gateway Python, script lato client — è marcato da un codice/indice: quando qualcosa va storto compare un messaggio uniforme che riporta quel codice, permettendo di risalire al punto esatto in cui si è verificato il problema. I messaggi sono differenziati per profilo: l'utente vede un avviso essenziale con il codice, mentre all'amministratore vengono mostrati anche i dettagli tecnici (tipo, file, riga, testo della query) utili al debug. Il meccanismo è uniforme per le pagine e per le chiamate AJAX.
Tecnologie
Cuore del funzionamento lato server è un gateway che consente alle pagine di invocare, in modo uniforme, programmi ed elaborazioni scritti in linguaggi diversi — finora Python e C++ — restituendone i risultati (in genere in formato JSON) direttamente nella pagina. Il gateway è usato in modo pervasivo insieme all'interfaccia AJAX di jQuery: questo ha di fatto standardizzato le chiamate in tutto il portale, con un unico schema richiesta/risposta per qualunque operazione dinamica.
- Motore in PHP su Apache/Linux, database PostgreSQL; front-end su Bootstrap 5 e jQuery.
- Pagine configurate in modo dichiarativo (JSON): template, metadati, librerie e profili di accesso, senza modificare il motore.
- Componenti riutilizzabili e calcolo lato server tramite un gateway Python: le pagine possono avviare simulazioni ed elaborazioni e mostrarne i risultati.
- Contenuti scientifici interattivi: grafici (ECharts), formule in LaTeX (KaTeX), visualizzazioni 3D (three.js), codice con evidenziazione della sintassi.
- Procedura guidata per avviare nuovi portali; layout responsive per desktop e mobile.
Progetti realizzati con PortLAB
- WebNIR — portale CNR-IFAC sulle radiazioni non ionizzanti: campi elettromagnetici (CEM), radiazioni ottiche artificiali (ROA) e dispositivi medici impiantabili attivi, con strumenti per la valutazione dell'esposizione e della schermatura.
- UISH — Urban Intelligence Science Hub — progetto CNR per il gemello digitale della città: l'attività di CNR-IFAC sulla qualità dell'aria a Catania e la validazione del modello AirPortal.
- Purple — portale dedicato ai metodi analitici e all'archivio delle attività e delle misure ambientali.
- Console di amministrazione — l'interfaccia di gestione della piattaforma stessa, che ospita anche una sezione didattica con esempi interattivi (la suite Quantum Monte Carlo per l'equazione di Schrödinger e il teorema di Pitagora).
Keywords: PortLAB, CMS, framework PHP, portali scientifici, multilingua, PostgreSQL, CNR-IFAC