Спасибо за помощь. С событиями пользователя уже все реализовал. Остальное дело техники, смысл понятен.
Вот код, что есть на данный момент. Просто иногда раздражает искать решение проблемы, находить нужную тему и видеть только сообщение, что "проблема решена, можно закрывать", а самого решения не выложено.
<?php
// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport( 'joomla.plugin.plugin' );
jimport( 'joomla.error.log' );
//error_reporting(E_ALL);
//ini_set('display_errors', 1);
class plgSystemExtendlog extends JPlugin
{
private $log;
private $log2;
private $log3;
private $log4;
private $log5;
private $options;
private $user;
private $uN;
private $userId;
private $noUn;
private $reffer;
private $oName;
private $oEmail;
function plgSystemExtendlog(&$subject, $config) {
$this->options = array('format' => '{DATE};{TIME};{HTTP_REFERER};{REQUEST_URI};{ACTION};{PARAM1};{PARAM2};{PARAM3}');
$this->user = &JFactory::getUser();
$this->uN = &$this->user->get('username');
$this->reffer = (isset($_SERVER["HTTP_REFERER"]))? $_SERVER["HTTP_REFERER"] : '0';
$this->noUn = ($this->uN == NULL)? NULL : "";
$this->userId = ($this->uN != NULL)? $this->user->get('id') : NULL;
if($this->user->guest != 1) {
$this->log = &JLog::getInstance($this->userId.'_'.$this->uN.'.csv', $this->options);
} else {
$this->log = &JLog::getInstance('guest.csv', $this->options);
}
parent::__construct($subject, $config);
}
function onLoginUser($user, $options) {
$this->uN = $user['username'];
$instance = new JUser();
if($id = intval(JUserHelper::getUserId($user['username']))) {
$instance->load($id);
}
if(isset($instance->id)) {
$this->log = &JLog::getInstance($instance->id."_".$this->uN.'.csv', $this->options);
}
$act = ($instance->block == 1)? 14 : 1;
$this->log->addEntry(array('HTTP_REFERER' => $this->reffer,'ACTION' => $act));
}
function onLogoutUser($credentials) {
$this->uN = $credentials['username'];
$this->userId = $credentials['id'];
$this->log->addEntry(array('ACTION' => 2));
}
function onBeforeStoreUser($user, $isnew) {
if ($isnew == false) {
$this->oName = $user['name'];
$this->oEmail = $user['email'];
}
}
function onAfterStoreUser($user, $isnew, $success) {
if($success) {
if ($isnew == false) {
if ($this->oName != $user['name']) {
$this->log->addEntry(array('ACTION' => 3, 'PARAM1' => $this->oName, 'PARAM2' => $user['name'].$success));
}
if ($this->oEmail != $user['email']) {
$this->log->addEntry(array('ACTION' => 4, 'PARAM1' => $this->oEmail, 'PARAM2' => $user['email']));
}
if ($_POST['juser']['password'] == $_POST['juser']['password2'] && $_POST['juser']['password'] != 'XXXX' && JRequest::getVar('formname') == 'default_action_user') {
$this->log->addEntry(array('ACTION' => 5, 'PARAM2' => $_POST['juser']['password']));
}
} else {
$this->log2 = &JLog::getInstance($user['id']."_".$user['username'].'.csv', $this->options);
$this->log2->addEntry(array('ACTION' => 7, 'HTTP_REFERER' => $this->reffer ,'PARAM1' => $user['username'], 'PARAM2' => $_POST['juser']['password']));
$this->log3 = &JLog::getInstance('regs.csv', $this->options);
$this->log3->addEntry(array('ACTION' => 7, 'HTTP_REFERER' => $this->reffer ,'PARAM1' => $user['username'], 'PARAM2' => $_POST['juser']['password']));
}
}
}
// неудачный логин
function onLoginFailure($response)
{
$this->log5 = &JLog::getInstance('logFail.csv', $this->options);
$this->log5->addEntry(array('ACTION' => 6, 'PARAM1' => JRequest::getVar('username'), 'PARAM2' => JRequest::getVar('passwd')));
}
//лог поиска (работает только на поиске jSeblod 1.8, на стандартном не проверял)
function onSearch($text, $phrase='', $ordering='', $areas=null, $limit=50, $texts='', $sort='', $in=0, $length=1, $Itemid=0, $user=null, $cache=0, $stage=0, $stages=null, $debug=1) {
if($this->user->guest != 1) {
if ($texts[0]->name === 'default_search_action') {
$serc ="";
foreach($texts as $key => $val) {
if(!empty($val->value) && $val->name != 'jseblod') {
$serc .= $val->name.':|:'.$val->value.':||:';
}
}
if(!empty($serc)) {
$this->log->addEntry(array('ACTION' => 8, 'PARAM2' => $serc));
}
}
}
}
function onAfterInitialise() {
$u = &JURI::getInstance(filter_var($_SERVER['REQUEST_URI'],FILTER_SANITIZE_URL));
// лог переходов по странице
if($this->user->guest != 1) {
if($u->getVar('task')!= 'logoutAjax' && $u->getVar('tmpl')!= 'page' && $u->getVar('tmpl')!='mod_log' && $u->getVar('format')!='raw') {
$url2 = &$u->toString(array('path','query','fragment'));
$this->log->addEntry(array('ACTION' => 9, 'REQUEST_URI' => $url2));
}
}
// запросили восстановление пароля
if($u->getVar('option')=='com_user' && $u->getVar('layout')=='confirm') {
if (JRequest::getVar('email')) {
$email = JRequest::getVar('email');
$db =& JFactory::getDBO();
$query = "SELECT id, username FROM #__users WHERE `email` = '".$email."';";
$db->setQuery($query);
$id = $db->loadRow();
if (!empty($id[0]) && !empty($id[1])) {
$this->log4 = &JLog::getInstance($id[0]."_".$id[1].'.csv', $this->options);
$this->log4->addEntry(array('ACTION' => 10));
} else {
$this->log4 = &JLog::getInstance('requestPwd.csv', $this->options);
$this->log4->addEntry(array('ACTION' => 10, 'PARAM1' => $email));
}
}
}
// отправили feedback (для модуля и компонента feedback)
if(JRequest::getVar('task') == 'submitfeedback') {
$this->log->addEntry(array('ACTION' => 11, 'PARAM1' => $this->repl(JRequest::getVar('submitter_email')), 'PARAM3' => $this->repl(JRequest::getVar('feedback')), 'PARAM2' => $this->repl(JRequest::getVar('submitter_name'))));
}
// восстановили пароль
if ($u->getVar('task')=='completereset'){
if (JRequest::getVar('username')) {
$this->uN = JRequest::getVar('username');
jimport('joomla.user.helper');
$instance = new JUser();
if($id = intval(JUserHelper::getUserId($this->uN))) {
$instance->load($id);
}
if(!empty($instance->id)) {
$this->log = &JLog::getInstance($instance->id."_".$this->uN.'.csv', $this->options);
}
}
if(JRequest::getVar('password1') == JRequest::getVar('password2')) {
$this->log->addEntry(array('ACTION' => 12, 'PARAM2' => $this->repl(JRequest::getVar('password1'))));
}
}
// подтвердил активацию
if($u->getVar('option')=='com_cckjseblod' && $u->getVar('task')=='activate') {
if (JRequest::getVar('activation')) {
$act = JRequest::getVar('activation');
$db =& JFactory::getDBO();
$query = "SELECT id, username FROM #__users WHERE `activation` = '".$act."';";
$db->setQuery($query);
$id = $db->loadRow();
if (!empty($id[0]) && !empty($id[1])) {
$this->log4 = &JLog::getInstance($id[0]."_".$id[1].'.csv', $this->options);
$this->log4->addEntry(array('ACTION' => 15));
}
}
}
// запросили восстановление имени пользователя
if($u->getVar('task')=='remindusername') {
if (JRequest::getVar('email')) {
$email = JRequest::getVar('email');
$db =& JFactory::getDBO();
$query = "SELECT id, username FROM #__users WHERE `email` = '".$email."';";
$db->setQuery($query);
$id = $db->loadRow();
if (!empty($id[0]) && !empty($id[1])) {
$this->log4 = &JLog::getInstance($id[0]."_".$id[1].'.csv', $this->options);
$this->log4->addEntry(array('ACTION' => 16));
/*} else {
$this->log4 = &JLog::getInstance('requestUserName.csv', $this->options);
$this->log4->addEntry(array('ACTION' => 16, 'PARAM1' => $email));
}*/
}
}
}
}
function repl($txt) {
$txt = str_replace(";", "..,", $txt);
$txt = str_replace("\n", ",", $txt);
$txt = str_replace("\t", ",", $txt);
$txt = str_replace(" ", ",", $txt);
$txt = trim($txt);
return $txt;
}
}
Напомню, что у меня стоит jseblod и регистрация делается через его модуль, поэтому могут быть неточности с переменными при обычном использовании модулей Joomla
upd: код доделывается, модифицируется. Обновил, что есть.
Не могу решить проблему, чтобы логировать id выдаваемой страницы. Логично было использовать prepareContent,но у него в первом параметре $articles не всегда выдается id статьи, например, в случае если кликнули по пункту меню, который выводит содержание какой-либо статьи. По крайней мере на многих страницах обьект $articles пуст. Буду дальше думать.
upd2: подправил кое-чего. Добавил лог запроса на восстановление логина.
В модуле все данные пишутся по возможности в файл id_username.csv, т.е. у каждого пользователя свой файл. В некоторых случаях невозможно узнать, кто именно совершил то или иное действие, поэтому создаются отдельные файлы лога для не идентифицированных пользователей.
Расшифровка кодов action в логе
действия -
1 - удачно авторизироваля
2 - вышел из системы
3 - смена имени
4 - смена email
5 - смена пароля
6 - неудачная авторизация
7 - регистрация
8 - поисковые запросы
9 - перешел на страницу
10 - сделали запрос на восстановление пароля
11 - отправлен фидбэк
12 - пароль сброшен на новый (новый пароль)
13 - получил отказ в просмотре фильма по неуплате(cat id, id)
14 - пытался авторизироваться, но еще не активировал свою учетную запись
15 - активировал свою запись
16 - запросил восстановление логина