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

Mick_20

  • Завсегдатай
  • 1027
  • 3 / 0
  • Что тут писать?
Вывод из таблиц
« : 28.03.2014, 11:18:45 »
Имеются две таблицы:
names
nid - id записи
name - наименование

files
fid - id файла
file - название
descr - описание
nid - id записи из таблицы names

Нужно вывести информацию как на скриншоте.


Запрос написал а сам вывод сделать не могу... помогите пожалуйста.

Код: php
$query = $db->getQuery(true);
$query->select('n.id, n.name')
->from('#__portfolio_works_names AS n')
->leftJoin('#__portfolio_works_files AS f ON f.nid = n.id')
->where("n.user_id = {$userid}");
$list = $db->setQuery($query)->loadObjectList();

foreach($list as $work)
{
?
}
   
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Re: Вывод из таблиц
« Ответ #1 : 28.03.2014, 12:11:00 »
ну.. и выводите дальше $work->id , work->name, только вы из второй таблицы файлов ничего не выбрали по моему в select надо добавить f.* или f.file..А n.id у вас точно есть выше вы писали что у вас nid в таблице names?
интернет-блог: http://websiteprog.ru
*

Mick_20

  • Завсегдатай
  • 1027
  • 3 / 0
  • Что тут писать?
Re: Вывод из таблиц
« Ответ #2 : 28.03.2014, 12:40:35 »
ну.. и выводите дальше $work->id , work->name, только вы из второй таблицы файлов ничего не выбрали по моему в select надо добавить f.* или f.file..А n.id у вас точно есть выше вы писали что у вас nid в таблице names?
nid есть в таблице. n.id.

Понятно что выводить $work->id и т.п.   Это если просто списком. А таблицами отдельными где для группы файлов одно name я не знаю как.
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Re: Вывод из таблиц
« Ответ #3 : 28.03.2014, 13:21:23 »
Ну тут много вариантов, используйте функции php для работы с массивами http://www.php.net/manual/ru/ref.array.php . Я бы например сделал так:
Код: php
$names = array_unique(array_column($list,'name'));
foreach($names as $name)
{
   echo $name.'<hr />';
   $keys = array_keys($list,$name);
   foreach ($keys as $key)
   {
       $file= $list[$key];
       echo $file->file.'<br />';
   }
}
« Последнее редактирование: 28.03.2014, 13:24:53 от zomby6888 »
интернет-блог: http://websiteprog.ru
*

Mick_20

  • Завсегдатай
  • 1027
  • 3 / 0
  • Что тут писать?
Re: Вывод из таблиц
« Ответ #4 : 28.03.2014, 13:32:10 »
Вот только до чего додумался:

Код: php
foreach($list as $work) 
{
$t = $work->title;
$f = "<td>".$work->file_name."</td><td>".$work->descr."</td>";


$out = "<table><tr><td colspan='2'>{$t}</td></tr><tr>{$f}</tr></table><br />";
echo $out;

}

Выводит не так как надо:

Открытый урок по Информатике (презентация + сценарий)
my_article1.doc   | План открытого урока по Информатике.

Открытый урок по Информатике (презентация + сценарий)
my_article2.pptx| Презентация к открытому уроку по Информатике.

Сценарий классного часа
work1-2.doc   План классного часа


Нужно так:

Открытый урок по Информатике (презентация + сценарий)
my_article1.doc   | План открытого урока по Информатике.
my_article2.pptx| Презентация к открытому уроку по Информатике.

Сценарий классного часа
work1-2.doc   План классного часа
*

Mick_20

  • Завсегдатай
  • 1027
  • 3 / 0
  • Что тут писать?
Re: Вывод из таблиц
« Ответ #5 : 28.03.2014, 13:37:58 »
Сделал так:

Код: php
$query = $db->getQuery(true);
$query->select('n.id, n.title, f.file_name, f.descr')
->from('#__portfolio_works_names AS n')
->leftJoin('#__portfolio_works_files AS f ON f.nid = n.id')
->where("n.user_id = {$userid}");
$list = $db->setQuery($query)->loadObjectList();

