以编程方式遍历视图结果的最佳方法是什么?


12

给定一个名为“ Children”的视图(具有两个字段:child_node_id和birth_order_value),以编程方式遍历给定display_id为“ default”和包含父节点id的参数的视图结果集的最佳方法是什么?

以前,我在代码块中使用过View,其代码类似于以下代码:

if ( arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2)) {
   $node = node_load(arg(1));
   $args = array($node->nid);
   $view = views_get_view('Children');
   print $view->preview('default', $args);
}

但是,在另一个块中,我想基于视图中找到的值执行一些逻辑。您可能可以根据我的最终要求来猜测业务逻辑:我希望支持该视图的代码块(“子级”)被多次调用。在遍历视图数据集结果时,我想递归遍历遍历子节点的子节点,以查询其子节点。


您的方法看起来还可以。如果您将其放在答案中,人们可以对其进行投票并批准。您可以尝试的一件事是,而不是每次都取消设置视图。在执行之前执行$ view-> clone_view()。视图加载非常繁重,这可能有助于提高内存和性能。
杰里米·法兰西

如果我不在这里,请原谅,但这是您可以使用关系并在父表中的字段上分组来完成的事情。我不确定您是否需要使用代码。从父模板覆盖中调用子视图和逻辑也可能更简单。
杰森·史密斯

您应该考虑foreach 代替for(.. sizeof()),它的性能要好得多(因为它是C而不是PHP)。
berkes 2011年

需要注意的一件事是if (arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2)),与其做起来,不如使用它if ($node = menu_get_object())
克里斯·普利卡斯

我已经从问题中修剪出答案,并将其发布为答案。这样,对于网站用户来说,这个问题就有答案了。
杰里米法国

Answers:


2

我似乎已经尝试了一些方法。但是,我想向其他答案和更好的解决方案开放我的问题。

<?php
if ( arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2) ) {
   $node = node_load(arg(1));
   $args = array($node->nid );
   unset($view);
   $view = views_get_view('Children');
   $view->set_display('default');  
   $view->set_arguments($args);
   $view->set_items_per_page(20);
   $view->execute();
   $newarg = array();
   for ($i=0; $i<sizeof($view->result); $i++) {
      $newarg[$i] = $view->render_field('nid_1', $i);
   }
   for ($i=0; $i<sizeof($newarg); $i++) {
      unset($view);
      $view = views_get_view('Children');
      $view->set_display('default');  
      $view->set_arguments($newarg[$i]);
      $view->set_items_per_page(20);
      $view->execute();
      ....
   }
}
?>

完成结果集后,多次执行视图的关键是让我取消set($ view)。


1

我通过以下功能获得了不错的成绩。返回值是所有视图记录的数组。调用dsm($ return_value)将使您对特定视图的结构有一个很好的了解。

function _get_view_data($view_name, $args, $page = NULL, $page_size = 0 ) {
    $view = views_get_view($view_name);
    $view->pager['items_per_page'] = $page_size;
    $view->set_arguments($args);
    if ($page) {
        $view->build($page);
        $view->execute($page);
    }
    else {
        $view->execute();
    }
    return $view->result;
}

1

这是Drupal API中已内置的辅助函数。(我花了一段时间在Drupal Docs中四处浏览,最终找到了它。似乎很多其他人也产生了不使用此帮助程序的解决方案,并且该帮助程序做了一个有趣的步骤,而其他解决方案则没有。 。以在执行之前在$ view对象上调用pre_render)。

我不能保证它是否运作良好,但至少在这里是专门指出这些方法存在问题的地方。

对于D6 http://api.drupal.org/api/views/views.module/function/views_get_view_result/6

对于D7 http://api.drupal.org/api/views/views.module/function/views_get_view_result/7

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.