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

chilly_bang

  • Захожу иногда
  • 113
  • 1 / 1
Приветствую.

Возникла проблема добавления дополнительных мета-тегов к статьям. У меня мета-тегов много: Dublin Core, Open Graph, некоторые микроформаты тоже как мета добавляю. Для обычных статей Joomla я использовал замечательный плагин JosTag: он по синтаксису {tag}meta name="tagname" content="tagcontent"{/tag} добавляет любые тегы в head статьи. Но с К2 работать отказался. В коде только сама строка кода стоит, а в head ничего не пишется:(
Вот и вопрос: как добавить дополнительные теги в голову К2-статьи?
И, кстати, я плагин этот, JosTag, привешу сюда - может быть, для настоящих самураев это раз мечом взмахнуть, чтоб он и с К2 заработал? Вот круто было бы вообще!
спасибо

[вложение удалено Администратором]
*

chilly_bang

  • Захожу иногда
  • 113
  • 1 / 1
спасибо, чтобы мне помог ваш совет, надо будет ещё с несколькими вещами хорошо разобраться...

скажите, пожалуйста: я не прав, думая, что скорее нужно в плагин добавить условие, когда он срабатывает? Там есть вот такие строки:
Код
// perform the replacement
if ($context = 'com_content.article') {
$article->text = preg_replace_callback($regex, array(&$this,'plgJosTag_replacer'), $article->text );
return true;
}
и я думал, что надо либо добавить что-то в условие if ($context = 'com_content.article'), либо дописать ещё одно условие дл того, чтобы плагин мог знать, как ему на К2 реагировать...
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
var_dump($context ); //посмотрите, что здесь com_k2.article ?
if ($context = 'com_content.article' || $context = 'com_k2.article'){
*

chilly_bang

  • Захожу иногда
  • 113
  • 1 / 1
Большое спасибо! таки помогла первая ссылочка. Плагин работает. Надо сперва взять евент из JosTag, когда он стреляет, и его вставит в шаблон. А потом воспользоваться советом номер один. Вот только одна мелочишка осталася досадная чрезвычайно, из-за дичайшего незнания синтаксиса:
вот так работает:
Код
<?php echo JHTML::_('content.prepare', '{tag}meta name="author" content="wowa"{/tag}'); ?>
а вот так не работает:(
Код
<?php echo JHTML::_('content.prepare', '{tag}meta name="author" content=" echo $extrafields['44']; "{/tag}'); ?>

Думаю, дело в том, что плагин фильтрует входные данные, вот так:
Код
		// strip out unwanted HTML elements
$html_entities_match = array("|\<br \/\>|", "#<#", "#>#", "|&#39;|", '#&quot;#', '#&nbsp;#' );
$html_entities_replace = array("\n", '', '', "'", '"', ' ' );
$tag = preg_replace($html_entities_match, $html_entities_replace, $tag );
$tag = str_replace("\t", '  ', $tag);
$tag = str_replace("&lt;", '<', $tag);
$tag = str_replace("&gt;", '>', $tag);

А как быть - не знаю...:(
*

Fedor Vlasenko

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

chilly_bang

  • Захожу иногда
  • 113
  • 1 / 1
не, вот так делается:   
Код
<meta name="author" content=""/>
*

Fedor Vlasenko

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

chilly_bang

  • Захожу иногда
  • 113
  • 1 / 1
прости, не понял. строка
Код
<?php echo JHTML::_('content.prepare', '{tag}meta name="author" content="test"{/tag}'); ?>
работает по любому, я вроде писал, да? А вот что с var_dump($extrafields['44']); делать - совсем не понял... если так вставляю - то пустой сайт, ошибка, если в <?php var_dump($extrafields['44']); ?> то выдаёт во фронтенде NULL.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
у тебя в массиве $extrafields['44'] NULL. Ничего нет Соответственно
<?php echo JHTML::_('content.prepare', '{tag}meta name="author" content="'.$extrafields['44'].'"{/tag}'); ?>
выведет
<meta name="author" content=""/>
*

chilly_bang

  • Захожу иногда
  • 113
  • 1 / 1
а вот и нет, я проверил первым делом - есть в этом поле значение! я и дальше проверил: какое бы поле (заполненное или нет) var_dump не смотрел - везде NULL. а поля-то заполнены 100% - фронтенд значения показывает:(
« Последнее редактирование: 14.01.2013, 20:37:16 от chilly_bang »
*

chilly_bang

  • Захожу иногда
  • 113
  • 1 / 1
надо вместо $extrafields['46'] вот так делать:
Код
<?php echo JHTML::_('content.prepare', '{tag}meta name="таг" content="'.$this->item->extraFields->алиас_имени_доп_поля->value.'"{/tag}'); ?>]<?php echo JHTML::_('content.prepare', '{tag}meta name="tagname" content="'.$this->item->extraFields->your_extra_field_alias->value.'"{/tag}'); ?>
и работает на ура!
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Как добавить свой класс для страниц вывода материалов по тегу k2?

Автор Slava77

Ответов: 0
Просмотров: 4084
Последний ответ 16.02.2023, 23:29:34
от Slava77
Как добавить дополнительным полям K2 разные классы?

Автор Slava77

Ответов: 3
Просмотров: 2302
Последний ответ 06.06.2021, 22:36:00
от sivers
Можно ли безболезненно добавить загрузку еще одной миниатюры, изображения?

Автор designerandrey

Ответов: 0
Просмотров: 1546
Последний ответ 16.04.2019, 20:22:13
от designerandrey
Falang дополнительные поля К2

Автор face2005

Ответов: 0
Просмотров: 853
Последний ответ 06.03.2019, 13:01:32
от face2005
Не добавить изображение с сервера в материал. ( обзор на сервере )

Автор Grione

Ответов: 0
Просмотров: 1723
Последний ответ 28.12.2018, 19:06:20
от Grione