Новости Joomla

SW JProjects v.2.5.0 - компонент каталога цифровых проектов на Joomla

SW JProjects v.2.5.0 - компонент каталога цифровых проектов на Joomla

👩‍💻 SW JProjects v.2.5.0 - компонент каталога цифровых проектов на Joomla.Компонент - менеджер цифровых проектов для Joomla! CMS. Компонент обеспечивает создание каталога цифровых проектов и предоставляет возможность скачивания, в том числе с использованием лицензионных ключей.👩‍💻 v.2.5.0. Что нового?Схемы структур данных для серверов обновлений. Теперь с SW JProjects вы может создавать сервер обновлений не только для расширений Joomla, но и свои собственные. Например, вам нужно, чтобы структура данных сервера обновлений была другая и формат должен быть, например, не XML, а JSON. Формирование структуры данных для сервера обновлений расширений Joomla вынесено в отдельный плагин. Вы можете создать свой собственный плагин и реализовать в нём нужную вам структуру данных, добавив или наоборот исключив отображаемые данные. Сервер обновлений в компоненте по-прежнему отображает информацию о списке проектов и их версиях, о конкретном проекте и его changelog.Можно выбрать схему данных сервера обновлений глобально для всего компонента, выбрать другую схему данных для категории проектов, а так же выбрать схему в каждом проекте.

Разработчикам в качестве образца можно посмотреть плагин схемы данных для Joomla в составе компонента или же плагин-образец JSON-схемы на GitHub.
Группа плагинов swjprojects. Для нужд компонента создана группа плагинов swjprojects. В частности, в этой группе находится плагин структуры данных Joomla расширений для сервера обновлений.Изменение языковых констант. Изменены некоторые языковые константы в панели администратора. Если вы делали переопределение констант - переопределите их снова.👩‍💻 Joomla 6. Внесены изменения для корректной установки и работы компонента на Joomla 6. Компонент успешно протестирован на Joomla 6-beta2.Минимальная версия Joomla - 5. Подняты минимальные системные требования: Joomla 5.0.0 и PHP 8.1.
- Страница расширения👉 Плагин-образец кастомной JSON-схемы данных для сервера обновлений на GitHub.- GitHub расширения- Документация на GitHub- Joomla Extensions Directory#joomla #расширения

Как триггерить события для плагинов на манер Joomla 5+?В Joomla 6 должны удалить метод...

Как триггерить события для плагинов на манер Joomla 5+?В Joomla 6 должны удалить метод...

👩‍💻 Как триггерить события для плагинов на манер Joomla 5+?В Joomla 6 должны удалить метод triggerEvent(), с помощью которого раньше вызывались события для плагинов. Теперь чтобы в своём коде вызвать событие для плагина и получить от него результаты нужно:- создать объект класса события- передать в него параметры

use Joomla\CMS\Event\AbstractEvent;use Joomla\CMS\Factory;use Joomla\CMS\Plugin\PluginHelper;// Грузим плагины нужных группPluginHelper::importPlugin('system');// Создаём объект события$event = AbstractEvent::create('onAfterInitUniverse', [    'subject' => $this,    'data'    => $data, // какие-то данные    'article' => $article, // ещё материал вдовесок    'product' => $product, // и товаров подвезли]);// Триггерим событиеFactory::getApplication()->getDispatcher()->dispatch(    $event->getName(), // Тут можно строку передать 'onAfterInitUniverse'    $event);// Получаем результаты// В случае с AbstractEvent это может быть не 'result',// а что-то ещё - куда сами отдадите данные.// 2-й аргумент - значение по умолчанию, // если не получены результаты$results = $event->getArgument('result', []);
Плюсы такого подхода - вам не нужно запоминать порядок аргументов и проверять их наличие. Если вы написали свой класс события, то в плагине можно получать аргументы с помощью методов $event->getArticle(), $event->getData(), $event->getProduct() и подобными - реализуете сами под свои нужды. Если такой класс события написали, то создаёте экземпляр своего класса события и укажите его явно в аргументе eventClass
use Joomla\Component\MyComponent\Administrator\Event\MyCoolEvent;$event = MyCoolEvent::create('onAfterInitUniverse', [    'subject'    => $this,    'eventClass' => MyCoolEvent::class, // ваш класс события    'data'       => $data, // какие-то данные    'article'    => $article, // ещё материал вдовесок    'product'    => $product, // и товаров подвезли]);
Ожидаемо, что класс вашего события будет расширять AbsractEvent или другие классы событий Joomla.🙁 Есть неприятный нюанс - нельзя просто так вызывать событие и ничего не передать в аргументы. Аргумент subject обязательный. Но если вы всё-таки не хотите туда ничего передавать - передайте туда пустой stdClass или объект Joomla\registry\Registry.
@joomlafeed#joomla #php #webdev

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

alex_a_k

  • Захожу иногда
  • 381
  • 21 / 0
Посоветуйте где можно почитать/подсмотреть как вытянуть из таблицы сессий хранящиеся данные по user agent'ам.
Че-то не выходит...  :(
Не жмитесь на "+" в репу!
А так же на мелкий donate. ))
*

SmokerMan

  • Гуру
  • 5290
  • 720 / 26
что есть такое User Agent?
Код
<?php die($_SERVER['HTTP_USER_AGENT']); ?>
не?)
*

