Form a tabella

 
Immagini del form classico ed a tabella a confronto

A chi non è mai capitato di dover creare un form e dargli un aspetto grafico particolare? Credo che chiunque abbia avuto questa necessità avrà avuto anche la necessità di disporre i campi sottoforma di tabella, sopratutto quando si ha una serie di elementi simili che devono essere inseriti.

Per fare questo abbiamo diversi modi, vediamo quale è il più "pulito" e veloce.

Innanzitutto dobbiamo avere una pagina in cui viene inserito il form, per fare questo andiamo ad usare l'hook menu che richiami la funzione che genera il form tramite la funzione drupal_get_form:

<?php
/**
* Implementation of hook_menu().
*/
function tableform_menu() {
 
$items = array();

  $items['tutorial/formtabella'] = array(
   
'title' => t('Form a tabella'),
   
'description' => t('Crea un form con struttura tabellare'),
   
'page callback' => 'drupal_get_form',
   
'page arguments' => array('tableform_form'),
   
'access arguments' => array('access content'),
  );
 
  return
$items;
}
?>

A questo punto andiamo a realizzare la funzione che genera il nostro form e lo restituisce come array. Questa procedura viene semplificata usando un ciclo che inserisce in cascata i vari elementi ripetendoli, ho definito una variabile che contiene il numero di elementi che devono essere contenuti nella tabella, mla cosa non è necessaria ma molto comoda, dato che poi questo valore verrà usato in molte occasioni (theming del form, validazione, inserimento, cancellazione, ..).

Vediamo la funzione che si occupa di creare il form:

<?php
/**
* Create form
*/
function tableform_form($form_state) {
 
  for(
$i = 0; $i < FORM_COUNT_ROWS; $i++) {
   
$form['check_' . $i ] = array(
     
'#type' => 'checkbox',
     
'#default_value' => TRUE,
    );
   
$form['select_' . $i] = array(
     
'#type'          => 'select',
     
'#options' => array(
       
'value1' => t('Valore 1'),
       
'value2' => t('Valore 2'),
       
'value3' => t('Valore 3'),
      ),
    );
   
$form['text_' . $i] = array(
     
'#type'          => 'textfield',
     
'#maxlength'     => 128,
    );
  }
 
 
$form['#theme'] = 'tableform_draw';
 
  return
$form;
}
?>

Ho coscentemente omesso tutto ciò che non serve per modificare kl'aspetto, ma potrebbe essere necessario in un form classico (vedi pulsante di submit e cose simili). Da notare l'inserimento della voce #theme come chiave dell'array che indica quale è la funzione di theming da usare per la formattazione del form.

A questo punto andiamo a creare la funzione che permette di visualizzare il form in tabella:

<?php
/**
*  Create form table
*/
function theme_tableform_draw($form) {
 
$header = array(t('Attivo'), t('Valore'), t('Descrizione'));
 
  for(
$i = 0; $i < FORM_COUNT_ROWS; $i++) {
   
$rows[] = array(
     
drupal_render($form['check_' . $i ]),
     
drupal_render($form['select_' . $i]),
     
drupal_render($form['text_' . $i])
    );
  }
 
 
$output = theme('table', $header, $rows);
 
 
$output .= drupal_render($form);
 
  return
$output;
}
?>

In questa funzione usaiamo la funzione drupal_render per andare a renderizzare gli elementi del form e disporli nella righe della tabella, viene poi usata la funzione theme table per realizzare al tabella. L'ultima chiamata al form serve a far disegnare gli elementi che non sono stati inseriti precedentemente nel form.

Una volta realizzata la funzione dobbiamo occuparci di segnalarla al meccanismo di theming, per fare questo usiamo l'hook_theme:

<?php
/**
* Implementation of hook_theme().
*/
function tableform_theme($existing, $type, $theme, $path) {
   return array(
   
'tableform_draw' => array(
     
'arguments' => array('form' => NULL),
    ),
  );
}
?>

Ora possiamo caricare il modulo e visualizzare il risultato desiderato andando all'indirizzo segnalato. Potete vedere il risultato finale andando all'indirizzo Form in tabella e potete scaricare il modulo d'esempio allegato a questo articolo.

