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

zeus07

  • Давно я тут
  • 723
  • 9 / 0
Здравствуйте!

Для одного из проектов необходимо использовать модуль православного календаря. нашёл подобный модуль для Joomla 1.5, решил переписать на Joomla 3. С файлом манифеста, языковым файлом и точкой входа проблем не возникло. Не знаю, как правильно поправить файл шаблона вывода. Буду рад если подскажите, или пнёте в нужном направлении.

Сам не программист, а верстальщик, но хотелось бы научиться в этом разбираться.
Ниже привожу код файла:

Код
<?php
/**
* Modul Calendar Pravoslaviya Joomla 1.5.x
* Version : 1.0
* Created by : Dmitry Kraev
* Mail : dmitry@kraev.pro
* Created on : 9/01/2011
* Last Updated on : 9/01/2011
* URL : www.kraev.pro
* License : http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php
*/

// no direct access
defined('_JEXEC') or die('Restricted access');

$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx'));
$width = $params->get('width');
$height = $params->get('height');
$pre_text = $params->get('pre_text', '0');
$background = $params->get('background');
$align = $params->get('align');
$date = $params->get('date');
$tmshift = $params->get('tmshift');
$scale = $params->get('scale');
$name = $params->get('name');
$life = $params->get('life');
$icon = $params->get('icon');
$trop = $params->get('trop');
$hram = $params->get('hram');
$relics = $params->get('relics');
$vek = $params->get('vek');
$bold = $params->get('bold');
$tipikon = $params->get('tipikon');
$feofan = $params->get('feofan');
$mesta = $params->get('mesta');
$trapeza = $params->get('trapeza');

if ($params->get('scripts') == '1') {
$string = '<script type="text/javascript" src="/modules/mod_calendar_pravo/js/highslide.js"></script>';
$mainframe->addCustomHeadTag ( $string );
$string = '<link rel="stylesheet" type="text/css" href="/modules/mod_calendar_pravo/css/highslide.css" />';
$mainframe->addCustomHeadTag ( $string );
}

$string = '<link rel="stylesheet" type="text/css" href="/modules/mod_calendar_pravo/css/style.css" />';
$mainframe->addCustomHeadTag ( $string );
$string = '<script language="Javascript" src="http://script.days.ru/icon.php?advanced=1&date='.$date.'&href=0&tmshift='.$tmshift.'&scale='.$scale.'"></script>';
$mainframe->addCustomHeadTag ( $string );

echo '<script type="text/javascript">
hs.graphicsDir = "/modules/mod_calendar_pravo/js/graphics/";
hs.outlineType = "'.$background.'";
hs.wrapperClassName = "draggable-header";
hs.showCredits = false;
hs.align = "'.$align.'";
hs.dimmingOpacity = 0.75;
   </script>';
if ($pre_text != '0') {
echo '<div class="highpretext'.$params->get( 'moduleclass_sfx' ).'">'.$pre_text.'</div>';
}
echo '
<div class="iconcontent'.$params->get( 'moduleclass_sfx' ).'">
<a href="/" id="highlinks'.$params->get( 'moduleclass_sfx' ).'" onclick="return hs.htmlExpand(this, {width: '.$width.', height: '.$height.'})">
<span class="icontitle'.$params->get( 'moduleclass_sfx' ).'"><script language="Javascript">print_podpis()</script></span>
<span class="iconimage'.$params->get( 'moduleclass_sfx' ).'"><script language="Javascript">print_img()</script></span>
</a>
<div class="highslide-maincontent">
<h2 class="componentheading">Календарь</h2>
<script language="Javascript" src="http://script.days.ru/calendar.php?name='.$name.'&life='.$life.'&icon='.$icon.'&trop='.$trop.'&hram='.$hram.'&relics='.$relics.'&vek='.$vek.'&bold='.$bold.'&tipikon='.$tipikon.'&feofan='.$feofan.'&trapeza='.$trapeza.'&date='.$date.'&tmshift='.$tmshift.'&css=1&images=1"></script>
</div>
</div>
';
?>

Подскажите пожалуйста
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Re: Переработка модуля с 1.5 на 3.3
« Ответ #1 : 15.08.2014, 11:09:48 »
Что бы научиться в этом разбираться, нужно изучить основы программирования!
Ибо код который вы предоставили примитивный и это банальные основы!
*

zeus07

  • Давно я тут
  • 723
  • 9 / 0
Re: Переработка модуля с 1.5 на 3.3
« Ответ #2 : 15.08.2014, 11:14:17 »
Что бы научиться в этом разбираться, нужно изучить основы программирования!
Ибо код который вы предоставили примитивный и это банальные основы!

Да, конечно понимаю, что всему нужно учиться. Но подскажите пожалуйста, как правильно задать некоторые параметры:
вот это например
Код
$width = $params->get('width');
и это
Код
$mainframe->addCustomHeadTag ( $string );
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Re: Переработка модуля с 1.5 на 3.3
« Ответ #3 : 15.08.2014, 11:22:41 »
Код: php
$width = $params->get('width');
Параметры задаются в админке в настройках модуля!

