Form API di Drupal 7 — Creazione di moduli in Drupal
Nei precedenti tutorial abbiamo conosciuto gli hook hook_block_info(), hook_block_view(), hook_menu() e hook_permission(), e ora possiamo creare programmaticamente quante pagine e blocchi vogliamo. In questa lezione conosceremo il Form API di Drupal 7 per creare moduli. Creeremo un modulo di amministrazione per gestire le funzioni del nostro modulo e cercheremo di utilizzare il maggior numero possibile di hook già visti, per consolidare le competenze.
Per cominciare, mostreremo 3 blocchi. Questo dovrebbe essere semplice per te:
function sitemade_block_info(){
$blocks = array(); // inizializza un array vuoto
$blocks[1]['info'] = 'Elenco utenti';
$blocks[2]['info'] = 'Elenco nodi';
$blocks[3]['info'] = 'Elenco termini';
return $blocks;
}
function sitemade_block_view($delta = ''){
$block = array();
switch ($delta){
case 1:
$block['subject'] = 'Utenti';
$block['content'] = '';
$query = db_select('users', 'u')
->fields('u', array('uid', 'name'))
->orderBy('u.uid', 'DESC')
->range(0, 5)
->execute();
$users = $query->fetchAll(PDO::FETCH_ASSOC);
foreach($users as $user){
$block['content'] .='';
}
break;
case 2:
$block['subject'] = 'Nodi';
$block['content'] = '';
$query = db_select('node', 'n')
->fields('n', array('nid', 'title'))
->orderBy('n.nid', 'DESC')
->range(0, 10)
->execute();
$nodes = $query->fetchAll(PDO::FETCH_ASSOC);
foreach($nodes as $node){
$block['content'] .='';
}
break;
case 3:
$block['subject'] = 'Termini';
$block['content'] = '';
$query = db_select('taxonomy_term_data', 't')
->fields('t', array('tid', 'name'))
->orderBy('t.tid', 'DESC')
->range(0, 10)
->execute();
$terms = $query->fetchAll(PDO::FETCH_ASSOC);
foreach($terms as $term){
$block['content'] .='';
}
break;
}
return $block;
}
Dopo aver svuotato la cache, i nuovi blocchi appariranno nell’amministrazione. Posizionali nella barra laterale sinistra:

Ora creiamo una pagina di amministrazione dove inseriremo il modulo per gestire questi tre blocchi:
function sitemade_permission(){
return array(
'admin content blocks' => array(
'title' => t('Admin content blocks'),
'description' => t('Nodes, Users, Terms'),
),
);
}
function sitemade_menu(){
$items = array();
$items['admin/config/content/content_blocks'] = array(
'title' => 'Blocchi utenti, nodi e termini',
'description' => 'Amministrazione dei blocchi',
'page callback' => '_sitemade_content_blocks',
'access arguments' => array('admin content blocks'),
);
return $items;
}
function _sitemade_content_blocks(){
$content = 'Lorem ipsum!';
return $content;
}
La nuova pagina apparirà all’indirizzo admin/config/content/content_blocks come segnaposto:

Impostiamo ora i permessi per l’amministratore (grazie a hook_permission()):

Ora modifichiamo i nostri hook per creare il modulo di amministrazione. Gestiremo il titolo del blocco e il numero di elementi mostrati (nodi, utenti, termini).
function sitemade_menu(){
$items = array();
$items['admin/config/content/content_blocks'] = array(
'title' => 'Blocchi utenti, nodi e termini',
'description' => 'Amministrazione dei blocchi',
'page callback' => 'drupal_get_form',
'page arguments' => array('_sitemade_content_blocks'),
'access arguments' => array('admin content blocks'),
);
return $items;
}
drupal_get_form($form_id)
È un wrapper per drupal_build_form() usato quando non serve lo stato del form ($form_state).
Riceve l’ID univoco del modulo e restituisce il suo array strutturale.
Ora la nostra funzione _sitemade_content_blocks() dovrà restituire un array di definizione del modulo:
function _sitemade_content_blocks(){
$form = array();
$form['nodes-title'] = array(
'#type' => 'textfield',
'#title' => t('Titolo blocco nodi'),
'#default_value' => variable_get('node_block', ''),
'#size' => 60,
'#maxlength' => 64,
'#description' => t('Titolo del blocco per i Nodi'),
);
$form['node-selected'] = array(
'#type' => 'select',
'#title' => t('Numero di nodi nel blocco'),
'#options' => drupal_map_assoc(range(1,10)),
'#default_value' => variable_get('node_block_range', 5),
);
$form['actions'] = array('#type' => 'actions');
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => t('Save'),
);
return $form;
}
Il risultato sarà una semplice interfaccia di amministrazione:

Elaborazione del modulo
Per gestire la sottomissione, usiamo hook_formID_submit():
function sitemade_content_blocks_submit($form, &$form_state){
variable_set('node_block', $form_state['values']['nodes-title']);
variable_set('node_block_range', $form_state['values']['node-selected']);
}
Ora i dati inseriti verranno salvati in variabili di Drupal con variable_set(), e caricati in seguito con variable_get().
Infine, aggiorniamo hook_block_view() per usare questi valori personalizzati:
function sitemade_block_view($delta = ''){
$block = array();
switch ($delta){
case 2:
$block['subject'] = variable_get('node_block', 'Nodi');
$block['content'] = '';
$query = db_select('node', 'n')
->fields('n', array('nid', 'title'))
->orderBy('n.nid', 'DESC')
->range(0, variable_get('node_block_range', 5))
->execute();
$nodes = $query->fetchAll(PDO::FETCH_ASSOC);
foreach($nodes as $node){
$block['content'] .= '';
}
break;
}
return $block;
}
Non dimenticare di svuotare la cache! Ora i tuoi blocchi mostreranno titoli e quantità configurabili dall’interfaccia di amministrazione.
