array('Cell 1', array('data' => 'Cell 2', 'colspan' => 2)), 'class' => array('funky') * ) * ); * @endcode * - footer: An array containing the table footer. Each element of the array * can be either a localized string or an associative array with the * following keys: * - "data": The localized title of the table column. * - "field": The database field represented in the table column (required * if user is to be able to sort on this column). * - "sort": A default sort order for this column ("asc" or "desc"). Only * one column should be given a default sort order because table sorting * only applies to one column at a time. * - Any HTML attributes, such as "colspan", to apply to the column footer * cell. * - attributes: An array of HTML attributes to apply to the table tag. * - caption: A localized string to use for the tag. * - colgroups: An array of column groups. Each element of the array can be * either: * - An array of columns, each of which is an associative array of HTML * attributes applied to the COL element. * - An array of attributes applied to the COLGROUP element, which must * include a "data" attribute. To add attributes to COL elements, set the * "data" attribute with an array of columns, each of which is an * associative array of HTML attributes. * Here's an example for $colgroup: * @code * $colgroup = array( * // COLGROUP with one COL element. * array( * array( * 'class' => array('funky'), // Attribute for the COL element. * ), * ), * // Colgroup with attributes and inner COL elements. * array( * 'data' => array( * array( * 'class' => array('funky'), // Attribute for the COL element. * ), * ), * 'class' => array('jazzy'), // Attribute for the COLGROUP element. * ), * ); * @endcode * These optional tags are used to group and set properties on columns * within a table. For example, one may easily group three columns and * apply same background style to all. * - sticky: Use a "sticky" table header. * - empty: The message to display in an extra row if table does not have any * rows. * * @return string * The constructed HTML. * * @see theme_table() * * @ingroup theme_functions */ function bootstrap_table($variables) { $header = $variables['header']; $rows = $variables['rows']; $footer = $variables['footer']; $attributes = $variables['attributes']; $caption = $variables['caption']; $colgroups = $variables['colgroups']; $sticky = $variables['sticky']; $empty = $variables['empty']; $responsive = $variables['responsive']; // Add sticky headers, if applicable. if (count($header) && $sticky) { drupal_add_js('misc/tableheader.js'); // Add 'sticky-enabled' class to the table to identify it for JS. // This is needed to target tables constructed by this function. $attributes['class'][] = 'sticky-enabled'; } $output = ''; if ($responsive) { $output .= "
\n"; } $output .= '\n"; if (isset($caption)) { $output .= '' . $caption . "\n"; } // Format the table columns: if (count($colgroups)) { foreach ($colgroups as $number => $colgroup) { $attributes = array(); // Check if we're dealing with a simple or complex column. if (isset($colgroup['data'])) { foreach ($colgroup as $key => $value) { if ($key == 'data') { $cols = $value; } else { $attributes[$key] = $value; } } } else { $cols = $colgroup; } // Build colgroup. if (is_array($cols) && count($cols)) { $output .= ' '; $i = 0; foreach ($cols as $col) { $output .= ' '; } $output .= " \n"; } else { $output .= ' \n"; } } } // Add the 'empty' row message if available. if (!count($rows) && $empty) { $header_count = 0; foreach ($header as $header_cell) { if (is_array($header_cell)) { $header_count += isset($header_cell['colspan']) ? $header_cell['colspan'] : 1; } else { $header_count++; } } $rows[] = array( array( 'data' => $empty, 'colspan' => $header_count, 'class' => array('empty', 'message'), ), ); } // Format the table header: if (count($header)) { $ts = tablesort_init($header); // HTML requires that the thead tag has tr tags in it followed by tbody // tags. Using ternary operator to check and see if we have any rows. $output .= (count($rows) ? ' ' : ' '); foreach ($header as $cell) { $cell = tablesort_header($cell, $header, $ts); $output .= _theme_table_cell($cell, TRUE); } // Using ternary operator to close the tags based on whether or not there // are rows. $output .= (count($rows) ? " \n" : "\n"); } else { $ts = array(); } // Format the table rows: if (count($rows)) { $output .= "\n"; foreach ($rows as $row) { // Check if we're dealing with a simple or complex row. if (isset($row['data'])) { $cells = $row['data']; // Set the attributes array and exclude 'data' and 'no_striping'. $attributes = $row; unset($attributes['data']); unset($attributes['no_striping']); } else { $cells = $row; $attributes = array(); } if (count($cells)) { // Build row. $output .= ' '; $i = 0; foreach ($cells as $cell) { $cell = tablesort_cell($cell, $header, $ts, $i++); $output .= _theme_table_cell($cell); } $output .= " \n"; } } $output .= "\n"; } // Format the table footer: if (count($footer)) { $output .= "\n"; foreach ($footer as $row) { // Check if we're dealing with a simple or complex row. if (isset($row['data'])) { $cells = $row['data']; // Set the attributes array and exclude 'data'. $attributes = $row; unset($attributes['data']); } else { $cells = $row; $attributes = array(); } if (count($cells)) { // Build row. $output .= ' '; $i = 0; foreach ($cells as $cell) { $cell = tablesort_cell($cell, $header, $ts, $i++); $output .= _theme_table_cell($cell); } $output .= " \n"; } } // Using ternary operator to close the tags based on whether or not there // are rows. $output .= "\n"; } $output .= "\n"; if ($responsive) { $output .= "
\n"; } return $output; }