Новости 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 Гость просматривают эту тему.
  • 8 Ответов
  • 6529 Просмотров
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Привет всем!

При написании комопонента столкнулся с проблемой - у меня есть запрос, который выводит большой список. Есть желание его разбить на несколько страниц, но вот как это сделать? Есть ли в Joomla! стандартные средства или для этого необходимо написать что-то своё?

Спасибо!
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Думал писать с нуля, а оказалось, я уже это один раз описывал: Функции для постраничной навигации
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
smart - огромное спасибо! Буду пробовать :)

P.S.
Сорри вроде просматривал этот форум весь, а твою ссылку пропустил.
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Такс, что-то у меня не получается... Может кто глянет свежим взглядом, поможет.

Вот вывод списка (пока всего 3 записи), но pagination не срабатывает:
http://demo.contra.lv/index.php?option=com_contrashop&task=manage&mode=slotlist&limitstart=0&limit=1

Код вывода:
Код
if ($mode == "slotlist") {
require_once( $GLOBALS['mosConfig_absolute_path'] . '/includes/pageNavigation.php' );
$limit = intval( mosGetParam( $_REQUEST, 'limit', 1 ) );
$limitstart = intval( mosGetParam( $_REQUEST, 'limitstart', 0 ) );
$database->setQuery("SELECT * FROM #__contrashop_slots WHERE expired=0 LIMIT {$limitstart}, {$limit}");
$rows = $database->loadObjectList();
$total = COUNT($rows);

?>  <div id="mainContainer" style="">
<legend><h3><?php echo _ALL_SLOTS; ?></h3></legend>
<table width="100%">
<tr>
<td><b><?php echo _SERVER; ?></b></td>
<td><b><?php echo _NICK; ?></b></td>
<td><b><?php echo _PASSW; ?></b></td>
<td><b><?php echo _BOUGHT; ?></b></td>
<td><b><?php echo _EXPIRES; ?></b></td>
<td></td>
</tr>
<?php foreach ($rows as $row) {
if ($row->server == "dd2") {
$servername = "dust2 only";
}
if ($row->server == "gg") {
$servername = "Gun Game";
}
if ($row->server == "ggdm") {
$servername = "Gun Game DM";
}
if ($row->server == "conq") {
$servername = "Conquest";
}
if ($row->server == "dm") {
$servername = "Death Match";
}
if ($row->server == "zm") {
$servername = "Zombie Mod";
}
if ($row->server == "all") {
$servername = "All";
}
echo '<tr>
<td width="20%">'.$servername.'</td>
<td width="20%">'.$row->nick.'</td>
<td width="20%">'.$row->pass.'</td>
<td width="20%">'.$row->start_str.'</td>
<td width="20%">'.$row->end_str.'</td>';
}
echo "</tr></table></div>";
$pageNav = new mosPageNav( $total, $limitstart, $limit );
$link = "index.php?option=com_contrashop&task=manage&mode=slotlist";
echo $pageNav->writePagesLinks( $link );
}
Где чего я попутал? Наставьте на путь истинный :) Спасибо.
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Ошибься ты вот в чем. Ты делаешь запрос, ограничиваешь выборку, и потом считаешь количество по выбранному - а оно всегда одно и то же будет. Нужно же, несколько иначе. Простенький пример из компонента баннеров:


	
$limit 
	
	
intval$mainframe->getUserStateFromRequest"viewlistlimit"'limit'$mosConfig_list_limit ) );
	
$limitstart intval$mainframe->getUserStateFromRequest"viewban{$option}limitstart"'limitstart') );

	
// get the total number of records
	
$query "SELECT COUNT(*)"
	
"\n FROM #__banner"
	
;
	
$database->setQuery$query );
	
$total $database->loadResult();

	
require_once( 
$GLOBALS['mosConfig_absolute_path'] . '/administrator/includes/pageNavigation.php' );
	
$pageNav = new mosPageNav$total$limitstart$limit );

	
$query "SELECT b.*, u.name AS editor"
	
"\n FROM #__banner AS b "
	
"\n LEFT JOIN #__users AS u ON u.id = b.checked_out"
	
;
	
$database->setQuery$query$pageNav->limitstart$pageNav->limit );
	
$rows $database->loadObjectList();


Т.е. сначла делается запрос, возвращающий количество элементов, получаем $total, потом формируем объект страничной навигации, в него передаем 3 параметра, а затем уже делаем запрос на выборку данных, и ограничиваем ее значениями из объекта страничной навигации.

1. Ограничиваем значениями объекта потому, что параметры переданные запросом могут быть неверны (например нет такого смещения), а в объекте это ве корретируется
2. В указанном примере ограничение делается не путем добавления LIMIT в сам текст запроса, а в функцию setQuery. По сути, произойдет то же самое, просто выглядит аккуратнее.

*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Серж, спасибо огромное. Снова выручил!

В итоге у меня получилось так:

	
	
	
$limit intvalmosGetParam$_REQUEST'limit'10 ) );
	
	
	
$limitstart intvalmosGetParam$_REQUEST'limitstart') );
	
	
	

	
	
	
$database->setQuery("SELECT COUNT(*) FROM #__contrashop_slots WHERE expired=0");
	
	
	

	
	
	
$total $database->loadResult();
	
	
	

	
	
	
require_once( 
$GLOBALS['mosConfig_absolute_path'] . '/includes/pageNavigation.php' );
	
	
	
$pageNav = new mosPageNav$total$limitstart$limit );

                        
$database->setQuery("SELECT * FROM #__contrashop_slots WHERE expired=0 LIMIT {$pageNav->limitstart}{$pageNav->limit}");
	
	
	
$rows $database->loadObjectList();


Всё замечательно работает.
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Блин, захотел привести вывод постраничной навигации к sefRelToAbs таким способом:

$link 
'index.php?option=com_contraadmins';
echo 
sefRelToAbs($pageNav->writePagesLinks$link ));

Но получается в итоге http://www.contra.lv/<< [Первая] < [Предыдущая] 1 2 [Следующая] > [Последняя] >>
хотя при этом ссылки навигации приводятся к sefRelToAbs... Откуда тут появилось http://www.contra.lv/ вот в чём вопрос.

Что неверно в коде?
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Блин, захотел привести вывод постраничной навигации к sefRelToAbs таким способом
а нафига? они и так выводятся в правильном формате, посмотри внимательнее код в файле includes/pageNavigation.php - ты увидишь там все необходимые вызовы метода sefRelToAbs
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Хмм... Что-то мне показалось, что выводилось без sef. Ещё раз перепроверюсь.

Update: да , всё в порядке... я чего-то не углядел
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Вывод статистики по всем проектам в один roster

Автор r0m4n

Ответов: 4
Просмотров: 795
Последний ответ 18.12.2019, 18:47:57
от r0m4n
Вывод таблицы, деление на страницы

Автор March Cat

Ответов: 6
Просмотров: 1128
Последний ответ 09.01.2019, 18:49:15
от dmitry_stas
Меню схлопывается после перезагрузки страницы

Автор onelawyer

Ответов: 10
Просмотров: 1676
Последний ответ 11.10.2017, 14:50:48
от effrit
Модификация модуля lastet_news вывод времени перед заголовком

Автор Morphiss

Ответов: 9
Просмотров: 2424
Последний ответ 19.04.2016, 12:41:55
от spsyper
Как вставить модуль в код нужной страницы php?

Автор zvi

Ответов: 7
Просмотров: 3714
Последний ответ 12.04.2016, 19:36:55
от AlekVolsk