Utente: Anonymous

Caricamento

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

Lettura extra-contenuto di un nodo

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:

Implementazione della funzione legata alla tipologia del nodo

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.

Implementazione della funzione legata ad un modulo

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.