$titles = array_unique(array_column($list,'title'));
foreach($titles as $title)
{
   echo $title.'<hr />';
   $keys = array_keys($list,$title);
   foreach ($keys as $key)
   {
       $file= $list[$key];
       echo $file->file_name.'<br />';
   }
}


Пишет ошибку: Fatal error: Call to undefined function array_column() in /uspeh.tspu.ru/portfolio/add_work.php on line 67 Fatal error: Access to undeclared static property: JLoader::$classes in /uspeh.tspu.ru/libraries/loader.php on line 195

На эту строку: $titles = array_unique(array_column($list,'title'));   
name я заменил в таблице на title
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Re: Вывод из таблиц
« Ответ #6 : 28.03.2014, 13:52:01 »
а array_column только в php 5.5 появился.. тогда придется циклом перебрать тайтлы:
Код: php
foreach ($list as $work)
  titles[] = $work->name;
$titles = array_unique(titles);
ну и дальше все остальное..
интернет-блог: http://websiteprog.ru
*

Mick_20

  • Завсегдатай
  • 1027
  • 3 / 0
  • Что тут писать?
Re: Вывод из таблиц
« Ответ #7 : 29.03.2014, 18:51:24 »
Не получается вывести файлы(
Выводит только $work->name;

Код: php
foreach ($list as $work)
  $titles[] = $work->name;
$titles = array_unique($titles);
foreach($titles as $title)
{
   echo $title.'<hr />';
  
   $keys = array_keys($list,$title);
   foreach ($keys as $key)
   {
       $file= $list[$key];
       echo $file->file_name.'<br />';
   }
}
*

winstrool

  • Давно я тут
  • 820
  • 51 / 2
  • Свободен для работы
Re: Вывод из таблиц
« Ответ #8 : 30.03.2014, 00:50:04 »
не забывайте про безопасность кода:
Код: php
$query = $db->getQuery(true);
$query->select('n.id, n.name')
->from('#__portfolio_works_names AS n')
->leftJoin('#__portfolio_works_files AS f ON f.nid = n.id')
->where("n.user_id = {$userid}");
$list = $db->setQuery($query)->loadObjectList();

foreach($list as $work)
{
?
}
при такой вариации, скрипт подвержен sql-injection, юзайте функцию intval()   
*

passer

  • Завсегдатай
  • 1013
  • 75 / 3
Re: Вывод из таблиц
« Ответ #9 : 30.03.2014, 02:21:48 »
Что там за массив обьектов в $list получается могу только догадываться, но попробуй так
Код: php
foreach ($list as $work){
echo $work->name;
$files = array_filter($list,
function($el) use ($work->id) {
return (int)$el->nid === (int)$work->id;
}
);
if($files)
foreach($files as $file)
echo $file->file_name;
}
Не проверял. Если ошибки синтаксиса где, сам поправишь. PHP не ниже 5.3
« Последнее редактирование: 30.03.2014, 02:32:02 от passer »
*

Mick_20

  • Завсегдатай
  • 1027
  • 3 / 0
  • Что тут писать?
Re: Вывод из таблиц
« Ответ #10 : 30.03.2014, 18:14:02 »
так ничего и не получилось :(
пришлось делать с подзапрос в запросе...
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

PHP вывод и замена значения из БД

Автор CityCat

Ответов: 11
Просмотров: 745
Последний ответ 29.07.2021, 15:53:58
от CityCat
Вывод img взависимости от url?

Автор warlocksp

Ответов: 2
Просмотров: 874
Последний ответ 25.04.2021, 14:50:32
от warlocksp
Вывод данных соглано таблицы Excel

Автор warlocksp

Ответов: 56
Просмотров: 2607
Последний ответ 28.02.2019, 23:56:23
от warlocksp
Вывод описание по картинки?

Автор warlocksp

Ответов: 7
Просмотров: 948
Последний ответ 11.01.2019, 18:05:43
от xpank
Вывод цены в зависимости от времени и дня недели

Автор baskethome

Ответов: 6
Просмотров: 1735
Последний ответ 13.02.2015, 13:51:43
от Arkadiy