Lettura del contenuto di un nodo - node_load()
La lettura del contenuto del nodo, è eseguita mediante la funzione node_load($nid) a cui è passato il valore dell'identificativo univoco del nodo <nid> da caricare. Al suo interno viene generata la query indicata, che usa tre tabelle:
- NODE da cui sono estratte informazioni sulla pubblicazione e tipo del nodo
- NODE_REVISIONS da cui sono estratte informazioni sul contenuto del nodo (Il titolo del nodo è letto da questa tabella e non da NODE come si potrebbe pensare)
- USERS da cui sono estratte informazioni sul proprietario del nodo
Query di selezione
SELECT n.nid, n.type, n.language, n.uid, n.status, n.created, n.changed, n.comment, n.promote,
n.moderate, n.sticky, n.tnid, n.translate, r.vid, r.uid AS revision_uid, r.title, r.body, r.teaser, r.log,
r.timestamp AS revision_timestamp, r.format, u.name, u.picture, u.data
FROM node n
INNER JOIN users u ON u.uid = n.uid
INNER JOIN node_revisions r ON r.nid = n.nid AND r.vid = <n.nid>
WHERE n.nid = <n.nid>
Dala funzione node_load() torna un oggetto ($node) contenente le informazioni lette mediante la query.
In particolare i valori $node->body e $node->teaser conterranno rispettivamente contenuto e sommario del nodo.
Oggetto $node generato dalla funzione.
(ND=da tabella NODE; NR da tabella NODE_REVISIONS; US da tabella USERS)
| $node->nid |
ND |
identificativo univoco del nodo |
| $node->language |
ND |
lingua del contenuto:'it' , 'en', 'fr', … |
| $node->type |
ND |
tipo del nodo. Tabella di codifica NODE_TYPE |
| $node->uid |
ND |
identificativo utente del proprietario del nodo |
| $node->status |
ND |
=0 non visibile; =1 visibile |
| $node->created |
ND |
timestamp della data di creazione del nodo |
| $node->changed |
ND |
timestamp della data di modifica del nodo |
| $node->comment |
ND |
identificativo utente dell'ultimo commento |
| $node->promote |
ND |
=1 il nodo è visualizzato in prima pagina |
| $node->moderate |
ND |
=1 il nodo deve essere controllato prima della pubblicazione |
| $node->sticky |
ND |
numero d'ordine del nodo nella prima pagina |
| $node->tnid |
ND |
set ID traduzione (da capire meglio) |
| $node->translate |
ND |
Booleano.Indica se la traduzione deve essere aggiornata |
| $node->sticky |
ND |
numero d'ordine del nodo nella prima pagina |
| $node->vid |
NR |
identificativo del numero di revisione |
| $node->uid |
NR |
identificativo utente del proprietario del nodo |
| $node->title |
NR |
titolo del nodo per la revisione corrente |
| $node->body |
NR |
contenuto del nodo per la revisione corrente |
| $node->teaser |
NR |
sommario del nodo per la revisione corrente |
| $node->log |
NR |
Messaggio di log contenente le modifiche eseguite |
| $node->revision_timestamp |
NR |
data di modifica del nodo |
| $node->format |
NR |
formato del nodo da tabella FILTERS_FORMAT |
| $node->name |
US |
nome utente |
| $node->picture |
US |
percorso all'immagine utente |
| $node->data |
US |
serializzazione di un array che rappresenta i campi dela form utente |
Oltre alla lettura delle informazioni contenute specificatamente nelle tabelle NODE e NODE_REVISIONS, Drupal consente di aggiungere ulteriori informazioni ai nodi e quindi all'oggetto $node.
Potremmo decidere di definire un nuovo tipo di nodo con informazioni aggiuntive salvate in una tabella separata.
Pensiamo ad esempio ad una rubrica telefonica. Il nominativo e l'identificativo univoco potrebbero essere rispettivamente il campo <title> e il campo <nid> della tabella NODE, mentre tutte le informazioni aggiuntive come l'indirizzo, il telefono, l'email etc, potrebbero essere memorizzate in una tabella separata.
Si pone quindi il problema di leggere queste ulteriori informazioni associate ai nodi.
Drupal consente di leggere queste extra informazioni implementando funzioni particolari che gestiscano queste situazioni.
Dobbiamo distinguere due casi:
Nella tabella NODE_TYPES sono elencati il tipo di nodi definiti nel sistema. Tra questi sono presenti i nodi principali, forniti con il sistema, quali: page, book, story etc.
Dalla stessa tabella vediamo che il campo <module> ci dice da quale modulo sono gestiti i nodi.
Ora supponiamo di aggiungere il nuovo tipo di nodo "rubrica" e che questo tipo di nodo sia gestito dall'omonimo modulo con tutte le sue funzioni implementate in rubrica.module. Ora quando Drupal leggerà un nominativo dal nodo rubrica, nominativo e identificativo saranno letti come indicato nel precedente paragrafo, mentre l'ulteriore contenuto sarà letto chiamando la funzione rubrica_load($node). La funzione deve tornare un array associativo costituito dalle coppie chiave=valore. Un esempio di semplice codice è il seguente:
<?php
function rubrica_load($node) {
// rid = identificativo nominativo ;
$r = db_fetch_object(db_query('SELECT telefono, indirizzo,citta FROM {rubrica} WHERE rid = %d ', $node->nid));
info = array();
info['telefono'] = $r->telefono;
info['indirizzo'] = $r->indirizzo;
info['citta'] = $r->citta;
return $info;
}
?>
All'oggetto $node originale, Drupal aggiungerà le informazioni:
| $node->telefono |
| $node->indirizzo |
| $node->citta |
La funzione è chimata all'interno di node_load() mediante node_invoke($node,'load');
Attenzione:Nel caso il modulo di gestione sia quello di default node, il nome della funzione deve essere node_content_load() e non node_load() come dovrebbe.
In questo caso viene chiamata una funzione per avvisare altri moduli che si sta caricando un nodo.
Infatti la funzione non appartiene al modulo che gestisce il tipo di nodo come nel caso precedente , ma ad altri moduli attivi.
A questo punto la funzione chiamata potrebbe compiere due diverse operazioni:
- aggiungere informazione al nodo. Si ricade nel caso precedente e quindi anche la funzione potrebbe essere implementata in modo analogo.
- Utilizzare l'informazione di lettura del nodo contenute in $node per altre attività ad esempio per eseguire statistiche sulla frequenza di lettura di quel nodo.
In entrambi i casi possono dunque essere aggiunte o meno extra informazioni all'oggetto $node.
La funzione da implementare deve chiamarsi nomemodulo_nodeapi($node,$opz).
A questa funzione è passato l'oggetto $node e il valore $opz='load. che indica l'operazione che si sta eseguendo sul nodo .
Un esempio di semplice codice, nel caso in cui venga aggiunta informazione a $node, è il seguente:
<?php
function rubrica_nodeapi($node,$opz) {
switch (
$opz) {
case 'load':
info = array();
info['telefono'] = $r->telefono;
info['indirizzo'] = $r->indirizzo;
info['citta'] = $r->citta;
return $info;
break;
default:
break;
}
?>
La funzione è chiamata all'interno di node_load() mediante node_invoke_nodeapi($node,'load');
La funzione node_load() per ogni nodo letto chiama tutte le funzioni implametate in questo modo.
Invia nuovo commento