logo

Extra Block Types (EBT) - Nuova esperienza con Layout Builder❗

Extra Block Types (EBT) - tipi di blocchi stilizzati e personalizzabili: Slideshows, Tabs, Cards, Accordion e molti altri. Impostazioni integrate per sfondo, DOM Box, plugin javascript. Vivi oggi il futuro della costruzione dei layout.

Demo moduli EBT Scarica moduli EBT

❗Extra Paragraph Types (EPT) - Nuova esperienza con Paragraphs

Extra Paragraph Types (EPT) - insieme di moduli basati su paragrafi in modo analogo.

Demo moduli EPT Scarica moduli EPT

Scorri

Form API di Drupal 7 — Creazione di moduli in Drupal

14/10/2025, by Ivan

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:

Drupal blocks

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:

Drupal admin page

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

Drupal 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:

Drupal admin form

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.

Drupal block