Обновление таблицы {node_counter} программно в drupal - PullRequest
6 голосов
/ 20 марта 2010

В настоящее время я использую модуль статистики (ядро) в моей установке Drupal 6. Это увеличивает счетчик в таблице {node_counter} каждый раз, когда просматривается узел, и это работает.

У меня вопрос - могу ли я программно увеличить этот счетчик? Я стремлюсь достичь этого, когда пользователи взаимодействуют с контентом, созданным из представлений (скажем, щелчком по лайтбоксу), поэтому возможность обновления таблицы с помощью AJAX была бы идеальной.

Я выполнил быстрый поиск по d.o, и, похоже, не было никаких модулей, которые торчали бы сразу. У кого-нибудь есть опыт с этим?

1 Ответ

9 голосов
/ 20 марта 2010

Для этого не должно быть сложно создать специальный модуль.

Запрос, который выполняет модуль статистики:

db_query('UPDATE {node_counter} SET daycount = daycount + 1, totalcount = totalcount + 1, timestamp = %d WHERE nid = %d', time(), arg(1));
// If we affected 0 rows, this is the first time viewing the node.
if (!db_affected_rows()) {
  // We must create a new row to store counters for the new node.
  db_query('INSERT INTO {node_counter} (nid, daycount, totalcount, timestamp) VALUES (%d, 1, 1, %d)', arg(1), time());
}

Единственное, что нам нужно сделать, это заменить arg(1) идентификатором узла, к которому мы хотим добавить счетчик, это можно сделать в пользовательском модуле, например, так.

function custom_module_menu() {
  $items['custom/ajax/%node'] = array(
    'title' => 'Update count',
    'page callback' => 'custom_module_update_counter',
    'page arguments' => array(2),
    'access callback' => array('custom_module_access_control'),
  );

 function custom_module_update_counter($node) {
   db_query('UPDATE {node_counter} SET daycount = daycount + 1, totalcount = totalcount + 1, timestamp = %d WHERE nid = %d', time(), $node->nid);
   // If we affected 0 rows, this is the first time viewing the node.
   if (!db_affected_rows()) {
     // We must create a new row to store counters for the new node.
     db_query('INSERT INTO {node_counter} (nid, daycount, totalcount, timestamp) VALUES (%d, 1, 1, %d)', $node->nid, time());
   }
 }

Осталось только реализовать пользовательскую функцию контроля доступа, вы можете проверить, является ли запрос ajax, или сделать любой другой элемент управления, который вам нравится, функция должна просто вернуть TRUE или FALSE. Вам также необходимо создать событие ajax с идентификатором узла в вашей настройке, но это также не должно быть слишком сложным.

Вам нужно нажать на ссылку custom/ajax/2, чтобы обновить узел с идентификатором 2 и т. Д.

...