Собственная регистрация сторожевого таймера - PullRequest
0 голосов
/ 02 ноября 2010

Вот сценарий, который я хочу исправить для коммерческого магазина:

Администратор сайта входит в систему, создает заказы для пользователей, создает платежи и / или применяет кредиты к заказам для пользователей.

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

Я вижу, что сторожевой таймер имеет:

function watchdog($type, $message, $variables = array(), $severity = WATCHDOG_NOTICE, $link = NULL) {
  global $user, $base_root;

  // Prepare the fields to be logged
  $log_message = array(
    'type' => $type, 
    'message' => $message, 
    'variables' => $variables, 
    'severity' => $severity, 
    'link' => $link, 
    'user' => $user, 
    'request_uri' => $base_root . request_uri(), 
    'referer' => referer_uri(), 
    'ip' => ip_address(), 
    'timestamp' => time(),
  );

  // Call the logging hooks to log/process the message
  foreach (module_implements('watchdog') as $module) {
    module_invoke($module, 'watchdog', $log_message);
  }
} 

Есть ли способ переопределить глобальный $ user без взлома основной функции и без ее дублирования?

Могу ли я передать$ user как переменная как-то?Могу ли я вызвать $ user = user_load ($ customer-> uid) до watchdog (), чтобы обманным путем заставить его войти в систему?Я хотел бы, чтобы записанный UID не был 0 или 1, если я могу помочь, потому что действительно сложно отслеживать журналы для определенных аспектов системы по профилю пользователя (учетная запись, биллинг, заказы и т. Д.).

Ответы [ 2 ]

3 голосов
/ 02 ноября 2010

Вам, вероятно, лучше занести это в отдельную таблицу. Сторожевой таймер предназначен для временных системных сообщений, а не для постоянной пользовательской информации. Если ничего больше, он периодически очищается на cron, что может пугать пользователей.

Если вы настроены на это таким образом, функция сторожевого таймера имеет хук, hook_watchdog, с помощью которого ваш модуль может изменить пользователя. Вам нужно будет сделать что-то немного умнее с текстом сообщения - сделать сериализованной информацию, которую вы анализируете и распаковываете на крючок - но это, безусловно, возможно.

0 голосов
/ 02 ноября 2010

попробуйте этот код:

    global $user;
    $original_user = $user;
    session_save_session(FALSE);
    $user = user_load(array("uid" => NEW_USER_UID));      
    watchdog(HERE);
    $user = $original_user;   // @TODO: switch user: user back    
    session_save_session(TRUE);

Мне это не нравится, но работает :) 1004 *

...