Drupal:使用视图输出作为节点内容

时间:2012-11-16 11:45:21

标签: php drupal drupal-7 drupal-modules drupal-views

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

首先,我创建了一个带有块视图显示projects的视图subprojects,显示带有project上下文过滤器的field_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']);
}

这很有效,将视图显示输出添加到节点的内容中。

只有一些东西不起作用:

  • title(label)
  • 当用其他内容渲染时,重量不会改变显示位置(它总是第一个,在身体上方)。

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

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

解决方案必须独立于主题,因此不要回答“更改主题模板”或类似内容

如何在节点中显示子节点?我正在寻找一种方法来获得可解释的字段

2 个答案:

答案 0 :(得分:1)

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

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

  $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提供它所期望的所有信息,包括所有preprocess函数中预期的变量。

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

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

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

答案 1 :(得分: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,
  );
}