How to create a custom module (to a bloc, page ...) using a twig template ?
Step 1. Create your module and Block (/tutoriels/107/create-a-simple-block-programmatically)
Step 2. Add your template usin hook_theme()
(here module name = clock)
Example:
function clock_theme($existing, $type, $theme, $path) {
return array(
'clock' => array(
'variables' => array(
'icon' => NULL,
'title' => NULL,
'time' => NULL,
),
),
);
}
You cal also use template_preprocess to handle your template.
Example:
function template_preprocess_clock(&$variables) {
//Add global classes
$variables['attributes']['class'][] = 'my_clock';
}
Add theme hook suggestions. Example from multivaluefield.module)
/**
* Implements hook_theme_suggestions_HOOK().
* Add template suggestions.
*/
function multivaluefield_theme_suggestions_multivaluefield($variables) {
$suggestions = array();
$sett = $variables['settings'];
$suggestions[] = 'multivaluefield__' . $sett['#field_name'];
$suggestions[] = 'multivaluefield__' . $sett['#entity_type'];
$suggestions[] = 'multivaluefield__' . $sett['#bundle'];
$suggestions[] = 'multivaluefield__' . $sett['#field_name'] . '__' . $sett['#entity_type'] . '__' . $sett['#bundle'];
return $suggestions;
}
Step 3. Create the twig template in clock/templates/clock.html.twig
Example:
<div {{ attributes }}>
{% if icon %}
<img class='clock_block_icon' src='{{ icon }}' alt='{{ title }}'/>
{% endif %}
<div class="clock_block_title" >{{ title }}</div>
<div class="clock_block" data-time="{{ time }}"></div>
</div>
Step 4. Add the template to your block or page, using the render array
Example :
return array(
'#theme' => 'clock',
'#icon' => $icon,
'#title' => 'The Title',
'#time' => "The Time is : ".date('H:i:s'),
);
Finally, don't forget to clear cache and your blocked will use the new template.
Another example of add a template suggestions.
1. find the theme preprocess.
For that, activate the theme debug then analyse the code. For example, for the 'views_view_summary' you can find something like :
<!-- THEME DEBUG -->
<!-- CALL: theme('views_view_summary_unformatted') -->
<!-- FILE NAME SUGGESTIONS:
* views-view-summary-unformatted-view-theviewname-block-1.tpl.php
* views-view-summary-unformatted-view-theviewname.tpl.php
x views-view-summary-unformatted.tpl.php
-->
Here, the theme function is "views_view_summary_unformatted" so preprocess is THEME_preprocess_views_view_summary_unformatted.
2. In the template.php of your theme, create new function THEME_preprocess_views_view_summary_unformatted and add the new template suggestion.
Example:
function mytheme_preprocess_views_view_summary_unformatted(&$variables){
$variables['theme_hook_suggestions'][] = 'my_custom_template';
}
Comments2
On what place do I have to enter the render array from step 4?
Thank you for the tutorial! On what place do I have to enter the render array from step 4?
On a page, block ...
Hi,
You can use return your render array on a page, block ... instead of :
return array('#markup' => 'Your html');
Page example, Block example