2009-08-26 2 views
1

Я пытаюсь показать обновленные результаты для вычисленного поля CCK.Автоматически обновлять узел Drupal после hook_view

Расчет основан на полях в другом узле, поэтому они не обновляются автоматически.

Итак: я звоню node_save($node) в hook_view, что делает настройку, но результаты не отображаются, пока я не обновляю страницу.

Есть ли способ обновить страницу автоматически, или я должен приближаться к ней под другим углом?

Edit: В ответ на вопросы Хенрика, здесь более подробно:
hook_view и его node_save ниже, остальная часть коды находится в поле Компьютерного в «проект» типа контента, суммируя значение от другого узла , Без node_save мне нужно отредактировать и сохранить узел «project», чтобы получить результат. С его помощью мне просто нужно обновить страницу.

Добавление 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

Спасибо за разъяснение - Я обновил свой ответ с некоторыми новыми возможностями, а также закрепляющий моя кость во главу первого предложения для переквалификации;) –

ответ

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

2

Edit 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. Не хранить поле вообще, вместо этого переучитывать его каждый раз, когда узел просматривается.

    Вы уже пробовали вариант «всегда перекомментировать»?


Edit 2: Мой первоначальный ответ был испорчен двумя способами сразу, как это совершенно неправильно функцию для получения текущего запроса URI и не проверить рекурсии (как lazysoundsystem указал очень учтиво;)

Так следующий был обновлен на самом деле тестируемой версию делать переадресацию:

есть ли способ, чтобы обновить годовые GE автоматически

Вы можете попробовать:

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

Это приведет к Drupal, чтобы послать заголовок перенаправления для клиента, в результате чего новый запрос текущей страницы, убедившись, что не сразу перенаправить снова.