2

我对此一无所知,所以我希望这里有人能指出我正确的方向。我有一个名为portfolio_item 的内容类型,其中包含一个名为field_portfolio_description 的文本字段。我正在尝试在不使用视图的情况下打印该字段存在的每个值的列表。这是我的 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 不存在于输出中。唯一存在的投资组合项目是在访问实际投资组合项目时。

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

稍后我可能会重新讨论这个问题,如果我找到解决方案,我一定会发布最终代码。再次,如果其他人有想法,我愿意尝试。再次感谢那些插话的人。

4

2 回答 2

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;
  }
}
于 2012-12-10T05:38:13.810 回答
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));

此主题函数调用返回标记,因此您无需通过渲染函数传递它。您的代码不起作用的另一个原因是因为您在每次迭代时都重置了 $items['data'] 值

$items['data'] = $folio['value'];

应该

$items['data'][] = $folio['value'];

上面的解决方案应该为你做,它是 Drupal 7 渲染标记的方式

请参阅:Drupal 7 中的渲染数组 - http://drupal.org/node/930760

于 2012-12-06T11:52:29.213 回答