I'm struggling to get a render-array constructed, and I think it's because of how theme_item_list
works. I would be grateful if anyone could help find the problem (or tell me to implement it without item_list!)
The context: This function is called from my module's
hook_block_view()
to render the content of the block. The module is an example module showing how to use a new API. I hope nothing of that is needed to answer this point, except that these calls are not made from a theme.
The code I have is:
function example_render() {
$block = array();
/* fill $providers[] ... */
$items = array();
foreach ($providers as $metric => $provider) {
$value = $provider['value'];
$class_link = $provider['name'];
$name_link = $provider['name'];
// Construct a renderable array wrapper for the template invocation.
$items[$metric] = array(
'#type' => 'container',
'#attributes' => array('class' => array('provider')),
'info' => array(
'providername' => array(
'#prefix' => '<span class="provider-name">',
'#markup' => $name_link,
'#suffix' => '</span>',
),
'providervalue' => array(
'#prefix' => '<span class="metric-value">',
'#markup' => $value,
'#suffix' => '</span>',
),
'metricname' => array(
'#prefix' => '<span class="metric-name">',
'#markup' => $class_link,
'#suffix' => '</span>',
),
),
);
}
// Finally, bring it all together.. a container with the via text then a list
// of the providers.
$block['content'] = array(
'#type' => 'container',
'#attributes' => array('class' => array('example')),
'ttl_text' => array(
'#prefix' => '<h3 class="metrics-title">',
'#markup' => $record['title'],
'#suffix' => '</h3>',
),
'via_text' => array(
'#prefix' => '<span class="metrics-via">',
'#markup' => $via_text,
'#suffix' => '</span>',
),
'metrics' => array(
'#items' => $items,
'#theme' => 'item_list',
'#attributes' => array(
'class' => 'providers-list',
),
),
);
return $block;
}
and this is what I get when run with 9 items in the list:
<div class="example"><h3 class="metrics-title">A bacterial sulfonolipid triggers multicellular development in the closest living relatives of animals</h3><span class="metrics-via">via <a href="http://alm.svr.elifesciences.org/articles/info:doi/10.7554/eLife.00013" external="1" target="_blank">Lagotto article information</a> courtesy of <a href="http://articlemetrics.github.io/" external="1" target="_blank">Lagotto</a></span><div class="item-list"><ul class="providers-list"><li #type="container" #attributes="Array" info="Array Array Array" class="first"></li>
<li #type="container" #attributes="Array" info="Array Array Array"></li>
<li #type="container" #attributes="Array" info="Array Array Array"></li>
<li #type="container" #attributes="Array" info="Array Array Array"></li>
<li #type="container" #attributes="Array" info="Array Array Array"></li>
<li #type="container" #attributes="Array" info="Array Array Array"></li>
<li #type="container" #attributes="Array" info="Array Array Array"></li>
<li #type="container" #attributes="Array" info="Array Array Array"></li>
<li #type="container" #attributes="Array" info="Array Array Array" class="last"></li>
</ul></div></div>
not very inspiring!
The three 'Array' under 'info' in the html here obviously correspond to the providername/providervalue/metricname arrays in the code i.e. the $items array isn't being interpreted as a render array at all.
How can I make this work?