Se avete domande scrivete pure nei commenti.

AllegatoDimensione
Modulo d'esempio per form in tabella1.37 KB

Altri contenuti che potrebbero interessarti

  • Tabella paginata e ordinabile
    Nella realizzazione di interfaccie di report può capitare di dover creare delle tabelle che visualizziino una serie di informazioni. Spesso, se i dati sono molti, è necessario ricorrere alla creazione di tabelle paginate. In altri casi, o in aggiunta a questo, può essere necessario andare a...
  • Precedentemente avevo scritto una patch per views che pemetteva di andare ad indicare delle classi specifiche alle singole righe delle views. Considerato che modificare il codice di un modulo lo considero una delle cose più pericolose nonché sbagliate, e in considerazione del fatto dell'enorme...
  • Interfaccai di presentazione della documentazione delle API di Drupal in gedit
    Non sono ancora riuscito a convincervi ad usare gedit, nonostante i fantastici snippet? vediamo se ques'altra estensione per Drupal vi invonglierà a tentare il passaggio. Cosa serve ad uno sviluppatore? Sicuramente poter accedere alla guida del sitema che sta usando velocemente, e quindi cosa cè di...
  • Caricamento di un form tramite ajax
    Nella creazione di form può essere necessario procede con passi successivi in una serie di scelte, questo comporta una perdita di tempo per gli utenti e quindi è molto comodo sfruttare le potenzialità offerte da ajax per effettuare questi passaggi in cascata senza dover andare a ricaricare la...

Commenti

Ritratto di Luck

Non funziona

Ciao,
sto sbagliando qualcosa credo ma non mi funziona.
Ho provato a copiarlo passo passo dagli esempi qui sopra spiegati ed a scaricarlo e metterlo nel browser;
nel primo caso mi da pagina bianca, nel secondo(stranissimo) mi fa vedere il codice sorgente nel browser senza lavorarlo.
Dove sbaglio?
Grazie comunque per i tuoi preziosi tutorial!

Ritratto di mavimo

Cosa vuol dire metterlo nel

Cosa vuol dire metterlo nel browser? Questo codice è quello di un modulo e quindi va caricato da FTP e abilitato da pannello di amministrazione, puoi indicare esattamente che passaggi hai fatto?

Ritratto di Lumen

Form tabellare usando cck

Ciao! Grazie innanzitutto per l'esempio.

Io - usando cck - avrei la necessità di creare un form per la compilazione di un timesheet strutturato in questo modo:
A) un'intestazione con Cod. Operatore, nome operatore, N. reparto e Data.

B) una tabella di 8 colonne e tot righe strutturato come segue:

  • 1a colonna intestazione "cliente" compilabile sotto nelle righe con una select che mi pesca dalla taxonomy "clienti";
  • 2a colonna "Reparto", idem con taxonomy reparto;
  • 3a colonna "Codice attività" compilabile sotto con un conditional field che mi pesca da una select dei codici relativi al reparto scelto nella colonna 2;
  • 4a colonna "Fase" con un integer;
  • 5a colonna Quantità, idem;
  • 6a colonna "Ore da" un campo da cui selezionare un orario o un textfield;
  • 7a colonna "a" idem;
  • 8a colonna "Descrizione" è un textfield.

Mi servirebbe capire se esiste un modulo per la ver. 5x che renda possibile mettere in questa forma tabellare diversi tipi di campi, e magari (sarebbe il massimo) un altro che oltre a rendere delle tabelle riepilogative dei risultati li possa esportare in formati xls come fa il webform report (ma immagino che lì ci penserà views...?)

Grazie fin da ora!

Ritratto di mavimo

Che io sappia non esiste

Che io sappia non esiste quello che chiedi ne per la 5 ne per la 6, ci sono alcuni moduli che cercano di approssimare quello che vuoi ottenere tu, ma mi pare una cosa abbastanza "particolare" per cui probabilmente dovrai costruirti dei moduli ad hoc, se trovi altre soluzioni fai un fischio :)

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