alex_a_k

  • Захожу иногда
  • 381
  • 21 / 0
что есть такое User Agent?
Код
<?php die($_SERVER['HTTP_USER_AGENT']); ?>
не?)
Да, мне нужен $_SERVER['HTTP_USER_AGENT'].
Но задача в том, чтобы достать его из базы данных, где он хранится в поле data таблицы #__session
« Последнее редактирование: 27.06.2013, 21:43:02 от alex_a_k »
Не жмитесь на "+" в репу!
А так же на мелкий donate. ))
*

likrion

  • Давно я тут
  • 750
  • 129 / 2
Код
$session =& JFactory::getSession();
$browser = $session->get('session.client.browser');
echo $browser;
R331474010295
*

Shustry

  • Гуру
  • 6434
  • 745 / 3
Код: php
$userid = 480;

$query='select s.userid, s.data from #__session as s where s.userid='.$userid;

$db = JFactory::getDBO();
$db->setQuery($query);

$session = $db->loadObjectList()[0]->data;

var_dump ($session);

Только таблица session же обнуляется периодически.
*

alex_a_k

  • Захожу иногда
  • 381
  • 21 / 0
Код
$session =& JFactory::getSession();
$browser = $session->get('session.client.browser');
echo $browser;
Причем здесь текущая сессия?
Речь идет о базе данных!
Не жмитесь на "+" в репу!
А так же на мелкий donate. ))
*

alex_a_k

  • Захожу иногда
  • 381
  • 21 / 0
Код: php
$userid = 480;
$query='select s.userid, s.data from #__session as s where s.userid='.$userid;
$db = JFactory::getDBO();
$db->setQuery($query);
$session = $db->loadObjectList()[0]->data;
var_dump ($session);
Спасибо, попробую.

Только таблица session же обнуляется периодически.
Я в курсе.
Мне нужно разделить мух от котлет (текущих юзеров, гостей и ботов) в пределах последних сессий.
Не жмитесь на "+" в репу!
А так же на мелкий donate. ))
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
*

alex_a_k

  • Захожу иногда
  • 381
  • 21 / 0
Код: php
$session = $db->loadObjectList()[0]->data;
var_dump ($session);
Я не совсем точно поставил вопрос...
Здесь вытягивается ВСЁ поле data, а мне нужно ИЗ НЕГО вытянуть session.client.browser.

P.S. В loadObjectList() с '[О]' выдает ошибку...
Не жмитесь на "+" в репу!
А так же на мелкий donate. ))
*

alex_a_k

  • Захожу иногда
  • 381
  • 21 / 0
Код: php-brief
//guest = true значит гость
$guest = JFactory::getUser()->guest;
Вы читать умеете?
При чем здесь текущий гость к юзерагенту, хранящемуся в базе данных в таблице sessions в поле data  из которого нужно вытянуть session.client.browser!
Бля, выбешивает! Ж:-E
Не жмитесь на "+" в репу!
А так же на мелкий donate. ))
*

SDKiller

  • Живу я здесь
  • 2705
  • 329 / 5
  • ...ergo sum
P.S. В loadObjectList() с '[О]' выдает ошибку...

Вы массив сначала получите, а потом уже его мучайте.
Зачем индекс массива к функции цеплять, тем более что она может и null вернуть если таблица пустая.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Цитировать
Вы читать умеете?
Конечно умеем. Зачем спрашивается лезть в сессию? Велосипед свой делаем?
вам ответил SmokerMan как это делать или используйте JBrowser, JWebClient
*

alex_a_k

  • Захожу иногда
  • 381
  • 21 / 0
