| 7 form.inc | theme_tableselect($variables) |
| 8 form.inc | theme_tableselect($variables) |
Returns HTML for a table with radio buttons or checkboxes.
An example of per-row options:
$options = array();
$options[0]['title'] = "A red row"
$options[0]['#attributes'] = array ('class' => array('red-row'));
$options[1]['title'] = "A blue row"
$options[1]['#attributes'] = array ('class' => array('blue-row'));
$form['myselector'] = array (
'#type' => 'tableselect',
'#title' => 'My Selector'
'#options' => $options,
);
Parameters
$variables: An associative array containing:
- element: An associative array containing the properties and children of the tableselect element. Properties used: #header, #options, #empty, and #js_select. The #options property is an array of selection options; each array element of #options is an array of properties. These properties can include #attributes, which is added to the table row's HTML attributes; see theme_table().
Related topics
File
- includes/
form.inc, line 3266 - Functions for form and batch generation and processing.
Code
function theme_tableselect($variables) {
$element = $variables['element'];
$rows = array();
$header = $element['#header'];
if (!empty($element['#options'])) {
// Generate a table row for each selectable item in #options.
foreach (element_children($element) as $key) {
$row = array();
$row['data'] = array();
if (isset($element['#options'][$key]['#attributes'])) {
$row += $element['#options'][$key]['#attributes'];
}
// Render the checkbox / radio element.
$row['data'][] = drupal_render($element[$key]);
// As theme_table only maps header and row columns by order, create the
// correct order by iterating over the header fields.
foreach ($element['#header'] as $fieldname => $title) {
$row['data'][] = $element['#options'][$key][$fieldname];
}
$rows[] = $row;
}
// Add an empty header or a "Select all" checkbox to provide room for the
// checkboxes/radios in the first table column.
if ($element['#js_select']) {
// Add a "Select all" checkbox.
drupal_add_js('misc/tableselect.js');
array_unshift($header, array('class' => array('select-all')));
}
else {
// Add an empty header when radio buttons are displayed or a "Select all"
// checkbox is not desired.
array_unshift($header, '');
}
}
return theme('table', array('header' => $header, 'rows' => $rows, 'empty' => $element['#empty'], 'attributes' => $element['#attributes']));
}
Login or register to post comments
Comments
How do I disable individual rows in tableselect or set defaults?
The tableselect template:
<?php
$header = array();
$options = array();
$default_value = array();
$IsCheckbox = true;
$header = array(
'title' => t('Column title')
);
$options[0]['title'] = "A red row";
$options[0]['#attributes'] = array ('class' => array('red-row'));
$options[1]['title'] = "A blue row";
$options[1]['#attributes'] = array ('class' => array('blue-row'));
if($IsCheckbox)
{
/* Checkbox only */
$default_value[0] = true;
$default_value[1] = false;
}
else
{
/* Radiobox only */
$default_value = '0';
}
$form['myselector'] = array (
'#type' => 'tableselect',
'#title' => 'My Selector',
'#header' => $header,
'#options' => $options,
'#multiple' => $IsCheckbox,
'#default_value' => $default_value
);
?>
Disable rows:
<?php/* Using foreach: */
foreach( $options as $key => $value )
{
$form['myselector'][$key]['#disabled'] = true;
}
/* Individual: */
$form['myselector'][0]['#disabled'] = true;
$form['myselector'][1]['#disabled'] = true;
?>
* Disable block must go after $form['myselector'] = aray(...) initialization block;
** Please note, that it is checkbox/radio element is actually being disabled;
*** Drupal 7 disable rows tableselect.
Disabling -- a clearer description
To make it clearer, when you disable rows:
You can't do it while you assemble the rows. You have to iterate through your tableselect after setting it up and set ['table'][$key]['#disabled'] for each row you want to disable then.
Don't use ['#disable'] = FALSE, any setting will disable the row, even FALSE. Just don't specify it at all if the row should be selectable. The checkbox/radio button will be removed rather than disabled, actually.
Sticky headers
In theme_table there is an variable that you can pass to disable sticky headers like so:
<?php$form['table'] = array(
'#type' => 'table',
'#rows' => $rows,
'#header' => $header,
'#sticky' => FALSE,
);
?>
Unfortunately there's no way of passing that sticky variable through theme_tableselect so the least hacky solution in my opinion is to add the class tableheader-processed to the table select (which will trick the sticky header javascript into thinking that the table already has a sticky header).
Resulting code would be:
<?php$form['table'] = array(
'#type' => 'tableselect',
'#header' => $header,
'#options' => $options,
'#default_value' => $value,
'#attributes' => array(
'class' => array(
'tableheader-processed'
),
),
);
?>
Hopefully this helps someone in the future :)
Views
Can someone tell me how to use tableselect with views? I am trying to add checkboxes next to every row.
Thanks!
If I'm not mistaken there's
If I'm not mistaken there's no way to do that using Views alone. You'd have to use Views Bulk Operations (plus custom actions if needed). Module here: http://drupal.org/project/views_bulk_operations