Код: php
$mainframe->addCustomHeadTag ( $string );
А это банальный метод добавления данных в HEAD (выведется там где <jdoc:include type="head" />
*

zeus07

  • Давно я тут
  • 723
  • 9 / 0
Re: Переработка модуля с 1.5 на 3.3
« Ответ #4 : 15.08.2014, 11:26:53 »
У меня просто почему-то выводится такая ошибка:
Код
Fatal error: Call to a member function addCustomHeadTag() on a non-object in /home/artcolor/artcolorit.com/hram/modules/mod_calendar_pravo/tmpl/default.php on line 40
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Re: Переработка модуля с 1.5 на 3.3
« Ответ #5 : 15.08.2014, 11:46:08 »
потому что в J 1.6+ нет глобальной переменной $mainframe
есть $app = JFactory::getApplication();
$app->addCustomHeadTag();
*

zeus07

  • Давно я тут
  • 723
  • 9 / 0
Re: Переработка модуля с 1.5 на 3.3
« Ответ #6 : 15.08.2014, 11:53:01 »
Понял, спасибо.
Значит строку
Код
$mainframe->addCustomHeadTag ( $string );
надо заменить на
Код
$app->addCustomHeadTag ( $string );
верно?
А строку
Код
$app = JFactory::getApplication();
прописать в начале файла?
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Re: Переработка модуля с 1.5 на 3.3
« Ответ #7 : 15.08.2014, 12:00:42 »
$app = JFactory::getApplication();
в любом месте но до первого использования $app->addCustomHeadTag ( $string );
*

zeus07

  • Давно я тут
  • 723
  • 9 / 0
Re: Переработка модуля с 1.5 на 3.3
« Ответ #8 : 15.08.2014, 12:06:07 »
Так и сделал, но вот новая ошибка
Код
Fatal error: Call to undefined method JApplicationSite::addCustomHeadTag() in /home/artcolor/artcolorit.com/hram/modules/mod_calendar_pravo/tmpl/default.php on line 41
*

evgen777

  • Давно я тут
  • 657
  • 62 / 2
Re: Переработка модуля с 1.5 на 3.3
« Ответ #9 : 15.08.2014, 12:18:03 »
Код
$doc = JFactory::getDocument();
$doc->AddCustomTag($html);
Разработка, доработка расширений для Joomla!
*

zeus07

  • Давно я тут
  • 723
  • 9 / 0
Re: Переработка модуля с 1.5 на 3.3
« Ответ #10 : 15.08.2014, 12:21:17 »
Код
$doc = JFactory::getDocument();
$doc->AddCustomTag($html);


Где это прописать, подскажите пожалуйста
*

evgen777

  • Давно я тут
  • 657
  • 62 / 2
Re: Переработка модуля с 1.5 на 3.3
« Ответ #11 : 15.08.2014, 12:23:39 »
строку
Код
$mainframe->addCustomHeadTag ( $string );
заменить на то что я выше писал
и само собой вместо $html то что вам надо вывести.
Разработка, доработка расширений для Joomla!
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Re: Переработка модуля с 1.5 на 3.3
« Ответ #12 : 15.08.2014, 12:24:13 »
точно, забыл что вынесли в документ а не в application!
Точно так же как и с APP только заменить на $doc
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Re: Переработка модуля с 1.5 на 3.3
« Ответ #13 : 15.08.2014, 12:26:24 »
Вообще лучше сделать так:
Код: php
$doc = JFactory::getDocument();
$doc->addScript('http://script.days.ru/icon.php?advanced=1&date='.$date.'&href=0&tmshift='.$tmshift.'&scale='.$scale);
$doc->addStyleSheet('/modules/mod_calendar_pravo/css/style.css');
*

zeus07

  • Давно я тут
  • 723
  • 9 / 0
Re: Переработка модуля с 1.5 на 3.3
« Ответ #14 : 15.08.2014, 12:40:57 »
Да, действительно, так будет корректнее.
В принципе, всё получилось. Большая благодарность за помощь, ну и конечно же плюсики в карму
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Счётчик полей в админке модуля

Автор zeus07

Ответов: 9
Просмотров: 947
Последний ответ 28.06.2021, 13:40:31
от zeus07
Не занимать место под пустой вывод модуля

Автор platonische

Ответов: 11
Просмотров: 932
Последний ответ 28.04.2020, 07:53:11
от sivers
Проблема вызова модели компонента из модуля

Автор platonische

Ответов: 1
Просмотров: 767
Последний ответ 24.04.2020, 18:32:32
от platonische
Pagination компонента и данные из формы модуля

Автор platonische

Ответов: 4
Просмотров: 976
Последний ответ 29.01.2020, 11:32:43
от mardok
Доступ к переменной модели из модуля

Автор platonische

Ответов: 18
Просмотров: 2386
Последний ответ 11.01.2020, 22:21:42
от robert