UNIVERSITÀ DEGLI STUDI DI PADOVA Facoltà di Scienze MM.FF.NN. Corso di Laurea in Informatica il tuo ricettario online Relatore: Dott.ssa Ombretta Gaggi Laureando: Emanuele Bottos matricola: 525804 Indice 1 Introduzione 1.1 Funzionalità del software Magikchef 1.2 Obiettivi . . . . . . . . . . . . . . . . 1.3 Analisi di siti competitor . . . . . . . 1.3.1 GialloZafferano.it . . . . . . . 1.3.2 Tastespotting.com . . . . . . 1.3.3 BigOven.com . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 8 9 10 10 11 12 2 Analisi dei requisiti 2.1 Requisiti Utente . . . . . . 2.2 Descrizione dei prodotti . . 2.2.1 Ingredienti . . . . . 2.2.2 Vini . . . . . . . . . 2.2.3 Ricette . . . . . . . 2.2.4 Basi di preparazione 2.3 Struttura del portale . . . . 2.3.1 Lato Amministrativo 2.3.2 Lato Pubblico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 13 24 24 25 26 27 28 28 31 . . . . . . . . . . . . . 33 33 35 37 40 42 44 47 47 48 49 51 51 52 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Progettazione 3.1 Struttura del database . . . . . . . . . 3.1.1 Ingredienti . . . . . . . . . . . 3.1.2 Ricette . . . . . . . . . . . . . 3.1.3 Dipendenze ingredienti e ricette 3.1.4 Supporto al social networking . 3.2 Gestione degli inviti . . . . . . . . . . 3.3 Gestione dei prodotti . . . . . . . . . . 3.3.1 Ricerca . . . . . . . . . . . . . 3.3.2 Ricerca avanzata . . . . . . . . 3.3.3 Inserimento . . . . . . . . . . . 3.3.4 Modifica . . . . . . . . . . . . . 3.3.5 Eliminazione . . . . . . . . . . 3.3.6 Approvazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 INDICE 3.4 3.3.7 Associazione a sponsor . . . . . . . . Gestione commenti, voti e prodotti favoriti 3.4.1 Visualizzazione utenti . . . . . . . . 3.4.2 Gestione profilo . . . . . . . . . . . . 3.4.3 Votazione . . . . . . . . . . . . . . . 3.4.4 Preferiti . . . . . . . . . . . . . . . . 3.4.5 Inserimento commento . . . . . . . . 3.4.6 Eliminazione commento . . . . . . . 3.4.7 Lista della spesa . . . . . . . . . . . 3.4.8 Attivazione utente . . . . . . . . . . 3.4.9 Eliminazione utente . . . . . . . . . 4 Sviluppo 4.1 Scelte tecnologiche . . . . . . 4.1.1 PHP . . . . . . . . . . 4.1.2 MySQL . . . . . . . . 4.1.3 AJAX . . . . . . . . . 4.1.4 JQuery . . . . . . . . 4.1.5 Smarty . . . . . . . . 4.2 Pattern MVC . . . . . . . . . 4.3 Descrizione delle classi . . . . 4.3.1 Parte Amministrativa 4.3.2 Parte Pubblica . . . . 5 Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 55 55 56 56 57 57 58 58 59 60 . . . . . . . . . . 61 61 61 62 62 62 63 64 66 66 80 89 6 Conclusioni 91 6.1 Sviluppi Futuri . . . . . . . . . . . . . . . . . . . . . . . . . . 92 Elenco delle figure 1.1 Screenshot software MagikChef . . . . . . . . . . . . . . . . . 8 2.1 2.2 Struttura lato Amministrativo MagikChef . . . . . . . . . . . Struttura lato Pubblico MagikChef . . . . . . . . . . . . . . . 29 31 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 Esempio di internazionalizzazione del database . . . . Struttura database - ingredienti . . . . . . . . . . . . . Struttura database - ricette - parte 1/2 . . . . . . . . . Struttura database - ricette - parte 2/2 . . . . . . . . . Struttura database - dipendenze ingredienti e ricette . Struttura database - parte sociale . . . . . . . . . . . . Diagramma degli stati degli inviti . . . . . . . . . . . . Screenshot Gestione inviti amministrativo MagikChef Use Case - Gestione ricette . . . . . . . . . . . . . . . Flow Chart - Inserimento nuova ricetta . . . . . . . . . Screenshot modifica di una ricetta . . . . . . . . . . . Use Case - Gestione parte social del portale . . . . . . Screenshot Visualizzazione profilo utente . . . . . . . . . . . . . . . . . . . . . 33 35 37 38 40 42 44 46 47 50 54 55 60 4.1 Schema Pattern MVC . . . . . . . . . . . . . . . . . . . . . . 64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 ELENCO DELLE FIGURE Capitolo 1 Introduzione MagikChef è un software offine, distribuito su cd-rom per piattaforma Windows, creato per cuochi, pasticcieri, food and beverage manager, insegnanti ed in generale tutti i settori di ristorazione. Un applicativo completo per la gestione del ricettario di cucina, che offre la possibilità di consultare ricette ideate da Etoile ma anche di gestire, modificare e archiviare le ricette personali in modo professionale. Il committente, Boscolo Etoile Academy, ha richiesto lo sviluppo dell’applicativo in versione web in sostituzione della versione cdrom e soprattutto semplificato nel suo utilizzo, in modo da potersi rivolgere non solo al settore professionale ma anche agli appassionati di cucina. L’applicativo web è stato sviluppato in modo da diventare un vero e proprio social network, dove, oltre a gestire le proprie ricette, gli utenti possano condividere, commentare e valutare ricette, consigli ed osservazioni di tutti gli altri utilizzatori. In prospettiva, infine, il progetto dovrà essere integrato con il sito e-commerce Boscolo Etoile Academy in modo che da ogni singola scheda del ricettario possa essere suggerito ed effettuabile un acquisto. Tale progetto è stato sviluppato durante l’attività di stage presso l’azienda ospitante Aleaweb di Maniago (PN) che da 10 anni opera nel mondo del web e nelle soluzioni professionali per la vendita ed il commercio online oltre che in numerosi altri servizi riguardanti l’informatica. Essa è composta di una squadra completa di consulenti, programmatori, grafici, editor testuali e commerciali ed è stata d’appoggio nello sviluppo di tale progetto durante la fase di analisi e d’aiuto per le scelte progettuali e la fornitura di materiale per lo studio e lo sviluppo dell’applicazione. 8 Introduzione 1.1 Funzionalità del software Magikchef Il programma è stato realizzato nei primi anni 2000 ed è stato sviluppato attraverso il linguaggio di programmazione Delphi. Si presenta come un normale software gestionale, dove tabelle e menù a tendina primeggiano nell’intera struttura grafica del programma. Il primo impatto non è dei più rassicuranti dovuto alla grafica per niente intuitiva ed all’enorme quantità di azioni possibili strutturate in modo disordinato e difficilmente comprensibile. I termini utilizzati sono strettamente tecnici, questo restringe il campo dell’utente medio al solo professionista nel campo della ristorazione. Fig. 1.1: Screenshot software MagikChef Le principali funzionalità del software sono: • consultazione di circa 3000 ingredienti, 1500 ricette e 500 vini • inserimento, modifica e archivio di ricette, ingredienti e vini • calcolo ed analisi di valori nutrizionali e costi delle ricette • motore di ricerca avanzata per ricette secondo svariati parametri • realizzazione di menù personalizzati Obiettivi 9 • calcolo ed analisi per le attrezzature necessarie per banchetti e catering • report di stampa per ricette, menù e liste di spesa globali e di settore • possibilità di importazione ed esportazione delle ricette L’applicativo Magikchef permette all’utente di modificare la gran parte delle impostazioni, quasi nulla è vincolato. É possibile infatti modificare tutti i tipi di categorizzazione delle ricette, questa opzione poteva sembrare vantaggiosa nell’utilizzo in modo strettamente privato per un singolo utente, ma, avendo voluto creare un ricettario con l’aiuto di svariati professionisti, importando quindi in un unico database tutte le ricette con relative personalizzazioni, il risultato finale è stata la perdita di informazioni riguardo alle categorie delle ricette. Il database, inoltre, è stato progettato senza alcun vincolo di integrità, ottendo quindi multeplici dati corrotti, incoerenti e duplicati. 1.2 Obiettivi Dopo un attenta analisi del software MagikChef ed incontri con il proponente è stato scelto, in accordo con l’azienda ospitante lo stage, di stabilire come obiettivi principali i seguenti punti: • Riprogettazione di un database normalizzato creazione e sviluppo di un database normalizzato in modo da garantire integrità e coerenza dei dati. La progettazione del database dovrà prevedere l’obbligo di importazione della maggiorparte dei dati presenti del vecchio sistema. Inoltre il database, dovrà rispettare le norme di progetto stabilite dall’azienda ospitante ed essere corredato da una buona documentazione in modo da poter garantire un più semplice sviluppo futuro da parte di terze persone. • Sviluppo di un BackOffice personalizzato creazione di un amministrativo al fine di poter gestire non solo i dati inseriti dagli utenti, ma utile a riorganizzare l’archivio presente. Dovranno quindi essere integrate delle funzionalità specifiche per aiutare l’amministratore a controllare e migliorare la qualità e la correttezza dei numerosi dati corrotti e incoerenti presenti nel vecchio sistema. L’amministrativo dovrà inoltre integrarsi con il già presente sistema backoffice dell’azienda Aleaweb, dovrà quindi essere strutturato come un modulo del backoffice generale. • Semplificazione delle funzionalità progettazione dell’applicativo in modo da garantire un’ottima usabilità anche da parte di utenti non esperti (sia per quanto riguardo la ristorazione, sia per quanto riguarda l’informatica). Verranno quindi 10 Introduzione inizialmente tralasciate alcune funzionalità del vecchio sistema offline (come la creazione di menù o la gestione dei costi per le risorse per banchetti e catering) in modo da poter garantire un maggiore facilità di utilizzo sia dal lato amministrativo che da quello pubblico. • Sviluppo di un sistema di inviti inizialmente il portale web, sarà accessibile esclusivamente attraverso un invito elettronico, indirizzato principalmente verso i partecipanti alla scuola di cucina professionale Boscolo Etoile Academy. Questa scelta è stata decisa per aver un primo impatto da una fascia di utenti esperti nel settore della ristorazione, in modo da poter verificare ed analizzare le varie reazioni ed apportare le relative modifiche prima di una prematura presentazione al grande pubblico. Dovrà quindi essere costrutito un sistema per la generazione automatica di inviti, possibili promozioni e una gestione per gli utenti invitati e richiedenti. • Sviluppo dell’applicazione lato pubblico creazione di una parte pubblica, ossia della zona accessibile a tutti gli utenti. Questa sezione dovrà permettere all’utente di inserire, modificare ed archiviare ricette ed ingredienti personali. Inoltre dovrà contenere le principali funzionalità di un social network quali la possibilità di commentare, votare ed visualizzare ricette, ingredienti e profili degli altri utenti iscritti al portale. • Progettazione per una futura gestione di sponsors sviluppo di un sistema di base per poter associare i prodotti dell’applicazione web (ricette, vini e ingredienti) ad uno o più sponsor, in modo da poter creare in un futuro un applicazione collegata con l’attuale sito e-commerce Boscolo Etoile Academy, partendo già da un prodotto strutturato verso quell’obbiettivo. 1.3 Analisi di siti competitor Oltre ad analizzare il software offline MagikChef si è deciso di studiare le soluzioni adottate da siti web operanti nel settore gastronomico. Tra i numerosi portali di cucina presenti nel web sono stati approfonditi maggiormente tre possibili competitor scelti per l’utilizzo della lingua italiana (GialloZafferano.it), per il maggior numero di visite giornaliere (tastespotting.com) e per le migliori soluzioni adottate (bigoven.com). 1.3.1 GialloZafferano.it • Descrizione: Nato nel 2006, dalla passione per la cucina dei soci fondatori, Giallozafferano è diventato in breve tempo il più autorevole e seguito portale Analisi di siti competitor 11 italiano di gastronomia con oltre 600.000 utenti unici e più di 3.000.000 pagine visitate mensilmente. Non sono solo le ricette, anzi le foto-ricette, a caratterizzare Giallozafferano ma, anche, notizie e novità dal mondo gastronomico, e una delle comunità online più attiva del settore. Ogni ricetta è fotografata passa per passo, la scuola di cucina segue l’aspirante cuoco in ogni passaggio delle preparazioni, il blog pubblica notizie, curiosità e informazioni, le guide sempre aggiornate offrono innumerevoli spunti e idee, e ovviamente la community, con il suo forum e la chat, sono diventati la casa di tantissimi appassionati gastronomi. • Fattori Positivi: – Permette a ciascun utente di crearsi il proprio blog di cucina. – Dispone di un buon archivio di ricette ben strutturato, corredato anche di una sezione video. • Fattori Negativi: – La community è vincolata al solo commento delle ricette o nella pubblicazione di messaggi nel forum, l’inserimento delle ricette e limitato nel proprio blog, godendo quindi di scarsa visibilità. 1.3.2 Tastespotting.com • Descrizione: Immagini, ricette, articoli e link come post-it su una parete della vostra cucina: questa è l’immagine che vogliono dare del loro servizio i creatori di Tastespotting, una sorta di social network come Digg in cui i voti espressi dagli utenti fanno salire o scendere in classifica le segnalazioni di altri utenti. Tastespotting è quindi un succulento aggregatore di food blogs, che non mancherà di suggerire qualche peccato di gola. 12 Introduzione • Fattori Positivi: – Sito semplice ed accativante, induce l’utente ad esplorarlo. – Enorme archivio di ricette. • Fattori Negativi: – Scarsa categorizzazione delle ricette. – Le ricette provengono da blog differenti e non possono essere gestite. – Scarsa possibilità di comunicare con il proprietario della ricetta. 1.3.3 BigOven.com • Descrizione: Ogni utente iscritto su BigOven può creare le proprie ricette, condividerle con gli altri, apprendere da altri utenti i segreti dei fornelli, scoprire nuovi piatti, e scambiarsi opinioni, trucchi ed ovviamente ricette. E poi, un sito con ben oltre 170.000 ricette da sfogliare, tutte ben catalogate per categoria e corredate di foto e video, si fa ben piacere anche senza prendere in considerazione il suo lato sociale. Da questo punto di vista poi offre gli stessi strumenti sociali degli altri social network tipo Facebook, come ad esempio la condivisione, i commenti, e la partecipazione a gruppi tematici. • Fattori Positivi: – Ottima categorizzazione di ricette. – Ottima gestione della componente sociale con numerose interazioni con i principali social network, quali facebook e twitter. – Sezione video delle ricette. • Fattori Negativi: – Nessuna informazioni negativa è sicuramente il portale web migliore nel settore. Capitolo 2 Analisi dei requisiti 2.1 Requisiti Utente I requisiti di seguito descritti sono emersi tramite gli incontri con il proponente, l’analisi della struttura e delle funzionalità del vecchio software MagikChef ed il confronto con i siti competitor. Di tutti i requisiti raccolti sono stati preferiti quelli riguardanti la parte di gestione delle ricette ed ingredienti, tralasciando inizialmente la componente sociale del portale. Questa scelta è stata presa, in accordo con il proponente, a causa della corposa quantità di lavoro ed il limitato tempo a disposizione. Si definisce requisito una condizione o una capacità richiesta da un utente per risolvere un problema. Per ciascun requisito è stato attribuito un tipo (funzionale, qualità o vincolo) ed una priorità (obbligatoria o facoltativa). I requisiti funzionali determinano quali funzioni deve fornire il sistema per soddisfare determinati bisogni degli utenti utilizzatori, mentre i requisiti non funzionali riguardano aspetti di qualità come affidabilità, usabilità, accessibilità ed efficienza. Per requisito obbligatorio si intende una richiesta che deve essere assolutamente soddisfatta, irrinunciabile, per facoltativo un requisito non strettamente necessario ma che dà un valore aggiunto al prodotto finale. Req 1 - Gestione degli ingredienti (lato amministrativo) • Req 1.1 - Ricerca Descrizione: Visualizzazione degli ingredienti tramite una lista ordinabile con la possibilità di filtrarli per nome, tipologia, sponsor e stato di attivazione tramite una ricerca. Tipo: Funzionale. Priorità: Obbligatorio. • Req 1.2 - Visualizzazione Descrizione: Visualizzazione dell’ingrediente selezionato ed i suoi re- 14 Analisi dei requisiti lativi attributi. Tipo: Funzionale. Priorità: Obbligatorio. • Req 1.3 - Inserimento, modifica ed eliminazione Descrizione: Inserimento, modifica ed eliminazione di un ingrediente ed i suoi relativi attributi. Tipo: Funzionale. Priorità: Obbligatorio. • Req 1.4 - Associazione a sponsor Descrizione: Associazione e deassociazione di un ingrediente ad uno o più sponsor. Tipo: Funzionale. Priorità: Obbligatorio. Req 2 - Gestione delle categorie degli ingredienti (lato amministrativo) • Req 2.1 - Ricerca Descrizione: Visualizzazione delle categorie degli ingredienti in una lista ordinabile con la possibilità di filtrarli per nome. Tipo: Funzionale. Priorità: Obbligatorio. • Req 2.2 - Inserimento, modifica ed eliminazione Descrizione: Inserimento, modifica ed eliminazione di un attributo di una categoria relativa agli ingredienti. Tipo: Funzionale. Priorità: Obbligatorio. Req 3 - Gestione report degli ingredienti (lato amministrativo) • Req 3.1 - Ricerca Descrizione: Visualizzazione in una lista ordinabile degli ingredienti suggeriti/inseriti dagli utenti, con la possibilità di filtrarli per nome. Tipo: Funzionale. Priorità: Obbligatorio. • Req 3.2 - Approvazione Descrizione: Approvazione o ignoramento di un ingrediente inserito dall’utente. Nel primo caso l’amministratore dovrà verificare la correttezza degli attributi del relativo prodotto. Tipo: Funzionale. Priorità: Obbligatorio. Requisiti Utente 15 Req 4 - Gestione dei vini (lato amministrativo) • Req 4.1 - Ricerca Descrizione: Visualizzazione in una lista ordinabile dei vini con la possibilità di filtrarli per nome, per sponsor e per stato di attivazione. Tipo: Funzionale. Priorità: Obbligatorio. • Req 4.2 - Visualizzazione Descrizione: Visualizzazione del vino selezionato ed i suoi relativi attributi. Tipo: Funzionale. Priorità: Obbligatorio. • Req 4.3 - Inserimento, modifica ed eliminazione Descrizione: Inserimento, modifica ed eliminazione di un vino ed i suoi relativi attributi. Tipo: Funzionale. Priorità: Obbligatorio. • Req 4.4 - Associazione a sponsor Descrizione: Associazione e de associazione di un vino ad uno o più sponsor. Tipo: Funzionale. Priorità: Obbligatorio. Req 5 - Gestione delle ricette (lato amministrativo) • Req 5.1 - Ricerca Descrizione: Visualizzazione in una lista ordinabile dei ricette con la possibilità di filtrarle per nome, tipologia, sponsor e per stato di attivazione. Tipo: Funzionale. Priorità: Obbligatorio. • Req 5.2 - Ricerca Avanzata Descrizione: ricerca avanzata delle ricette con la possibilità di applicare i seguenti filtri: nome, categoria(tipologia, tipo di portata, specifica di portata), ingredienti presenti (o meno) nella ricetta, numero di porzioni, difficoltà, tempo di cottura, stagione, paternità, vino, tag. Tipo: Funzionale. Priorità: Obbligatorio. • Req 5.3 - Visualizzazione Descrizione: Visualizzazione della ricetta selezionata ed i suoi relativi attributi. 16 Analisi dei requisiti Tipo: Funzionale. Priorità: Obbligatorio. • Req 5.4 - Inserimento, modifica ed eliminazione Descrizione: Inserimento, modifica ed eliminazione di una ricetta ed i suoi relativi attributi. Tipo: Funzionale. Priorità: Obbligatorio. • Req 5.5 - Associazione a sponsor Descrizione: Associazione e de associazione di una ricetta ad uno o più sponsor. Tipo: Funzionale. Priorità: Obbligatorio. • Req 5.6 - Photogallery Descrizione: Creazione e gestione (inserimento, eliminazione e ordinamento immagini) di una photogallery relativa alla ricetta. Tipo: Funzionale. Priorità: Obbligatorio Req 6 - Gestione delle categorie delle ricette(lato amministrativo) • Req 6.1 - Ricerca Descrizione: Visualizzazione delle categorie delle ricette in una lista ordinabile con la possibilità di filtrarli per nome. Tipo: Funzionale. Priorità: Obbligatorio. • Req 6.2 - Inserimento, modifica ed eliminazione Descrizione: Inserimento, modifica ed eliminazione di un attributo di una categoria relativa alle ricette. Tipo: Funzionale. Priorità: Obbligatorio. • Req 6.3 - Gestione Relazioni Descrizione: Gestione delle relazioni padre/figlio per le categorie (tipologia, tipo di portata e specifica di portata). Tipo: Funzionale. Priorità: Facoltativo. Req 7 - Gestione delle Basi di Preparazione (lato amministrativo) • Req 7.1 - Ricerca Descrizione: Visualizzazione delle basi di preparazione, in una lista Requisiti Utente 17 ordinabile con la possibilità di filtrarle per nome, tipologia ricetta e tipologia ingrediente. Tipo: Funzionale. Priorità: Obbligatorio. • Req 7.2 - Visualizzazione Descrizione: Visualizzazione della base di preparazione con gli attributi come ingrediente o ricetta. Tipo: Funzionale. Priorità: Obbligatorio. • Req 7.3 - Inserimento ed eliminazione Descrizione: Inserimento di una nuova base di preparazione da un ingrediente o ricetta preesistente ( associandone i relativi attributi mancanti) verrà creata una associazione ricetta/ingrediente. Nel caso dell’eliminazione verrà cancellata solamente l’associazione ricetta/ingrediente. Tipo: Funzionale. Priorità: Obbligatorio. Req 8 - Gestione degli sponsors (lato amministrativo) • Req 8.1 - Ricerca Descrizione: Visualizzazione degli sponsors, in una lista ordinabile con la possibilità di filtrarli per nome. Tipo: Funzionale. Priorità: Facoltativo. • Req 8.2 - Inserimento, modifica ed eliminazione Descrizione: Inserimento, modifica ed eliminazione di uno sponsor. Tipo: Funzionale. Priorità: Facoltativo. Req 9 - Gestione degli inviti (lato amministrativo) • Req 9.1 - Visualizzazione utenti Descrizione: Visualizzazione degli utenti non attivi tramite una lista ordinabile con la possibilità di filtrarli per nome e stato. Tipo: Funzionale. Priorità: Obbligatorio. • Req 9.2 - Modifica ed eliminazione utente Descrizione: Modifica dello stato ed eliminazione di un utente non attivo. Tipo: Funzionale. Priorità: Obbligatorio. 18 Analisi dei requisiti • Req 9.3 - Spedizione inviti Descrizione: Spedizione degli inviti ad uno o più indirizzi e-mail inseriti dall’amministratore. Tipo: Funzionale. Priorità: Obbligatorio. • Req 9.4 - Gestione Promozioni Descrizione: Creazione, attivazione e disattivazione di una o più promozioni. Tipo: Funzionale. Priorità: Obbligatorio. • Req 9.5 - Gestione testo email Descrizione: Possibilità di modificare oggetto e testo delle mail relative agli inviti ed alle promozioni. Tipo: Funzionale. Priorità: Facoltativo. Req 10 - Registrazione e Login (lato pubblico) • Req 10.1 - Login Descrizione: Accesso al portale tramite l’inserimento di username e password. Tipo: Funzionale. Priorità: Obbligatorio. • Req 10.2 - Invito Descrizione: Accesso al portale tramite le credenziali ricevute attraverso un invito via posta elettronica. Tipo: Funzionale. Priorità: Obbligatorio. • Req 10.3 - Promozione Descrizione: Accesso al portale tramite il codice promozionale. Tipo: Funzionale. Priorità: Obbligatorio. • Req 10.3 - Richiesta d’invito Descrizione: Gestione di un form per la richiesta di invito al portale tramite l’inserimento dei propri dati. Tipo: Funzionale. Priorità: Obbligatorio. • Req 10.4 - Registrazione Descrizione: Registrazione al portale tramite l’inserimento delle proprie credenziali dopo aver effettuato l’accesso tramite invito o codice Requisiti Utente 19 promozionale. Tipo: Funzionale. Priorità: Obbligatorio. Req 11 - Gestione Profilo (lato pubblico) • Req 11.1 - Modifica credenziali Descrizione: Modifica delle proprie credenziali quali nome, email, password ecc... Tipo: Funzionale. Priorità: Obbligatorio. • Req 11.2 - Upload foto Descrizione: Upload e modifica di una immagine da utilizzare come foto profilo. Tipo: Funzionale. Priorità: Obbligatorio. • Req 11.3 - Visualizzazione utenti Descrizione: Visualizzazione dei profili degli utenti con relative informazioni riguardanti le ricette personali, preferite ed ingredienti privati. Tipo: Funzionale. Priorità: Obbligatorio. • Req 11.4 - Riassunto attività personali Descrizione: Pannello con l’elenco delle proprie ricette ed ingredienti personali e preferiti con la possibilità modificare tali attributi e filtrarli per nome. Tipo: Funzionale. Priorità: Obbligatorio. Req 12 - Gestione ingredienti (lato pubblico) • Req 12.1 - Ricerca Descrizione: Visualizzazione degli ingredienti (propri ed approvati) con la possibilità di filtrarli per nome. Tipo: Funzionale. Priorità: Obbligatorio. • Req 12.2 - Visualizzazione Descrizione: Visualizzazione dell’ingrediente selezionato ed i suoi relativi attributi. Tipo: Funzionale. Priorità: Obbligatorio. • Req 12.3 - Inserimento, modifica ed eliminazione Descrizione: Inserimento, modifica ed eliminazione di un ingrediente personale ed i suoi relativi attributi. Tipo: Funzionale Priorità: Obbligatorio. 20 Analisi dei requisiti • Req 12.4 - Inserimento veloce Descrizione: Inserimento di un proprio ingrediente durante la compilazione della lista degli ingredienti di una propria ricetta. Tipo: Funzionale. Priorità: Obbligatorio. Req 13 - Gestione delle ricette (lato pubblico) • Req 13.1 - Ricerca Descrizione: Visualizzazione delle ricette con la possibilità di filtrarle per nome. Tipo: Funzionale. Priorità: Obbligatorio. • Req 13.2 - Ricerca Avanzata Descrizione: Ricerca avanzata delle ricette con la possibilità di applicare i seguenti filtri: nome, categoria(tipologia, tipo di portata, specifica di portata), ingredienti presenti (o meno) nella ricetta, numero di porzioni, difficoltà, tempo di cottura, stagione, vino. Tipo: Funzionale. Priorità: Obbligatorio. • Req 13.3 - Visualizzazione Descrizione: Visualizzazione della ricetta selezionata ed i suoi relativi attributi. Tipo: Funzionale. Priorità: Obbligatorio. • Req 13.4 - Inserimento, modifica ed eliminazione Descrizione: Inserimento, modifica ed eliminazione di una ricetta personale ed i suoi relativi attributi. Tipo: Funzionale. Priorità: Obbligatorio. • Req 13.5 - Preferiti Descrizione: Inserimento ed eliminazione di una ricetta tra le proprie preferite. Tipo: Funzionale. Priorità: Obbligatorio. • Req 13.6 - Lista della spesa Descrizione: Inserimento ed eliminazione di una ricetta dalla propria lista della spesa. Tipo: Funzionale. Priorità: Facoltativo. Requisiti Utente 21 • Req 13.7 - Commenti Descrizione: Inserimento ed eliminazione di un proprio commento relativo ad una ricetta. Nel caso la ricetta appartenga all’utente, il permesso di cancellazione si estende per tutti i commenti. Tipo: Funzionale. Priorità: Facoltativo. • Req 13.8 - Votazione Descrizione: Possibilità di assegnazione giornaliera di un voto ad ogni ricetta. Tipo: Funzionale. Priorità: Facoltativo. • Req 13.9 - Visualizzazione Migliori Ricette Descrizione: Visualizzazione delle ricette con votazione più alta in homepage. Tipo: Funzionale. Priorità: Facoltativo. Req 14 - Gestione della lista della spesa (lato pubblico) • Req 14.1 - Visualizzazione Descrizione: Visualizzazione delle ricette presenti nella lista della spesa personale, da tale lista è possibile eliminare una o più ricette presenti. Tipo: Funzionale. Priorità: Facoltativo. • Req 14.2 - Calcolo della lista Descrizione: Calcolo degli ingredienti (quantità e prezzo) necessari per le ricette inserite nella lista della spesa personale. Tipo: Funzionale. Priorità: Facoltativo. • Req 14.3 - Gestione Portate Descrizione: Possibilità di decidere il numero delle portate per le ricette scelte nella lista della spesa e ricalcolarne quindi prezzo e quantità degli ingredienti necessari. Tipo: Funzionale. Priorità: Facoltativo. Req 15 - Sicurezza del portale Descrizione: Il portale, sia nella parte amministrativa che in quella pubblica, deve prevenire possibili attacchi esterni (prevalentemente tramite SQL injection) ed essere privo di bug che possano rendere accessibili dati sensibili. Tipo: Qualità. Priorità: Obbligatorio. 22 Analisi dei requisiti Req 16 - Modularità della parte amministrativa Descrizione: La parte amministrativa del portale deve essere integrata con il preesistente amministrativo e deve quindi rispettarne le condizioni per preservarne l’integrità ed aver accesso alle funzionalità integrate. Tipo: Qualità. Priorità: Obbligatorio. Req 17 - Efficacia ed efficienza del portale Descrizione: Il portale deve essere progettato in modo che gli utenti possano raggiungere facilmente tutte le informazioni, cercando di spendere meno risorse possibili. Tipo: Qualità. Priorità: Obbligatorio. Req 18 - Facilità di apprendimento Descrizione: Il portale deve essere progettato in modo che l’utente medio possa apprenderne tutte le funzionalità in modo veloce ed intuitivo. Tipo: Qualità. Priorità: Facoltativo. Req 19 - Supporto ad un elevato carico di informazioni Descrizione: Le query deve essere ottimizzate perché il sistema possa essere reattivo anche nel caso di un elevato numero di record da analizzare. Tipo: Qualità. Priorità: Facoltativo. Req 20 - PHP v5.0 Descrizione: Utilizzo del linguaggio di scripting interpretato PHP versione 5.0. Tipo: Vincolo. Priorità: Obbligatorio. Req 21 - JQuery v1.8.6 Descrizione: Utilizzo del framework per javascript JQuery versione 1.8. Tipo: Vincolo. Priorità: Obbligatorio. Requisiti Utente 23 Req 22 - Smarty v3.0 Descrizione: Utilizzo del web template Smarty versione 3.0 basato su PHP. Tipo: Vincolo. Priorità: Obbligatorio. Req 23 - MYSQL v5.0 Descrizione: Utilizzo del sistema per basi di dati MYSQL versione 5.0. Tipo: Vincolo. Priorità: Obbligatorio. 24 Analisi dei requisiti 2.2 2.2.1 Descrizione dei prodotti Ingredienti Si chiama comunemente ingrediente ciascuna delle sostanze od oggetti che vanno mescolati o aggiunti seguendo un determinato ordine al fine di ottenere una miscela unica, ossia una ricetta. Ad essi, nell’applicativo Magikchef, vengono attribuite le seguenti caratteristiche: • Nome: nome, unico, attribuito per identificare l’ingrediente. • Tipologia: categoria principale per caratterizzare l’ingrediente (ad esempio: Bevanda, Frutta, Latticino, Pesce, etc...). • Unità di misura: valore con il quale si intende quantificare l’ingrediente. Nel caso in cui venga assegnato un valore diverso da grammi dovrà essere abbinato un quantitativo in grammi dell’opzione scelta, ciò è indispensabile per un corretto calcolo del prezzo, dei valori nutrizionali e del peso netto. Ad esempio: ingrediente: Olio unità di misura: cucchiaio grammi: 20 gr (indica il peso di un cucchiaio d’olio). Ad ogni ingrediente è possibile associare più unità di misura. Tenendo l’esempio dell’olio, oltre all’unità di misura cucchiaio è utile avere l’unità di misura litro. Infatti, nel caso la ricetta sia la pasta al pomodoro, si richiederanno 2 cucchiai d’olio nel sugo, nel caso delle patatine fritte si utilizzerà mezzo litro d’olio. • Prezzo: costo riferito ad un quantitativo di 100 grammi dell’ingrediente, esso viene corredato da una data che si aggiorna automaticamente ogni qual volta viene aggiornato tale valore. • Valori Nutrizionali: valori nutrizionali quali lipidi, glucidi, proteine e chilocalorie presenti in un quantitativo di 100 grammi dell’ingrediente. • Peso Netto: valori in percentuale riferiti allo scarto per la pulizia ed al possibile decremento o incremento di peso dovuto alla cottura. Queste percentuali applicate al quantitativo scelto dall’utente permettono il calcolo del peso netto dell’ingrediente. • Adattabilità: ulteriore caratteristica relativa all’ingrediente, essa indica se questo è adatto al tipo di utente indicato nel valore di adattabilità. Le tipologie Descrizione dei prodotti 25 di utente sono, ad esempio: vegano, vegetariano, celiaco, intollerante al latte ecc... 2.2.2 Vini L’applicativo MagikChef dispone di un ottimo archivio di vini (circa 500). Principalmente la loro funzionalità è quella di essere associati ad una ricetta ma possono essere anche visualizzati singolarmente perchè accompagnati da una buona descrizione e da un discreto numero di attributi: • Nome: nome, unico, attribuito per identificare il vino. • Tipologia: categoria principale per caratterizzare il vino (ad esempio: rosso, bianco, frizzantino, spumante, ecc...). • Produttore: nome del principale o del più conosciuto produttore del vino in dettaglio. • Nozioni: descrizione generale del vino. • Vitigno: nome del vigneto dal quale proviene il vino. • Vitigno: provincia dove viene prodotto il vino. • Invecchiamento: anni di invecchiamento, ovvero il periodo necessario per la corretta fermentazione del vino. Se necessario viene specificato anche con quale modalità (tipo di contenitore, temperatura, ...) è consigliabile far fermentare tale prodotto. • Profumo, sapore e gradazione alcolica: ulteriori caratterizzazioni del vino, spesso accompagnate da una breve descrizione. • Temperatura di servizio: temperatura del vino con la quale è consigliabile servire tale prodotto. • Prezzo: costo riferito ad una normale bottiglia di vino (75 cl), esso viene corredato da una data che si aggiorna automaticamente ogni qual volta viene aggiornato tale valore. 26 Analisi dei requisiti 2.2.3 Ricette Una ricetta indica una lista di ingredienti con le relative dosi accompagnati da un dettagliato procedimento e talvolta anche da delle immagini. Per poter categorizzare le ricette in modo da permettere una ricerca in modo più efficente, nell’applicativo MagikChef ad una ricetta vengono associate le seguenti caratteristiche: • Nome: nome, unico, attribuito per identificare la ricetta. • Categoria: categoria della ricetta, questa caratteristica e composta da tre componenti che rappresentano rispettivamente la tipologia della ricetta (ad esempio: pasticceria, cucina, frutta, ...) , il tipo della portata (antipasto, primo, secondo, ...) e la specifica della portata (affettato, vegetale, al cioccolato, ...). • Descrizione: descrizione della ricetta (storia, provenienza, curiosità, ...) • Procedimento: descrizione dettagliata della procedura da seguire per la corretta realizzazione della ricetta. • Porzioni: numero delle portate relative alla quantità degli ingredienti scelta. • Tempo cottura: tempo, espresso in minuti, necessario alla cottura, se necessaria, della ricetta. • Lista degli ingredienti: elenco degli ingredienti con relative dosi e un’opzionale descrizione. • Photogallery: ad ogni ricetta è possibile associare una o più foto rappresentanti la ricetta completata o in fase di preparazione. • Dati aggiuntivi: ad ogni ricetta è possibile aggiungere dei dati opzionali quali: un vino da abbinare, una stagione od una occasione nella quale è preferibile preparare tale ricetta, il grado di difficoltà nella preparazione della ricetta, la temperatura di cottura, le azioni da effettuare dopo una probabile cottura ed un prezzo da associare al prodotto finito (al kg o per porzione). Descrizione dei prodotti 27 • Dati relativi al software MagikChef : per preservare un’integrità con il vecchio software MagikChef, solo per la parte amministrativa, rimangono visibili due ulteriori caratteristiche quali la paternità della ricetta e il gruppo di appartenza. Questi valori sono strettamente legati alla scuola di cucina professionale Boscolo Etoile Academy, essi infatti rappresentano rispettivamente i cuochi/professori della scuola e le pubblicazioni cartacee ed informatiche dell’accademia. 2.2.4 Basi di preparazione Un base di preparazione non è nientaltro che un prodotto che è sia ricetta che ingrediente. Esso conterrà tutti gli attributi, sia quelli riferiti ad una ricetta, sia quelli relativi ad un ingrediente. Avrà, in aggiunta degli altri prodotti, una relazione tra ingrediente e ricetta, in modo che l’utente possa decidere se visualizzare tale prodotto come ingrediente o come ricetta. Un semplice esempio per questo particolare tipo di prodotto è la besciamella essa infatti può essere inteso come ricetta, ossia un preparato di burro, farina, latte, noce moscata e sale oppure come un semplice ingrediente per la preparazione delle lasagne alla bolognese. Tutti i prodotti qui descritti avranno inoltre le seguenti caratteristiche: • Paternità Utente: indica a quale utente (o amministratore) appartiene tale prodotto. • Verificato: è un attributo visibile solamente dall’amministratore, verrà utilizzato solamente nella fase iniziale dello sviluppo del progetto, tale valore indica infatti se il prodotto è stato controllato dall’amministratore, questa scelta è dovuta al fatto di facilitare l’amministratore nel lavoro di correzione dei record del database come spiegato negli obiettivi del progetto. • Approvato: i prodotti inseriti dagli utenti potranno essere valutati dall’amministratori, nel caso in cui il prodotto sia ritenuto valido l’amministratore potrà decidere di approvarlo. Un ingrediente, un vino o una base di preparazione approvata è visibile a tutti gli utenti altrimenti rimane visibile ed utilizzabile solamente all’utente proprietario. Nel caso di una ricetta questo valore indicherà una futura possibilità di diventare un prodotto a pagamento. 28 Analisi dei requisiti 2.3 2.3.1 Struttura del portale Lato Amministrativo Come già introdotto negli obbiettivi del progetto, l’applicativo MagikChef dovrà, per quanto riguarda la parte amministrativa, essere integrato con il backoffice dell’azienda Aleaweb. L’amministrativo in questione è un CMS (content management system), ossia un sistema di gestione dei contenuti, interamente sviluppato all’interno dell’azienda con lo scopo di facilitare la gestione dei contenuti dei siti web, svincolando l’amministratore da conoscenze tecniche di programmazione. Questo sistema è stato sviluppato tramite il linguaggio PHP con una programmazione orientata agli oggetti, cercando di seguire le regole del pattern MVC, norme comunemente seguite dai maggiori framework per PHP. Il CMS sviluppato dall’azienda è strutturato in modo da ospitare svariati moduli gestiti da un core principale. L’applicazione MagikChef dovrà quindi figurare in questo sistema come un semplice modulo, non dovrà quindi andare ad interferire con il core o con moduli esterni. Per lo sviluppo dell’intero portale verranno utilizzati due moduli comuni, già sviluppati dall’azienda Aleaweb di seguito brevemente descritti: • Gestione Utenti: attraverso questo modulo è possibile inserire, modificare o eliminare tutti gli utenti e gli amministratori registrati al portale, è inoltre possibile creare dei gruppi ai quali definire determinati permessi ed associarne gli utenti desiderati. Ogni utente può essere caratterizzato con i relativi dati anagrafici ed è possibile inoltre inserire dinamicamente campi personalizzabili per una maggiore flessibilità del sistema. • File Manager: questo modulo è stato creato per poter salvare nel server web qualunque tipo di file ed organizzare tali allegati per cartelle. Contiene un sistema di upload multiplo e grazie ad un efficiente sistema di drag & drop è possibile, con molta facilità, ordinare i vari file ed organizzarli nelle cartelle create. Questo archivio viene poi riutilizzato da tutti gli altri moduli che necessitano di file esterni come ad esempio nella creazione di una fotogallery per una determinata ricetta. Se l’amministratore aveva già proveduto ad uploadare le immagini dovrà solamente selezionarle dalla cartella del filemanager da lui creata ed associarle quindi alla ricetta desiderata, in caso contrario opterà per un normale upload delle foto. Come raffigurato nell’immagine, il modulo MagikChef dell’amministrativo verrà strutturato dividendolo per le varie tipologie di prodotto e per le funzionalità riguardanti gli sponsor e la gestione degli inviti. Struttura del portale 29 Fig. 2.1: Struttura lato Amministrativo MagikChef Attraverso il seguente flow chart è possibile inoltre avere una prima inquadratura di come saranno organizzate le pagine ed i relativi livelli di profondità. • Ingredienti: Archivio: sezione dove è possibile visualizzare, inserire, modificare od eliminare un ingrediente. Categorie: sezione dove è possibile visualizzare, inserire, modificare od eliminare una delle categorie relative agli ingredienti. Report: sezione che raccoglie l’archivio degli ingredienti inseriti dagli utenti, attraverso una lista ordinata e filtrabile per nome, l’amministratore avrà accesso a tutti gli ingredienti (non presenti nell’attuale database) proposti dagli utenti e tramite delle semplici azioni potrà decidere se ignorare il suggerimento o approvare il prodotto rendendolo cosı̀ pubblico a tutti gli utenti del portale. • Vini: sezione dove è possibile visualizzare, inserire, modificare od eliminare un ingrediente. • Basi di Preparazione: sezione dove è possibile visualizzare, inserire, modificare od eliminare una base di preparazione. 30 Analisi dei requisiti • Ricette: Archivio: sezione dove è possibile visualizzare, inserire, modificare od eliminare una ricetta. Categorie: sezione dove è possibile visualizzare, inserire, modificare od eliminare una delle categorie relative alle ricette. Nel caso delle categorie tipologia, portata e specifica di portata è possibile gestirne le relazioni padre/figlio. • Sponsors: sezione dove è possibile visualizzare, inserire, modificare od eliminare uno sponsor e dove inoltre è possibile visualizzare e gestire tutti i prodotti ai quali è stato associato uno o più sponsor. • Inviti: Inviti : sezione dove è possibile invitare persone attraverso la spedizione di una e-mail contenente le credenziali per l’accesso al portale. É inoltre possibile modificare il messaggio delle e-mail. Promozioni : una promozione è un codice attraverso il quale una persona si può prenotare con una priorità maggiore per l’utilizzo del portale (se non invitata tramite e-mail), tramite questa sezione è possibile gestire l’attivazione o disattivazione di una o più promozioni. Struttura del portale 2.3.2 31 Lato Pubblico La parte pubblica dell’applicativo MagikChef sarà accessibile nella sua integrità solamente dagli utenti con le corrette credenziali, in caso contrario il visitatore sarà vincolato alla pagina iniziale nella quale potrà esclusivamente inserire un codice promozionale o richiedere un invito tramite il form apposito. Fig. 2.2: Struttura lato Pubblico MagikChef • Login: sezione attraverso la quale un utente può accedere al portale MagikChef. Questa sezione offre inoltre la funzionalità di accesso tramite le credenziali ricevute attraverso un invito elettronico, ciò comporterà una successiva registrazione, e la possibilità di prenotare un futuro accesso tramite l’inserimento di un codice promozionale o richiedendo un invito compilando il form apposito. • My MagikChef : sezione personale dell’utente, attraverso questa il visitatore potrà gestire il proprio profilo (dati anagrafici e foto) e controllare il proprio archivio di ricette ed ingredienti con la possibilità di visualizzare, inserire modificare ed eliminare i propri prodotti. • Ingredienti: sezione nella quale è possibile visualizzare tutti gli ingredienti (filtrabili per nome) presenti nel database ed analizzare i relativi attributi • Ricette: sezione nella quale è possibile visualizzare tute le ricette (filtrabili per 32 Analisi dei requisiti nome) presenti nel database ed analizzarle nel dettaglio. Questa sezione è corredata di una ricerca avanzata dove è possibile filtrare le ricette attraverso svariate caratteristiche quali: nome, categoria, ingredienti presenti o meno nella ricetta, numero di porzioni, difficoltà, tempo di cottura, stagione e vino. • Lista della Spesa: ogni utente registrato ha la possibilità di selezionare una o più ricette da inserire nella propria lista della spesa. Questa sezione si occupa di organizzare le ricette selezionate e di generare una lista degli ingredienti (calcolandone le relative quantità) per la realizzazione delle ricette selezionate. Sarà inoltre possibile determinare il numero di portate per ciascuna ricetta e ricalcolare le corrette quantità di ogni ingrediente nella relativa lista della spesa. Capitolo 3 Progettazione 3.1 Struttura del database Tra gli obiettivi non è mai emersa la possibilità di avere un portale multilingua, ma mettendo in previsione una probabile richiesta di questo genere è stato preferibile progettare un database che la potesse sopportare. Tra le svariate soluzioni proposte nella rete o nei più comuni libri specifici del settore, la soluzione adottata è stata quella che permetteva di poter lavorare sul numero di lingue e sul numero di campi che possono essere internazionalizzati senza dover lavorare eccessivamente sulla struttura del database. Fig. 3.1: Esempio di internazionalizzazione del database Come raffigurato nell’immagine, l’idea di base è stata quella di creare una tabella principale (per ogni oggetto del database sensibile all’i18n1 ) contentente tutti i dati che certamente non avrebbero cambiato il loro valore a seconda della lingua (come una chiave principale numerica e le relative chiavi esterne) ed una tabella internazionalizzata (i18n) contentente, la chiave esterna relativa all’oggetto principale, la lingua e i dati relativi alla lingua scelta. Nell’esempio: 1 Il termine inglese Internationalization viene spesso abbreviato come i18n dove il numero 18 fa riferimento al numero di lettere omesse 34 Progettazione • product: tabella di prodotti generici, contiene la propria chiave primaria e opzionali chiavi secondarie. • product i18n: tabella internazionalizzata, contiene i valori dei generici prodotti nelle varie lingue, la chiave esterna lang id definisce la lingua, product id definisce l’oggetto generico. • lang: tabella che contiene tutte le lingue disponibili nel database con eventuali attributi aggiuntivi. Il database è stato progettato seguendo delle norme sui nomi consigliate dall’azienda Aleaweb, cosı̀ da renderne più leggibile la lettura all’interno del database più esteso che compone il sistema BackOffice di Aleaweb. Queste regole richiedono che: • tutti i nomi devono essere in inglese e non devono contenere lettere maiuscole. • il nome delle tabelle deve essere composto di un codice di tre cifre indicante il modulo dell’amministrativo (in questo caso mgk), il carattere di underscore, il nome scelto della tabella e nel caso di una tabella internazionalizzata deve essere aggiunto i18n. Ad esempio mgk ingredients i18n. • le chiavi primarie sono indicate da id, il carattere di underscore ed il nome della tabella (id mgk ingredients i18n). • le chiavi esterne sono indicate dal nome della tabella (a cui si riferiscono), il carattere di underscore e id (mgk ingredients i18n id). Per comodità di lettura si è scelto di di suddividere l’intero database in quattro macroaree. Struttura del database 3.1.1 35 Ingredienti mgk ingredients è la tabella contente tutti gli ingredienti del sistema, essa (come spiegato in precedenza) è accompagnata dalla sua tabella di internazionalizzazione mgk ingredients i18n contente gli attributi degli ingredienti nelle varie lingue. Ad ogni ingrediente viene associata una singola categoria, definita dalla chiave esterna mgk in typologies id, ed un singolo proprietario, chiave esterna glo users id. Sono presenti inoltre due associazioni molti a molti definite tramite le tabelle mgk in2ct e mgk um2in ed indicano rispettivamente le relazioni tra gli ingredienti e le caratteristiche di adattabilità e tra gli ingredienti e le unità di misura. Fig. 3.2: Struttura database - ingredienti 36 Progettazione Le tabelle che gestiscono gli ingredienti sono: nome tabella descrizione mgk mgk mgk mgk mgk mgk ingredienti (con i18n relativa) tipologie degli ingredienti (con i18n relativa) adattabilità degli ingredienti (con i18n relativa) associazione ingredienti - adattabilità unità di misura (con i18n relativa) associazione unità di misura - ingredienti ingredients in typologies in categories in2ct um um2in Nella query che segue viene calcolato il prezzo, peso netto e calorie relativi agli ingredienti della ricetta XYZ: SELECT ing18 . ingredient AS nome , ROUND (( r2i18 . quantity * u2i . gram * ing18 . cost / 100 ) , 2) AS prezzosingolo , ROUND ((( r2i18 . quantity * u2i . gram ) * (1 - (( ing18 . clean_discard / 100) + ( ing18 . cook_discard / 100) ) ) * (1 + ( ing18 . cook_increase / 100) ) ) ,0) AS pesonetto , ROUND (( r2i18 . quantity * u2i . gram * ing18 . calorie / 100 ) ,0) AS calorie FROM mgk_rc2in AS r2i INNER JOIN mgk_rc2in_i18n AS r2i18 ON r2i18 . mgk_rc2in_id = r2i . id_mgk_rc2in INNER JOIN mg k_ ing re die nts _i 18n AS ing18 ON r2i . mgk_ingredients_id = ing18 . mgk_ingredients_id INNER JOIN mgk_um_i18n AS um18 ON r2i . mgk_um_id = um18 . mgk_um_id INNER JOIN mgk_um2in AS u2i ON r2i . mgk_um_id = u2i . mgk_um_id WHERE r2i18 . lang = ’ it ’ AND ing18 . lang = ’ it ’ AND um18 . lang = ’ it ’ AND u2i . mgk_ingredients_id = r2i . mgk_ingredients_id AND r2i . mgk_recipes_id = ’ XYZ ’ ORDER BY nome Struttura del database 3.1.2 37 Ricette La tabelle contente le ricette è stata nominata mgk recipes ed è associata, attraverso le relative chiavi esterne ai vari attributi delle ricette quali: gruppi, paternità, temperatura, stagione, difficoltà, vini e dopo cottura, ognuno dei quali, qualora necessario, accompagnato dalla propria tabella di internazionalizzazione. É presente un’associazione molti a molti con i tag assegnati dagli utenti alla ricetta gestita dalla tabella mgk rc2tg. Come descritto in precedenza ogni tabella viene categorizzata secondo una tripla di caratteristiche vincolate tra loro tramite un legame padre/figlio. Queste caratteristiche sono tipologia, tipo di portata e specifica di portata e le loro relazioni sono gestite tramite la tabella mgk rc cat. Fig. 3.3: Struttura database - ricette - parte 1/2 38 Progettazione Fig. 3.4: Struttura database - ricette - parte 2/2 Struttura del database 39 Le tabelle che gestiscono le ricette sono: nome tabella descrizione mgk mgk mgk mgk mgk recipes rc cat rc typologies course course spec mgk mgk mgk mgk mgk mgk mgk mgk mgk rc groups paternity temperature seasons difficulty wines aftercook tags rc2tg ricette (con i18n relativa) relazioni tripla tipologie, portata e specifiche tipologia delle ricette(con i18n relativa) portata delle ricette (con i18n relativa) specifica di portata delle ricette (con i18n relativa) gruppo delle ricette (con i18n relativa) paternità delle ricette temperatura della ricetta (con i18n relativa) stagione della ricetta (con i18n relativa) difficoltà della ricetta (con i18n relativa) vino associato alla ricetta (con i18n relativa) azione dopo cottura (con i18n relativa) tags assegnati dagli utenti associazione ricette-tag Nella seguente query, ad esempio, vengono selezionate le dieci ricette più votate con le relative categorie: SELECT rec18 . recipe , typ18 . typology , cou18 . course , csp18 . course_spec FROM mgk_recipes_i18n AS rec18 INNER JOIN mgk_recipes AS rec ON rec18 . mgk_recipes_id = rec . id_mgk_recipes INNER JOIN mgk_rc_cat AS cat ON rec . mgk_rc_cat_id = cat . id_mgk_rc_cat LEFT OUTER JOIN m g k_ r c _ t yp o l o g ie s _ i 18 n AS typ18 ON cat . mg k_ rc_ typ ol ogi es _id = typ18 . mg k_ rc_ typ ol ogi es _id LEFT OUTER JOIN mgk_course_i18n AS cou18 ON cat . mgk_course_id = cou18 . mgk_course_id LEFT OUTER JOIN mgk _co ur se_ sp ec_ i1 8n AS csp18 ON cat . mgk_course_spec_id = csp18 . mgk_course_spec_id ORDER BY rec18 . n_vote LIMIT 0 , 10 40 3.1.3 Progettazione Dipendenze ingredienti e ricette Questa macroarea del database rappresenta tutte le relazioni presenti tra i prodotti, ossia l’associazione molti a molti per gestire la lista degli ingredienti di ogni ricetta, gestita dalla tabella mgk rc2in; la relazione tra ingredienti e ricetta nelle basi di preparazione mgk basic e la gestione degli sponsor mgk sp2pr. L’associazione prodotto / sponsor viene definita con la chiave esterna dello sponsor e la chiave esterna composta da id e tipologia del prodotto, che definisce l’ingrediente la ricetta o il vino definito. Fig. 3.5: Struttura database - dipendenze ingredienti e ricette Struttura del database 41 Le tabelle che gestiscono questa macroarea sono: nome tabella descrizione mgk mgk mgk mgk mgk ricette ingredienti vini basi di preparazione associazione ingredienti-ricetta (con i18n relativa) sponsors associazione sponsors-prodotti recipes ingredients wines basic rc2in mgk sponsors mgk sp2pr Nella seguente query vine selezionato il nome della ricetta che non ha l’ingrediente XYZ: SELECT DISTINCT ( rec . id_mgk_recipes ) , rec18 . recipe FROM mgk_recipes_i18n AS rec18 INNER JOIN mgk_recipes AS rec ON rec18 . mgk_recipes_id = rec . id_mgk_recipes INNER JOIN mgk_rc2in AS r2i ON rec . id_mgk_recipes = r2i . mgk_recipes_id AND rec . id_mgk_recipes NOT IN ( SELECT DISTINCT mgk_recipes_id FROM mgk_rc2in WHERE mgk_ingredients_id IN ( ’ XYZ ’ ) ) WHERE rec18 . lang = ’ it ’ 42 3.1.4 Progettazione Supporto al social networking In questa sezione del database vengono rappresentate le associazioni relative alla parte sociale del portale MagikChef (in figura 3.6). Sono infatti raffigurate nell’immagine, le tabelle che contengono le informazioni relative a commenti, votazioni e preferenze degli utenti riguardo le ricette. La tabella che contiene la lista di tutti gli utenti, glo users, era preesistente nel database del BackOffice Aleaweb, all’interno del quale si appoggia l’applicativo Magikchef. Attraverso la chiave esterna glo users id, vini, ingredienti e ricette hanno il riferimento al relativo proprietario. Fig. 3.6: Struttura database - parte sociale Struttura del database 43 Le tabelle che gestiscono la parte sociale dell’applicazione sono: nome tabella descrizione mgk recipes mgk ingredients mgk wines glo users glo users info mgk invitations glo ex2im glo img glo filemanager mgk comments mgk ratings mgk favourites ricette ingredienti vini lista degli utenti informazioni aggiuntive relative agli utenti utenti invitati associazione modulo-immagine informazioni sulle immagini informazioni sui file commenti storico votazioni favoriti e lista della spesa La seguente query selezionala prima immagine della ricetta XYZ: SELECT fmn . id_glo_filemanager AS name , extension FROM glo_ex2im AS e2i LEFT OUTER JOIN glo_img AS img ON e2i . glo_img_id = img . id_glo_img LEFT OUTER JOIN glo_filemanager AS fmn ON img . glo_filemanager_id = fmn . id_glo_filemanager WHERE e2i . ext_id = ’ XYZ ’ AND cod_section = ’ MGK_REC_GAL ’ ORDER BY priority LIMIT 0 , 1 44 3.2 Progettazione Gestione degli inviti MagikChef è stato progettato, inizialmente, per essere un portale riservato agli iscritti ai corsi di cucina dell’accademia Boscolo Etoile. Per rendere questo possibile è stata realizzato un sistema per la gestione degli inviti. É stato inoltre sviluppato un sistema per gestire eventuali richieste esterne per l’accesso a tale sistema ed eventuali promozioni. Con promozione si intende un codice alfanumerico che può essere inserito in una pubblicità all’interno di riviste specializzate, negli articoli dell’ecommerce Boscolo o inviato tramite posta (cartacea) alle persone desiderate. Questo codice, viene generato automaticamente dall’amministrativo MagikChef e viene associato ad esso una data di scadenza. L’utente in possesso di tale codice effettua una registrazione prioritaria al portale, ma deve comunque ricevere un’approvazione manuale dell’amministratore per poter usufruire dei servizi offerti dal portale MagikChef. Fig. 3.7: Diagramma degli stati degli inviti Gestione degli inviti 45 Legenda degli stati del digramma in figura 3.7: • S0: utente visitatore; • S1: utente richiedente non confermato; • S2: utente richiedente confermato; • S3: utente in promozione non confermato; • S4: utente in promozione confermato; • S5: utente invitato; • S6: utente attivo; Le azioni del diagramma degli stati nella figura 3.7 sono: • 1.1 Richiesta d’invito: l’utente compila il form per la richiesta di un invito per l’accesso la portale MagikChef. • 1.2 Richiesta e-mail: l’amminstrativo (in automatico) invia una e-mail all’indirizzo inserito dal richiedente per confermare la validità di questo. • 1.3 Conferma e-mail: l’utente richiedente risponde alla mail per confermare la veridicità dell’indirizzo. • 1.4 Spedizione invito: l’amministratore, qualora lo ritenisse utile, invia un’invito per l’acceso al portale al richiedente. • 2.1 Inserimento promozione: l’utente inserisce il codice promozionale e compila il form di registrazione. • 2.2 Richiesta e-mail: l’amminstrativo (in automatico) invia una e-mail all’indirizzo inserito dall’utente in promozione per confermare la validità di questo. • 2.3 Conferma e-mail: l’utente in promozione risponde alla mail per confermare la veridicità dell’indirizzo. • 2.4 Approvazione utente: l’amministratore approva l’utente in promozione inviandogli una mail di benvenuto. 46 Progettazione • 3.1 Conferma invito: l’utente invitato conferma il proprio invito accedendo al portale tramite le credenziali ricevute per e-mail e compilando il form di registrazione. Fig. 3.8: Screenshot Gestione inviti amministrativo MagikChef Gestione dei prodotti 3.3 47 Gestione dei prodotti Come prodotti MagikChef si intendono ricette, ingredienti, vini e basi di preparazione. Ad ognuno di essi vengono attribuite delle funzionalità comuni che si differenziano dall’utente che ne usufruisce. Esse si possono riassumere in ricerca, inserimento, modifica ed eliminazione che possono essere effettuate sia dall’utente semplice che dall’amministratore, ed approvazione ed associazione a sponsor, operazioni limitate all’amministratore. Di seguito viene analizzata in modo dettagliato la gestione delle ricette. Fig. 3.9: Use Case - Gestione ricette I casi d’uso rappresentati nella figura soprastante sono: 3.3.1 Ricerca • Nome: ricerca di una ricetta. • Attori coinvolti: utente. • Descrizione: Ricerca di una ricetta, o di una lista di ricette, filtrate tramite il proprio nome. L’utente deve essere aiutato nella ricerca tramite lo sviluppo di un sistema di autocompletamento che ne suggerisca il corretto inserimento del nome della ricetta. • Flusso degli eventi: – l’utente inserisce il nome della ricetta da ricercare 48 Progettazione – il sistema visualizza una lista di nomi di 10 ricette come suggerimenti aggiornate contemporaneamente all’inserimento del testo da parte dell’utente (autocompletamento). – l’utente può decidere se ricercare la parola da lui inserita o scegliere uno dei suggerimenti proprosti dal sistema. – il sistema mostra i risultati divisi in pagine ciascuna contenente 10 risultati. • Flusso alternativo: nel caso in cui il testo ricercato dall’utente non produca alcun risultato verrà visualizzato il relativo messaggio d’errore. • Precondizioni: l’utente deve aver effettuato il login. • Postcondizioni: nessuna. 3.3.2 Ricerca avanzata • Nome: ricerca avanzata di una ricetta. • Attori coinvolti: utente. • Descrizione: ricerca di una ricetta, o di una lista di ricette, filtrate tramite: – nome (con autocompletamento) – categoria (tipologia, portata e specifica) – presenza o meno di un ingrediente (con autocompletamento) – numero delle porzioni – tempo di cottura – difficoltà – stagione – vino (con autocompletamento) • Flusso degli eventi: – l’utente inserisce le caratteristiche della ricetta da ricercare – il sistema suggerisce all’utente tramite autocompletamento nome, ingredienti e vino (se inseriti). – il sistema mostra i risultati divisi in pagine ciascuna contenente 10 risultati. • Flusso alternativo: nel caso in cui le caratteristiche ricercate dall’utente non producano alcun risultato verrà visualizzato il relativo messaggio d’errore. Gestione dei prodotti 49 • Precondizioni: l’utente deve aver effettuato il login. • Postcondizioni: nessuna. 3.3.3 Inserimento • Nome: inserimento di una nuova ricetta. • Attori coinvolti: utente. • Descrizione: l’utente inserisce una nuova ricetta attribuendone tutte le caratteristiche da lui desiderate. Al termine di tale azione, esso potrà procedere all’inserimento di una relativa photogallery. • Flusso degli eventi: – l’utente sceglie di inserire una nuova ricetta. – l’utente inserisce i dati iniziali della ricetta quali: nome, tipologia, descrizione, procedimento, etc ... – l’utente inserisce la lista degli ingredienti con le relative quantità. – il sistema suggerisce l’ingrediente tramite autocompletamento e, ad ingrediente scelto, visualizza le relative unità di misura. – se l’ingrediente scelto dall’utente non è presente nel database, può inserirlo tra i personali, questo verrà inserito nella lista dei report degli ingredienti visibile dall’amministratore. – l’utente conclude l’inserimento della ricetta inserendo facoltativamente i dati aggiuntivi come: vino, difficoltà, dopo cottura, stagione, etc ... – salvata la ricetta l’utente può inserire una relativa photogallery ed ordinerne le immagini. • Flusso alternativo: nel caso in cui non vengano inseriti i dati obbligatori o vengano inseriti dati in modo non corretto verrà visualizzato il relativo messaggio d’errore. • Precondizioni: l’utente deve aver effettuato il login. • Postcondizioni: viene archiviata una nuova ricetta. 50 Progettazione Fig. 3.10: Flow Chart - Inserimento nuova ricetta Gestione dei prodotti 3.3.4 51 Modifica • Nome: modifica di una ricetta personale. • Attori coinvolti: utente. • Descrizione: l’utente seleziona una delle sue ricette personali e ne modifica qualsiasi attributo. • Flusso degli eventi: – l’utente sceglie di modificare ricetta personale. – il sistema visualizzerà un form identico a quello dell’inserimento, precompilato secondo gli attributi della ricetta selezionata. – l’utente può procedere alla modifica di qualunque campo rispettando i campi obbligatori ed i tipi di dato. – il sistema salva le modifiche apportate dall’utente all propria ricetta. • Flusso alternativo: nel caso in cui non vengano inseriti i dati obbligatori o vengano inseriti dati in modo non corretto verrà visualizzato il relativo messaggio d’errore. Se l’utente sceglie di modificare una ricetta non sua viene reindirizzato alla homepage con relativo messaggio di errore. • Precondizioni: l’utente deve aver effettuato il login e deve selezionare una propria ricetta. • Postcondizioni: viene modificata una ricetta. 3.3.5 Eliminazione • Nome: eliminazione di una ricetta personale. • Attori coinvolti: utente. • Descrizione: l’utente seleziona una delle sue ricette personali e ne decide l’eliminazione. • Flusso degli eventi: – l’utente sceglie di eliminare ricetta personale. – il sistema visualizzerà una finestra dove richiede all’utente di confermare l’azione richiesta. – in caso affermativo il sistema provvederà all’eliminazione della ricetta selezionata. 52 Progettazione • Flusso alternativo: Se l’utente sceglie di eliminare una ricetta non sua viene reindirizzato alla homepage con relativo messaggio di errore. • Precondizioni: l’utente deve aver effettuato il login e deve selezionare una propria ricetta. • Postcondizioni: viene eliminata una ricetta. 3.3.6 Approvazione • Nome: approvazione di una ricetta. • Attori coinvolti: amministratore. • Descrizione: l’amministratore approva una ricetta inserita da un utente. La ricetta selezionata potrà ora essere modificata dall’amministratore, essere associata ad uno sponsors o diventare a pagamento. • Flusso degli eventi: – l’amminstratore visualizza la lista delle ricette inserite dagli utenti. – l’amministratore seleziona la ricetta da approvare. – l’amminstratore modifica il campo approvato selezionando la voce affermativa. – il sistema modifica la ricetta in approvata. • Flusso alternativo: l’amministratore può decidere di deapprovare una ricetta precedentemente approvata • Precondizioni: l’amministratore deve aver avuto accesso al back office amministrativo. • Postcondizioni: viene modificato il campo approvato di una ricetta. 3.3.7 Associazione a sponsor • Nome: associazione di una ricetta ad uno sponsor. • Attori coinvolti: amministratore. • Descrizione: l’amministratore seleziona una o più ricette alle quali associa uno sponsor. • Flusso degli eventi: – l’amminstratore visualizza la lista delle ricette approvate. Gestione dei prodotti 53 – l’amministratore seleziona una o più ricette dalla lista alle quali vuole associare uno sponsor. – il sistema genera la lista di tutti gli sponsor che non hanno alcuna associazione con le ricette selezionate. – l’amministratore sceglie uno sponsor dalla lista descritta nel punto precedente. – il sitema associa lo sponsor alle ricette. • Flusso alternativo: nel caso l’amministratore scelga di deassociare uno sponsor verranno visualizzati gli sponsor che hanno delle associazioni attive con le ricette selezionate. • Precondizioni: l’amministratore deve aver avuto accesso al back office amministrativo. • Postcondizioni: viene associato lo sponsor ad una o più ricette. 54 Progettazione Fig. 3.11: Screenshot modifica di una ricetta Gestione commenti, voti e prodotti favoriti 3.4 55 Gestione commenti, voti e prodotti favoriti In questa sezione verranno analizzati tutti quegli aspetti che riguardano la parte “sociale” dell’applicazione MagikChef. Tali funzionalità permettono gli utenti di interagire tra loro, non solo semplicemente visualizzando le ricette altrui ma anche sfogliando il loro profilo, rilasciando commenti o dando un voto alla ricetta preferita. Fig. 3.12: Use Case - Gestione parte social del portale I casi d’uso rappresentati nella figura soprastante sono: 3.4.1 Visualizzazione utenti • Nome: visualizzazione del profilo di un utente. • Attori coinvolti: utente. • Descrizione: l’utente ha la possibilità di visualizzare il profilo degli altri utenti che è composto di dati dell’utente, lista delle ricette e degli ingredienti personali e lista delle ricette preferite. • Flusso degli eventi: 56 Progettazione – l’utente seleziona un utente premendo sul suo nome raggiungibile nei dettagli di una ricetta. – il sistema visualizza la scheda del profilo dell’utente selezionato. • Flusso alternativo: nel caso venga selezionato un utente inesistente il sistema redirige l’utente alla homepage con relativo messaggio d’errore. • Precondizioni: l’utente deve aver effettuato il login. • Postcondizioni: nessuna. 3.4.2 Gestione profilo • Nome: gestione del proprio profilo utente. • Attori coinvolti: utente. • Descrizione: l’utente ha la possibilità di modificare i propri dati incluse le proprie credenziali d’accesso al portale MagikChef quali email e password. • Flusso degli eventi: – l’utente seleziona la voce il mio profilo dal menù. – l’utente può modificare qualsiasi campo del suo profilo, comprese le proprie credenziali d’accesso e la sua immagine del profilo. – il sistema salva le modifiche apportate dall’utente. • Flusso alternativo: nel caso vengano omessi dati obbligatori il sistema risponderà con un relativo messaggio d’errore. • Precondizioni: l’utente deve aver effettuato il login. • Postcondizioni: vengono modificati i dati principali dell’utente. 3.4.3 Votazione • Nome: assegnazione di un voto ad una ricetta. • Attori coinvolti: utente. • Descrizione: l’utente ha la possibilità assegnare un voto da 1 a 5 ad ogni ricetta persenta nel sistema una volta al giorno. • Flusso degli eventi: – l’utente esprime un voto ad una ricetta da 1 a 5. Gestione commenti, voti e prodotti favoriti 57 – il sistema controlla se l’utente ha già votato la ricetta selezionata nelle precedenti 24 ore. – il sistema risponde con un messaggio di ringraziamento per l’avvenuta votazione. – il sistema calcola la nuova media di voto e aggiorna il numero di voto della relativa ricetta. • Flusso alternativo: nel caso in cui l’utente abbia già votato la ricetta nelle precedenti 24 ore il sistema risponderà con un relativo messaggio d’errore. • Precondizioni: l’utente deve aver effettuato il login. • Postcondizioni: viene associato un voto alla ricetta. 3.4.4 Preferiti • Nome: gestione di una lista di ricette preferite. • Attori coinvolti: utente. • Descrizione: l’utente può assegnare una preferenza ad un a o più ricette inserendole nella propria lista dei preferiti. • Flusso degli eventi: – l’utente seleziona una ricetta. – l’utente aggiunge la ricetta alla propria lista dei preferiti. – il sistema aggiorna la lista dei preferiti dell’utente. • Flusso alternativo: nel caso in cui l’utente abbia già assegnato la sua preferenza a tale ricetta può eliminarla dalla propria lista. • Precondizioni: l’utente deve aver effettuato il login. • Postcondizioni: viene aggiornata la lista dei preferiti dell’utente. 3.4.5 Inserimento commento • Nome: inserimento di un commento. • Attori coinvolti: utente. • Descrizione: l’utente può inserire un commento ad una ricetta. • Flusso degli eventi: – l’utente seleziona una ricetta. 58 Progettazione – l’utente aggiunge un commento. – il sistema aggiunge il commento in coda alla lista dei commenti della ricetta selezionata. • Flusso alternativo: se il testo del commento viene lasciato vuoto il sistema risponde con il relativo errore. • Precondizioni: l’utente deve aver effettuato il login. • Postcondizioni: viene aggiunto un commento alla ricetta. 3.4.6 Eliminazione commento • Nome: eliminazione di un commento. • Attori coinvolti: utente. • Descrizione: l’utente può eliminare un proprio commento o tutti i commenti relativi alla propria ricetta. • Flusso degli eventi: – l’utente seleziona un proprio commento o un commento relativo ad una propria ricetta. – l’utente elimina il commento. – il sistema elimina il commento dalla lista dei commenti della ricetta selezionata. • Flusso alternativo: nessuno. • Precondizioni: l’utente deve aver effettuato il login. • Postcondizioni: viene eliminato un commento dalla ricetta. 3.4.7 Lista della spesa • Nome: gestione della lista della spesa. • Attori coinvolti: utente. • Descrizione: l’utente può aggiungere una ricetta alla propria lista della spesa e modificarne il numero delle portate per calcolarne la somma dei relativi ingredienti. • Flusso degli eventi: – l’utente seleziona una ricetta. – l’utente aggiunge la ricetta alla propria lista della spesa. Gestione commenti, voti e prodotti favoriti 59 – il sistema aggiorna la lista della spesa e ne calcola i relativi ingredienti. – l’utente modifica il numero delle portate di una o più ricette presenti nella propria lista della spesa. – il sistema calcola la nuova lista degli ingredienti calcolandone le relative quantità in base al numero di portate scelte. • Flusso alternativo: nel caso in cui l’utente inserisca un valore non numerico per il numero di portate il sistema visualizzerà l’errore relativo. Se la ricetta è già presente nella lista della spesa dell’utente egli può decidere di eliminarla. • Precondizioni: l’utente deve aver effettuato il login. • Postcondizioni: viene aggiornata la lista della spesa. Le successive due funzionalità erano già presenti nel backoffice Aleaweb nel modulo di gestione degli utenti. Vengono descritte perchè integrate e fondamentali nell’amministratio del portale MagikChef. 3.4.8 Attivazione utente • Nome: attivazione / disattivazione di un utente. • Attori coinvolti: amministratore. • Descrizione: l’amministratore può attivare o disattivare lo stato di un utente decidendone la possibilità di accesso al portale o meno, ma preservando i suoi dati (contrariamente all’eliminazione). • Flusso degli eventi: – l’amministratore attiva/disattiva un utente. – il sistema aggiorna lo stato del relativo utente. • Flusso alternativo: nessuno. • Precondizioni: l’amministratore deve aver avuto accesso al back office amministrativo. • Postcondizioni: viene aggiornato lo stato dell’utente. 60 Progettazione 3.4.9 Eliminazione utente • Nome: eliminazione di un utente. • Attori coinvolti: amministratore. • Descrizione: l’amministratore può eliminare un utente con la conseguente cancellazione di tutti i dati relativi. • Flusso degli eventi: – l’amministratore elimina un utente. – il sistema elimina dal database tutti i dati relativi a tale utente. • Flusso alternativo: nessuno. • Precondizioni: l’amministratore deve aver avuto accesso al back office amministrativo. • Postcondizioni: viene eliminato un utente. Fig. 3.13: Screenshot Visualizzazione profilo utente Capitolo 4 Sviluppo 4.1 Scelte tecnologiche Le motivazioni delle scelte tecnologiche sono principalmente dovute ai requisiti di vincolo prefissati durante l’attività di analisi del progetto. Dovendo progettare un modulo all’interno di un sistema back office preesistente non era infatti possibile scegliere un linguaggio di scripting differente da quello adottato, ossia PHP, o un diverso gestore di database, MYSQL. L’utilizzo della tecnologia AJAX è stato voluto per rendere il portale più interattivo ed insieme al framework jQuery, ha reso possibile azioni semplici come l’autocompletamento, o complesse come il contemporaneo calcolo dei valori nutrizionali durante l’inserimento degli ingredienti in una ricetta. Di seguito vengono descritti in modo più approfondito le principali scelte tecnologiche adottate. 4.1.1 PHP PHP (acronimo ricorsivo di PHP: Hypertext Preprocessor, preprocessore di ipertesti) è un linguaggio di scripting interpretato, con licenza open source e libera, originariamente concepito per la programmazione Web ovvero la realizzazione di pagine web dinamiche. Attualmente è utilizzato principalmente per sviluppare applicazioni web lato server ma può essere usato anche per scrivere script a riga di comando o applicazioni standalone con interfaccia grafica. PHP riprende per molti versi la sintassi del C, come peraltro fanno molti linguaggi moderni, e del Perl. È un linguaggio a tipizzazione debole e dalla versione 5 migliora il supporto al paradigma di programmazione ad oggetti. Certi costrutti derivati dal C, come gli operatori fra bit e la gestione di stringhe come array, permettono in alcuni casi di agire a basso livello; tuttavia è fondamentalmente un linguaggio di alto livello, caratteristica questa rafforzata dall’esistenza delle sue moltissime API. PHP è in grado di interfacciarsi a innumerevoli database tra cui MySQL, 62 Sviluppo PostgreSQL, Oracle, Firebird, IBM DB2, Microsoft SQL Server, solo per citarne alcuni, e supporta numerose tecnologie, come XML, SOAP, IMAP, FTP, CORBA. Si integra anche con altri linguaggi/piattaforme quali Java e .NET e si può dire che esista un wrapper per ogni libreria esistente, come CURL, GD, Gettext, GMP, Ming, OpenSSL ed altro. PDO PDO e’ un’ estensione di PHP in grado di pilotare database di diverso tipo tramite un’ unica interfaccia ( o meglio classe ) che con gli stessi metodi opera su mysql, mysql 4.x, sqlite 2.x, sqlite 3.x , PostgreSQL, sqlserver, oracle, ecc. L’utilizzo di questa classe è utile e indispensabile per rendere un applicativo portabile su diverse forme di databases. Essa viene integrata dalla versione di PHP 5.1 fortemente orientata agli oggetti. 4.1.2 MySQL Si tratta di un RDBMS (relational database management system) composto da un server ed un client con interfaccia a caratteri, oltre che all’intuitiva ed ottimizzata accessibilità tramite PHP, disponibile sia in piattaforme Unix che Windows. Il sistema era in licenza GPL, attualmente è di proprietà di Sun Microsystems ultimamente acquistata da Oracle. Con il supporto di Apache e PHP è disponibile il tool PHPMyAdmin per l’amministrazione tramite interfaccia grafica del database: creazione database, creazione tabelle, inserimento, cancellazione e query. 4.1.3 AJAX AJAX, acronimo di Asynchronous JavaScript and XML, è una tecnica di sviluppo per la realizzazione di applicazioni web interattive (Rich Internet Application). Lo sviluppo di applicazioni HTML con AJAX si basa su uno scambio di dati in background fra web browser e server, che consente l’aggiornamento dinamico di una pagina web senza esplicito ricaricamento da parte dell’utente. AJAX è asincrono nel senso che i dati extra sono richiesti al server e caricati in background senza interferire con il comportamento della pagina esistente. Normalmente le funzioni richiamate sono scritte con il linguaggio JavaScript. 4.1.4 JQuery jQuery è una libreria di funzioni (un cosiddetto software framework) per le pagine web, codificata in javascript, che si propone come obiettivo quello di Scelte tecnologiche 63 astrarre ad un livello più alto la programmazione lato client del comportamento di ogni singola pagina HTML. Tramite l’uso della libreria jQuery è possibile effettuare svariate operazioni, come ad esempio ottenere l’altezza di un elemento, o farlo scomparire con effetto dissolvenza. Anche la gestione degli eventi è completamente standardizzata e gestita automaticamente, assieme alla loro propagazione; stessa cosa per quanto riguarda l’utilizzo di AJAX, in quanto sono presenti alcune funzioni molto utili e veloci che si occupano di istanziare i giusti oggetti ed effettuare la connessione e l’invio dei dati. 4.1.5 Smarty Smarty è un motore di web template scritto in PHP. Smarty consente di separare il codice PHP, il business logic (la programmazione del software), dal codice HTML, il presentation logic (l’aspetto grafico di un sito web), e di generare contenuti web mediante il rimpiazzo di speciali Smarty tag all’interno del documento (sostituzione di variabili e molto altro). La raffinata astrazione creata da Smarty consente di separare drasticamente l’interfaccia grafica di una pagina web (la presentazione) dal back-end in PHP, favorendo lo sviluppo di applicazioni di gran lunga più organizzate ed eleganti. L’uso di Smarty facilita agli sviluppatori PHP l’implementazione del modello di sviluppo Model-View-Controller (MVC), che presenta degli indubbi vantaggi: è infatti possibile nascondere ai webdesigner la logica di programmazione di un sito, mentre i programmatori lavoreranno senza curarsi dell’interfaccia grafica del sito. 64 Sviluppo 4.2 Pattern MVC Model View Controller è un design pattern strutturale che aiuta a strutturare le applicazioni in tre parti utilizzando la programmazione ad oggetti. Il compito di questa strutturazione è quello di rendere indipendenti, disaccoppiando le parti software tra loro, adibite al controllo, all’accesso ai dati e alle viste di presentazione degli stessi. Il pattern è basato quindi sulla separazione dei compiti fra le classi che interpretano tre ruoli principali: • Il modello gestisce i dati e fornisce i metodi per accedervi in modo astratto e consistente, solitamente la progettazione del modello è guidata sostanzialmente dalla struttura del database e quindi sostanzialmente dalle modalità di accesso ad esso. • La vista si incarica di visualizzare i dati o un porzione di essi, forniti dal controllore attraverso un opportuno modello, in base ad una specifica formattazione rappresentante un certo contesto applicativo, che potrà essere un lista di record, una form per l’inserimento e la modifica, un grafico, o qualsiasi rappresentazione si vuole dare a questi dati. • Il controllore è il motore dell’applicazione, riceve i comandi dall’utente, generalmente attraverso la vista utilizzando i propri metodi e li utilizza per richiamare in modo adeguato gli altri due componenti, permettendo quindi al modello di estrarre i dati, che vengono passati per la visualizzazione alle opportune viste. In pratica il controllore si occupa di rimappare le azioni effettuate dall’utente alle risposte dell’applicazione, che lavoreranno sui modelli e le viste in modo adeguato. Fig. 4.1: Schema Pattern MVC Vantaggi: Pattern MVC 65 • Indipendenza delle varie componenti, che permette di lavorare separatamente in team (con competenze diverse) alle parti software astraendone al meglio il funzionamento. • Possibilità di scrivere viste e controllori diversi utilizzando lo stesso modello di acceso ai dati e quindi riutilizzare parte del lavoro già fatto. • Avere il controllore separato dal resto dell’applicazione rende la sua progettazione più semplice permettendo di concentrare gli sforzi sulla logica del funzionamento. • Obbliga gli sviluppatori a rispettare uno standard nella stesura del progetto, che ne facilita poi la comprensione e le successive implementazioni, soprattutto utilizzabile in progetti di medie/grandi dimensioni. • Software più flessibile, mantenibile ed aggiornabile nel tempo. Svantaggi: • Adatto soprattutto a progetti medio/grandi. • Architettura sostanzialmente complessa. Esistono tantissimi framework open-source per utilizzare il pattern di sviluppo MVC assieme al linguaggio PHP, tra i più famosi citiamo Zend Framework, CakePhp, Symfony, PHPMVC ecc. Per lo sviluppo dell’applicazione MagikChef è stato però scelto di non adottarne alcuno per non essere vincolati nelle pesanti scelte progettuali che ciascuno adotta, come ad esempio le norme sui nomi delle tabelle del database o l’eccessivo carico di utilizzo della memoria dovuto alla troppa generalizzazione. É stato quindi costruito un sistema ad hoc che si occupasse della gestione dei paramentri adottando le regole del pattern strutturale MVC. 66 4.3 Sviluppo Descrizione delle classi Come introdotto precedentemente, la progettazione dell’applicazione web è stata fortemete improntata sulla scelta di seguire le indicazioni del pattern MVC sia nella parte amministrativa che in quella pubblica. Sono state quindi costruite delle classi per accedere e gestire i vari dati nel database (model ) denominate con il suffisso Mod e delle classi per la gestione dei dati estrapolati dal database e dei comandi ricevuti dall’utente (control ) denominato con il suffisso Con. Le viste sono delle pagine HTML generate tramite l’utilizzo del framework Smarty che interagiscono con l’utente e comunicano le richieste con le classi del controllore. Sia nella parte pubblica che in quella amministrativa, l’applicativo è stato suddiviso in diversi moduli. Ciascuno di essi è composto da: una classe modello, una classe controllore ed una o più viste. La classe modello contiene tutte quelle azioni che si interfacciano direttamente con i dati, effettua interrogazioni o modifiche sul database e lavora direttamente sui file fisici per quanto riguarda l’upload o la cancellazione dei file. La classe controllore serve da collegamento tra il modello e le viste, essa può interfacciarsi, oltre al modello del modulo in comune, a qualsiasi altre classe modello dell’applicazione. Questa determinata classe fornisce alle sue relative viste i dati prelevati dal modello e richiamandone le corrette funzioni. Le viste sono semplici pagine HTML rese dinamiche dalle azioni del controllore con il quale comunica tramite form, collegamenti diretti o piccole applicazioni javascript. 4.3.1 Parte Amministrativa Nella tabella successiva verrano brevemente elencati i moduli della parte amministrativa specificando le relazioni che intercorrono tra le classi controllore, i modelli e le viste. modulo basi di preparazione ingredienti controllore BasicCon categorie degli ingredienti CatIngredientsCon IngredientsCon modelli BasicMod RecipesMod IngredientsMod BasicMod SponsorsMod CatIngredientsMod viste form.html list.html form.html list.html report.html catList.html Descrizione delle classi 67 ricette RecipesCon categorie delle ricette vini CatRecipesCon sponsors SponsorsCon WinesMod SponsorsMod SponsorsMod inviti InvitationsCon InvitationMod WinesCon RecipesMod CatRecipesMod IngredientesMod BasicMod SponsorsMod CatRecipesMod advList.html form.html list.html catList.html relations.html form.html list.html catList.html list.html list.html invitations.html promotions.html form.html Di seguito vengono elencate in dettaglio tutte le funzioni di ogni classe dell’applicazione della parte amministrativa. CONTROLLER classe: IngredientsCon Controllore che gestisce le azioni relative agli ingredienti. funzione index form parametri datas report getList filters getReport filters getData changeStatus datas id, status, type descrizione disegna la pagina principale disegna il form per inserimento/modifica dell’ingrediente disegna la lista per il report degli ingredienti preleva la lista degli ingredienti secondo i filtri e popola la lista dinamica del template preleva la lista degli ingredienti proposti dall’utente in base ai filtri e popola la lista dinamica del template acquisisce i dati dopo l’invio del form aggiorna lo stato dell’ingrediente (controllato/non controllato) 68 action Sviluppo act upd: aggiorna un ingrediente nel db add: aggiunge un ingrediente nel db del: elimina un ingrediente nel db mdel: elimina più ingredienti nel db ignore: ignora un ingrediente inserito dall’utente mignore: ignora più ingredienti inseriti dall’utente link: associazione record-gruppo classe: CatIngredientsCon Controllore che gestisce le azioni relative alle categorie degli ingredienti. funzione index getList parametri action act filters descrizione disegna la pagina principale preleva la lista delle categorie degli ingredienti secondo i filtri e popola la lista dinamica del template upd: aggiona una categoria degli ingredienti add: aggiunge una categoria degli ingredienti del: elimina una categoria degli ingredienti Descrizione delle classi 69 classe: WinesCon Controllore che gestisce le azioni relative ai vini. funzione index form parametri getList filters getData action datas act datas descrizione disegna la pagina principale disegna il form per inserimento/modifica del vino preleva la lista dei vini secondo i filtri e popola la lista dinamica del template acquisisce i dati dopo l’invio del form upd: aggiona un vino add: aggiunge un vino del: elimina un vino mdel: elimina più vini link: associazione record - gruppo classe: RecipesCon Controllore che gestisce le azioni relative alle ricette. funzione index parametri params form datas advanced getList filters getListAdv filters getData datas getAutocomplete table, substring checkIng name, id checkWine refreshCat name, id categories refreshPrice id, qta, um descrizione disegna la pagina iniziale, se vengono passati dei parametri filtra la lista disegna il form per inserimento / modifica della ricetta disegna la pagina della ricerca avanzata preleva la lista delle ricette secondo i filtri e popola la lista dinamica del template preleva la lista delle ricette secondo i filtri e popola la lista dinamica del template (per la ricerca avanzata) acquisisce i dati dopo l’invio del form gestisce il popolamento della lista per l’autocompletamento controlla l’integrità record (nome - id) se vero richiede le unità di misura del determinato ingrediente controlla l’integrità record (nome - id) ricarica le sottocategorie delle ricette a seconda della categoria padre selezionata ricalcola il prezzo, il netto e le calorie dell’ingrediente singolo a seconda delle scelte effettuate (ingrediente, quantità e unità di misura) 70 action Sviluppo act upd: aggiona una ricetta add: aggiunge una ricetta del: elimina una ricetta mdel: elimina più ricette link: associazione record - gruppo classe: CatRecipesCon Controllore che gestisce le azioni relative alle categorie delle ricette. funzione index getList parametri action act filters addRel deleteRel descrizione disegna la pagina principale preleva la lista della categoria delle ricette secondo i filtri e popola la lista dinamica del template upd: aggiona una categoria delle ricette add: aggiunge una categoria delle ricette del: elimina una categoria delle ricette aggiunge una relazione tipologia - portata - specifica elimina una relazione tipologia - portata specifica classe: BasicCon Controllore che gestisce le azioni relative alle basi di preparazione. funzione parametri index form datas getAutocomplete table, substring checkName getList name, id, table filters action act descrizione disegna la pagina iniziale disegna il form di inserimento della base gestisce il popolamento della lista per l’autocompletamento controlla l’integrità del record (nome - id) preleva la lista delle basi secondo i filtri e popola la lista dinamica del template del: elimina una base mdel: elimina una o più basi classe: SponsorsCon Controllore che gestisce le azioni relative agli sponsor. funzione index mgmt parametri descrizione disegna la pagina iniziale disegna la pagina per la lista degli sponsors Descrizione delle classi getProduct filters getList filters getId id action act 71 preleva la lista dei prodotti con relativi sponsors secondo i filtri e popola la lista dinamica del template preleva la lista degli sponsors secondo i filtri e popola la lista dinamica del template preleva gli id dei prodotti e restituisce la lista degli sponsor relativi cat upd: modifica uno sponsors dal db cat add: aggiunge uno sponsors dal db cat del: elimina uno sponsors dal db del: elimina una associazione prodotto / gruppo mdel: elimina una o più associazioni prodotto / gruppo link: associa dei prodotti ad un gruppo delink: deassocia un prodotto ad un gruppo classe: InvitationsCon Controllore che gestisce le azioni relative agli inviti ed alle promozioni. funzione index parametri invitations promotions invForm proForm getPromoList filters getUserList filters checkMail actionProm mail act descrizione disegna la pagina della lista degli utenti invitati disegna la pagina per la spedizione degli inviti disegna la pagina per la gestione delle promozioni disegna la pagina per la gestione delle email per gli inviti disegna la pagina per la gestione delle email per le promozioni preleva la lista delle promozioni secondo i filtri e popola la lista dinamica del template preleva la lista degli utenti invitati secondo i filtri e popola la lista dinamica del template controlla se la mail è presente nel database start: attiva una promozione stop: ferma una promozione delete: elimina una promozione add: aggiunge una promozione updtext: aggiorna i testi delle mail relativi alla promozione 72 actionInv Sviluppo act getRandomString length send mail updtext: aggiorna i testi delle mail relativi alla promozione accept: accetta un utente che arriva da una promozione invite: spedisce un invito all’utente richiedente delete: elimina un utente invitato genera un codice casuale di lunghezza length spedisce una mail di invito Descrizione delle classi 73 MODEL classe: IngredientsMod Modello che gestisce il trattamento dei dati relativi agli ingredienti. funzione getTypologies getUM getUmById parametri id getCategories getDataById getReference queryList id id cont, params queryReport cont, params update add delete ignore changeStatus id, data data id id id, type descrizione preleva tutte le tipologie degli ingredienti preleva tutte le unità di misura preleva le unità di misura associate ad un ingrediente preleva tutte le categorie per gli ingredienti preleva un ingrediente dal suo id controlla se l’ingrediente ha delle referenze preleva la lista degli ingredienti secondo i filtri imposti (viene richiamata sia per ritornare il numero di record (cont = true) sia per ritornare tutti i record richiesti (cont = false)) preleva la lista degli ingredienti inseriti e non approvati dagli utenti secondo i filtri imposti (viene richiamata sia per ritornare il numero di record (cont = true) sia per ritornare tutti i record richiesti (cont = false)) aggiorna l’ingrediente nel db aggiunga l’ingrediente nel db elimina l’ingrediente nel db ignora un elemento nella lista dei report cambia lo stato (approvato o meno) di un prodotto (ingrediente, vino, ricetta) classe: CatIngredientsMod Modello che gestisce il trattamento dei dati relativi alle categorie degli ingredienti. funzione parametri records descrizione contiene i nomi dei campi delle tabelle interessate [0] => tabella [1] => tabella i18n [2] => chiave primaria [3] => chiave esterna relativa [4] => valore 74 Sviluppo queryList cont, params update id, data add data delete getReference id id preleva la lista delle categorie degli ingredienti secondo i filtri imposti (viene richiamata sia per ritornare il numero di record (cont = true) sia per ritornare tutti i record richiesti (cont = false)) aggiorna la categoria degli ingredienti nel db aggiunge la categoria degli ingredienti nel db elimina la categoria degli ingredienti nel db controlla se la categoria degli ingredienti ha delle referenze classe: WinesMod Modello che gestisce il trattamento dei dati relativi ai vini. funzione getdataById getReference queryList parametri id id cont, params update add delete id ,data data id descrizione preleva un vino dal suo id controlla se il vino ha delle referenze preleva la lista dei vini secondo i filtri imposti (viene richiamata sia per ritornare il numero di record (cont = true) sia per ritornare tutti i record richiesti (cont = false)) aggiorna il vino nel db aggiunge un vino nel db elimina il vino nel db classe: RecipesMod Modello che gestisce il trattamento dei dati relativi alle ricette. funzione getCategories getFeatures parametri getdataById getAcValues id table, search queryList cont, params descrizione preleva tutte le categorie delle ricette preleva tutte le caratteristiche della ricetta (a scelta multipla) preleva una ricetta dal suo id preleva i valori per popolare l’autocompletamento preleva la lista delle ricette secondo i filtri imposti (cont = true => conto i record, altrimenti restituisco la lista) Descrizione delle classi queryListAdv cont, params checkName name, id refreshPrice id, um, qta update add delete id, data data id 75 preleva la lista delle ricette secondo i filtri imposti (per la ricerca avanzata) (cont = true => conto i record, altrimenti restituisco la lista) controlla l’integrità nome - id (per l’ingrediente) calcola prezzo calorie e netto tramite ingrediente, quantità e unità di misura aggiorna la ricetta nel db aggiunge la ricetta nel db elimina la ricetta nel db classe: CatRecipesMod Modello che gestisce il trattamento dei dati relativi alle categorie delle ricette. funzione parametri records queryList cont, params update add delete getReference id, data data id id getTypologies getCourse typ getCourseSpec typ, cou getNumRecipes typ, cou, csp getOther typ, cou descrizione contiene i nomi dei campi delle tabelle interessate [0] => tabella [1] => tabella i18n [2] => chiave primaria [3] => chiave esterna relativa [4] => valore preleva la lista delle categoria delle ricette secondo i filtri imposti (viene richiamata sia per ritornare il numero di record (cont = true) sia per ritornare tutti i record richiesti (cont = false)) aggiorna la categoria delle ricette nel db aggiunge la categoria delle ricette nel db elimina la categoria delle ricette nel db controlla se la categoria delle ricette ha delle referenze preleva tutte le tipologie delle ricette presenti nel db preleva tutte le portate relative alla tipologia scelta preleva tutte le specifiche relative alla coppia tipologia - portata scelta ritorna il numero delle ricette presenti per la tripla tipologia - portata - specifica scelta preleva tutte le specifiche NON relative alla coppia tipologia - portata scelta 76 Sviluppo addCourse addCourseSpec typ, cou typ, cou, csp delCourse delCourseSpec typ, cou typ, cou, csp aggiunge una relazione tipologia - portata aggiunge una relazione tipologia - portata - specifica elimina una relazione tipologia - portata elimina una relazione tipologia - portata specifica classe: BasicMod Modello che gestisce il trattamento dei dati relativi alle basi di preparazione. funzione getTypologies parametri queryList cont, params getAcValues table, search add recipe, ingredient delete id createLinkedText text descrizione preleva tutte le tipologie sia delle ricette che degli ingredienti preleva la lista delle basi secondo i filtri imposti (cont = true => conto i record, altrimenti restituisco la lista) preleva i valori per popolare l’autocompletamento aggiunge una base nel database elimina una base nel database sostituisce le parole di un testo con un collegamento alla relativa corrispondenza ad una base di preparazione classe: SponsorsMod Modello che gestisce il trattamento dei dati relativi agli sponsor. funzione getSponsors getIdByProduct parametri productList cont, params queryList cont, params delete id ids descrizione preleva tutti gli sponsors preleva tutti gli id degli sponsors che hanno una o più associazioni con i prodotti richiesti preleva la lista dei prodotti associati a degli sponsors secondo i filtri imposti (cont = true => conto i record, altrimenti restituisco la lista) preleva la lista degli sponsors secondo i filtri imposti (cont = true => conto i record, altrimenti restituisco la lista) elimina una associazione prodotto/gruppo nel db Descrizione delle classi linkTo sponsor, id, type deLink sponsor, id, type cat update cat add cat delete id, data data id 77 crea un’associazione prodotto/gruppo nel db cancella un’associazione prodotto/gruppo nel db aggiorna uno sponsor nel db aggiunge uno sponsor nel db elimina uno sponsor nel db classe: InvitationsMod Modello che gestisce il trattamento dei dati relativi agli inviti. funzione getTypologies parametri setStatusProm deleteProm getText updText addPromo queryPromoList id, value id value value, data data cont, params queryUserList cont, params checkMail addInvite updInvite mail mail, code id, data activeUser deleteInv sendmail getInvitebyId id id type, data id descrizione preleva tutte le tipologie sia delle ricette che degli ingredienti imposta lo stato di una promozione elimina una promozione preleva il testo delle mail aggiorna il testo delle mail aggiunge una promozione preleva la lista delle promozioni secondo i filtri imposti ( cont = true => conto i record, altrimenti restituisco la lista ) preleva la lista degli utenti invitati secondo i filtri imposti ( cont = true => conto i record, altrimenti restituisco la lista ) restituisce vero se la mail è presente nel db aggiunge un utente nella lista degli invitati aggiorna lo stato di un utente tra la lista degli invitati attiva un utente in promozione elimina un utente dalla lista degli invitati invia una mail estrae i dati di un utente invitato tramite il suo id 78 Sviluppo VIEW sezione: basic Contiene le pagine HTML relative alle basi di preparazione nome pagina form.html list.html descrizione pagina per l’inserimento di una nuova base di preparazione visualizza la lista di tutte le basi di preparazione sezione: ingredients Contiene le pagine HTML relative agli ingredienti nome pagina catList.html form.html list.html report.html descrizione visualizza le liste e gestisce le categorie degli ingredienti pagina per l’inserimento e la modifica di un ingrediente visualizza la lista degli ingredienti visualizza la lista degli ingredienti suggeriti dall’utente sezione: invitations Contiene le pagine HTML relative agli inviti e promozioni nome pagina invForm.html invitations.html list.html proForm.html promotions.html descrizione pagina per la modifica dei testi delle mail relativi agli inviti pagina per la spedizioni degli inviti visualizza la lista degli utenti invitati pagina per la modifica dei testi delle mail relativi alle promozioni pagina per la gestione delle promozioni sezione: recipes Contiene le pagine HTML relative alle ricette nome pagina advList.html catList.html form.html list.html relationsList.html sezione: sponsors descrizione ricerca avanzata per le ricette visualizza le liste e gestisce le categorie delle ricette pagina per l’inserimento e la modifica di una ricetta visualizza la lista delle ricette gestisce le relazioni padre/figlio per tipologie, portate e specifiche di portata Descrizione delle classi Contiene le pagine HTML relative agli sponsors nome pagina catList.html list.html descrizione pagina per la gestione degli sponsor visualizza la lista dei prodotti associati agli sponsors sezione: wines Contiene le pagine HTML relative ai vini nome pagina form.html list.html descrizione pagina per l’inserimento e la modifica di un vino visualizza la lista dei vini 79 80 4.3.2 Sviluppo Parte Pubblica Nella tabella successiva verrano brevemente elencati i moduli della parte pubblica specificando le relazioni che intercorrono tra le classi controllore, i modelli e le viste. modulo ingredienti controllore IngredientsCon modelli IngredientsMod ricette RecipesCon RecipesMod CheckListMod homepage IndexCon login LoginCon registrazione profilo personale RegisterCon MyMagikCon RegisterMod RecipesMod LoginMod SponsorsMod RegisterMod MyMagikMod RecipesMod IngredientsMod lista della spesa ChecklistCon ChecklistMod viste form.html index.html advanced.html details.html index.html index.html index.html details.html index.html form.html recipes.html index.html Di seguito vengono elencate in dettaglio tutte le funzioni di ogni classe dell’applicazione della parte pubblica. CONTROLLER classe: CheckListCon Controllore che gestisce le azioni relative alla lista della spesa. funzione index parametri servings action todo descrizione pagina principale della lista della spesa servings: aggiorna la lista se il parametro non è nullo add: aggiunge una ricetta alla lista rem: rimuove una ricetta dalla lista classe: IngredientCon Controllore che gestisce le azioni relative agli ingredienti. funzione parametri descrizione Descrizione delle classi index params, owner details id detailsWine id setQuickIng name getData datas add update delete datas datas id 81 disegna la pagina della lista degli ingredienti, i parametri rappresentano un filtro per nome e il paging dei risultati. owner: se presente visualizza solo gli ingredienti relativi all’utente loggato preleva gli attributi specifici dell’ingrediente richiesto preleva gli attributi specifici del vino richiesto inserisce un nuovo ingrediente per l’utente dalla lista di una ricetta acquisisce i dati dopo l’invio del form di inserimento/modifica dell’ingrediente aggiunge un nuovo ingrediente modifica un ingrediente elimina un ingrediente classe: LoginCon Controllore che gestisce le azioni relative al login. funzione index logout parametri user, password descrizione controlla la correttezza del login effettua il logout eliminando la sessione relativa classe: MyMagikCon Controllore che gestisce le azioni relative alla azioni relative al profilo utente. funzione index parametri recipes details userid ingredientForm recipeForm upFile file descrizione disegna la pagina del profilo dell’utente loggato disegna la pagina della gestione delle ricette personali e favorite e degli ingredienti personali disegna la pagina del profilo dell’utente richiesto form per l’inserimento/modifica degli ingredienti personali form per l’inserimento/modifica delle ricette personali caricamento di un’immagine per una ricetta 82 Sviluppo upAvatar deleteImg file id sortImg ids caricamento della foto profilo dell’utente eliminazione di un immagine relativa ad una ricetta ordinamento di immagini di una ricetta classe: RecipesCon Controllore che gestisce le azioni relative alle ricette. funzione index parametri params details id, comment, error advanced params refreshCat idT, idC getAutocomplete tab, term vote user, recipe, vote checkProduct table, nome favourite recipe, user refreshPrice ing, um, qta getData add update delete datas datas datas recipe descrizione disegna la pagina delle ricette, i parametri rappresentano un filtro per nome e il paging dei risultati disegna la pagina relativa alla ricetta richiesta comment: gestisce i commenti, inserimento e cancellazione error: segnala eventuali errori nel caricamento dell’immagine pagina per la ricerca avanzata delle ricette params: parametri della ricerca avanzata e relativo paging ricarica le liste delle categorie a seconda delle categorie selezionate estrae i termini per l’autocomplete gestione della votazione della ricetta controlla l’integrità nome - record gestione dell’attributo favorito per la ricetta ricalcola prezzo, netto e calorie di un determinato ingrediente a seconda dei parametri passati acquisisco i dati dal form per la ricetta aggiungo una ricetta aggiorno una ricetta elimino una ricetta classe: RegisterCon Controllore che gestisce le azioni relative alla registrazione. funzione parametri descrizione Descrizione delle classi index params checkMail save update mail datas datas 83 disegna la pagina della registrazione params: dati relativi ai codici di invito, promozione o richiesta invito controlla se la mail è già presente nel db salva i dati del nuovo utente aggiorna i dati dell’utente 84 Sviluppo MODEL classe: CheckListMod Modello che gestisce il trattamento dei dati relativi alla lista della spesa. funzione addToList getIfList parametri recipe, user recipe, user delFromList recipe, user getAllList user getIngredients id, servings createList ingredients descrizione aggiunge una ricetta alla lista della spesa determina se una ricetta appartiene o meno alla lista della spesa dell’utente in sessione elimina una ricetta dalla lista della spesa di un utente preleva tutte le ricetta della lista della spesa di un utente preleva la lista degli ingredienti di una determinata ricetta servings: se presente calcola quantità prezzo per le nuove portate richieste normalizza una lista di ingredienti con duplicati sommando prezzo e quantità classe: IngredientsMod Modello che gestisce il trattamento dei dati relativi agli ingredienti. funzione getList parametri page, search, owner setQuickIng name, user myIngredients getFeatures add user checkOwner ingredient, user getDataById ingredient update delete getWineById id, data id id data, user classe: LoginMod descrizione ottiene una lista di ingredienti limitati da una ricerca per nome owner: se presente prelevo solamente gli ingredienti dell’utente richiesto inserisce un nuovo ingrediente dalla lista di una ricetta preleva gli ingredienti di un utente dal db preleva le categorie degli ingredienti aggiunge un nuovo ingrediente del relativo utente controllo se l’ingrediente appartiene all’utente preleva l’ingrediente richiesto ed i suoi attributi aggiorna un ingrediente nel db elimina un ingrediente preleva il vino richiesto ed i suoi attributi Descrizione delle classi 85 Modello che gestisce il trattamento dei dati relativi al login. funzione checkData parametri username, password descrizione controlla la correttezza dei dati inseriti per il login classe: MyMagikMod Modello che gestisce il trattamento dei dati relativi al profilo utente. funzione myRecipes getFavourites parametri user user setDataImg data, id, type upload deleteImg sortImg file, name, id id position, item descrizione preleva le ricette relative ad un utente preleva le ricette favorite di un determinato utente imposta i dati relativi all’upload di una nuova immagine esegue l’upload dell’immagine elimina l’immagine aggiorna la priorità delle immagini relative ad una ricetta classe: RecipesMod Modello che gestisce il trattamento dei dati relativi alle ricette. funzione getList parametri page, search getTopRecipes getDataById getAcValues id table, search vote addComment delComment getFeatures num, id , user comment, recipe, user id getCourse idT getCourseSpec idT, idC queryListAdv page, params descrizione ottiene una lista di ricette limitata per nome e paging ottiene le sei ricette con il voto maggiore preleva la ricetta richiesta e i suoi attributi ottiene la lista di prodotto per l’autocompletamento salva nel db la votazione aggiunge un commento relativo ad una ricetta elimino il commento ottiene le caratteristiche generali delle ricette ottiene portate a seconda della tipologia di ricetta scelta ottiene le specifiche delle portate a seconda delle portate e del tipo di ricetta preleva una lista limitata di ricette tramite una ricerca avanzata 86 Sviluppo checkProduct addFavourite name, table id, user getFavourite id, user delFavourite id, user createLinkedText text getUmById id refreshPrice ing, um, qta add checkOwner data, user id, user update delete id, data id controlla l’integrità prodotto - id aggiunge una ricetta ai preferiti di un determinato utente determina se una ricetta appartiene o meno alla lista delle preferite di un utente elimina una ricetta tra le preferite di un utente sostituisce le parole di un testo con un collegamento alla relativa corrispondenza ad una base di preparazione ottiene le unità di misura di un ingrediente specifico calcola prezzo, calorie e netto di un ingrediente dati i parametri aggiunge una ricetta nel database controlla se l’utente è il proprietario della ricetta aggiorna una ricetta nel db elimina una ricetta dal db classe: RegisterMod Modello che gestisce il trattamento dei dati relativi alle registrazioni. funzione checkInv parametri mail, code checkPromo code checkMail mail activateInv setPromo getText sendMail data data value data, type checkHash mail, hash addRequest updateUser data, email data descrizione controlla se mail e codice corrispondono ad un invito controlla se il codice corrisponde ad una promozione controlla se la mail è già presente nel database attiva un utente invitato aggiunge i dati di un utente promozione preleva il testo delle mail invia le mail relativi alle conferme di inviti e promozioni effettua il controllo della correttezza della mail aggiunge una richiesta di invito nel db aggiorna i dati di un utente Descrizione delle classi 87 VIEW sezione: checklist Contiene le pagine HTML relative alla lista della spesa nome pagina index.html descrizione visualizza e gestisce la lista della spesa dell’utente sezione: ingredients Contiene le pagine HTML relative agli ingredienti nome pagina index.html descrizione visualizza la lista degli ingredienti sezione: ingredients Contiene le pagine HTML relative agli ingredienti nome pagina index.html descrizione visualizza la lista degli ingredienti sezione: mymagik Contiene le pagine HTML relative al profilo utente nome pagina descrizione details.html visualizza la scheda utente index.html gestisce il profilo dell’utente ingredientForm.html permette l’inserimento e la modifica degli ingredienti personali recipeForm.html permette l’inserimento e la modifica delle ricette personali recipe.html visualizza la lista di ricette preferite e ingredienti e ricette personali sezione: recipes Contiene le pagine HTML relative alle ricette nome pagina advanced.html details.html index.html descrizione pagina per le ricerche avanzate delle ricette visualzza la ricetta in dettaglio visualizza la lista delle ricette 88 Sviluppo Capitolo 5 Test Durante lo sviluppo dell’applicazione è stata effettuata una continua attività di verifica e validazione ai fini di poter garantire un prodotto sicuro e conforme agli standard di qualità dell’azienda. La maggiorparte della verifica statica sul codice è stata fatta dall’ambiente di sviluppo Komodo (editor di testo specializzato in linguaggi di programmazione relazionati con tecnologie alla base del web). Esso fornisce già in fase di scrittura una sicurezza notevole per evitare errori di battitura, parenterizzazione, incompatibilità di tipi o inizializzazioni errate di variabili segnalando instantaneamente l’errore e fornendone una possibile soluzione. La correttezza del flusso dell’informazione è stata verificata tramite numerosi test effettuati in parallelo alla fase di sviluppo cercando di simulare ogni possibile azione e forzando all’errore il sistema. Questi test sono stati effettuati prima su singole porzioni di codice e successivamente sulle classi intere e ripetuti ad ogni modifica dovuta alla correzione degli errori riscontrati. Al termine dello sviluppo dell’applicazione MagikChef sono stati effettuati dei test automatici per controllare la possibile presenza dei cosidetti “link morti”, ossia dei collegamenti all’interno del portale la quale destinazione sia errata o non definita, tramite l’utilizzo dell’applicativo open source Xenu’s Link. Grossa attenzione è stata inoltre rivolta al corretto funzionamento dei numerosi form presenti nel portale. Per ognuno di essi è stato necessario verificare tutte le possibili risposte dovute all’inserimento di caratteri speciali, all’introduzione di dati incompatibili o al mancato inserimento di dati obbligatori, controllando attentamente che il sistema rispondesse, se necessario, con il corretto messaggio d’errore. Data la funzionalità dell’upload di immagini sono stati eseguiti test specifici con particolare attenzione alla gestione dei file di grandi dimensioni, per i 90 Test quali è stata fissata una dimensione massima, e per l’upload di file potenzialmente pericolosi o corrotti. I test per le funzionalità relative al database si sono concentrati nella risoluzione del requisito che prevedeva la gestione di un elevato carico di informazioni. Inizialmente è stato testato l’intero sistema con un database privo di informazioni, successivamente, dopo aver controllato il corretto funzionamento di tutte le query, il database è stato gradualmente riempito, monitorando, a seconda del numero dei record inseriti, la velocità delle varie query tramite lo strumento query Analizer di MySQL. Quindi, laddove si è reso necessario, è stata migliorata la struttura delle query per renderle più veloci. In conclusione è stato richiesto ad alcuni dipendenti dell’azienda Aleaweb di visitare il portale e segnalare eventuali bug o suggerimenti, spedendo a ciascuno di essi un personale invito elettronico (come da funzionalità MagikChef). I tester comprendevano sia persone esperte nell’ambito informatico che non ed è stato importate notare come, seppur senza la presenza di un manuale utente e di suggerimenti vari, la maggiorparte delle persone sono riuscite ad esplorare la gran parte delle sezioni del sito ed apprenderne le funzionalità. Capitolo 6 Conclusioni L’applicativo web MagikChef è stato progettato e sviluppato interamente nelle 320 ore previste dall’attività di stage, grazie ad una buona attività di analisi che ha permesso di selezionare i requisiti principali realizzabili nel tempo prefissato. Nonostante la maggiorparte delle scelte tecnologiche fosse un requisito imposto dall’azienda esse si sono rivelate un ottimo supporto per lo sviluppo dell’applicazione. Sarebbe stato molto interessante però analizzare linguaggi di programmazione alternativi a PHP, in particolare confrontarne le differenze con Ruby che attraverso il framework Ruby on Rails, fortemente ispirato al paradigma MVC, sarebbe risultato un’ottima (o forse migliore) alternativa. Non risulta invece un vincolo dell’applicazione la scelta del gestore di database MYSQL, perchè grazie all’utilizzo della classe PDO di PHP è possibile utilizzare RDBMS differenti quali PostgreSQL o SQLite adottando poche modifiche al codice e, se necessario, alle query. Grave è il fatto che nell’attività di stage non è stato mai preso in considerazione il problema di sviluppare un sito web accessibile secondo le norme vigenti; ma questo requisito verrà sicuramente analizzato in un probabile sviluppo futuro e il suo sviluppo sarà facilitato grazie al pattern MVC adottato nella progettazione dell’applicativo. Esso infatti, permette un’ottima separazione tra il codice PHP e quello HTML rendendo molto più semplice e veloce l’implementazione ed il test di codice standard. Durante le attività di progettazione e sviluppo sono emersi ulteriori requisiti che sono stati soddisfatti, come la possibilità di associare un prodotto ad uno sponsor o l’inserimento rapido degli ingredienti durante la compilazione di una ricetta. Altri sono stati lasciati da parte per uno sviluppo futuro. 92 Conclusioni 6.1 Sviluppi Futuri Tra i requisiti emersi, i più interessanti e meritoveli di uno sviluppo futuro sono: • Gestione di menù Descrizione: dovrà essere introdotta la possibilità di creare, modificare ed eliminare un proprio menu, ossia un insieme di ricette e bevande che compongano un pasto completo. • Registrazione Pubblica Descrizione: permettere ad ogni visitatore di effettuare una registrazione e consultare liberamente il sito eliminando cosı̀ la limitazione d’accesso ai soli invitati da parte dell’amministratore. Questo requisito farà emerge numerose problematiche quali la creazione di un sistema di moderazione dei dati e la gestione di una cospicua quantità di informazioni. • Ampliamento della componente sociale del portale Descrizione: creazione di una messaggistica interna per gli utenti, possibilità della gestione di un blog personale, creazione di una rete di amicizie, ecc. • Interazione con i principali social network Descrizione: creazione di funzionalità lato utente che permettano di condividere ricette proprie o altrui verso i pricipali social network come facebook, twitter, delicious, ecc. • Sezione video Descrizione: inserimento di una sezione video, all’interno della quale ogni utente possa pubblicare il video della propria ricetta o video affini. • Sezione mobile Descrizione: creazione di un applicativo sviluppato per la visualizzazione e la gestione del proprio profilo del portale attraverso apparecchi mobili. • Validazione e accessibilità Descrizione: il portale dovrà essere validato rispetto ai validatori del W3C e dovrà rispettare le principali regole dell’accessibilità nell’ottica di rendere il sito il più fruibile possibile da parte di tutti gli utenti.