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:

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