2010-11-02 2 views
0

Voici le scénario que je veux fixer pour un magasin de commerce:exploitation forestière de surveillance personnalisée

journaux d'administration du site à, crée des commandes pour les utilisateurs, crée des paiements et/ou applique des crédits sur les commandes pour les utilisateurs. Watchdog enregistre tout cela, mais en tant qu'utilisateur admin, lorsque nous en avons besoin en tant qu'utilisateur client, l'action est prise en compte (afin que nous puissions lister sur ce compte toutes les actions que le système a effectuées sur son compte ou commandes).

Je vois que chien de garde a:

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

est-il un moyen de passer outre à l'utilisateur global $ sans le piratage de la fonction de base et sans dupliquer? Puis-je transmettre $ user en tant que variable d'une manière ou d'une autre? Puis-je appeler $ user = user_load ($ customer-> uid) avant que watchdog() ne l'amène à tromper cet utilisateur? Je voudrais que l'UID enregistré ne soit pas 0 ou 1 si je peux l'aider, car il est vraiment difficile de suivre les logs pour certains aspects du système par profil d'utilisateur (compte, facturation, commandes, etc.).

Répondre

0

essayer ce code:

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); 

Je n'aime pas ça, mais ça fonctionne :)

+0

Heh, j'aime les solutions comme celle-ci. – ceejayoz

3

Il est probablement préférable de consigner ceci dans un tableau séparé. Watchdog est pour les messages système temporaires et non pour les informations permanentes. Si rien d'autre, il est nettoyé périodiquement sur cron, ce qui pourrait effrayer les utilisateurs.

Si vous êtes configuré pour le faire de cette façon, la fonction de surveillance a un crochet, hook_watchdog, que votre module peut changer l'utilisateur. Vous devriez faire quelque chose d'un peu intelligent avec le texte du message - faites-en des informations sérialisées que vous analyserez et déballez dans le crochet - mais c'est certainement possible.

+0

Ouais. C'est ce que j'ai dit, mais c'est un système hérité en ce moment. Il y a environ un million d'enregistrements pour chien de garde. Je ne saurais pas par où commencer l'archivage dans une nouvelle table et la fixation des données au bon UID. – Kevin

+0

Voir ma mise à jour. 'hook_watchdog' peut faire ce dont vous avez besoin, mais cela demandera un peu de travail. – ceejayoz

Questions connexes