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

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Плагин работает по принципу переименования атрибута "data-src" элемента с классом "spoilerimage" в "src" после переименования атрибута картинка начинает загружаться. Вы вместо картики подставили ифрейм. При клике по спойлеру атрибут  "data-src" ифрейма изменяется на  "src" (можете сами посмотреть), но контент не подгружается. Думаю что это связано с отличиями поведения браузера с ифреймами и картинками.

Нашел заковырку. Удалите в файле /plugins/content/LVSpoiler/assets/jquery/ddaccordion.js в функции
Код
$targetContent.find(".spoilerimage").each(function () {
                    var $href = $(this).attr("data-src"); //адрес изображеения упакованая в атрибут data-src
                    if($href != 'undefined' && $href != null){ //если такая ссылка есть
                    $(this).after('<img class="spoilerloader" src="/plugins/content/LVSpoiler/loading2.gif" />'); //перед незагруженным изображением выводим изображение лоадера
                    $(this).hide(); //скрываем основное изображение
                    $(this).attr("src", $href); //заполняем атрибут src изображения его адресом                                     
                    $(this).removeAttr("data-src"); //удаляем атрибут data-src, все остальное делается внизу скрипта после загрузки изображеня
                  }                                       
                });
строку $(this).hide();
« Последнее редактирование: 06.03.2015, 12:17:59 от Arkadiy »
*

Beer

  • Завсегдатай
  • 1103
  • 43 / 1
  • БИРУ - БИР!
 Офигеть!  :D
 Вот ты ГОЛОВА! За пару минут все расшарил!
Небольшую благодарность на тел. указанный на сайте.
« Последнее редактирование: 06.03.2015, 12:35:38 от Beer »
*

Beer

  • Завсегдатай
  • 1103
  • 43 / 1
  • БИРУ - БИР!
Ошибка в коде ссылки на картинку:
Код
$(this).after('<img class="spoilerloader" src="/plugins/content/LVSpoiler/LVSpoiler/loading2.gif" />');
Заменить на:
Код
$(this).after('<img class="spoilerloader" src="/plugins/content/LVSpoiler/assets/loading2.gif" />');

Вроде как работает, но loading2.gif не убирается после загрузки содержимого спойлера.
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Вы его присоединение уберите сверху от этой строчки. Сейчас разбираюсь со спойлером, там пост-загрузка настроена только на изображения, ифреймы не работают до конца.
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Выпустил свежую версию плагина. Ссылка на загрузку в шапке темы. Убрал мутулз, устранил все найденные ошибки. Перенес присвоение класса скрытым незагруженным изображениям в скриптовую часть. Beer, попробуйте обновиться. Я там подкрутил, с виду должно ифрейм подгружать. Но старые файлы сохраните на всякий случай.
*

Beer

  • Завсегдатай
  • 1103
  • 43 / 1
  • БИРУ - БИР!
Что-то у меня он не работает...
Причем ошибок скриптов на странице нет.
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Закачайте и установите спойлер еще раз, заработает. http://demoj3.argens.ru/index.php/lazy-velo-spoiler-demo Здесь ваша карта в четвертом спойлере.
*

Beer

  • Завсегдатай
  • 1103
  • 43 / 1
  • БИРУ - БИР!
Супер - заработало как часики!
2 мелкие картинки наверное лучше перенести в CSS, я сделал так:
Код
.openlanguage div{display:block;background:transparent url("data:image/gif;base64,R0lGODlhEAAFAIABAP///////yH5BAEAAAEALAAAAAAQAAUAAAIPjI8BkG27HIJQqniZww8UADs=") no-repeat left center}
.closedlanguage div{display:block;background:transparent url("data:image/gif;base64,R0lGODlhEAAFAIABAP///////yH5BAEAAAEALAAAAAAQAAUAAAIPjG8AqMgd1HJHSuospjAUADs=") no-repeat left center}
.spoilerloader{display:block;margin-left:auto;margin-right:auto}
Заодно лоадер вывел посередине спойлера - так цивильнее.


 Добавил спойлеру футер - не могу допереть - как сделать закрытие спойлера кликом по нему. Логичнее кликнуть по футеру, нежели скроллить вверх страницу.
Код
$html .= '<div  id="spoiler_' . $numspoilers . '" class="technology"><div class="technology-title">' . $matches[1] . '</div></div><div class="thelanguage"><input type="hidden" class="opened" value="' . $opened . '"><div class="thetextinter">' . $spoilertext . '</div><div class="technology">Закрыть</div></div>';
« Последнее редактирование: 07.03.2015, 12:47:40 от Beer »
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Легче дописать дополнительный скрипт если не получилось с классом technology закрыть.
*

REandH

  • Осваиваюсь на форуме
  • 24
  • 0 / 0
Будет работать в поле полного описания товара. Надо включить обработку плагинами в настройках магазина.
Не работает в описании категорий VirtueMart, кто нибудь знак как хакнуть
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Спросите это в темах VirtueMart. Спойлер - обычный плагин группы content.
*

Beer

  • Завсегдатай
  • 1103
  • 43 / 1
  • БИРУ - БИР!
 Попытался вставить в спойлер видеоплеер (HD FLV Player):
