background

PortLab

CMS per la generazione di portali web dedicati a progetti di ricerca

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.

Architettura a livelli di PortLAB Il sito principale condivide codice comune, librerie di terze parti e servizi con i progetti secondari, che aggiungono contenuti e personalizzazioni locali. Progetto A Contenuti locali Personalizzazioni Progetto B Contenuti locali Personalizzazioni Progetto C Contenuti locali Personalizzazioni eredita via collegamenti simbolici SITO PRINCIPALE — base condivisa Codice comune Librerie di terze parti Servizi e strumenti
Architettura a livelli: base condivisa dal sito principale, personalizzabile in locale da ogni progetto.
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.

Anatomia di una pagina Il template combina i mattoni di interfaccia: intestazione, barra di navigazione con menu, breadcrumb, corpo con eventuale menu laterale e piè di pagina. Header Navbar + menu Breadcrumb Menu laterale(opzionale) Corpo pagina Footer
Il template sceglie e combina i mattoni di interfaccia (GUI) per formare la pagina.

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.

Stack tecnologico Il browser dialoga via HTTP/AJAX con il server Apache/PHP, che interroga il database PostgreSQL e delega i calcoli a un gateway che esegue programmi in diversi linguaggi. Browser Bootstrap · jQuery ECharts · KaTeXthree.js · highlight Server Apache + PHP Motore PortLAB Profili · sessione PostgreSQL Dati · utentischemi, tabelle, viste Gateway (gw2py) calcolo: Python, C++ HTTP / AJAXSQL
Dal browser al database: il motore PHP orchestra dati e calcolo; il gateway esegue programmi in più linguaggi.

Progetti realizzati con PortLAB

Keywords: PortLAB, CMS, framework PHP, portali scientifici, multilingua, PostgreSQL, CNR-IFAC