1

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

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

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

有没有办法自动刷新页面,或者我应该从不同的角度来解决这个问题?

编辑:为了回答 Henrik 的问题,这里有更多详细信息:及其在
下面,其余代码位于“项目”内容类型的计算字段中,汇总来自另一个节点的值。如果没有,我必须编辑并保存“项目”节点才能获得结果。有了它,我只需要刷新页面。hook_viewnode_savenode_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;
}
4

2 回答 2

2

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

  1. 由于project_view()不通过引用获取节点参数,您可能希望mymodule_nodeapi通过编写来实际获取其(可能更新的)结果

    $node = project_view($node);
    

    而不仅仅是

    project_view($node);
    
  2. 如果这可行,它也应该通过直接project_view()调用node_save($node)in而无需间接通过mymodule_nodeapi。(node_save()通过引用获取节点参数)。

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

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

    您是否已经尝试过“始终重新计算”选项?


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

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

有没有办法自动刷新页面

你可以试试:

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

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

于 2009-08-26T22:46:49.470 回答
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;
      }
  }
}
于 2009-08-27T09:51:21.707 回答