Код
<embed id="player" src="http://beer/components/com_hdflvplayer/hdflvplayer/hdplayer.swf" flashvars="baserefJ=http://beer&playlist_auto=false&id=1&showPlaylist=false&shareIcon=false&email=false&zoomIcon=false&playlist_autoplay=false&videoID=0&embedplayer=true" style="width:700px;height:400px" allowFullScreen="true" allowScriptAccess="always" type="application/x-shockwave-flash" wmode="transparent"></embed>

 Но что-то он не захотел отображаться. Т.е. спойлер открываю, а там - пусто. Типо того, как ранее было с картой.
 Может знаешь где и как взмахнуть напильником?

  ЗЫ Ютубовский плеер работает в спойлере.
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
*

maxpain

  • Новичок
  • 2
  • 0 / 0
Всем доброго времени! Может повторюсь, прошу простить.
У меня такой вопрос: как сделать ссылку на спойлер, чтобы при переходе на нее открывался нужный спойлер (подобие якоря), а все остальные закрыты были?
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Никак. Такая возможность не предусмотрена.
*

maxpain

  • Новичок
  • 2
  • 0 / 0
может быть в будущих версиях возможно реализовать?
*

Fingros

  • Захожу иногда
  • 61
  • 1 / 0
подскажите как управлять стилями (цвет, шрифт) спойлера
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Все, что не управляется из админки,  делается с помощью CSS.
*

Solbadguy

  • Осваиваюсь на форуме
  • 17
  • 0 / 0
Аркадий спасибо за отличный плагин!
Обновлял Joomla, после вылезло над каждой статьей, где делал спойлеры
Strict Standards: Only variables should be assigned by reference in D:\OpenServ\OpenServer\domains\exemple.ru\plugins\content\LVSpoiler\LVSpoiler.php on line 91
91 строка это
        $document = & JFactory::getDocument();
но мне это ни о чем не говорит, скажите куда смотреть
*

passer

  • Завсегдатай
  • 1013
  • 75 / 3
 $document = JFactory::getDocument();
*

Solbadguy

  • Осваиваюсь на форуме
  • 17
  • 0 / 0
$document = JFactory::getDocument();
держи конфетку.
*

pft

  • Новичок
  • 3
  • 0 / 0
Прошу прощения, м.б. повторяюсь, но после проверки сайта на битые ссылки обнаружилось, что есть ссылки с двойным слешем типа http://мой сайт.ru//plugins/content/LVSpoiler/assets/jquery/style.css
Кстати, на демосайте ссылка на который выше такая же картина: "http://demoj3.argens.ru//plugins/content/LVSpoiler/assets/jquery/style.css"
С этим надо как то бороться или забыть? беспокоит, не будет ли давать это нагрузку на сервер, т.к. страниц со спойлером очень много
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Ссылка на моем сайте, которую вы привели, открывает стиль спойлера, т.е. рабочая. но двойной слеш лучше конечно убрать.
*

pft

  • Новичок
  • 3
  • 0 / 0
У меня тоже все работает. Вот только убрать двойной слеш не получается - все положенные танцы с бубном  исполнены. Раньше такого не было, а недавно перешла на 3-ю Joomla и плагин поставила последний - и вот, пожалуйста.
А за плагин - отдельное спасибо. Уже несколько лет пользуемся.
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Посмотрите главный файл плагина. Найдите там /plugins/content/LVSpoiler/assets/jquery/style.css и уберите / с начала этой строки.
*

pft

  • Новичок
  • 3
  • 0 / 0
Спасибо! Так и сделала. Сейчас все нормально.
*

klulena

  • Захожу иногда
  • 56
  • 0 / 0
Добрый день! У меня все работает отлично, хотелось бы реализовать такую вещь:

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

Как это можно сделать? например как здесь сделано: http://www.croc.ru/about/direction/
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Написать другой плагин. Там, где вы показали, гораздо больше похоже на тултип чем на спойлер.
*

klulena

  • Захожу иногда
  • 56
  • 0 / 0
Написать другой плагин. Там, где вы показали, гораздо больше похоже на тултип чем на спойлер.
спасибо, попробую
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Плагин "Русская типографика"

Автор Physicist

Ответов: 261
Просмотров: 156140
Последний ответ 13.03.2025, 20:06:50
от Olg
Мастерю плагин для админки - оплата налом или по карте при самовывозе

Автор kkmspb

Ответов: 0
Просмотров: 1279
Последний ответ 27.08.2024, 15:39:37
от kkmspb
Плагин StopKids для маркировки сайта знаком 18+ для Joomla 1.5-3.x

Автор ecolora

Ответов: 40
Просмотров: 22639
Последний ответ 19.03.2023, 18:55:08
от ecolora
Компонент Commedia и плагин mp3browser для медиа-сайтов

Автор ecolora

Ответов: 557
Просмотров: 127799
Последний ответ 13.03.2023, 00:25:14
от ecolora
Плагин seoLinks

Автор alexandr-spb

Ответов: 0
Просмотров: 2637
Последний ответ 26.01.2023, 23:08:41
от alexandr-spb