Конечно умеем. Зачем спрашивается лезть в сессию? Велосипед свой делаем?
вам ответил SmokerMan как это делать или используйте JBrowser, JWebClient

Да не нужен мне текущий юзер, нужны именно данные из сессий в базе!
Зачем мне это нужно - дело десятое...
Просто дайте КОНКРЕТНЫЙ ответ на КОНКРЕТНЫЙ вопрос!
КАК ДОСТАТЬ session.client.browser В ТАБЛИЦЕ sessions ИЗ ПОЛЕ data?
Кто-нибудь может ответить на вопрос который задали, а не развивать дискуссии на вольную тему?

P.S. Ну или узнать сам принцип, механизм, как извлекать данные ИЗ ПОЛЕЙ ПОДОБНОГО ТИПА.
Там ведь хранится не просто текст...
Не жмитесь на "+" в репу!
А так же на мелкий donate. ))
*

SDKiller

  • Живу я здесь
  • 2705
  • 329 / 5
  • ...ergo sum
*

alex_a_k

  • Захожу иногда
  • 381
  • 21 / 0
http://php.net/manual/en/function.unserialize.php
Спасибо за подсказку, но что-то не выходит "каменный цветок"...

Пишу:
Код: php
$db = JFactory::getDBO();
$query='select * from #__session';
$db->setQuery($query);
$sessions = (array) $db->loadObjectList();
foreach($sessions as $session) {
$data = unserialize($session->data);
var_dump($data);
}

Получаю:
Цитировать
bool(false) bool(false) bool(false) bool(false) bool(false)

Что я делаю не так, ткните носом (не силен в PHP)?
« Последнее редактирование: 27.06.2013, 15:01:23 от alex_a_k »
Не жмитесь на "+" в репу!
А так же на мелкий donate. ))
*

SDKiller

  • Живу я здесь
  • 2705
  • 329 / 5
  • ...ergo sum
Да, там намного всё интереснее.

Как-то так

Код: php
                $db = JFactory::getDBO();
                $query='select * from #__session';
                $db->setQuery($query);
                $sessions = (array) $db->loadObjectList();

                foreach($sessions as $session) {
                    $data = (string) $session->data;
                    $old = $_SESSION;
                    session_decode($data);
                    $new = $_SESSION;
                    $_SESSION = $old;

                    echo $new['__default']['session.client.browser'];
                    echo '<br />';
                }

Получили:



Почему - читаем здесь

http://www.php.net/manual/ru/function.session-decode.php

И особенно вот этот момент

Цитировать
...and populates the $_SESSION superglobal with the result

Поэтому делать лучше локально.

А я всю думал - что за беда у меня в таблице с ромбиками вместо символов - а это из-за session.serialize_handler'a
« Последнее редактирование: 27.06.2013, 16:05:47 от SDKiller »
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Еще вариант регуляркой строку разобрать
Код: php
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('data')->from('#__session');
$db->setQuery($query);
$datas = $db->loadResultArray();
if (count($datas)) {
foreach ($datas as $data) {
if ($data){
$data = preg_replace('/^.+session\.client\.browser\".+?[^"]\"(.+?[^"])".+$/', '$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('data')->from('#__session');
$db->setQuery($query);
$datas = $db->loadResultArray();
if (count($datas)) {
foreach ($datas as $data) {
if ($data){
$data = preg_replace('/^.+session\.client\.browser\".+?[^"]\"(.+?[^"])".+$/', '$1', $data);
echo $data;
}

}
}', $data);
echo $data;
}

}
}
*

SDKiller

  • Живу я здесь
  • 2705
  • 329 / 5
  • ...ergo sum
Вариант )

Только в зависимости от session.serialize_handler может быть ведь и так

Код
rSwjYWtlgeOZdumc_Q5XtsKp9nGevC3yqN9rH8TSx48D8NQk7CwXQDuK8CAQHFI7Te1aRr5yVCJHP_XeFoEU...

Я ещё голову ломал, что за чудеса у меня на хетцнере
« Последнее редактирование: 27.06.2013, 22:35:39 от SDKiller »
*

alex_a_k

  • Захожу иногда
  • 381
  • 21 / 0
Да, там намного всё интереснее.
Как-то так
...
Получили:
...
Почему - читаем здесь
http://www.php.net/manual/ru/function.session-decode.php
Попробовал - получилось, огромное спасибо.

Еще вариант регуляркой строку разобрать
...
И за это решение конечно тоже.

