Новости Joomla

Совет по Joomla: $db->getQuery(true) стал устаревшим

Совет по Joomla: $db->getQuery(true) стал устаревшим

👩‍💻 Совет по Joomla: $db->getQuery(true) стал устаревшим.Раньше при создании запросов в базу данных мы всегда получали объект запроса с помощью метода

getQuery(). Если передавался параметр
$new =
true, то получали новый запрос. Если без - последний.

use Joomla\CMS\Factory;$db = Factory::getContainer()->get('DatabaseDriver');$query = $db->getQuery(new: true);// и строим запрос
Под капот Joomla 4 вошёл Joomla Framework (PHP фреймворк а-ля Laravel, Yii и т.д.), а для Joomla 5 он обновился - версия 3.4.1 вышла 6 октября 2023г. В методе фреймворка есть примечание о том, что параметр
$new, который передавался в метод
getQuery() помечен как устаревший и будет удалён в версии фреймворка 4.0.
The parameter $new is deprecated and will be removed in 4.0, use %s::createQuery() instead.В Joomla 4 версия Joomla Framework была 2.x., в Joomla 5 - 3.x. Поэтому есть предположение, что с выходом Joomla 6 обновится и версия фреймворка - станет 4.0. Поэтому для получения объекта для новых запросов следует использовать метод
createQuery(). Он уже представлен в ядре и широко используется. При этом метод
getQuery() останется, но, скорее всего, будет выполнять функцию только геттера - получения текущего запроса.
@joomlafeed#joomla #php #разработка

0 Пользователей и 1 Гость просматривают эту тему.
  • 9 Ответов
  • 12435 Просмотров
*

Delfi

  • Захожу иногда
  • 53
  • 13 / 0
Столкнулся с задачей, надо вести лог для отдельных пользователей.

Использую стандартную библиотеку логирования

Делаю примерно так

Код: php

define('ERROR_LOG', $userId.'_'.$uN.'.csv');
jimport( 'joomla.error.log' );
$options = array('format' => "{DATE};{TIME};{COMMENT};{HTTP_REFERER};{REQUEST_URI};{ACTION};{OLDPARAM};{NEWPARAM};{PARAM3}");


$log = &JLog::getInstance(ERROR_LOG);

$log->addEntry(array('REQUEST_URI' => $_SERVER['REQUEST_URI'], 'ACTION' => "test", 'OLDPARAM' => $user->get('name'), 'NEWPARAM' => $_POST['juser[name]']));

Т.е. у каждого пользователя отдельный файл, которые кушает потом парсер.

Из основных событий мне надо выловить событие регистрации, авторизации, выхода из системы, изменение данных + занесение новых данных в лог, просмотр определенных страниц, события оплаты аккаунта и т.д.

Не логично внедрять в каждый модуль свой код.
Как оптимальней выполнить данную задачу?

Авторизация, регистрация сделана на AJAX и в случае неработающего js делает обычным способом. Правда сайт особо не рассчитан на людей без работающего js.

Пробовал вставлять код в index.php и ловить разные запросы, в зависимости от них уже добавлять в лог.
Но, скажем, при изменении имени пользователя необходимо узнать его имя до изменения.
Или в Joomla заметил через FireBug используются переадресации при многих действиях.
В общем, может есть какие идеи? Желательно, насколько это возможно, подробней.
« Последнее редактирование: 12.05.2011, 16:45:06 от Delfi »
*

Gruz

  • Завсегдатай
  • 1275
  • 167 / 3
  • gruz@jabber.org | gruz.org.ua
Життя має дві форми - горіння і гниття!
-
Со мной на "ты" - Вам лень развёрнуто формулировать вопрос? Нам лень отвечать. Правильный вопрос: - Версии J! и проблемного расширения? - Что хотел? - Что пробовал? - Что получилось и что не получилось? - Какие были ошибки?
*

Delfi

  • Захожу иногда
  • 53
  • 13 / 0
Благодарю.
Спасибо за наводки на события, очень кстати. Есть что почитать перед сном -))


Сейчас пробую экспериментировать

При изменении данных вижу такую картину в firebug

Код: ini
POST http://localhost/joomla15/my-profile/index.php?option=com_cckjseblod&view=type&layout=form&task=save&cckid=5&Itemid=14
GET http://localhost/joomla15/index.php?option=com_cckjseblod&view=type&layout=form&task=finishReg&cckid=0&Itemid=2&format=raw&vikl=
GET http://localhost/joomla15/my-profile/edit-profile

У меня используется компонент cckjseblod. Не будет ли с этим проблем?

Так вот, в пост у меня получается приходит массив juser, который содержит в себе измененные данные.
Я в конец index.php добавил функцию логирования. Пока все элементарно, чтобы понять вообще порядок событий.

Так вот, мне надо выловить $_REQUEST['juser'], который был передан по первой ссылки (см. выше). Но почему то Joomla улавливает только последнюю ссылку, так сказать. Т.е. она видит только параметры, переданные в http://localhost/joomla15/my-profile/edit-profile.
Как так происходит? Каким образом происходит редирект внутри?

