Tengo un formulario personalizado que muestra un elemento de formulario de aproximadamente 2 docenas de casillas de verificación. Me gustaría generarlos 3 por fila, en una tabla si es posible. ¿Cómo puedo hacer eso?
$form['preference'] = array(
'#type' => 'checkboxes',
'#default_value' => 1373,
'#required' => TRUE,
'#title' => 'Choose all that apply',
'#options' => $preference_options,
'#prefix' => '<div id="preference-options">',
'#suffix' => '</div>',
);
Primero, defina una función de tema personalizada con hook_theme () y asígnela al elemento de formulario con #theme.
En esa función de tema, puede usar expand_checkboxes para convertirlo en una matriz de elementos de casilla de verificación separados. Luego, reestructurarlo en una matriz con 3 elementos cada uno, renderizar las casillas de verificación y pasarlo a theme_table ().
Algo como esto, todo no probado.
function theme_yourmodule_preference($element) {
$elements = element_children(expand_checkboxes($element));
$rows = array();
for ($i = 0; $i < count($elements); $i += 3) {
$row = array(drupal_render($elements[$i]));
// The following two might not always exist, check first.
if (isset($elements[$i + 1]) {
$row[] = drupal_render($elements[$i + 1]);
}
if (isset($elements[$i + 2]) {
$row[] = drupal_render($elements[$i + 2]);
}
$rows[] = $row;
}
return theme('table', array(), $rows);
}
Adapté la solución de Berdir para mostrar en columnas y Drupal 7. Pensé en compartirlo.
function yourmodule_theme() {
return array
(
'form_yourmodule_form' => array
(
'render element' => 'form'
),
);
}
function theme_form_yourmodule_form($variables) {
$form = $variables['form'];
$element = $form['checkboxelement'];
unset($form['checkboxelement']);
$elements = element_children(form_process_checkboxes($element));
$colnr = 3; // set nr of columns here
$itemCount = count($elements);
$rowCount = $itemCount / $colnr;
if (!is_int($rowCount))
$rowCount = round((($itemCount / $colnr) + 0.5), 0, PHP_ROUND_HALF_UP);
$rows = array();
for ($i = 0; $i < $rowCount; $i++) {
$row = array();
for ($col = 0; $col < $colnr; $col++) {
if (isset($elements[$i + $rowCount * $col]))
$row[] = drupal_render($element[$elements[$i + $rowCount * $col]]);
}
$rows[] = $row;
}
$variable = array(
'header' => array(),
'rows' => $rows,
'attributes' => array('class' => 'checkbox_columns'),
'caption' => NULL,
'colgroups' => NULL,
'sticky' => NULL,
'empty' => NULL,
);
$output = theme_table($variable);
$output .= drupal_render_children($form);
return $output;
}
Encontré una solución aún más fácil: ¡hay un módulo para esto! Radios de casillas de verificación de varias columnas