How to use hook_theme and hook_node_load in drupal 7

Posted on: Aug 10th 2011

Recently I had a requirement of having social networking icons like Facebook share, Retweet, Google plus on all node pages of a site. So, I decided to have my own SNS module and use hook_theme() function to theme my variables.

That is I don't have to put any SNS codes in the node tpl and everything can be managed from one place.

So, the first thing is the hook_node_load() function (Here I assume that the name of the module is "example").

function example_node_load($nodes, $types) {
	 foreach ($nodes as $node) {
		$node->myvar = theme('myvar',array(
			'mysite' => "http://www.amitavroy.com",
		));
	}
}


What are we doing here: We are using the hook_node_load to insert a variable myvar to the main $node object when the node is loading. The code from line number 3 to 5 tells Drupal that it needs to add a variable myvar to the $node object using the theme 'myvar' and I am passing a variable to the theme function 'mysite' which has the link of my website.

So, now we use the hook_theme() function.

function example_theme() {
	return array(
		 'myvar' => array(
			 'template' => 'myvar',
		 )
	);
}


As per line number 4 of this function, Drupal knows that the variable 'myvar' which we are inserting to the $node object should be rendered using the template 'myvar'. Now, this is a convention. The template name i.e. 'template' => 'myvar' should be same as the name of the variable i.e. on line 3.

Once this is done, we can create a myvar.tpl.php file inside the module folder and handle how the variable will be rendered.

 

This is a standard way of doing things the Drupal way. I could have easily printed this in the node tpl. But, somehow custom codes in the node.tpl.php is not a very good idea. Especially if your site has quite a few node tpls.

Plus in this fashion other module have control over how this variable will behave and themer's life will be a lot easy because if there is any styling changes required, they just have to look for one tpl to modify. :)