Show taxonomy terms Grouped By Taxonomy Parent
User login
Lately I was assigned with the task to display all terms assigned to a node, grouped by their parent. To better explain this, let's say for example that we have the Vocabulary 1 assigned to Content Type A, with the following terms:
Parent 1
-- term 1
-- term 2
-- term 3
Parent 2
-- term 4
-- term 5
Parent 3
-- term 6
-- term 7
etc.
Nodes from Content Type 1 have various terms assigned. For example, node/143 has the following terms assigned: term 2, term 4, and terms 6 & 7.
The requirement was to display the node like this:
Node Title
Node Content
Parent 1
-- term 2
Parent 2
-- term 4
Parent 3
-- term 6
-- term 7
In order to achieve the above, I created a View (Node). In this View, I added a relationship of Parent Term. Then, in the fields, I added Taxonomy: Term, select the Parent Term relationship, and excluded it from display. (This would be the Parent label). Then, I once again added the field Taxonomy: Term. (This would be the terms). This would display the Parent of each term as well, like Parent 1: term 1. Sweet.
So now for the groupping part:
In the Style option (under the basic settings), by little gear icon, I selected the Group By: Taxonomy: Term (The field that holds the relationship). You can select any format you would like, as long as you adjust the groupping options accordignly.
*If the groupping is not working as expected, make sure to disable the Themer module, as it messes with the output.*
The view is ready and works like a charm :) All that's left, is to attach it to the node. There are many ways to do this, including a number of modules, but I preffered to do it with some code.
I copied the node.tpl.php and renamed it to node-content-type-1.tpl.php, to override the output of the node for this particular content type. I deleted the section where terms are printed, and programmatically inserted the view, with the node id argument, using:
<?php
$viewName = 'views_name';
$display_id = 'default';
print views_embed_view($viewName, $display_id, $node->nid);
?>
And that's it :) The terms of the nodes are displayed under each node, and groupped by the term parent.