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

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Решил для себя сделать контент-плагин для создания карусели изображений в любом месте материала.
Вводная: в теле материала пишем что-то вроде:

{avic=images/image1.jpg|Title image 1|Description image 1}
{avic=images/image2.jpg|Title image 2|Description image 2}
{/avic}

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

Что получилось (сам плагин) - здесь.

Проблема в том, что не работает, просто не преобразует текст в карусель. В php новичок, прошу помощи.
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Прошу помощи в создании плагина
« Ответ #1 : 07.02.2014, 16:20:06 »
Можно ли какими-либо средствами пошагово выполнить php-код, как под отладчиком? с точками останова? при формировании страницы сайта?
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Прошу помощи в создании плагина
« Ответ #2 : 07.02.2014, 17:06:12 »
Почему вот эта конструкция не работает?:
Код: php
            $row_result = '<div class="item"><img src="'.$matchprm[0].'" alt="'.$matchprm[2].'">';
            if ($av_labels) {
              $row_result += '<div class="carousel-caption"><h3>'.$matchprm[1].'</h3><p>'.$matchprm[2].'</p></div>';}
            $row_result += '</div>';
            $row->text = str_replace("{avic=".$match."}", $row_result, $row->text);
echo $row_result; выдает 0

пришлось жестко указывать:
Код: php
            if ($av_labels) {
              $row->text = str_replace("{avic=".$match."}", '<div class="item"><img src="'.$matchprm[0].'" alt="'.$matchprm[2].'"><div class="carousel-caption"><h3>'.$matchprm[1].'</h3><p>'.$matchprm[2].'</p></div></div>', $row->text);
            } else {
              $row->text = str_replace("{avic=".$match."}", '<div class="item"><img src="'.$matchprm[0].'" alt="'.$matchprm[2].'"></div>', $row->text);
            }
« Последнее редактирование: 07.02.2014, 17:18:27 от AlekVolsk »
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Прошу помощи в создании плагина
« Ответ #3 : 07.02.2014, 20:58:18 »
Помогите решить, пожалуйста.
Функция, преобразующая вводный текст в карусель:
Спойлер
[свернуть]

1. После кждого <div class="item">...</div> вставляются 2 пары <p></p>, как от них избавиться? {avic=...} и {/avic} изначально на входе обрамлены тегами параграфа, видимо оттуда и берутся, но как от них избавиться?

2. Не вставляются индикаторы, $ol_result постоянно возвращает пустую строку, на любом этапе.

Прошу помощи спецов, спасибо.

Архив с плагином обновил, устанавливается нормально, карусель выводится (без индикаторов) но скрипт пока работает не корректно.
« Последнее редактирование: 07.02.2014, 21:03:47 от AlekVolsk »
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Прошу помощи в создании плагина
« Ответ #4 : 08.02.2014, 00:25:45 »
AlekVolsk, хочу пояснить свое видение на вашу работу.
JavaScript достаточно очень хорошо развился за последние годы, честно не ожидал от него такого. К чему я это клоню. Зачем вам писать какой-то код, затем обрабатывать его на php , чтобы затем дать на обработку js. Не проще ли сразу написать в js обрабатывать какой нибудь класс.
К примеру в HTML писать
Код: html4strict
<div class="slider" data-button="1">
Через класс уведомляя, про виджет слайдер и через атрибуты data инициализировать параметры.
Код: javascript
$("div.slider").each(function(){
//здесь обрабатываем все слайдеры
});
По ходу все подключения JavasScript в Joomla в нынешнее время это полный отстой. Каждый язык должен обрабатывать наиболее приемлимые свои предназначения.
В вашем же плагине( и в Joomla так  >:() вы пишите не валидную разметку HTML, обрабатываете php, чтобы отработал js.
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Прошу помощи в создании плагина
« Ответ #5 : 08.02.2014, 02:17:37 »
К сожалению, в js я вообще не разбираюсь, да и в php новичок (я раньше кроме как delphi 20 лет ничего не писал), плагин по сути простейший, но даже с ним пока большие сложности.
Учусь, проще говоря. Возможно, не с того конца начал, ну да у меня все так :)
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Прошу помощи в создании плагина
« Ответ #6 : 08.02.2014, 23:42:05 »
Зачем вам писать какой-то код, затем обрабатывать его на php , чтобы затем дать на обработку js. Не проще ли сразу написать в js обрабатывать какой нибудь класс.
К примеру в HTML писать
Код: html4strict
<div class="slider" data-button="1">
Через класс уведомляя, про виджет слайдер и через атрибуты data инициализировать параметры.
Код: javascript
$("div.slider").each(function(){
//здесь обрабатываем все слайдеры
});

Здесь вы подразумеваете, что пользователь в теле материала напишет <div class="slider" data-button="1">, а контент-плагин уже сам подхватит div и js воткнет в него слайдер. А ка тогда плагину указать, какие фотографии показывать в слайдере? В самом плагине, в настройках? писать в базу? А если таких слайдеров большое множество и все они разные? Создавать категории, каждой из которых присваивать фото с заголовками и описаниями? Это уже не простой плагин, совсем другой уровень разработки, мне слабо.

Можно, конечно, слить необходимые фото в одну папку и указать в теле материала {avic=folder}, тем самым упростив обработку тела материала, но тогда: 1 минус: придется сканировать папку на все фото, составлять их список, потом работать с этим списком, формируя из него слайды карусели, что в целом и общем только утяжеляет плагин; 2 минус: нельзя будет для каждого фото указать заголовок и описание; 3 минус: лишняя нагрузка на файловые операции пользователя, т.е.: если понадобится показать не все фото из папки, лишнее придется удалять, а затем - при необходимости - заново заливать, к тому же может возникнуть (гипотетически) необходимость показать одно и тоже фото в разных слайдерах, придется его дублировать в разных папках. Поэтому решение указывать жестко имена файлов в теле материалов считаю оправданным: меньше возни с пользовательскими файловыми операциями, легче вся работа плагина - сформировал карусель и запустил js, чтобы она крутилась, к тому же для каждого фото можно указать его описание.


