Attualmente sto sviluppando una nuova...diciamo così...filosofia. Sembra complessa ma in realtà è molto più semplice di quello che pensavo!
L'idea è di separare i concetti
- CONTENUTO (xml)
- STRUTTURA (xml)
- STILE (css)
- STAMPA (script php)
In pratica i documenti vengono descritti all'interno di un file XML di solo contenuto.
Utilizzo tag puramente descrittivi, brevi e mnemonici.
Per esempio
codice:
<DOCUMENTO autore="pippo" data="06/02/2005 titolo="prova" ">
<DESCRIZIONE>blah blah</DESCRIZIONE>
<TITOLO>titolo del documento</TITOLO>
<CONTENUTO>
blah blah blah <LINK href="http://www.url.com">un link</LINK>
</CONTENUTO>
</DOCUMENTO>
Da osservare che questo file non ha alcun riferimento circa la sua struttura o il suo stile. Però è leggibile!
La struttura viene descritta in un secondo XML che però può essere comune a più documenti...eventualmente tutti.
codice:
<PAGINA>
<TITOLO />
<CONTENUTO />
</PAGINA>
Infine viene il foglio di stile classico.
Il direttore d'orchestra è ovviamente il parsing PHP dei vari XML. Cerco di non tediarvi con i dettagli...
L'idea è quella di effetuare la visita completa in-order dell'albero XML oppure ricercare un nodo in particolare per generare la pagina (esempio i meta tag). Questo processo lo chiamo STAMPA.
esempio di visita in order (1st child/next sibling)
Per ogni nodo se è testo lo stampo cosi com'è (tanto c'e poco da fare) se è invece un tag ho due possibilità.
La prima, di default, è di stamparlo com'è (quindi non ha effetto sull'output).
La seconda è di richiamare la funzione associata a parsare quel tag.
Nel php questo è particolarmente semplice perchè la tabella di parsing è banalmente un array associativo (una mappa) del tipo
$parser_table["nome_tag"] = "nome_funzione";
Quando incontro un tag richiamo la funzione che riceve varie info sul tag
- nome del tag
- accesso ai suoi attributi
- il tag è in apertura o chiusura?
- path del tag
- ecc...
Questo è un esempio 'reale' (anche se banale)
codice:
// \n per dare leggibilità al sorgente
function Comment(&$tag_struct){
echo($tag_struct->isopen()?"<span id=COMMENTO>\n":"</span>\n");
}
Naturalmente posso decidere se visualizzare o meno il nodo (comunico al parser di ignorare anche il testo) oppure utilizzare gli attributi (invisibili al browser!)
Le funzioni che gestiscono i tag possono essere molto più complicate!
Ad esempio potrebbero generare i meta tag html oppure verificare se il link è attivo o meno (quindi stamparlo con una riga sopra).
Unico limite la fantasia!
I vantaggi di questo metodo sono infiniti! Ne cito alcuni
- contenuto, struttura, stile e stampa sono totalmente indipendenti (posso modificare uno senza preoccuparmi dell'altro!)
- posso modificare l'implementazione di un tag (ad esempio implementare un LINK con un javascript più complesso)
- il documento è facile da scrivere, da leggere (anche senza browser!), da modificare. E' compatto! Scrivo il documento normalmente (converto il testo in caratteri HTML al momento della stampa : esempio caratteri accentati, <, >, ecc...)-> leggibilità!
- il db posso usarlo al meglio! lascio i documenti sul filesystem mentre nel db memorizzo solo il riferimento al doc, la descrizione, la data, l'autore, i link, ecc...il processo di acquisizione nel db può essere reso automatico attraverso la semplice ricerca sui tag o gli attributi del CONTENUTO.xml.
Tale processo può essere automatizzato a livello di singolo documento o di intere directory!
Eseguo l'upload di un nuovo documento e mi trovo il giorno dopo il db aggiornato !
Posso modificare un contenuto senza preoccuparmi del db (il riferimento non cambia)(al limite si aggiornano i campi)
In questo modo però il db evita di frammentarsi perchè le info contenute sono minime. Facili da recuperare.
- inoltre la struttura gerarchica XML può essere usata per gestire strutture 'ricorsive' come le mappe di un sito (path)...in un modo davvero semplice.
Allo stato attuale molti problemi li ho già risolti ma in modo 'indipendente'...inoltre devo pensare alle notazioni da usare (meglio i tag o gli attributi? nomi?)
Sperando di avervi non dico convinto ma almeno incuriosito...