在Drupal经验方面,我正尝试使用Drupal和Views API在自定义代码级别解决站点设计难题。像往常一样,我看似简单的解决问题的尝试向我展示了我还不知道的多少!
我有一个节点引用字段,它指向由许多不同的内容类型和这些类型的子类别使用的“相关事实”内容。虽然我可以创建关系并显示视图的“相关事实”,但是仍然存在问题。首先,我希望将相关事实放在一个单独的块中,并为视图提供的整个文章列表显示一个相关事实的列表。对于具有相同“相关事实”参考的多个对象,视图不会处理任何重复项。另外,我将不得不为每种内容类型和子类别分别生成大量的“相关事实”视图。
如果我可以创建一个单独的相关事实视图,该视图可以接受一组nids作为参数,那么可以简化相关事实视图。所以我的问题是如何解决这个问题。虽然从内部来看可能是可行的,但我正在寻求一个自定义模块php解决方案,因此我需要实现以下目标:
提取任何“内容类型”视图的结果作为参数列表。除了显示查看结果之外,我还需要加载正在显示的NID列表。
调用相关事实视图,并将其列表传递给它,以用作“相关事实”视图中的过滤器或上下文过滤器。
附加信息:
使用这种策略,我首先定义了一个视图,然后尝试从中提取结果。这种尝试导致在视图对象中查找结果时出现问题(请参阅此问题)。获得结果后,我将需要生成另一个视图,以这些结果作为过滤器。我已经看到从代码实现的视图是包含所有参数都已编码的包含文件的视图,但是没有找到定义和生成视图并使用php函数处理结果的示例。任何示例或链接将不胜感激。
迄今:
有两个答案解决了应用视图结果并将其作为上下文过滤器放置在另一个视图中的过程。但是我仍然面临这样的问题,即拥有数十种内容类型,每种类型中至少包含十二种视图内容窗格变体。除了将每个视图直接链接到相关事实之外,我将需要让我的任何view1内容视图将其结果传递给一个单独的“相关事实”视图。
CONTENT TYPE SUB-CATEGORY RELATED FACT (nid)
Type 1 --------- General Info 101, 105
Specifications 103, 105
Inspections 102
Quality
etc...
Type 2 ----------General Info 101, 106
Specifications 102, 103
Cost factors 107
etc...
View1查找特定的内容类型,并包含各种子类别文章,这些文章按子类别字段中的值排序。另外,它包含有关相关事实的节点参考字段。查看一个用于内容类型和子类别的过滤器,并具有用于显示的暴露字段和具有相关事实引用节点的隐藏字段。
View2过滤“相关事实”文章,并包含针对nid的上下文过滤器设置(尽管该设置适用于URL)
使用Letharion的答案中的代码,第6行中的foreach循环正在编译商品ID的列表,而不是相关事实ID的列表(这些商品引用了相关事实,但是相关事实没有对商品的节点引用) 。我需要从每个节点的事实字段中提取相关的事实ID。我已经将事实字段包括在View1定义中,但是由于命令dpm($ node);找不到结果。已经崩溃了,我不知道值在数组中的存储位置。
由于将为不同的内容类型克隆多个View1,所以我认为使用hook_views_post_execute并对其进行如下编码可能是有意义的:
function mymodule_views_post_execute (&$sourceview) {
$nids = '';
foreach($sourceview->result as $node) {
$nids += $node->nid . ','; //I need field name for $node->facts
}
$nids = rtrim($nids, ',');
$view = views_get_view('get_related');
//dpm($nids); // Fatal error: Cannot unset string offsets...
$view->execute_display('panel_pane_1', array($nids));
}
最后,我不确定是否必须将视图的显示定向到正确的位置,还是通过将相关的事实内容窗格通过面板UI放置在面板位置中,然后让面板主题化处理其余的内容来完成。