2009-08-26 54 views
1

我试图显示CCK计算字段的更新结果。hook_view后自动刷新Drupal节点

该计算基于另一个节点中的字段,因此不会自动更新。

所以:我打电话node_save($node)hook_view,这确实做了调整,但结果不显示,直到我刷新页面。

有没有办法自动刷新页面,还是应该从不同的角度来处理?

编辑:针对Henrik的问题,这里的更多详细信息:
hook_view及其node_save是下面的代码的其余部分是在计算领域中的“项目”的内容类型,从另一个节点总结值。没有node_save,我必须编辑并保存“项目”节点才能得到结果。有了它,我只需要刷新页面。

hook_view中添加drupal_goto(drupal_get_destination())会给出'未找到页面',而不是我期待的恶性循环。我可以放置另一个地方吗?

function mymodule_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) { 
    switch ($op) { 
    case 'view': 
     if($node->type == 'project') { 
     project_view($node); 
     break; 
     } 
    } 
} 

function project_view($node) { 
    node_save($node); 
    return $node; 
} 
+0

感谢澄清 - 我我的答案更新了一些新的选项,以及固定我的骨头为首的重定向的第一个建议;) – 2009-08-27 23:28:25

回答

1

如果该值只能计算出来,您可以在加载时向节点添加一些内容。

function mymodule_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) { 
    switch ($op) { 
    case 'load': 
     if($node->type == 'project') { 
     $node->content['myfield'] = array('#value' => mymodule_calculate_value(), '#weight' => 4, '#theme' => 'my_theme'); 
     } 
     break; 
     } 
    } 
} 
+0

这是一个很好的选择,但它是令人沮丧的,我不能工作了解如何直接使用计算字段。 – lazysoundsystem 2009-08-27 17:19:58

2

编辑1:由于新发布的代码和附加的说明,我有可能会解决这个问题,而重定向三点建议:

  1. 由于project_view()并不需要通过参考节点参数,您可能希望通过编写mymodule_nodeapi实际获得其(可能更新的)结果

    $node = project_view($node); 
    

    ,而不是仅仅

    project_view($node); 
    
  2. 如果这样的作品,它应该还没有通过间接通过project_view()只是mymodule_nodeapi调用node_save($node)直接工作。 (node_save()通过引用获取节点参数)。

  3. AFAIK,计算字段基本上提供两种工作模式可以通过复选框字段配置表格上切换:

    1. node_save()计算领域一次,在数据库中存储的结果,只对新的更新保存操作。
    2. 根本不存储字段,而是在每次查看节点时重新计算它。

    您是否尝试过“always recompute”选项?


编辑2:我原来的答复是在一次(有缺陷的两种方式,因为它采用了完全错误的函数来检索当前请求的URI并没有检查递归作为lazysoundsystem指出非常有礼貌;)

所以以下已经更新到做重定向的实际测试版本:

有没有一种方法来刷新PA GE 自动

你可以尝试:

if (!$_REQUEST['stop_redirect']) { 
    drupal_goto(request_uri(), array('stop_redirect' => true)); 
} 

这将导致Drupal的一个重定向头发送到客户端,导致当前页面的新要求,确保不立即再次重定向。