Извиняюсь, если глупые вопросы, просто сложно искать что-то, не зная в какую сторону копать.

И при использовании самописного модуля не будет ли у меня подобных проблем?
*

Gruz

  • Завсегдатай
  • 1275
  • 167 / 3
  • gruz@jabber.org | gruz.org.ua
Почитай на ночь, поэкспериментируй днём, а следующим вечером переформулируй вопрос. Так будет правильнее всего.
Життя має дві форми - горіння і гниття!
-
Со мной на "ты" - Вам лень развёрнуто формулировать вопрос? Нам лень отвечать. Правильный вопрос: - Версии J! и проблемного расширения? - Что хотел? - Что пробовал? - Что получилось и что не получилось? - Какие были ошибки?
*

Delfi

  • Захожу иногда
  • 53
  • 13 / 0
Разумно.

Уже один момент понял. Спасибо, ссылки уже возымели эффект.
*

Delfi

  • Захожу иногда
  • 53
  • 13 / 0
Спасибо за помощь. С событиями пользователя уже все реализовал. Остальное дело техники, смысл понятен.

Вот код, что есть на данный момент. Просто иногда раздражает искать решение проблемы, находить нужную тему и видеть только сообщение, что "проблема решена, можно закрывать", а самого решения не выложено.

Код: php
<?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 - запросил восстановление логина
« Последнее редактирование: 18.05.2011, 14:34:27 от Delfi »
*

Aleks_El_Dia

  • Moderator
  • 3671
  • 353 / 0
  • AEDStudio Joomla! Direction
Это мегазачет, нынче редко выкладывают готовые решения нестандартных проблем.
Спам придумали боги в отместку за наши молитвы (с) Рома Воронежский
На молоко: Z369038872422 || R210017695494 || U247040729215 || ЯД 410011288250383
Мигрирую сайты, переношу расширения J!1.0->J!1.5->J!2.5. Более 50 успешных миграций.
*

Delfi

  • Захожу иногда
  • 53
  • 13 / 0
Это мегазачет, нынче редко выкладывают готовые решения нестандартных проблем.

Спасибо.
Сам часто наталкивался на подобное, поэтому  решил быть более полезным, чем просто помочь себе
*

jesus

  • Захожу иногда
  • 127
  • 15 / 1
  • фронтенд ищет бэкенда для совместного творчества
Здравствуйте!
А можно для обычных пользователей пояснить. Откуда этот файл запускать?
Спасибо!
Спасибо за freeware!
Если вы готовы небезвозмездно ответить на мой вопрос, с удовольствием рассмотрю предложение.
Ищу адекватного партнёра (программиста) по разработке сайтов на Joomla. Обеспечу ненапряжный поток задач.
*

Delfi

  • Захожу иногда
  • 53
  • 13 / 0
Здравствуйте!
А можно для обычных пользователей пояснить. Откуда этот файл запускать?
Спасибо!

Приветствую!

Это содержание файла плагина.

Для работы засовываем в одну папку php файл extendlog.php, который содержит код выше.

Второй файл extendlog.xml:

Код
<?xml version="1.0" encoding="utf-8"?>
<install version="1.5" type="plugin" group="system">
<name>System - Extend log</name>
<author>Salnikov.SS</author>
<creationDate>May 2011</creationDate>
<copyright>Copyright (C) 2005 - 2011. All rights reserved.</copyright>
<license>http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL</license>
<authorEmail>salnikov.ss@yandex.ru</authorEmail>
<authorUrl>www.zonaspb.ru</authorUrl>
<version>1.5</version>
<description>Extend logging</description>
<files>
<filename plugin="extendlog">extendlog.php</filename>
</files>
<params>
</params>
</install>
Два файла в корень архива zip
Затем через удаление/добавление устанавливаем как обычный модуль. Должно сработать.
Прошу учесть, что лог писался под Joomla + jseblod, поэтому некоторые механизмы на чистой Joomla работать не будут.

Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Как сделать появление случайных картинок из пяти разных категорий?

Автор Katy93

Ответов: 2
Просмотров: 2668
Последний ответ 03.05.2021, 21:34:20
от sivers
Как сделать бэкап сайта

Автор egorovv

Ответов: 8
Просмотров: 7354
Последний ответ 06.06.2020, 12:09:43
от SeBun
[Решено] Проблема с авторизацией Invalid Token

Автор treX

Ответов: 100
Просмотров: 95392
Последний ответ 06.10.2019, 16:55:45
от PaLyCH
Вход в административный раздел - Имя пользователя и пароль не совпадают

Автор ZekMan

Ответов: 70
Просмотров: 25660
Последний ответ 16.12.2017, 20:12:04
от Aleks_El_Dia
Как сделать отображение третьего и далее уровней меню?

Автор Hloja_Blimm

Ответов: 12
Просмотров: 2093
Последний ответ 24.11.2017, 15:12:04
от Hloja_Blimm