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

neket

  • Захожу иногда
  • 61
  • 11 / 1
JRequest и фильтрация
« : 15.10.2012, 14:22:28 »
Доброго времени суток. Ни как не могу справиться с одной проблемой. Получаю через post-запрос изображение в виде base64. JRequest часть текста обрезает.
Пробовал использовать параметры:

    1 - JREQUEST_NOTRIM - если установлен, то пробелы по краям не обрежутся, по умолчанию пробелы отсекаются.
    2 - JREQUEST_ALLOWRAW - если установлен, то будет отключена всякая фильтрация, при этом более высокие биты игнорируются.
    4 - JREQUEST_ALLOWHTML - позволяет html-код. Но если установлен, то все равно будет включен фильтр безопасности по очистке html-кода.

Ни один не помогает, всё равно происходит обрезание кода. Как быть?
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Re: JRequest и фильтрация
« Ответ #1 : 15.10.2012, 15:33:44 »
Именно JRequest режет? В $_POST все ок?

Попробуйте ещё вот такую комбинацию:
$var = base64_decode(JRequest::getVar('myVar', '', 'POST', 'BASE64'));

P.S.
Лучше вместо JRequest использовать JInput, так как JRequest уже в легаси и скоро от него совсем откажутся.
*

SDKiller

  • Живу я здесь
  • 2705
  • 329 / 5
  • ...ergo sum
Re: JRequest и фильтрация
« Ответ #2 : 15.10.2012, 16:41:41 »
P.S.
Лучше вместо JRequest использовать JInput, так как JRequest уже в легаси и скоро от него совсем откажутся.

Ну да, только вот они не озадачились тем, что в JRequest можно было принудительно задавать откуда брать.

А теперь если есть задача взять данные именно из $_POST надо делать лишние телодвижения.
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Re: JRequest и фильтрация
« Ответ #3 : 15.10.2012, 17:00:57 »
А теперь если есть задача взять данные именно из $_POST надо делать лишние телодвижения.
Почему же? Все осталось так же как и раньше:

Getting Values from a Specific Super Global


Код: php
$foo = $jinput->get->get('varname', 'default_value', 'filter');
$foo = $jinput->post->get('varname', 'default_value', 'filter');
$foo = $jinput->server->get('varname', 'default_value', 'filter');

http://docs.joomla.org/Retrieving_request_data_using_JInput

Кроме того, JInput сразу же доступен в контроллере в качестве свойства $input начиная с Платформы 12.2 (Joomla 3.x)
*

passer

  • Завсегдатай
  • 1013
  • 75 / 3
Re: JRequest и фильтрация
« Ответ #4 : 15.10.2012, 17:09:13 »
А с файлами как удобно.
$files = $input->files->get('jform1');
Спасибо.
Аккуратный массивчик
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Re: JRequest и фильтрация
« Ответ #5 : 15.10.2012, 17:15:00 »
А с файлами как удобно.
$files = $input->files->get('jform1');
Спасибо.
Аккуратный массивчик
Аха. Так что плюсов стало больше, чем в JRequest. Главное уметь ими воспользоваться ;)
*

SDKiller

  • Живу я здесь
  • 2705
  • 329 / 5
  • ...ergo sum
Re: JRequest и фильтрация
« Ответ #6 : 15.10.2012, 18:29:20 »
Почему же? Все осталось так же как и раньше:

Да как-то не совсем, тут они ввели magic метод, вместо того чтобы просто указать параметром откуда брать данные, что абсолютно неоправданно. Да и с точки зрения чистоты восприятия кода это не одобряется.

Ведь magic-методы - это fallback, к ним обращение идёт после того как в классе не найден запрашиваемый метод.
Соответственно их постоянное использование идёт в ущерб производительности.
Основное применение для них - обработать ошибку, которая не была перехвачена вовремя, а не быть использованными постоянно.


Код
$foo = $jinput->post->get('varname', 'default_value', 'filter');
Если посмотреть на обработку этого в JInput - что получается?
Создан дефолтный экземляр класса, который берёт данные из $_REQUEST, в нём не находится объекта/метода $post, идёт fallback к методу __get(), в котором заново создаётся экземпляр класса с уже заданными параметрами.

Да и вот это веселит
Цитировать
// TODO throw an exception
« Последнее редактирование: 15.10.2012, 18:35:08 от SDKiller »
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Чем JFactory::getApplication()->input лучше JRequest::getVar()?

Автор Shustry

Ответов: 43
Просмотров: 15893
Последний ответ 13.01.2017, 12:18:41
от Septdir
Joomla 3.1 не находит JRequest. Не работает AJAX!

Автор justquestion

Ответов: 2
Просмотров: 3599
Последний ответ 11.10.2013, 12:42:08
от Aleks.Denezh