Автоматически обновлять узел Drupal после hook_view - PullRequest
1 голос
/ 26 августа 2009

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

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

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

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

Редактировать: В ответ на вопросы Хенрика, вот более подробно:
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;
}

Ответы [ 2 ]

2 голосов
/ 27 августа 2009

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

    Вы уже пробовали опцию «всегда пересчитывать»?


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

Итак, следующее было обновлено до реально протестированной версии перенаправления:

Есть ли способ обновить страницу автоматически

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

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

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

1 голос
/ 27 августа 2009

Если значение вычисляется только когда-либо, вы можете просто добавить что-то к своему узлу во время загрузки.

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