php - Drupal:使用 View 输出作为节点内容

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

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

首先,我创建了一个 View projects ,其中包含 block View 显示 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']);
}

这正在工作,将 View 显示输出添加到节点的内容中。

只有一些功能不起作用:

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

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

我不能使用子节点作为引用,只能使用父节点。

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

如何在节点中显示子节点?我正在寻找一种方法来解释它是一个字段

最佳答案

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

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

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

通过上述内容,字段的标题/标签以及字段的内容( View 本身)应该显示。该代码未经测试,因此在语法方面可能不是 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 相应地设置标题/标签的样式。正如您所描述的,我对权重没有任何问题。

关于php - Drupal:使用 View 输出作为节点内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13415956/

相关文章:

php - mysql_fetch_array() 的返回数据和类型

drupal-7 - 使用Drupal 7 Forms API向每个单选按钮添加描述

php - Drupal - 如何获取行的总和

drupal-7 - 以编程方式创建有机组

PHP try-catch 支持简写吗?

php - 从表中找出相关数据

php - 在 Laravel 项目中使用 Drupal API 时函数重新声明错误

Drupal 7 hook_node_access 有条件地阻止节点访问

Drupal 7,在一个管理面板中管理多站点内容

php - 交响乐团 5 : An unexpected value could not be normalized: stream resource