Home   Informatica   PHP   Step5: Prime tabelle per il menu

Step5: Prime tabelle per il menu

Scritto da sergio il 16/01/2020 10:00:41

Iniziamo costruendo un paio di tabelle che ci serviranno per la nostra navigazione: una tabella relativa alle categorie per raggruppare voci di menu omogenee e una seconda per le voci di menu effettive.

 

t_cat_menu

id          INTEGER     PK    NN          AI
codice      VARCHAR(5)        NN    UQ
descrizione VARCHAR(50)       NN
ordine      INTEGER           NN

 

t_menu

id          INTEGER     PK    NN          AI
codice      VARCHAR(5)        NN    UQ
descrizione VARCHAR(50)       NN
md5         VARCHAR(50)       NN
url         VARCHAR(50)       NN
pubblicato  BOOLEAN           NN
idCategoria INTEGER           NN
idPadre     INTEGER
ordine      INTEGER           NN

 

Per quanto riguarda il campo “boolean” un tempo, sui vecchi MySql non era previsto e si usava il tipo dati “TINYINT” di lunghezza 1, ma oramai si sono evoluti anche loro, potenza della Oracle!

Le due tabelle hanno quindi una relazione uno a molti tra la categoria e le relative voci di menu.

Costruiamo 2 classi che siano aderenti a queste 2 tabelle create.

catMenu.class.php:

//CATEGORIA DEL MENU

class catMenu

{

       var $id;

       var $codice;

       var $descrizione;

       var $ordine;

function __construct()

       {     

       }

}

 

4 attributi che corrispondono ai 4 campi della tabella. Il costruttore va previsto, ma in questo caso non ci serve molto e possiamo lasciarlo vuoto, potremmo utilizzarlo ad esempio per preimpostare qualche campo…

Creiamo poi i metodi per le classiche operazioni di lettura della lista dei record, di dettaglio di un singolo record, di update, di delete.

Se vogliamo lavorare con un vero modello 3-tier parcheggiamo i dati estratti dal database su delle collection in memoria.

Un metodo “getList” potrebbe quindi essere:

function getList()

{

  global $db;

  global $errorMsg;

            

  try

  {

    $sql = "SELECT * FROM t_cat_menu ORDER BY ordine";

    if(!$db->query($sql))

      throw new Exception($errorMsg, 0);

      

    while ($rowCatMenu = $db->row())

    {

       $id = $rowCatMenu["id"];

       $hashtable[$id] =

array( "id"           => $id

                    ,"codice"       => $rowCatMenu["codice"]

                    ,"descrizione"  => $rowCatMenu["descrizione"]

                    ,"ordine"       => $rowCatMenu["ordine"]

             );

    }

       return $hashtable;

  }

  catch (Exception $ex)

  {

    $errorMsg = $ex->getMessage();

  }

}

Usiamo 2 variabili globali ($db e $errorMsg) in modo da centralizzare nella index.php la connessione al database (che ovviamente comunque non è persistente e viene istanziata ad ogni action) e una unica variabile contente la messaggistica (non necessariamente solo di errore) che viene poi visualizzata in una precisa posizione della pagina.

Per i dati estratti costruiamo delle hashtable, con le n-uple costituite da accoppiate chiave – valore.

Le classi costruite quindi costituiscono il livello dell’applicativo che lavora sui dati. L’SQL che opera sul DB deve essere presente SOLO QUI!

In modo del tutto identico possiamo costruire le classe per la tabella t_menu:

menu.class.php

class menu

{

       var $id;

       var $codice;

       var $descrizione;

       var $md5;

       var $url;

       var $categoria;

       var $ruolo;

       var $pubblicato;

       var $ordine;

       var $id_padre;

}


Questi sono gli attributi e qui sotto il metodo getList:

function getList($categoria = null)

{

  global $db;

  global $errorMsg;

            

  try

  {

     $sql = "SELECT * FROM t_menu m

LEFT JOIN t_cat_menu c ON m.id_categoria = c.id ";

     if ($categoria != null) { $sql .= "WHERE m.id_categoria = ".$categoria; }

     $sql .= " ORDER BY c.ordine, m.ordine";

            

     if (!$db->query($sql))

       throw new Exception($errorMsg, 0);

            

     while ($rowMenu = $db->row())

     {

       $id = $rowMenu["m.id"];

       $hashtable[$id] =

array ( "id"               => $id

                    ,"codice"           => $rowMenu["m.codice"]

                    ,"descrizione"      => $rowMenu["m.descrizione"]

                    ,"md5"              => $rowMenu["m.md5"]

                    ,"url"              => $rowMenu["m.url"]

                    ,"codiceCategoria"  => $rowMenu["c.codice"]

                    ,"pubblicato"        => $rowMenu["m.pubblicato"]

                    ,"ordine"           => $rowMenu["m.ordine"]

             );

     }

     return $hashtable;

  }

  catch (Exception $ex)

  {

    $errorMsg = $ex->getMessage();

  }

}

L’unica differenza rispetto al getList delle categorie di menu è che qui viene gestito un parametro (facoltativo) che se valorizzato viene utilizzato per filtrare le voci di menu relativa alla categoria passata a parametro.

Direi che vi ho martellato abbastanza, alla prossima!

Ultimo aggiornamento 16/01/2020 10:00:41