Il logo del sito

Progetto Pizza a Domicilio

Pizza a domicilio

Sito di una pizzeria che consegna domicilio.

Attività:

  1. Specifiche
  2. Organizzazione del lavoro
  3. Contenuto html
  4. Database
  5. Form per l'interazione con il database

Potrei lavorare su un blocco notes. Ma poi so per esperienza che il lavoro alla lunga andrebbe perduto. Per evitarlo lavorerò direttamente su documenti html. Ci metterò più tempo ma non butterò nulla. Della forma non mi preoccupo perchè questo lavoro serve solo a me. Ogni tanto aggiornerò il sito, ma solo perchè al momento certe cose posso provarele solo on-line. Non avendo ne mySQLAdimin ne PHP installiti sul mio pc. Le addività sopra elencate le porterò avanti in parallelo cercando di dedicare un po di tempo ad ognuna.

Siccome le cose che non so sono tante. della forma non mi preoccupo. E' sicuro che ogni argomento, dopo un primo abbozzo, sarà rivisitato più volte.

§ 1. Specifiche

Parto da questa idea:

Oltre alla presentazione dell'attività (HTML), dovrò sviluppare un database (MySQL) in cui archiviare informazioni relative ai clienti, ai clienti registrati, ai prodotti disponibili, agli ordini e alle fatture. La creazione e manutenzione del database potrà essere fatta con con myPhpAdmin, ma dovrò mettere a disposizione della pizzeria pagine per l'aggiunta e la modifica dei prodotti, pagine per la gestione degli ordini per quei clienti che desiderano ordinare per telefono. Dovrò consentire agli utenti del sito di registrarsi in modo tale da semplificare futuri ordini, ma dovrò anche consentire ad un utente di ordinare senza registrarsi. Dovrò creare un listino per le pizze. E siccome la pizzeria ha anche una sala dove servire i clienti potrei anche sviluppare un modulo per la raccolta degli ordini ai tavoli.

Il menù presentato ai clienti del ristorante sarà diverso da quello presentato agli utenti remoti. In ogni caso potrà contenere oltre alle pizze, alimenti diversi e bevande.

Dovrò consentire ai clienti di pagare sia in contanti che con carta di credito.

Potrei sviluppare una funzione per stampare / aggiornare le pagine del menù cartaceo in seguito alla modifica dei prodotti diponibili, dei prezzi, della stagionalità dei prodotti.

§ 2. Organizzazione del lavoro

L'ambiente di lavoro è organizzato così:


            [MioSito]
                  file html, css, js, relativi alle prime due sezioni del mio sito
               [download]
               [files]
               [images]
               [TestPage]
                  file html, css, js, php relative alla parte del sito 
                  sugli strumenti per lo sviluppo di applicazioni web,
                  compresa questa pagina, comprese le eventuali pagine
                  per provare funzioni da inserire nel nuovo progetto.
               [txt]
               [ProPiz]
                     file html, css, js, php, del sito della pizzeria
                  [db]
                     tutto quello che serve per creare le tabelle di database per il sito                                   
                  [images]
            

Per ora non aggiungo altro il contenuto di [ProPiz] potrà essere servire per un sito autonomo

[db] definisce tabelle e query per il progetto pizzeria all'interno dell'unico db mySQL di cui dispongo. In futuro potrò utilizzare questo contenuto per popolare un database dedicato.

§ 3. Contenuto html

Ci sono un sacco di funzionalità di html che non conosco. Cercherò di imparare quelle che servono per il nuovo sito, prendendo spunto da siti esistenti.

Quattro siti sui sette che avevo presi ad esempio nell'agosto del 2017 oggi non esistono più. Rifacimento dei siti? Cambio di gestione?

Gennaro Esposito

Mr Johnny

Il pizzacchiere

I siti napoletani sono i più scenografici. Sono pura pubblicità. Invogliano ad andare in pizzeria. Mettono soggezione. Usano immagini e grafica ricercatissima. Quasi tutte le tecniche di presentazione utilizzate mi sono sconosciute.

