A Drupal theme table example

Summary: A Drupal "theme table" example, where I show how to generate an HTML table from a Drupal module, using the Drupal theme function (and specifically not the theme_table function).

I was working on a new Drupal 7 application yesterday, developing a module where I need to display a table in my Drupal module, and I couldn't find any good Drupal table examples, so I thought I'd share my working code here. This code isn't very good yet, but it does show a "Drupal theme table" example, i.e., how to display a table in Drupal by properly calling the theme function.

Without much discussion, here's my current Drupal theme table example. While I'm only on Day 1 of development, this code comes directly from a Drupal module named 'Sleetmute', and a file named sleetmute.module:

<?php
# a hook_menu implementation
function sleetmute_menu() {
  $items = array();

  # my drupal table list view menu item
  # this first line is the url ('projects')
  $items['projects'] = array(
    'title' => t('Your Projects'),
    'description' => 'Your Sleetmute FPA Projects',
    'page callback' => 'projects_list',
    'access arguments' => array('access content'),
    'type' => MENU_NORMAL_ITEM,
  );
  return $items;
}

function projects_list() {
  $header = array('Cell 1', 'Cell 2');
  $data = array( 
            array('A', 'B'),
            array('C', 'D')
  );
  $output = theme('table', 
           array('header' => $header, 
                  'rows' => $data ));
  return $output;
}

I'm not an expert Drupal module developer by any stretch of the imagination, but I do know that code works. It displays a simple HTML table with a header row and two data rows. Note that I call the Drupal theme function here with the 'table' attribute, and not the theme_table function. I do know that this approach is correct.

In that example I replaced my actual SQL database call with simple static table data. In the code below I'll show the actual Drupal table code, including the SQL query.

A Drupal theme table example with a database query

As a more 'real world' Drupal theme table example, here's the actual code I use to generate my HTML table, using a SQL query to get the data I need:

function get_user_id() {
  global $user;
  return $user->uid;
}

function projects_list() {
  $header = array('ID', 'Type', 'Name');
  $data = array();

  # set the database table
  $query = db_select('sleet_projects', 'p');

  # configure the query
  $query->condition('user_id', get_user_id())
        ->fields('p', array('id', 'project_count_type', 'name'));

  # execute the query
  $results = $query->execute();

  foreach ($results as $row) {
  $data[] = array($row->id, 
                  $row->project_count_type, 
                  $row->name);
  }
  $output = theme('table', 
                  array('header' => $header, 
  	                'rows' => $data ));
  return $output;
}

This example does not currently show how to add a pager to a Drupal table, but I hope to get that working later today.

Also, I should mention that this code works on Drupal 7, and will not work on Drupal 6, primarily because of the SQL functions I've used.

Drupal theme docs

As a relatively new Drupal module developer, I don't understand the Drupal theme function docs, but that's a link to them. This link on default theme implementations may also be helpful, but again, at the moment I don't understand the intent of that document. (Once I understand this process better I'll be glad to update that page, but at the moment I think that page can be seriously improved by including one or two Drupal theme function examples.)

In the meantime, if you need a Drupal theme table example, I hope this helps get you started in the right direction.