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.