§ 4. Database

Forse è la parte sul cui contenuto ho le idee più chiare, comunque devo imparare diverse cose. Con Access non avrei problemi. Ma MySQL è diverso e di myphpadmin so veramente poco. Certamente ha una interfaccia molto più povera di Access e anche di NetBeans, ma quello che offre vorrei impare a sfruttarlo completamente o almeno quasi completamente.

§ 4.1 Tabelle

Posso iniziare ad impostare queste tabelle partendo dalla tabella Ordini. Parto da questa perchè la ragione dell'applicazione è quella di consentire ai clienti di ordinare pizze che dovranno essere consegnate a domicilio.

Ignoro per il momento il problema della distanza che sicuramente è un vincolo per il servizio. La pizzeria non potrà accettare ordini da consegnare a più di quindici-venti minuti di distanza in auto o motorino dalla pizzeria. Quindi potrei pensare alla sofisticazione di localizzare l'indirizzo di consegna e calcolarne la distanza dalla pizzeria.

In prima battuta il vincolo potrebbe essere abbastanza semplice come: consegna nel centro storico, o consegna all'interno della circonvallazione, ....

Le informazioni relative agli ordini sono memorizzate in due tabelle, OrdiniTestate che identifica l'ordine, il cliente, l'indirizzo di consegna; OrdiniRighe che conterrà l'elenco dei cibi e delle bevande ordinate.

Le informazioni per la compilazione della testata dell'ordine saranno recuperate nella tabella Clienti

Le informazioni per la compilazione delle singole righe d'ordine saranno recuperate nella tabella Menu

Penso subito a qualche sofisticazione che potrebbe rispondere a queste domande: quanti ordini posso accettare in ogni momento, con che precisione posso garantire l'orario di consegna, ....

Sono sofisticazioni che al momento metto da parte. Se arriverò ad occuparmi di questo significa che avrò risolto in precedenza tanti problemi.

Il database lo creerò con una procedura e non con l'interfaccia phpMyAdmin perchè prevedo che dovrò modificarlo, ampliarlo, ricostruirlo un sacco di volte. Ma anche perchè questo database fa parte di un applicazione che potrebbe essere replicata in tanti esemplari.

$ 4.1.1 Tabella Clienti

      $createClienti = "CREATE TABLE Clienti(
         idCliente INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
         nome VARCHAR(50) NOT NULL,
         password VARCHAR(8) NOT NULL,
         email VARCHAR(30) NOT NULL UNIQUE,
         tel VARCHAR(12) NOT NULL,
         indVia VARCHAR(30),
         indViaNro VARCHAR(8),
         indCAP VARCHAR(8),
         indCitta VARCHAR(20),
         indProvincia VARCHAR(2),
         reg_date TIMESTAMP,
         currentLogged BOOLEAN DEFAULT FALSE,
         lastOrder DATETIME
      )";
$ 4.1.2 Tabella Fattorini

      $createFattorini = "CREATE TABLE Fattorini(
         idFattorino INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
         nomeFattorino VARCHAR(20) NOT NULL,
         presente BOOLEAN DEFAULT TRUE,
         libero BOOLEAN DEFAULT TRUE
      )";
$ 4.1.3 Tabella Menu

      $createMenu = "CREATE TABLE Menu(
         idItemMenu INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
         itemMenu VARCHAR(20) NOT NULL,
         itemMenuDesc VARCHAR(255),
         prezzo FLOAT NOT NULL,
         disponibile BOOLEAN DEFAULT TRUE
      )";