Но судя по...
И особенно вот этот момент
Цитировать
...and populates the $_SESSION superglobal with the result
Это не самый лучший вариант.
Если я правильно понял перезапись (даже временная) в $_SESSION чужих данных для удобства их разбора - совсем "не камильфо".
Я верно понял?

Поэтому делать лучше локально.
Не совсем понял что имеется в виду...

Как по вашему, лучше использовать вариант с разборкой строки регуляркой?

Только в зависимости от session.serialize_handler может быть ведь и так
...
Я ещё голову ломал, что за чудеса у меня на хетцнере
Я не настолько глубоко знаком с такими тонкостями.
Если вам не сложно, объясните пожалуйста кратко, в двух словах особенности и подводные камни.

А то все получилось, но я в растерянности - каким же путем идти.
Не жмитесь на "+" в репу!
А так же на мелкий donate. ))
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Если работает вариант с регуляркой используйте его. Он быстрее и не ресурсоемкий. Нет лишних движений и преобразований, значит должен работать быстрее и меньше кушать памяти.
SDKiller а если не __default?
*

alex_a_k

  • Захожу иногда
  • 381
  • 21 / 0
Если работает вариант с регуляркой используйте его. Он быстрее и не ресурсоемкий. Нет лишних движений и преобразований, значит должен работать быстрее и меньше кушать памяти.
Спасибо за информацию, попробую.
Но мне бы еще хотелось услышать мнения и ответы уважаемых гуру на кучу вопросов из предыдущего поста.
Это не просто праздное любопытство, по этому обидно спрашивать в пустоту...

SDKiller а если не __default?
А такое может быть?
В каком случае происходит?
Не жмитесь на "+" в репу!
А так же на мелкий donate. ))
*

SDKiller

  • Живу я здесь
  • 2705
  • 329 / 5
  • ...ergo sum
SDKiller а если не __default?

Стандартные вещи, в частности сессию, Joomla пишет в пространство имён default

Вообще я мало встречал расширений, которые бы писали свои данные в свой namespace
JCE например пишет.

А вы обычно когда сохраняете в сессию или получаете из неё значения указываете namespace? Вряд ли.

А значит

« Последнее редактирование: 27.06.2013, 22:18:33 от SDKiller »
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Я не спорю но это маленький ответ на session.serialize_handler. Кто же знал, что и у вас конфигурация не стандарт.  *DRINK*
*

SDKiller

  • Живу я здесь
  • 2705
  • 329 / 5
  • ...ergo sum
Если я правильно понял перезапись (даже временная) в $_SESSION чужих данных для удобства их разбора - совсем "не камильфо".
Я верно понял?

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

К сожалению  session_decode принудительно пишет сразу в $_SESSION

Там же на php.net в комментариях приводятся несколько вариантов разбора сессии, но у меня вот например unserialize ошибку даёт потому что какие-то служебные символы в БД попадают и видны там ромбиками.

Цитировать
Цитата: SDKiller от Сегодня в 14:55:17
Поэтому делать лучше локально.

Не совсем понял что имеется в виду...

Я не знаю, что именно вы хотите реализовать.
Если отслеживание в оперативном режиме - то надо тогда использовать другие методы.
Лучше напрямую получать $_SERVER['HTTP_USER_AGENT']

Если в исторических целях - выгружаете таблицу с хостинга, делаете на денвере/wamp'е/openserver'е - что у вас там стоит.
Только убедитесь что у конфигурации php более-менее совпадают.

Цитировать
Я не настолько глубоко знаком с такими тонкостями.

Сам в шоке ;)
Зато вот выяснил для себя вопрос, который меня последние пару месяцев озадачивал - почему на одном из хостингов у меня не то что я привык видеть в #__session
*

alex_a_k

  • Захожу иногда
  • 381
  • 21 / 0
Верно.
Я для скорости воткнул код в одном из шаблонов админки, меня на первой итерации выкинуло. Поэтому пришлось сохранять предыдущее значение, потом возвращать на место.
К сожалению  session_decode принудительно пишет сразу в $_SESSION
Но как по вашему, вариант сохранение текущей $_SESSION -> перезапись данными из бд -> восстановление сохраненной имеет право на спокойную жизнь?
Здесь не будет граблей и подводных камней?

