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

kichik

  • Осваиваюсь на форуме
  • 15
  • 4 / 0
Добрый день форумчане, недавно передо мной встала (в прямом смысле этого слова) задача, реализация афиши... Выбрал компонент EventList под Joomla 1.5, начал делать, все бы хорошо, да вот в дальнейшем возникла потребность в кнопке "Я ИДУ", немного поразмыслив и поковырявшись в файлах компонента, не имея довольно хороших знаний понятия MVC в Joomla, я толком ничего не написал, вот теперь обращаюсь к вам, посоветуйте как можно довольно просто это реализовать?

Есть основные требования: во фронт энде, в  событиях отображается кнопка "Я ИДУ" и кол-во людей "ИДУЩИХ", и все, больше ничего и не требуется...
И в бэкэнде, требуется выводить список к каким событиям сколько людей идет и кто именно(отображать имя, фамилию зарегистрированного пользователя)

Не прошу тарелки с голубой каемкой, прошу помощи понять принцип реализации, либо какой-нибудь набросанный код, направивший меня в нужное русло...

PS Не принимайте в штыки
*

neo85r

  • Захожу иногда
  • 93
  • 10 / 0
  • Ускорение сайтов
Re: Кнопка "Я ИДУ" в компоненте EventList
« Ответ #1 : 16.04.2012, 19:03:34 »
1. Найти таблицу, где хранятся события компонента (my_table), добавить в нее столбей `i_will_go_counter` type int(11) default 0;
В этом столбце будем хранить число пошедших.
2. В файле компонента component_name.php добавить задачу
Код
$controller->registerTask( 'i_will_go', 'i_will_go' );
3. В файле контроллера controller добавить функцию
Код
function i_will_go()
{
global $mainframe;
$db = &JFactory::getDBO();
$id = JRequest::getInt('id');
$query = "UPDATE `#__my_table` SET `i_will_go_counter` = `i_will_go_counter` + 1 WHERE `id` = ".$id;
$db->setQuery($query);
if ($db->query()) $mainframe->redirect(куда, 'Счетчик обновлен');
$mainframe->redirect(куда, 'Счетчик не удалось обновить', 'error');
}
Теперь осталось добавить кнопку с url = 'index.php?option=com_mycomponent&task=i_will_go&id'.$id.'=&Itemid='.JRequest::getVar('Itemid');
$id - это id данного события. Да, чтобы не накликивали, а также увидеть тех, кто идет, стоит добавить еще одну таблицу `id`, `user_id`, `event_id` и реализовать проверку перед увеличением счечика. а также записывать в нее тех, кто идетtask=i_will_go
*

kichik

  • Осваиваюсь на форуме
  • 15
  • 4 / 0
Re: Кнопка "Я ИДУ" в компоненте EventList
« Ответ #2 : 17.04.2012, 08:59:00 »
Спасибо БОЛЬШУЩЕЕ, с помощью вашего кода сделал счетчик, вывод кол-ва идущих, записываю в БД кто идет и на какое мероприятие, так же сравниваю, кто уже пошел и кто еще не согласился =), таким образом отсеиваю идущих...

Но возникла небольшая трабла, после реализации счетчика, а именно после клика по ссылке "я иду", если я авторизован, то меня выкидывает... Есть мысли?

ПС переношу все в админку, чтобы наблюдать идущих пользователей =)
*

neo85r

  • Захожу иногда
  • 93
  • 10 / 0
  • Ускорение сайтов
Re: Кнопка "Я ИДУ" в компоненте EventList
« Ответ #3 : 17.04.2012, 09:35:58 »
>>если я авторизован, то меня выкидывает
позавчера была такая же ситуация. как совершенно случайно выяснилось, надо в файлах компонента сменить кодировку на utf-8
да, еще бывает вариант когда
Код
$user = & JFactory::getUser();
А потом к коде $user меняешь, например
Код
$user = 'My variable';
, тогда также выкидывает
*

kichik

  • Осваиваюсь на форуме
  • 15
  • 4 / 0
Re: Кнопка "Я ИДУ" в компоненте EventList
« Ответ #4 : 17.04.2012, 10:00:37 »
уууу сработало, я бы даже не подумал о кодировке...

спасибо большое =)

уже почти заканчиваю работу с админ частью =)
*

dagolovach

  • Новичок
  • 2
  • 0 / 0
Re: Кнопка "Я ИДУ" в компоненте EventList
« Ответ #5 : 30.05.2013, 12:53:24 »
Задам вопрос тут.
А есть возможность реализовать аналогичным образом в каком-нибудь компоненте для 3.0 ( а то евентлист только для 1.5)?
Том же JEvents?

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

Оптимизация вложености в компоненте

Автор kaksdelat

Ответов: 11
Просмотров: 2334
Последний ответ 16.07.2015, 23:55:15
от z3l
Подключение js файла и кнопка прикреления

Автор __noob__

Ответов: 6
Просмотров: 1762
Последний ответ 20.05.2014, 00:24:40
от Fedor Vlasenko
[Решено] Не сохраняются HTML тэги в самописном компоненте

Автор evgen777

Ответов: 5
Просмотров: 1267
Последний ответ 04.03.2014, 15:40:47
от evgen777
Invlid token на разрабатываемом компоненте

Автор designcenter

Ответов: 1
Просмотров: 1291
Последний ответ 06.01.2014, 02:07:26
от Aleks.Denezh
[Решено] Удаление ID из материалов в своём компоненте

Автор n_drey

Ответов: 9
Просмотров: 1459
Последний ответ 25.12.2013, 16:46:54
от n_drey