Ottimizzazione dei contenuti
Per ridurre lo spazio necessario all’archiviazione dei contenuti, è stato implementato un sistema di compressione delle immagini quando queste superano determinati limiti preimpostati. In particolare, se i contenuti superano 1 MB, prima del salvataggio nel database le immagini vengono ridimensionate a un massimo di 800×800 pixel (qualora la risoluzione originale sia superiore), mantenendo le proporzioni e riducendo la qualità del 30%.Se la dimensione finale del file non risulta inferiore di almeno il 30% rispetto a quella iniziale, viene mantenuta la versione originale.
Questi parametri sono configurabili e possono essere modificati dall’utente in base a diversi criteri, ad esempio in funzione del piano di utilizzo o di altre esigenze specifiche.
Il metodo che si occupa di effettuare la compressione:
CompressionHelper::CompressDocumentImages($body, $quality = 100, $maxwidth = null, $maxheight = null)
SmartORM
L’accesso a MySQL è gestito tramite un ORM sviluppato appositamente: SmartORM
Il metodo utilizzato per l’aggiornamento di una tabella accetta un singolo oggetto o un array di oggetti; la libreria si occupa di costruire automaticamente la query inserendo le proprietà dell’oggetto all’interno della stessa.
Anche in fase di lettura, l’ORM restituisce un oggetto che rappresenta la tabella.
Questo approccio garantisce un mapping coerente tra tabelle del database e classi dell’applicazione.
Import & Export
L’esportazione di un contenuto, che può includere immagini e altri elementi ipertestuali, avviene in formato XML.
Per garantire l’integrità dei dati, all’XML viene aggiunta una proprietà check, che viene verificata in fase di importazione. Inoltre, il file XML viene compresso in formato ZIP per ridurre lo spazio di archiviazione.
L’importazione, possibile in qualsiasi cartella relativa ai contenuti, prevede la decompressione del file ZIP e la verifica della validità del checksum check.
È inoltre possibile esportare e importare un’intera cartella, inclusi tutti i contenuti e le sottocartelle in essa presenti. La logica implementata si basa su una navigazione ricorsiva delle cartelle tramite query MySQL.
La stessa logica di esportazione e importazione può essere utilizzata anche come sistema di backup completo dei contenuti.
<?xml version="1.0" encoding="UTF-8"?>
<documents type="content" check="148086b2225ac24a2da0a7527ad0afa7c19fc131"><document>...</document></documents>
Blog
Quando viene creato un utente o un’azienda, viene contestualmente generato e associato un blog di default. È comunque prevista la possibilità di aggiungere ulteriori blog tematici.
Poiché il portale consente la ricerca delle idee, ogni post viene salvato anche in forma testuale. Le singole parole del testo vengono analizzate, conteggiate e memorizzate in una tabella dedicata, utilizzata sia per la ricerca sia per individuare le parole più significative. L’utente ha comunque la possibilità di visualizzare l’elenco delle parole (tag) e selezionare quelle che ritiene più rappresentative del contenuto.
Le parole vengono inoltre filtrate attraverso un elenco di termini da ignorare (stopwords o parole funzionali come articoli, congiunzioni, preposizioni, pronomi e verbi ausiliari).
Con l’aumentare dei post e delle parole non selezionate dagli autori, è previsto l’intervento di un revisore, che dovrà verificare e confermare che le parole ignorate appartengano effettivamente alle stopwords. Questo processo consente, nel tempo, di migliorare la qualità e la significatività del testo analizzato.
DataGrid
Nato dall’esigenza di avere uno strumento flessibile per visualizzare e gestire i dati provenienti dai recordset.
Il componente è stato progettato per integrarsi nell’architettura MVC e permette di gestire in modo configurabile diversi aspetti della griglia:
- paginazione, con numero di righe per pagina e navigazione tra le pagine;
- filtri sui dati visualizzati;
- configurazione delle colonne e del loro contenuto;
- modifica dei valori delle celle prima della visualizzazione;
- titolo della griglia;
- azioni disponibili direttamente sulla griglia o nel menu contestuale di ogni riga.
Particolare attenzione è stata dedicata alla gestione delle azioni. Ogni operazione può essere configurata indicando il tipo di azione, l’URL, i parametri da passare, l’icona, il testo e gli attributi HTML.
I parametri possono inoltre essere costruiti dinamicamente utilizzando i valori presenti nella riga. In questo modo, ad esempio, una stessa configurazione può generare automaticamente i collegamenti per modificare o eliminare ciascun elemento.
Le azioni possono anche essere condizionate al contenuto della riga, rendendo possibile mostrare una determinata voce di menu solo quando una specifica colonna assume un certo valore.
Un altro aspetto interessante riguarda l’integrazione con JavaScript: oltre alle normali navigazioni verso URL, il componente permette di gestire azioni lato client, modificare dinamicamente elementi della pagina e, ad esempio, aprire finestre modali per visualizzare ulteriori informazioni.
L’integrazione con il controller avviene attraverso semplici callback per il recupero delle righe e il conteggio dei record. La GridView si occupa quindi della presentazione e della gestione dell’interfaccia, mentre il modello rimane responsabile dell’accesso ai dati.
L’obiettivo non era realizzare una griglia “universale”, ma uno strumento riutilizzabile e facilmente configurabile all’interno della piattaforma, evitando di ripetere ogni volta la stessa logica per paginazione, azioni, filtri e gestione dell’interfaccia.
Un piccolo componente, quindi, ma rappresentativo di un approccio che ho seguito nello sviluppo della piattaforma: quando una funzionalità ricorre, può valere la pena trasformarla in uno strumento riutilizzabile e adattabile alle diverse esigenze.
GDPR
Al fine di rispettare il GDPR, alcuni campi delle tabelle relative a utenti e aziende vengono criptati; l’accesso a tali dati avviene tramite le viste `Users` e `Companies`.
Le password, inoltre, non vengono salvate in chiaro ma come hash. La verifica avviene confrontando l’hash della password inserita dall’utente con quello memorizzato nel database.