尝试在Drupal 7中的页面模板上显示字段类型的项目列表,而不使用Views

时间:2012-12-06 07:22:30

标签: drupal drupal-7

我在这个问题上已经结束了,所以我希望有人能指出我正确的方向。我有一个名为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出现的唯一时间是访问实际的投资组合项目。

因为我会以完全错误的方式解决这个问题。它似乎也不允许我显示该字段中项目的简单列表。

我稍后可能会再次访问,如果我找到了解决方案,我一定会发布最终代码。如果其他人有想法,我会再次尝试。再次感谢那些插话的人。

2 个答案:

答案 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;
  }
}