$ 4.1.4 Tabella OrdiniTestate

      $createOrdiniTestate = "CREATE TABLE OrdiniTestate(
         idOrdineTestata INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
         dataOrdine TIMESTAMP,
         idCliente INT(6) UNSIGNED, 
         orarioConsegna DATETIME,
         tel VARCHAR(12) NOT NULL,
         indVia VARCHAR(50),
         indViaNro VARCHAR(8),
         indCAP VARCHAR(8),
         indCitta VARCHAR(20),
         indProvincia VARCHAR(2),
         inCompilazione BOOLEAN DEFAULT TRUE,
         confermato BOOLEAN DEFAULT FALSE,
         inPreparazione BOOLEAN DEFAULT FALSE,
         preparato BOOLEAN DEFAULT FALSE,
         inConsegna BOOLEAN DEFAULT FALSE,
         consegnato BOOLEAN DEFAULT FALSE,
         idFattorino INT(6) UNSIGNED,
         imponibile FLOAT,
         aliquotaIVA FLOAT,
         iva FLOAT,
         totaleFattura FLOAT,
         FOREIGN KEY (idCliente) REFERENCES Clienti(idCliente),
         FOREIGN KEY (idFattorino) REFERENCES Fattorini(idFattorino)
      )";
$ 4.1.5 Tabella OrdiniRighe

      $createOrdiniRighe = "CREATE TABLE OrdiniRighe(
         idOrdineRiga INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
         idOrdineTestata INT(6)UNSIGNED, 
         idItemMenu INT(6)UNSIGNED,
         imponibile FLOAT,
         aliquotaIVA FLOAT,
         iva FLOAT,
         totaleFattura FLOAT,
         FOREIGN KEY (idOrdineTestata) REFERENCES OrdiniTestate(idOrdineTestata),
         FOREIGN KEY (idItemMenu) REFERENCES Menu(idItemMenu)
      )";
$ 4.1.6 Tabella FattureTestate

      $createFattureTestate = "CREATE TABLE FattureTestate(
         idFatturaTestata INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
         dataOrdine DATETIME,
         dataFattura TIMESTAMP,
         idCliente INT(6) UNSIGNED, 
         imponibile FLOAT,
         aliquotaIVA FLOAT,
         iva FLOAT,
         totaleFattura FLOAT,
         FOREIGN KEY (idCliente) REFERENCES Clienti(idCliente)         
      )";
$ 4.1.7 Tabella FattureRighe

      $createFattureRighe = "CREATE TABLE FattureRighe(
         idFatturaRiga INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
         idFatturaTestata INT(6) UNSIGNED, 
         idItemMenu INT(6) UNSIGNED,
         imponibile FLOAT,
         aliquotaIVA FLOAT,
         iva FLOAT,
         totaleFattura FLOAT,
         FOREIGN KEY (idFatturaTestata) REFERENCES FattureTestate(idFatturaTestata),
         FOREIGN KEY (idItemMenu) REFERENCES Menu(idItemMenu)
      )";

Nota 25/07/2017. E' un primo abbozzo, ho già molte idee per migliorare il database ed arricchire le funzionalità, ma siccome sono in altomare sia per quanto riguarda l'implementazione del database stesso, che, e soprattutto, per la realizzazione dell'interfaccia utente, mi accontento così. Già sarà, per me, difficile, realizzare quanto sotteso da queste tabelle.

$ 4.2. manuPizzaDB

Creo una pagina contenente comandi, disposti all'interno di forms, per creare e modificare le tabelle del database.

La prima form contiene pulsanti con cui comandare la creazione e l'eliminazione di tutte le tabelle del data base.

Ho creato due file di include, QueriesCreazioneTabelle.php e QueriesEliminazioneTabelle.php, contententi rispettivamente query di tipo CREATE TABLE e DROP TABLE e due array, arrayQueriesCreazioneTabelle e arrayQueriesEliminazioneTabelle, contenente i nomi delle variabili stringa contenenti le query.

In questo step ho imparato:

