[D5 - Beta] Checkbox su più colonne

2 contenuti / 0 new
Ultimo contenuto
[D5 - Beta] Checkbox su più colonne

Oggetto:Realizzazione di una lista di checkbox all'interno di un form ordinate su più colonne.

DESCRIZIONE:
Premetto che non è farina del mio sacco, la trovai in giro qualche mese fa, e l'autore se vedrà questo articolo mi perdonerà se non metto il link al suo sito (nn mi ricordo nemmeno dove l'ho trovato).

Molte volte mi sono trovato a dover gestire un checkbox con molte scelte e ad avere quindi una lunga lista di campi uno di seguito all'altro ottenendo un form lungo un chilometro.
Questo piccolo HOWTO genera un nuovo type per i checkboxes da inserire all'interno del proprio modulo.

HOWTO
1) Nel proprio file .module inserire la seguente funzione:

<?php
/**
 * param array $element
 *   Elemento fapi da modificare.
 *
 * return array
 *   Elemento modificato.
 */
function _expand_checkbox_columns($element) {
 
$value = is_array($element['#value']) ? $element['#value'] : array();
 
$element['#type'] = 'checkboxes';
 
$element['#tree'] = TRUE;
  if (
count($element['#options']) > 0) {
    if (!isset(
$element['#default_value']) || $element['#default_value'] == 0) {
     
$element['#default_value'] = array();
    }
    foreach (
$element['#options'] as $key => $choice) {
     
$class = $column && ($column % $element['#columns']) ? 'checkbox-columns' : 'checkbox-columns-clear';
      if (!isset(
$element[$key])) {
       
$element[$key] = array(
         
'#type' => 'checkbox',
         
'#processed' => TRUE,
         
'#title' => $choice,
         
'#default_value' => in_array($key, $value),
         
'#attributes' => $element['#attributes'],
         
'#prefix' => '<div class="' . $class . '">',
         
'#suffix' => '</div>',
        );
      }
     
$column++;
    }
  }
  return
$element;
}
/**
 * Implementation of hook_elements().
 */
function nomemodulo_elements() {
 
$type['checkbox_columns'] = array(
   
'#input' => TRUE,
   
'#process' => array(
     
'_expand_checkbox_columns' => array(),
    ),
   
'#tree' => TRUE,
  );
  return
$type;
}
?>

Attenzione: sostituire la scritta "nomemodulo" con il nome del tuo modulo

2) All'interno del form che si vuole generare potete utilizzare il type Checkbox_column come da esempio:

<?php
//....
 
$numero_colonne = 3;
 
$options = array(
   
'en'=>t('English (US)'),
   
'es'=>t('Español'),
   
'fr'=>t('Français'),
   
'it'=>t('Italiano'),
   
'ar'=>t('Arabic'),
   
'ur'=>t('Urdu'),
  );
 
$results = db_query("SELECT lang FROM {newsletter_settings_lang};");
 
$i = 0;
 
$checked = array();
  while(
$data = db_fetch_object($results)) {
   
$checked[$i] = $data->lang;
   
$i++;
  }
 
$form['lingua'] = array(
   
'#type' => 'checkbox_columns',
   
'#title' => t('Seleziona le lingue abilitate per le newsletter'),
   
'#columns' => $numero_colonne,
   
'#options' => $options,
   
'#suffix' => '<br style="clear:both;"/>',
   
'#default_value' => $checked
 
);
 
// ....
?>

Infine bisogna inserire il seguente css all'interno dei propri stili (ad esempio in style.css del proprio tema)

.checkbox-columns .form-item {
  width: 15em;
  margin-right: 10px;
  float: left;
  display: inline;
}
.checkbox-columns-clear .form-item {
  width: 15em;
  margin-right: 10px;
  clear: left;
  float: left;
  display: inline;
}

Questo è il risultato finale:
checkbox_multipli.png

Per Drupal 6, c'è un modulo: http://drupal.org/project/multicolumncheckboxesradios. Non l'ho testato.

Più imparo, più dubito.