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

HYBRID

  • Захожу иногда
  • 228
  • 47 / 0
  • Они захватят мир
Joomla вырезает теги, не дает вставить видео, начисто удаляет теги object, iframe, embed или пустые div-ы и span-ы  - типичная проблема для начинающего, да и порой опытного Joomla-юзверя впервые столкнувшегося с этим.

Способов избежать этого есть множество, ставить JCE со всеми его плюшками, отключать очистку кода в редакторе, но при этом давиться такими дублирующимися тегами с префиксом mce_, вообще отключить визуальный редактор (вариант для любителей легкого садомазо) даже как вариант "только чтобы вставить нужный код, а потом снова включить редактор" не очень привлекателен. А вот самый простой, гибкий и при этом надежный вариант я нашел только на просторах англоязычного интернета и делюсь им с вами.

Отбираем дудку у TinyMCE
Типичная ситуация, надо вставить видео с Youtube но редактор, зараза, вырезает код, гуглим, joomlaфорумим, паника нарастает, ответов нет, ищем плагины, совершаем манипуляции описанные выше, пиво уже кипит... глубоко вздыхаем и идем в настройки плагина TinyMCE (Расширения --> Менеджер плагинов --> Редактор - TinyMCE 2.0), включаем очистку кода, в поле расширенных валидных элементов прописываем нужный нам тег:



А потом снова пробуем вставить видео в редактор, через просмотр кода конечно же:



Я был бы рад что бы все было так просто, но увы, кликаем пару раз по кнопке "Показать/Скрыть редактор" и видим:



Опять черти что, но уже хотя бы тег на месте. Но куда девались все атрибуты?

Отступление: Изначально тег iframe наряду с другими (object, embed, script и т.д.) находится в черном списке конфигурационного файла TinyMCE по причине своей "небезопасности", но дело не ограничивается только тегами, все их атрибуты так же запрещены к использованию.

Заставляем TinyMCE плясать под нашу мелодию
Итак, для того чтобы редактор делал все то что мы хотим надо его надрессировать, к нужному тегу необходимо дописать все допустимые атрибуты
у нас есть код:

Код
<iframe title="YouTube video player" width="480" height="390" src="http://www.youtube.com/embed/_Gv7fo6mefo" frameborder="0" allowfullscreen></iframe>

прописываем в поле разрешенных элементов следующее:

Код
iframe[src|title|width|height|frameborder|allowfullscreen]

а после наслаждаемся результатом:



Заметка номер раз: Атрибуты без заголовков такие как allowfullscreen вырезаются, их необходимо записывать в XML-подобном виде: allowfullscreen="allowfullscreen".
Заметка номер два раза: Все неблочные элементы, коим является iframe, редактор оборачивает тегом <p>, если вас это не устраивает просто оберните iframe в div.

Bellissimo:



А кроме того
Если вы доверяете себе и остальным людям которые могут создавать публикации на вашем сайте и уверены что никто не подложит вам свинью, вместо того чтобы прописывать каждый атрибут по отдельности, как тут:

Код
iframe[src|title|width|height|frameborder|allowfullscreen]

прописываете:

Код
iframe[*]

Иногда необходимо использование пустых div-ов и span-ов в статьях, частая особенность типографики клубных шаблонов, так же вносим их в в список и наслаждаемся:

Код
iframe[*],div[*],span[*]

Теперь ваш редактор умеет сидеть, давать лапу, изображать "умри", приносить тапки и даже танцевать на задних лапках. А если очень нужно то может сыграть Мурку ;)
Можно допивать перекипяченное пиво.

Если собираетесь копировать в свой блог, укажите ссылку на источник.

В исходной статье предлагается извращенный метод изменения конфигурационного файла, оно тоже будет работать... до следующего обновления, тогда все ваши изменения затрутся, а вы и не вспомните даже. Если учесть что сайтов может быть не 1 а 10, и настройки могут быть разными... жестокое самоистязание это.
« Последнее редактирование: 26.03.2011, 00:08:43 от HYBRID »
http://hybrid-lab.com - лаборатория
*

palexa

  • Завсегдатай
  • 1108
  • 88 / 0
Столкнулся с проблемой.
Не могу вставить код стилей для одного материала TinyMCE 4.5.8
Код
<style>
div.textbox {
    width: 99%;
    border: 1px solid #66787F;
    border-radius: 20px;
...
}
</style>
Ну немного раздражает, что этот стиль нужен для одной страницы, и надо пихать его в стили всего шаблона
*

Progreccor

  • Захожу иногда
  • 270
  • 25 / 1
Столкнулся с проблемой.
Не могу вставить код стилей для одного материала TinyMCE 4.5.8

Ну немного раздражает, что этот стиль нужен для одной страницы, и надо пихать его в стили всего шаблона
добавить
Код
style[*]
в Дополнительные валидные элементы
*

palexa

  • Завсегдатай
  • 1108
  • 88 / 0
*

kabban

  • Захожу иногда
  • 73
  • 0 / 0
Супер, мне помогло allowfullscreen="allowfullscreen"
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться