Completiamo la costruzione del nostro database con l'ultima tabella, la chiameremo struttura
e sarà uno dei passaggi chiave dell'intero lavoro. Lo scopo di questa tabella è quello di descrivere tutte le tabelle di dati e memorizzare le informazioni necessarie per la costruzione delle interfacce, i form, per la gestione dei dati. A conti fatti, al termine del nostro lavoro l'inserimento corretto dei dati in questa tabella sarà l'unico lavoro da fare per far funzionare il nostro CMS.
I campi della tabella
Il primo campo sarà un normalissimo id
(INT
) chiave primaria con AUTOINCREMENT
. Chiameremo il secondo campo tabella
(VARCHAR(20)
) dove memorizzeremo il nome della tabella di appartenenza del campo, nel nostro caso i valori saranno "news" o "autori". Il terzo campo sarà il nome
del campo (VARCHAR(20)
), quindi per la tabella "news" avremo id
, titolo
, testo
e così via. Quarto campo label
(VARCHAR(50)
) per definire l'etichetta del campo nel form, dato che il nome del campo non può essere utilizzato per convenzione. Per esempio nel nostro caso potremmo avere "data_pubblicazione" e label "Data pubblicazione".
Il quinto campo sarà un ENUM
con valori '0' o '1': lo chiameremo chiave
e servirà per definire la chiave primaria. Il sesto campo, tipo_input
, sarà un ENUM
contenente tutte le possibili opzioni di input HTML5 (text
, hidden
, password
, search
, email
, number
, date
, checkbox
, checkboxlist
, radiolist
, select
e textarea
). Potremmo avere text
per il titolo della news e una textarea
per il testo, un hidden per l'id ecc.
Il campo successivo sarà un ENUM
e servirà per definire se un campo è obbligatorio o meno ed effettuare i relativi controlli server-side, ovviamente questa opzione può essere sfruttata anche per creare controlli client-side. Simile la funzione del campo controllo
che sarà sempre funzionale ai controlli server-side e potremo scegliere fra le opzioni string
o int
.
I campi successivi, visibile
e list
, saranno due ENUM
'0' e '1', il primo servirà per nascondere il campo nei form e per mostrare il contenuto nella lista iniziale, il secondo servirà per mostrare una serie di campi nel pannello di controllo. Abbiamo ora un terzetto di campi che serviranno per la creazione delle SELECT e quindi per la gestione delle relazioni uno a molti: se il controllo sarà quindi una SELECT
dovremo indicare da quale tabella estrarre i dati, quale campo utilizzare per il valore della option HTML e quale nel testo visibile. Si tratta quindi di tre VARCHAR
: origine_tabella
, origine_id
, origine_testo
.
I successivi tre campi hanno uno scopo simile ma questa volta declinato sulle tabelle di relazione molti a molti (il tipo di campo normalmente associato sarà una checkboxlist
):rel_tabella
, rel_id1
, rel_id2
, tutti VARCHAR
.
L'ultimo campo, ordine
, e sarà un INT
, o un decimal(10,3)
, e servirà per decidere l'ordine dei campi nei form di inserimento e modifica.
CREATE TABLE struttura (
id int(11) NOT NULL,
tabella varchar(20) NOT NULL,
nome varchar(20) NOT NULL,
label varchar(50) NOT NULL,
chiave enum('0','1') NOT NULL DEFAULT '0',
tipo_input enum('text','hidden','password','search','email','number','date','checkbox','checkboxlist','radiolist','select','textarea') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
obbligatorio enum('0','1') NOT NULL,
controllo enum('string','int') NOT NULL,
visibile enum('0','1') NOT NULL DEFAULT '1',
lista enum('0','1') NOT NULL DEFAULT '0',
origine_tabella varchar(255) NOT NULL,
origine_id varchar(30) NOT NULL,
origine_testo varchar(30) NOT NULL,
rel_tabella varchar(255) NOT NULL,
rel_id1 varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
rel_id2 varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
ordine int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Indici per le tabelle struttura
--
ALTER TABLE struttura
ADD UNIQUE KEY id (id);
--
-- AUTO_INCREMENT per la tabella struttura
--
ALTER TABLE struttura
MODIFY id int(11) NOT NULL AUTO_INCREMENT;
Popolare la tabella
Una volta generata la tabella "struttura" non resterà altro che popolarla con dei dati iniziali.
INSERT INTO struttura (id, tabella, nome, label, chiave, tipo_input, obbligatorio, controllo, visibile, lista, origine_tabella, origine_id, origine_testo, rel_tabella, rel_id1, rel_id2, ordine) VALUES
(1, 'news', 'id', 'id', '1', 'hidden', '1', '', '1', '1', '', '', '', '', '', '', 1),
(2, 'news', 'titolo', 'titolo', '0', 'text', '1', '', '1', '1', '', '', '', '', '', '', 2),
(3, 'news', 'testo', 'testo', '0', 'textarea', '0', '', '1', '0', '', '', '', '', '', '', 3),
(4, 'news', 'data_pubblicazione', 'data pubblicazione', '0', '', '1', '', '1', '1', '', '', '', '', '', '', 4),
(5, 'news', 'autore_id', 'autore', '0', 'select', '0', '', '1', '0', 'autori', 'id', 'cognome', '', '', '', 5),
(6, 'news', 'ordine', 'ordine', '0', 'number', '0', '', '1', '0', '', '', '', '', '', '', 6),
(7, 'autori', 'id', 'id', '1', 'hidden', '1', '', '1', '1', '', '', '', '', '', '', 1),
(8, 'autori', 'nome', 'nome', '0', 'text', '1', '', '1', '1', '', '', '', '', '', '', 2),
(9, 'autori', 'cognome', 'cognome', '0', 'text', '1', '', '1', '1', '', '', '', '', '', '', 3),
(10, 'autori', 'ordine', 'ordine', '0', 'number', '0', '', '1', '0', '', '', '', '', '', '', 4);
Ora nella tabella struttura
ci sono tutte le informazioni e le meta-informazioni per gestire le tabelle "news" e "autori": eseguendo una SELECT
saremo in grado di costruire i form e le liste per la gestione dei dati. Il motore di tutto questo sarà una classe apposita, avremo poi unfile PHP per inizializzare la classe e stampare i contenuti.