在hook_view之后自动刷新Drupal节点

时间:2009-08-26 16:29:31

标签: drupal cck

我正在尝试显示CCK计算字段的更新结果。

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

所以:我在node_save($node)中调用了hook_view,它会进行调整但结果在我刷新页面之前不会显示。

有没有办法自动刷新页面,还是我应该从另一个角度接近这个?

编辑:回答Henrik的问题,这里有更多细节:
hook_view及其node_save位于下方,其余代码位于“项目”内容类型的“计算字段”中,汇总了另一个节点的值。如果没有node_save,我必须编辑并保存“项目”节点以获得结果。有了它,我只需要刷新页面。

drupal_goto(drupal_get_destination())中添加hook_view会给出“找不到页面”,而不是我期待的恶性循环。还有其他地方可以放吗?

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;
}

2 个答案:

答案 0 :(得分:2)

编辑1:鉴于新发布的代码和其他说明,我有三条建议可以在不重定向的情况下解决问题:

  1. 由于project_view()不通过引用获取节点参数,您可能希望通过编写

    实际获取mymodule_nodeapi中的(可能更新的)结果
    $node = project_view($node);
    

    而不仅仅是

    project_view($node);
    
  2. 如果可以,只需通过project_view()直接调用node_save($node),就可以通过mymodule_nodeapi进行间接操作。 (node_save()通过引用获取节点参数。)

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

    1. node_save()上计算一次字段,将结果存储在数据库中,仅更新新的保存操作。
    2. 根本不存储字段,而是每次查看节点时重新计算字段。
    3. 您是否尝试过“始终重新计算”选项?


      编辑2:我的原始答案一下子有两种方式存在缺陷,因为它使用了一个完全错误的函数来检索当前请求URI并且没有检查递归(因为lazysoundsystem非常有礼貌地指出) ;)

      因此,以下内容已更新为执行重定向的实际测试版本:

        

      有没有办法刷新页面   自动

      你可以尝试:

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

      这将导致Drupal向客户端发送重定向标头,从而导致当前页面的新请求,确保不会立即重定向。

答案 1 :(得分: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;
      }
  }
}