Table view with rows/columns switched

Submitted by ravisagar on Wed, 12/02/2009 - 09:07

These days I am working on my other site to build the database of all the colleges affiliated to GGSIPU. I created a Custom Content Type to have various fields like college address, phone, fax, email, rating, etc. During the counselling time the students wants to compare various colleges based on various parameters like infrastructure, campus and other things. Now I wanted to create a view where a table is shown with the names of the colleges in the header and these parameters on rows.

This views snippet allows you to render a tableview with columns and rows switched. Suppose you have the following output:

Title | Price 1 | Price 2
Node #1 | $10 | $20
Node #2 | $15 | $25

but what you really want is the node titles displayed in the header, and the prices as the rows:

| Node #1 | Node #2
Price 1 | $10 | $15
Price 2 | $20 | $25

I created a view table, but obviously it showed the college names in the rows as it is the dynamic part. I searched around a lot on drupal and google and found this amazing piece of code that transpose the rows/columns.

You just need to replace YOURTHEME with the name of the theme and VIEWNAME with the view name and that's it!

function YOURTHEME_views_view_table_VIEWNAME($view, $nodes, $type) {
$fields = _views_get_fields();

// Table header
// Reserve first column for labels
$header = array('');
// Render first field of all nodes
foreach ($nodes as $node) {
$cell['data'] = views_theme_field('views_handle_field', $view->field[0]['queryname'], $fields, $view->field[0], $node, $view);
$cell['class'] = 'view-cell-header '. views_css_safe('view-field-'. $view->field[0]['queryname']);
$header[] = $cell;
// Nuke first field, so it won't get displayed in the rows anymore

// Table rows
$rows = array();
foreach ($view->field as $field) {
$row = array();
// First column is just the label
$cell['data'] = $field['label'];
$cell['class'] = views_css_safe('view-field-'. $field['queryname']);
$row[] = $cell;
// Add corresponding column for all nodes
foreach ($nodes as $node) {
$cell['data'] = views_theme_field('views_handle_field', $field['queryname'], $fields, $field, $node, $view);
$cell['class'] = views_css_safe('view-field-'. $field['queryname']);
$row[] = $cell;
$rows[] = $row;

return theme('table', $header, $rows, array('class' => 'show-table'));

It worked like a charm. If you are using sub theme of zen then replace YOURTHEME with "zen" instead of the name of your sub theme.

What next?
Now I want the students to be able to select at least 2 but maximum of 4 colleges using a list box and the view should display only those selected colleges. By exposing filters it creates a text box but not the list box because when you expose a text field it is becomes text field but when you expose a "select list text field" it becomes list box when you expose them.

There must be some way to achieve this.

Drupal Rocks!