【问题标题】:Drupal: use view output as node contentDrupal:使用视图输出作为节点内容
【发布时间】:2012-11-16 11:45:21
【问题描述】:

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

首先,我创建了一个带有块视图显示 subprojects 的视图 projects,使用 field_parent_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']);
}

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

只有一些东西不起作用:

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

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

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

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

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

【问题讨论】:

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


    【解决方案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 设置标题/标签的样式。正如你所描述的,我对权重没有任何问题。

    【讨论】:

    • viewfield 模块不是我需要的,因为它可以让您为每个节点选择一个视图,但我想在project 类型的所有节点中使用该视图,而不是让节点创建者选择风景。我正在尝试第二种解决方案。
    • @AlessandroPezzato 什么不起作用?只是没有出现吗?你还在想标题吗?订单/重量仍然不正确吗?
    • 无内容、无标签、无顺序。如果我将#label 更改为#title,它会显示标题。
    • 谢谢!前缀可以解决问题!如果没有找到结果,我添加了一个检查以隐藏前缀。
    【解决方案2】:

    感谢@nmc,这是我的最终解决方案。如果没有找到结果,则不显示标题。结果检查由if (count($view-&gt;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,
      );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      相关资源
      最近更新 更多