Nel topic Creare una Custom Page ho cercato di spiegare come realizzare una pagina personalizzata (Custom Page) utilizzando la connessione di phpbb e il template header e footer per ottenere una pagina che abbia la stessa testata e piede del Forum e un corpo dove si possa inserire qualcosa di personalizzato.
Vediamo ora di approfondire questo aspetto: interrogare il Database per ottenere i dati che vogliamo visualizzare nella nostra pagina.
1) Come funziona phpbb.
Se guardiamo i file del pacchetto phpbb vediamo che ci sono dei file php nella root, altri file php nella cartella includes, altri ancora nella cartella language e infine nella cartella styles che contiene gli stili installati abbiamo le cartelle template, theme e imageset.
In sostanza avviene questo: il file php situato nella root (index.php, viewforum.php, viewtopic.php, ecc) ha il compito di interrogare il database e con apposite domande (query) ottenere una lista di dati (un array) che contiene le informazioni richieste sotto forma di Variabili (tutte rigorosamente in Maiuscolo).
Per ottenere questi dati il file php sfrutta altri file (ad esempio le function della cartella includes) e per fare questo viene inserito nel file una riga "include".
Codice: Seleziona tutto
include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
Ovviamente questo porta a semplificare ed evitare di inserire il codice di un file include in tutti i file che avrebbero bisogno di queste funzioni.
Il file php è collegato con un template che è un file html che ha il compito di ricevere i dati sotto forma di variabili e creare la pagina visualizzando il contenuto.
In pratica l'abbinamento php-template è fondamentale nel meccanismo di phpbb.
Veniamo ora allo scopo di questa Guida: realizzare una query che interroghi il database.
Il Database contiene numerose tabelle (una sessantina) tutte collegate tra loro e in pratica contenenti tutto quello che costituisce il Forum.
Le tabelle in phpbb hanno un prefisso (per default è phpbb_ ma ognuno è libero di cambiarlo per cui potrebbe essere diverso, in questa Guida consideriamo che sia phpbb_)
Avremo quindi una serie di tabelle del tipo:
- phpbb_forums = contiene l'elenco dei Forums
- phpbb_topics = contiene i dati relativi ai Topics
- phpbb_posts = contiene i dati relativi ai Posts, testi, users, data, ecc.
- phpbb_users = è l'elenco degli utenti
- phpbb_attachments = l'elenco degli allegati (gli allegati veri e propri vengono salvati nella cartella "files")
- e così per altre numerose tabelle.
Queste tabelle, attraverso il file constants.php prendono un nome che poi verrà utilizzato dal sistema.
Avremo così FORUMS_TABLE, TOPICS_TABLE, POSTS_TABLE, USERS_TABLE, ATTACHMENTS_TABLE e così via.
Teniamo ben presente questo perchè sarà questo il nome che useremo nella query.
L'elenco lo troviamo nel file includes/constants.php.
Query di interrogazione
In una Custom Page la connessione al Database viene effettuata dalle prime righe di codice inserite nel file php e quindi se creiamo una query all'interno di una Custom Page dobbiamo considerare che siamo già connessi.
La struttura base di una query di interrogazione è la seguente:
Codice: Seleziona tutto
$sql = "SELECT campo1, campo2, campo3 FROM nome_tabella WHERE campo1 = 'x' ORDER BY campo2"
Considerando che in precedenza abbiamo detto che alle tabelle viene assegnato una Variabile tipo TOPIC_TABLE, ecc. vediamo un esempio pratico: vogliamo ottenere l'elenco dei Topics dell'utente topic_poster=10 nel forum_id=5 e voglio limitare il risultato ai primi 10 records.
Avremo:
Codice: Seleziona tutto
$sql = "SELECT topic_poster, topic_id, forum_id, topic_title
FROM " . TOPICS_TABLE . "
WHERE topic_poster = 10
AND forum_id = 5
ORDER BY topic_id DESC LIMIT 0,10";
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
$template->assign_block_vars('lista_topics',array(
'USER_COR' => $row['topic_poster'],
'TOPIC_COR' => $row['topic_id'],
'FORUM_COR' => $row['forum_id'],
'TITLE_COR' => $row['topic_title']
));
}
Il tutto viene messo in ordine di topic_id ma decrescente (DESC).
Inoltre il risultato è limitato ai records 0-10 della Lista con l'opzione "LIMIT 0,10".
Con il ciclo while prendiamo un record alla volta e i dati estratti li inseriamo in un array di nome "lista_topics" utilizzando le variabili USER_COR, TOPIC_COR, FORUM_COR e TITLE_COR.
Il Template, con la funzione BEGIN visualizzerà la lista cosi ottenuta:
Codice: Seleziona tutto
<!-- BEGIN lista_topics -->
{lista_topics.USER_COR}, {lista_topics.TOPIC_COR}, {lista_topics.FORUM_COR}, {lista_topics.TITLE_COR} <br>
<!-- END lista_topics -->
Ovviamente questo è un esempio, nel template le variabili andranno inserite associate ai relativi tag per una corretta formattazione (<table><tr><td><div>, ecc.)
Abbiamo realizzato la nostra prima query e creato una Lista degli ultimi 10 Topics dell'utente '10'.
Non abbiamo il nome dell'utente e nemmeno il nome del Forum, vediamo come fare per ottenere anche questi dati.
Abbiamo bisogno di ricavare i dati da più di una tabella, in questo caso le tabelle interessate sono topics, forums e users.
Dato che le diverse tabelle potrebbero avere campi con lo stesso nome dobbiamo individuare a quale tabella è riferito il campo che andremo a chiedere.
Questo si ottiene inserendo il nome completo "tabella_campo" (es. phpbb_users.user_id) ma il php ci consente di utilizzare delle abbreviazioni che andremo a stabilire.
Indichiamo con "ut, tt, ft" rispettivamente le tabelle users, topics e forums.
Questa sarà la query che oltre ai dati estratti in precedenza fornirà l'username e il nome del Forum.
Codice: Seleziona tutto
$sql = "SELECT tt.topic_poster, tt.topic_id, tt.forum_id, tt.topic_title,
ft.forum_id, ft,forum_name,
ut.user_id, ut.username
FROM " . TOPICS_TABLE . " tt, " . FORUMS_TABLE . " ft, " . USERS_TABLE . " ut
WHERE tt.topic_poster = 10
AND tt.forum_id = 5
AND tt.forum_id = ft.forum_id
AND tt.topic_poster = ut.user_id
ORDER BY tt.topic_id DESC LIMIT 0,10";
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
$template->assign_block_vars('lista_topics',array(
'USER_COR' => $row['topic_poster'],
'TOPIC_COR' => $row['topic_id'],
'FORUM_COR' => $row['forum_id'],
'TITLE_COR' => $row['topic_title'],
'USERNAME_COR' => $row['username'],
'FORUM_NAME_COR' => $row['forum_name']
));
}
Viene così ricavato anche il nome dell'utente e il nome del Forum.
Abbiamo realizzato la nostra prima query su tabelle diverse e possiamo passare il risultato alla nostra Pagina Personalizzata che visualizzerà la Lista degli ultimo 10 Topics dell'utente 10 nel Forum 5.
Per ora termino qui, in seguito vedremo di approfondire l'argomento con esempi più complessi.