Alterare lo schema di un modulo

 
Inserimento di una colonna in una tabella

Può capitare, a volte, di dover alterare lo schema di una tabella creata da un altro modulo, vedremo come effettuare questa operazione nella mianera corretta mantenendo l'integrità della struttura rappresentata dallo schema e quella effettivamente presente nel database.

Un breve promemoria, il DB Layer di Drupal si basa su di una struttura mantenuta all'intenro di un array, questa informazione viene elaborata ad ogni update/installazione/rimozione di modulo; la struttura definitiva viene mantenuta in cache per ottimizzare la struttura senza dover ogni volta andare a ricostruire la stessa.

Per la generazione dello schema il sistema opera in due fasi. Iniziialmente chiama tutti gli hook_schema() e effettua il merge degli array per avere la struttura dello schema generata dai moduli, successivamente (nella seconda fase) viene chiamato l'hook_schema_alter() che permette di effettuare delle modifiche all'interno dello schema.

In questa seconda operazione riceviamo (per riferimento) lo schema ottenuto dalla prima fase ed è quindi possibile andare ad aggiungere, modificare o rimuovere elementi dallo schema. Oltre a questa operazione (che si occupa solo di modificare lo schema) è necessario modificare anche la struttura del database, per effettuare questa operazioni ricorriamo, all'interno dell'hook_install(), la funzione db_add_field().

Vediamo ora in pratica come andare ad aggiungere all'interno di uno schema, generato da un modulo esterno al nostro, un campo; nel caso specifico vogliamo aggiungere all'interno della tabella degli utenti (tabella users) un nuovo campo che indica il peso che l'utente ha all'interno di un elenco.

Come prima cosa il nostro modulo dovrà implementare all'interno del file install l'hook_schema_alter(), quindi (ipotizzando che il nostro modulo si chiami classifica_utenti) avremo:

<?php
/**
* Implementation of hook_schema_alter().
*/
function classifica_utenti_schema_alter(&$schema) {
 
$schema['users']['fields']['classifica'] = array(
   
'description' => t("Peso nella classifica dell'utente"),
   
'type'        => 'int',
   
'unsigned'    => TRUE,
   
'not null'    => TRUE,
   
'default'     => 0,
  );
}
?>

A questo punto lo schema conterrà l'informazione, ma questa non è ancora stata costruita all'interno del database, un modo per procedere all'aggiunta del campo nel DB è ricorrere alla funzione sopra citata, quindi avremo:

<?php
/**
* Implementation of hook_install().
*/
function classifica_utenti_install() {
 
$ret = array();
 
db_add_field($ret, 'users', 'classifica', array(
   
'description' => t("Peso nella classifica dell'utente"),
   
'type'        => 'int',
   
'unsigned'    => TRUE,
   
'not null'    => TRUE,
   
'default'     => 0,
  ));
}
?>

La funzione db_add_field accetta una serie di parametri, in particolare il primo parametro è un array cche viene utilizzato per gestire il valore di ritorno, il secondo è una stringa che indica in quale tabella deve essere inserito il campo, metrne il terzo campo indica ilnome del field che deve essere aggiunto nel DB.
Il parametro successivo indica la struttura del field che deve essere inserito nel database (per informazioni più dettagliate vi rimando alle API).

Buon Drupal coding a tutti!

Altri contenuti che potrebbero interessarti

  • Drupal è uno dei migliori CMS (la versione 4.7 è giunta seconda al contest internazionale, subito dopo Joomla, ma con la versione 5 probabilmente si avrà il balzo al primo posto!) in circolazione per la realizzazione di siti nato nel 2001 e giunto ormai alla sua quinta versione...
  • Esempio di vista generata dall'integrazione del nostro modulo con views
    Alzi la mano chi non ha mai usato views. Alzi la mano che l'ha mai usato. Ok, non proprio tutti ma buona parte di voi ha alzato la mano, questo perchè è sicuramente uno strumento potentissimo per la visualizzazione delle informazioni, quindi è fondamentale (o comunque molto utile) andare ad...
  • Interfaccia di esempio per la selezione tramite autocompletamento in cascata
    Come spesso capita si utilizzano select per andare a far effettuare delle scelte agli utenti, e come abbiamo visto precentemente è possibile usare le funzionalità ajax per fare in modo che delle select secondarie varino in funzione della prima scelta. Cosa succede, invece, quando si hanno centinaia...
  • La volta scorsa, nel parlare di ottimizzazione del frontend di siti generici (e Drupal in particolare) avevamo affrontato alcune delle problematiche principali, tra cui appunto la generazione di sottodomini per lo smistamento degli asset statici [1], così da parallelizzare il più possibile il...

Commenti

Invia nuovo commento





  • Elementi HTML permessi: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img> <h2> <h3> <h4> <table> <thead> <tbody> <tr> <th> <td>
  • You may post code using <code>...</code> (generic) or <?php ... ?> (highlighted PHP) tags.
  • Linee e paragrafi vanno a capo automaticamente.
  • Indirizzi web o e-mail vengono trasformati in link automaticamente

Maggiori informazioni sulle opzioni di formattazione.



Condividi contenuti