Drupal 6&7 Custom Template And Invoke Module
<?php
$block = module_invoke('module_name', 'block', 'view', 0);
print $block['content'];
?>
How to create a module block?
Drupal has slightly changed its Theme API calls between Drupal 6 and Drupal 7. This small change can cause you (as it has me) some hours of grief at an apparently innocuous and undocumented feature.
the drupal 6 way
The old, Drupal 6 way of declaring a themable function was to do the following:
1
2
3
4
5
6
7
8
9
10
11
12
function mymodule_theme($existing, $type, $theme, $path) {
return array(
'mymodule_theme_function' => array(
'template' => 'mymodule_theme_function',
'arguments' => array(
'argument_1' => NULL,
'argument_2' => NULL,
'argument_n' => NULL,
)
),
);
}
Throughout your code, when you wanted to call that theming function, you would call something like:
1
2
3
4
5
$themed_content = theme('mymodule_theme_function',
'Argument 1 Text Sample',
'Argument 2 Text',
'Argument 3 number or image'
);
The declaration would go and look for the mymodule_theme_function.tpl.php in the same folder as your module and render the contents according to that template.
the drupal 7 way
Doing it in Drupal 7 has slightly changed the names and ordering of the parameters:
1
2
3
4
5
6
7
8
9
10
11
12
function my_d7_module_theme($existing, $type, $theme, $path) {
return array(
'my_d7_module_theme_function' => array(
'template' => 'my_d7_module_theme_function',
'variables' => array(
'argument_1' => NULL,
'argument_2' => NULL,
'argument_n' => NULL,
)
),
);
}
The first note is that it's now called 'variables' in the hook_theme() override. If you use the old name 'arguments', then you will likely see error messages come up in your Drupal log:
1
2
3
4
Notice: Undefined index: render element in theme() (line 811 of /var/www/includes/theme.inc)
Notice: Undefined variable: argument_1 in include() (line 10 of /var/www/sites/all/modules/my_d7_module/my_d7_module_theme_function.tpl.php)
Notice: Undefined variable: argument_2 in include() (line 13 of /var/www/sites/all/modules/my_d7_module/my_d7_module_theme_function.tpl.php)
Notice: Undefined variable: argument_n in include() (line 17 of /var/www/sites/all/modules/my_d7_module/my_d7_module_theme_function.tpl.php)
As such, they need to be referred to in an array key as variables in order to be passed to the final template.
You can attempt to then call this in a similar way to Drupal 6, such as:
1
2
3
4
5
$themed_content = theme('my_d7_module_theme_function',
'Argument 1 Text Sample',
'Argument 2 Text',
'Argument 3 number or image'
);
The first thing you will notice is that you only get 'A' in your function for argument_1 and that the other arguments are null.
This is due to how the new, improved and Drupal 7 version of the theme() function needs to be called:
1
2
3
4
5
$themed_content = theme('my_d7_module_theme_function', array(
"argument_1" => 'Argument 1 Text Sample',
"argument_2" => 'Argument 2 Text',
"argument_n" => 'Argument 3 number or image',
));
As you can see from the code above, the theme function takes an array as its second parameter. This array is a keyed array with the key being the name of the variable that was defined in the my_d7_module_theme(...) function and the value is the data that you want to assign to that variable and pass to the template.