我正在尝试显示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;
}
答案 0 :(得分:2)
编辑1:鉴于新发布的代码和其他说明,我有三条建议可以在不重定向的情况下解决问题:
由于project_view()
不通过引用获取节点参数,您可能希望通过编写
mymodule_nodeapi
中的(可能更新的)结果
$node = project_view($node);
而不仅仅是
project_view($node);
如果可以,只需通过project_view()
直接调用node_save($node)
,就可以通过mymodule_nodeapi
进行间接操作。 (node_save()
通过引用获取节点参数。)
AFAIK,计算字段基本上提供了两种工作模式,您可以通过字段配置表单上的复选框进行切换:
node_save()
上计算一次字段,将结果存储在数据库中,仅更新新的保存操作。您是否尝试过“始终重新计算”选项?
编辑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;
}
}
}