2

我正在编写一个 Drupal 7 模块来在内容中显示模块的子节点。节点有一个字段parent_nodes(节点引用),其中一个或多个节点被选为父节点。

首先,我创建了一个projects带有块视图 display 的视图,显示带有上下文过滤器subprojects的类型节点。projectfield_parent_project

这是我的模块:

<?php

function projects_preprocess_node(&$variables) {
  if ($variables['type'] == 'project') {
    if (isset($variables['view_mode']) && $variables['view_mode'] == 'full') {
      _projects_add_subprojects($variables);
    }
  }
}

function _projects_add_subprojects(&$variables) {
  $nid = $variables['nid'];
  $view = views_get_view('projects');
  $preview = $view->preview('subprojects', array($nid));
  $subprojects = array(
      '#title' => t('Subprojects'),
      '#label_display' => 'above',
      '#weight' => 10,
      //'#theme' => 'field',
      '#markup' => $preview,
  );
  if (!isset($variables['content']['subprojects'])) {
    $variables['content']['subprojects'] = array();
  }
  $variables['content']['subprojects'][] = $subprojects;
  dpm($variables['content']);
}

这是可行的,将视图显示输出添加到节点的内容中。

只有一些事情不起作用:

  • 标题(标签)
  • 当与其他内容一起渲染时,重量不会改变显示位置(它始终是第一个,在正文之上)。

如果我取消注释该'#theme' => 'field'行,标题将显示为标签,但不会呈现任何内容。这是因为使用了字段主题,我猜它需要#items并且不使用该#markup元素。

我不能使用子节点作为参考,而只能使用父节点。

解决方案必须独立于主题,所以不要回答“更改主题模板”或类似的问题

如何在节点中显示子节点?我正在寻找一种方法来获得可解释的东西,它是一个领域

4

2 回答 2

1

如果您还不知道,Viewfield 模块允许您将视图指定为内容类型中的字段。这可能会为您节省一些编码,但您可能不希望整个模块执行这样的特定任务,所以......

如果您想继续使用您编写的自定义代码,那么您需要将添加的内容重新构建为 Drupal 期望的正确渲染数组结构。尝试这样的事情:

  $subprojects_view_output = array(
      '#type' => 'markup',
      '#markup' => $preview,
  );
  $subprojects = array(
      '#theme' => 'field',  
      '#weight' => 10,
      '#title' => t('Subprojects'),
      '#items' => $subprojects_view_output,
  );

有了上述内容,您的字段的标题/标签以及字段的内容(视图本身)应该会显示出来。该代码未经测试,因此在语法方面可能不是 100% 正确,但希望能为您提供解决方案的途径。

编辑:我测试了上述内容,但它不起作用,因为为了使用现有的theme_field函数,Drupal 似乎需要更多信息来呈现像#field_name, #field_type,#entity_type等这样的字段,正如您应该在警告消息中看到的那样。

本质上,您正在伪造一个字段,如果您想继续使用内置的theme_field函数,您需要向 Drupal 提供它期望的所有信息,包括预处理函数中预期的所有变量。

或者,您可以继续使用原始代码并添加 a#prefix以使您的标题/标签呈现如下:

  $subprojects = array(
      '#weight' => 10,
      '#prefix' => '<div id="subprojects-view">asdf:</div>',
      //'#theme' => 'field',
      '#markup' => $preview,
  );

然后相应地使用 CSS 设置标题/标签的样式。正如你所描述的,我对加权没有任何问题。

于 2012-11-16T14:59:20.947 回答
1

感谢@nmc,这是我的最终解决方案。如果没有找到结果,则不显示标题。结果检查由 完成if (count($view->result) == 0)。重量在起作用。

<?php

function projects_preprocess_node(&$variables) {
  $type = $variables['type'];
  if ($type == 'project' || $type == 'customer') {
    if (isset($variables['view_mode']) && $variables['view_mode'] == 'full') {
      _projects_add_subprojects_markup($variables);
    }
  }
}

function _projects_add_subprojects_markup(&$variables) {
  $nid = $variables['nid'];
  $view = views_get_view('projects');
  $preview = $view->preview('subprojects', array($nid));
  if (count($view->result) == 0) {
    return;
  }
  $variables['content']['subprojects'] = array(
      '#weight' => 10,
      '#prefix' => '<h2>' . t('Subprojects') . '</h2>',
      '#markup' => $preview,
  );
}
于 2012-11-19T16:13:42.170 回答