Так кто мне поможет разобраться, как мне избавиться от тегов параграфов и как записать теги в переменную, чтобы потом ее вывести?
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Прошу помощи в создании плагина
« Ответ #7 : 09.02.2014, 00:27:16 »
Я предлагаю  писать в HTML так
Код: html4strict
<div class="slider horizontal" data-button="1">
<img alt="Рис 1" src="1.png">
<img alt="Рис 2" src="2.png">
<img alt="Рис 3" src="3.png">
</div>
а с помощью js добавлять уже нужные элементы разметки и управления
тем самым мы оставляем чистым HTML переложив формирование слайдера на сторону клиента с помощью js
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Прошу помощи в создании плагина
« Ответ #8 : 09.02.2014, 00:42:31 »
Вариант. А если пользователь, редактирующий материал, не бум-бум в HTML?
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Прошу помощи в создании плагина
« Ответ #9 : 09.02.2014, 00:46:10 »
Вариант. А если пользователь, редактирующий материал, не бум-бум в HTML?
То есть этот код ему не трудно запомнить а тот, что привел я тяжело?
{avic=images/image1.jpg|Title image 1|Description image 1}
{avic=images/image2.jpg|Title image 2|Description image 2}
Тогда пишите модуль а не плагин
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Прошу помощи в создании плагина
« Ответ #10 : 09.02.2014, 00:51:48 »
Модуль внутрь материала? Причем, при необходимости, множество раз?
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Прошу помощи в создании плагина
« Ответ #11 : 09.02.2014, 01:00:18 »
а в чем проблема. хоть модуль, хоть позицию сколько угодно стандартными средствами
http://x2t.com/281754
зато в модуле вы сделаете интерфейс который не будет требовать каких либо знаний. Все кнопочками да полями, выбор изображения подпись, эффект и т.д
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Прошу помощи в создании плагина
« Ответ #12 : 09.02.2014, 01:19:26 »
При всем уважении, Федор, а Вы можете помочь с решением проблем в имеющемся коде, не предлагая альтернативного решения?

Выяснил, что значение в переменную $ol_result записывается, но каждый раз стирается при последующем шаге цикла.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Прошу помощи в создании плагина
« Ответ #13 : 09.02.2014, 01:25:17 »
Можно ли какими-либо средствами пошагово выполнить php-код, как под отладчиком? с точками останова? при формировании страницы сайта?
Код: php-brief
$row_result .= '</div>'; //точка, а не +
var_dump($row_result);
die;
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Прошу помощи в создании плагина
« Ответ #14 : 09.02.2014, 01:29:24 »
С индикаторами разобрался.
Только что про точку сам догадался, спс.
Оказывается, в php слияние строк нельзя производить оператором сложения, как это делается в большинстве языков. Глупая ошибка, и никто новичку не подсказал...
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Прошу помощи в создании плагина
« Ответ #15 : 09.02.2014, 01:53:05 »
Вариант функции, формирующей карусель, с индикаторами:
Спойлер
[свернуть]

Однако, после каждого '<div class="item">...</div> также вставляются (или уже имеются, var_export($match); в начале цикла возвращает фигурные скобки с их содержимым, без тегов): <p></p><p></p>, т.е. на выходе я получаю:
Спойлер
[свернуть]

Как избавиться от этих тегов параграфов?
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Прошу помощи в создании плагина
« Ответ #16 : 09.02.2014, 02:24:23 »
При клике на индикатор или при автопрокрутки карусели весь <div id="avic0" class="avic slide" data-interval="7000" data-ride="avic"> помещается во внутрь непонятно откуда берущегося <div style="height: 0px; overflow: hidden; position: relative; margin: 0px;">, автопрокрутка останавливается, контролы ручной прокрутки и индикаторы не работаю, вся карусель невидимой становится (height: 0px; overflow: hidden;), к <div id="avic0" ... добавляется  style="overflow: hidden; margin: 0px;". Откуда это?
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Прошу помощи в создании плагина
« Ответ #17 : 09.02.2014, 19:04:34 »
К сожалению, в js я вообще не разбираюсь...
Вот для обучения. На голом JS в качестве примера сегодня написал
Poznakomlus == Fedor Vlasenko -> http://javascript.ru/forum/showthread.php?p=296740
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Вывод отладочной информации системного плагина

Автор effrit

Ответов: 23
Просмотров: 1472
Последний ответ 02.10.2018, 10:24:46
от effrit
Как при помощи функций Joomla узнать номер страницы в пагинации?

Автор tora312

Ответов: 45
Просмотров: 4629
Последний ответ 06.12.2016, 08:25:43
от tora312
Объясните как работает MVC Override с помощью плагина Joomla!

Автор kens1n

Ответов: 8
Просмотров: 2026
Последний ответ 09.10.2016, 11:00:25
от robert
Нужна помощь в написании плагина

Автор makslm

Ответов: 16
Просмотров: 1301
Последний ответ 06.10.2016, 15:48:06
от makslm
Продолжая тему разработки контент плагина, сорянчик))

Автор IvanTopor

Ответов: 7
Просмотров: 1184
Последний ответ 26.02.2016, 16:27:18
от b2z