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

Php Drupal:使用视图输出作为节点内容,php,drupal,drupal-7,drupal-modules,drupal-views,Php,Drupal,Drupal 7,Drupal Modules,Drupal Views,我正在编写一个Drupal7模块来显示内容中模块的子节点。 节点有一个字段父节点(节点引用),其中一个或多个节点被选为父节点 首先,我创建了一个视图projects,其中包含块视图显示subprojects,使用字段\u parent\u project上下文过滤器显示project类型的节点 这是我的模块: <?php function projects_preprocess_node(&$variables) { if ($variables['type'] == 'pr

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

首先,我创建了一个视图
projects
,其中包含块视图显示
subprojects
,使用
字段\u parent\u project
上下文过滤器显示
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']);
}

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

如果要继续使用编写的自定义代码,则需要将添加的内容重新构造为Drupal期望的正确结构。试着这样做:

  $subprojects_view_output = array(
      '#type' => 'markup',
      '#markup' => $preview,
  );
  $subprojects = array(
      '#theme' => 'field',  
      '#weight' => 10,
      '#title' => t('Subprojects'),
      '#items' => $subprojects_view_output,
  );
通过上述操作,您的字段的标题/标签以及字段的内容(视图本身)应该显示出来。该代码未经测试,因此在语法方面可能不是100%正确的,并且有望为您提供解决方案的途径

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

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

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

  $subprojects = array(
      '#weight' => 10,
      '#prefix' => '<div id="subprojects-view">asdf:</div>',
      //'#theme' => 'field',
      '#markup' => $preview,
  );
$subprojects=数组(
“#重量”=>10,
“#前缀”=>“asdf:”,
//“#主题”=>“字段”,
“#标记”=>$preview,
);

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

多亏了@nmc,这是我的最终解决方案。如果未找到结果,则不显示标题。如果(计数($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,
  );
}

我不需要viewfield模块,因为它允许您为每个节点选择一个视图,但我希望在类型为
project
的所有节点中使用该视图,而不是让node creator选择视图。我正在尝试第二种解决方案。@Alessandy问什么不起作用?只是没有出现?你还没找到标题吗?订单/重量是否仍然不正确?无内容、无标签、无订单。如果我用
#title
更改
#标签
,它会显示标题。谢谢!前缀成功了!我添加了一个检查,如果没有找到结果,则隐藏前缀。