我在这个问题上已经结束了,所以我希望有人能指出我正确的方向。我有一个名为portfolio_item的内容类型,其中包含一个名为field_portfolio_description的文本字段。我试图在不使用Views的情况下打印该字段存在的每个值的列表。这是我目前在template.php文件中的preprocess_page函数:
function blocks_preprocess_page(&$vars, $hook) {
$node = menu_get_object();
if ($node->type == 'portfolio_item') {
$portfolios = field_get_items('node', $node, 'field_portfolio_description');
$items = array();
foreach ($portfolios as $folio) {
$items['data'] = $folio['value'];
}
$vars['description'] = theme('item_list', array('items' => $items));
}
}
最后,我尝试使用以下内容在我的页面模板上调用它:
<?php print render($description); ?>
我尝试了几种不同的变化无济于事。任何帮助/建议将不胜感激。
更新:好吧我终于得到了一些调试结果。我发现了以下错误:注意:试图获得在blocks_preprocess_page()非对象的属性(线/sites/all/themes/blocks/template.php的24),这就是线24:
if ($node->type == 'portfolio_item') {
portfolio_item是内容类型的计算机名称,因此不是问题。
更新2:好的,所以我把这个函数一直剥离到$ node = menu_get_object();并且执行了var_dump(dpm无效)并发现非对象错误导致在访问页面时输出中没有portfolio_item。 portfolio_item出现的唯一时间是访问实际的投资组合项目。
因为我会以完全错误的方式解决这个问题。它似乎也不允许我显示该字段中项目的简单列表。
我稍后可能会再次访问,如果我找到了解决方案,我一定会发布最终代码。如果其他人有想法,我会再次尝试。再次感谢那些插话的人。
答案 0 :(得分:0)
试试这个:
$node = menu_get_object();
if ($node->type == 'portfolio_item') {
$portfolios = field_get_items('node', $node, 'field_portfolio_description');
$vars['description'] = array(
'#theme' => 'item_list',
'#items' => $portfolios
);
}
要使用渲染功能,必须将渲染数组传递给它。 field_get_items函数已返回数组或可渲染元素。然后,您所要做的就是在正确结构化的渲染数组中传递其返回值。渲染函数然后将其转换为标记。
theme('item_list', array('items' => $items));
此主题函数调用返回标记,因此您无需通过render函数传递它。您的代码无效的另一个原因是您在每次迭代时重置$ items ['data']值
$items['data'] = $folio['value'];
应该是
$items['data'][] = $folio['value'];
上面的解决方案应该为你做,它是Drupal 7渲染标记的方式
请参阅:Drupal 7中的渲染数组 - http://drupal.org/node/930760
答案 1 :(得分:0)
hook_preprocess_page()
已经获得了一个节点对象;没有必要再次加载它。然后,您的代码只使用文本字段中包含的其中一个值,即使它循环遍历数组内容,因为它始终将值保存在$items['data']
中。
您应该编写的代码类似于以下代码。
function blocks_preprocess_page(&$vars, $hook) {
$items = array();
if (!empty($vars['node']) && $vars['node']->type == 'portfolio_item') {
$portfolios = field_get_items('node', $vars['node'], 'field_portfolio_description');
foreach ($portfolios as $folio) {
$items[] = $folio['value'];
}
$vars['description'] = theme('item_list', array('items' => $items));
}
}
您可以安全地将字符串传递给render()
,因为它首先检查它获取的参数的数据类型。
function render(&$element) {
if (is_array($element)) {
show($element);
return drupal_render($element);
}
else {
// Safe-guard for inappropriate use of render() on flat variables: return
// the variable as-is.
return $element;
}
}