$ 4.2.1 L'uso della constraint FOREIGN KEY

   $createClienti = "CREATE TABLE Clienti(
         idCliente INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
         password VARCHAR(8) NOT NULL,
         ...
         lastOrder DATETIME
      )";

      $createFattorini = "CREATE TABLE Fattorini(
         idFattorino INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
         nomeFattorino VARCHAR(20) NOT NULL,
         presente BOOLEAN DEFAULT TRUE,
         libero BOOLEAN DEFAULT TRUE
      )";
      ...
      ...
      $createOrdiniTestate = "CREATE TABLE OrdiniTestate(
         idOrdineTestata INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
         dataOrdine TIMESTAMP,
         idCliente INT(6) UNSIGNED, 
         orarioConsegna DATETIME,
         ...
         consegnato BOOLEAN DEFAULT FALSE,
         idFattorino INT(6) UNSIGNED,
         ...
         totaleFattura FLOAT,
         FOREIGN KEY (idCliente) REFERENCES Clienti(idCliente),
         FOREIGN KEY (idFattorino) REFERENCES Fattorini(idFattorino)
      )";
$ 4.2.2 L'indirizzamento indiretto

   ...
   $arrayQueriesCreazioneTabelle=array(
       "createClienti" ,
       "createFattorini" ,
       "createMenu" ,
       "createOrdiniTestate" ,
       "createOrdiniRighe" ,
       "createFattureTestate" ,
       "createFattureRighe" ,
      ); 
      ...
      ...
   // Create table
   foreach($arrayQueriesEliminazioneTabelle as $sql){
      $conn->exec($$sql);
         echo "<p class=phpoutput >".$sql." - ". $$sql. "</p>";
   }
   ...   
   ...
$ 4.2.3 Ordine di creazione e cancellazione delle tabelle che contengono FOREIGN KEY

Ordine di creazione

            
   $arrayQueriesCreazioneTabelle=array(
       "createClienti" ,
       "createFattorini" ,
       "createMenu" ,
       "createOrdiniTestate" ,
       "createOrdiniRighe" ,
       "createFattureTestate" ,
       "createFattureRighe" ,
      ); 

Prima di creare una tabella contenente una FOREIGN KEY occorre creare la tabella di cui la FOREIGN KEY è REFERENCES.

Nel caso dell'esempio, prima di poter creare la tabella OrdiniTestate occorre creare le tabelle Clienti e Fattorini

Ordine di cancellazione

            
   $arrayQueriesEliminazioneTabelle=array(
       "dropOrdiniRighe" ,
       "dropOrdiniTestate" ,
       "dropFattureRighe", 
       "dropFattureTestate" ,
       "dropClienti" ,
       "dropFattorini" ,
       "dropMenu" 
      ); 

Prima di cancellare una tabella contenente la cui PRIMARY KEY è FOREIGN KEY di un altra tabella occorre cancellare la tabella contenente la FOREIGN KEY constraint.

Nel caso dell'esempio, prima di poter creare la tabella OrdiniTestate devo cancellare la tabella OrdiniRighe in quanto OrdiniRighe ha come FOREIGN KEY la chiave primaria di OrdineTestate. Se cancellassi prima OrdiniTestate in OrdiniRighe ci sarebbe un riferimento ad una tabella che non esiste più. Per la stessa ragione non posso cancellare la tabella Menu prima di OrdineRighe.

$ 4.2.4 Creazione ed eliminazione di una singola tabella

Creare ed eliminare tutte le tabelle servirà in casi eccezionali. Più probabile sarà, nel corso dello sviluppo, la necessità di cancellare e/o creare una singola tabella.

Vorrei poter selezionare il nome delle query di creazione o cancellazione da una lista a discesa compilata dinamicament. Ma questo è quello che non so fare. Fa parte della sezione § 5. Form per l'interazione con il database su cui ancora non visto niente.

Comincerò ad utilizzare un meccanismo più semplice: le finestre di dialogo realizzate con JavaScript.

Vorrei provare ad utilizzare una prompt box.

Ho imparato a creare liste a discesa. Vedi formSelectQueries

Inserisco questa tecnica nella pagina manuPizzaDB.php, nella sezione "Eliminazione/Creazione singola tabella.

§ 5. Form per l'interazione con il database

Sono in altomare. L'unica cosa che mi sembra di aver capito è che per fare quello che voglio io c'è bisogno di strumenti quali jaiax o jangular.