Я не знаю, что именно вы хотите реализовать.
Если отслеживание в оперативном режиме - то надо тогда использовать другие методы.
Лучше напрямую получать $_SERVER['HTTP_USER_AGENT']
Если в исторических целях - выгружаете таблицу с хостинга, делаете на денвере/wamp'е/openserver'е - что у вас там стоит.
Только убедитесь что у конфигурации php более-менее совпадают.
Суть задачи стоит в следующем...
Это модуль аналогичный штатному джумловскому "Кто в онлайне".
Только он выводит не только гостей и зарегеных юзеров, но и количество ботов (определяются по useragent), посетивших сайт за последние 10 минут.
Тонкость в том, что не хочется заводить отдельную таблицу и тупо писать в нее всех посетивших сайт и потом устраивать над ней разбор полетов.
Считаю это не рациональным, таблица будет слишком быстро разрастаться и много других моментов вытекающих из этого метода.
По этому и было принято решение использовать джумловскую таблицу сессий, в которой все вышеозначенные моменты уже решены.
Но я не думал, что достать необходимую инфу из поля data будет не так просто...
Может есть другой вариант?

Там же на php.net в комментариях приводятся несколько вариантов разбора сессии, но у меня вот например unserialize ошибку даёт потому что какие-то служебные символы в БД попадают и видны там ромбиками.
По вашему какой из вариантов в тамошних комметах подойдет под мои цели больше всего?

Сам в шоке ;)
Зато вот выяснил для себя вопрос, который меня последние пару месяцев озадачивал - почему на одном из хостингов у меня не то что я привык видеть в #__session
Хм...
Будем знать.
Век живи - век учись! ;)
« Последнее редактирование: 28.06.2013, 07:59:31 от alex_a_k »
Не жмитесь на "+" в репу!
А так же на мелкий donate. ))
*

alex_a_k

  • Захожу иногда
  • 381
  • 21 / 0
Пока остановился на варианте уважаемого Fedor Vlasenko, поскольку:

1. Вариант рабочий.
2. Быстрый и экономичный.
3. Без лишних заморочек с перезаписью сесии и т.д.
4. Это позволяет session.serialize_handler. )))

Но вопросы из предыдущего поста остаются открытыми.
Мне интересно узнать ваше мнение.
Не жмитесь на "+" в репу!
А так же на мелкий donate. ))
*

SDKiller

  • Живу я здесь
  • 2705
  • 329 / 5
  • ...ergo sum
Я бы всё же системным плагином писал агента текущего пользователя в отдельную табличку (соответственно выставив ему после этого в текущей сессии флаг, что "его посчитали", чтобы не дублировать записи).

С точки зрения производительности - думаю всё же вытаскивать уже готовый user agent из этой таблицы быстрее чем вытаскивать данные из таблицы сессий и разбирать их регулярками.
Что касается очистки таблицы - это не так сложно в реализации.
*

alex_a_k

  • Захожу иногда
  • 381
  • 21 / 0
Спасибо за совет, подумаю...
Не жмитесь на "+" в репу!
А так же на мелкий donate. ))
*

SDKiller

  • Живу я здесь
  • 2705
  • 329 / 5
  • ...ergo sum
Даже в целях вашего модуля можно бы было при записи в эту табличку сразу анализировать агент и писать ещё в одно поле типа tinyint уже признак (например 1-юзер, 2 - бот) - тогда при выводе модуля ещё быстрее получится.
Ведь пишется один посетитель один раз, а модуль выводиться будет каждый раз при просмотре страницы.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
В данном случае я бы посоветовал посмотреть на уже готовые решения. Вот по статистике у меня на одном сайте исправно крутится уже 4 года joomlastats. Не использую внешние скрипты статистики для небольших сайтов  - оптимальное решение, но их скриптов статистики очень много.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Вывод таблицы, деление на страницы

Автор March Cat

Ответов: 6
Просмотров: 1128
Последний ответ 09.01.2019, 18:49:15
от dmitry_stas
checkbox придать вид таблицы в файле XML

Автор xenos

Ответов: 5
Просмотров: 1585
Последний ответ 17.07.2017, 16:16:11
от vipiusss
SobiPro и SP-GeoMap поле

Автор dimat84

Ответов: 2
Просмотров: 2002
Последний ответ 02.08.2014, 11:36:22
от dimat84
Поле вывода календаря как d-m-Y. XML элемент календарь

Автор oppo

Ответов: 0
Просмотров: 1538
Последний ответ 19.07.2014, 15:43:47
от oppo
Про дополнительное поле регистрации Joomla 2.5

Автор NlCK

Ответов: 15
Просмотров: 2937
Последний ответ 04.06.2014, 09:32:34
от robert