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

mocart

  • Захожу иногда
  • 112
  • 9 / 0
Как передать из jshop название товара <?php print $this->product->name?> и вывести в модуле формы (использую - Simpleform2)?
« Последнее редактирование: 29.08.2013, 09:57:50 от b2z »
*

Fedor Vlasenko

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

mocart

  • Захожу иногда
  • 112
  • 9 / 0
Poznakomlus, так не выходит :(

максимум чего удалось добиться - Титле страницы
приведу код для наглядности
Спойлер
[свернуть]
и он же титле потом на имейл приходит
Код
<p>"<?php echo JRequest::getVar('pageTitle');?>"</p>
*

mohax

  • Давно я тут
  • 901
  • 66 / 3
А не мудрствуя лукаво записать в сессию и дернуть ее оттуда не вариант?
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Код: php
<?php 
$doc = JFactory::getDocument();
echo $doc->getTitle();
?>
зачем input?
и что у вас в массиве $doc, есть ли нужные данные
Код: php
<?php 
$doc = JFactory::getDocument();
print_r($doc);
?>
*

mocart

  • Захожу иногда
  • 112
  • 9 / 0
зачем input?
без него заголовок (пока хотя бы) не уйдет на мыло.
и что у вас в массиве $doc, есть ли нужные данные
посмотрел, но из компонента там вообще нет данных
] => Array ( [type] => component [name] => [attribs] => Array ( ) ) )
*

SDKiller

  • Живу я здесь
  • 2705
  • 329 / 5
  • ...ergo sum
А не мудрствуя лукаво записать в сессию и дернуть ее оттуда не вариант?

А это по сути - единственный вариант (куки как браузерозависимые не рассматриваем, GLOBALS как полагается отключены).
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
А это по сути - единственный вариант (куки как браузерозависимые не рассматриваем, GLOBALS как полагается отключены).
нет не единственный
есть еще js, можно и из урла страницы вытянуть инфу
*

SDKiller

  • Живу я здесь
  • 2705
  • 329 / 5
  • ...ergo sum
нет не единственный
есть еще js, можно и из урла страницы вытянуть инфу

js - браузерозависимое решение
url - при условии что переменные передаются в get
*

danik.html

  • Живу я здесь
  • 2650
  • 353 / 4
Я так понимаю модуль должен вывести название товара, только когда находимся на странице товара?
Ок. Сначала отрабатывает компонент, затем модуль. Значит, мы может что-то спокойно передать из компонента в модуль. Или Возможно получится получить инфу о товаре через апи jshop.
【Мегапак Virtuemart:
 • метатеги (description,keywords)
 • заголовки (title)
 • красивые алиасы (чпу) без тормозов и дублей!
*

mocart

  • Захожу иногда
  • 112
  • 9 / 0
А не мудрствуя лукаво записать в сессию и дернуть ее оттуда не вариант?
Ребят, если б знал как - я бы не спрашивал. Если поясните - буду премного благодарен :)

На самом деле пример встретил здесь (клацаем "экспресс"). Но там видимо отдельный модуль для JS создавали...потому что готовый такой не нашел и решил сторонним модулем попробовать сделать.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Записываем вставлять код в компоненте
Код: php-brief
<?php
$session = JFactory::getSession();
$session->set("product_name",  $this->product->name);
?>
Считываем, код в модуль
Код: php-brief
<?php
$session = JFactory::getSession();
echo $session->get("product_name");
?>
*

varX

  • Живу я здесь
  • 2466
  • 141 / 5
  • разработка компонентов
Передать переменную через сессию и GLOBALS можно, только если код модуля выполняется позже компонента в шаблоне. Если раньше, то js - единственное приемлемое решение.
Разработка и ремонт. VirtueMart. JoomShopping. Свои компоненты. Принимаю заявки на plasma-web.ru.
*

mocart

  • Захожу иногда
  • 112
  • 9 / 0
Передать переменную через сессию и GLOBALS можно, только если код модуля выполняется позже компонента в шаблоне. Если раньше, то js - единственное приемлемое решение.
модуль в самом конце, где дебаг, он у меня все равно скрыт - я могу хоть куда его опубликовать, всплывает в окне из карточки.

сейчас попробую код Poznakomlus, пока не знаю где в компоненте именно его нужно вставить
*

mohax

  • Давно я тут
  • 901
  • 66 / 3
Передать переменную через сессию и GLOBALS можно, только если код модуля выполняется позже компонента в шаблоне. Если раньше, то js - единственное приемлемое решение.
Если я правильно помню то сначала отрабатывает компонент, потом модуль. И вроде их расположение на странице не играет роли. Хотя могу ошибаться, на практике не проверял.
*

mocart

  • Захожу иногда
  • 112
  • 9 / 0
Записываем вставлять код в компоненте
$session =& JFactory::getSession();
$session->set("product_name",  $this->product->name);
Считываем, код в модуль
$session =& JFactory::getSession();
echo $session->get("product_name");

Poznakomlus,  спасибо, все получилось! +1 ;)
Попробую и другую инфу также вытянуть.
*

mohax

  • Давно я тут
  • 901
  • 66 / 3
Посмотрел я что нужно. Там к Вас все равно JS отрабатывает и форму открывает. Почему бы при рендинге карточки товара не передавать в функцию отображения формы все необходимые данные. Типа
Код
function showform(тут все данные)

Подробно не смотрел, спать пора. Но это мне кажется достаточно удобный  вариант в вашем случае.
*

mocart

  • Захожу иногда
  • 112
  • 9 / 0
mohax, я не против развернуть логику в другую сторону, и пока все под рукой можно поэкспериментировать :)


Там еще будет косяк с формой (но то уже другая тема, наверное) - надо будет научить ее не закрываться (точнее окно) при вводе неправильных данных в поле, а выводить сообщение об ошибке - здесь же, в окне.

И таким образом получим неплохое, я считаю, решение покупки товара "в один клик"
*

mohax

  • Давно я тут
  • 901
  • 66 / 3
mohax, я не против развернуть логику в другую сторону, и пока все под рукой можно поэкспериментировать :)


Там еще будет косяк с формой (но то уже другая тема, наверное) - надо будет научить ее не закрываться (точнее окно) при вводе неправильных данных в поле, а выводить сообщение об ошибке - здесь же, в окне.

И таким образом получим неплохое, я считаю, решение покупки товара "в один клик"

Раз уж начали, то не посмотреть ли Вам в сторону написания дополнительного функционала к магазину (новый контроллер, модель и вьюха), которые через встроенный behavior.modal загружался бы в модальное окно. Там можно и проверку сделать и все остальное. И передавать просто ID товара, а уже в модели получать запросом данные товара. Но это уже  философия. Где-то надо остановиться))
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
вообще можно в компоненте прописать вызов модуля  ^-^
Код: php
<?php
$document   =  JFactory::getDocument();
$renderer   = $document->loadRenderer('module');
$options    = array('style' => 'raw');
$module     = JModuleHelper::getModule('mod_breadcrumbs'); //mod_breadcrumbs замените на свой
$module->params = "product_name=".$this->product->name; //задаем значения
$module->params .= "\nproduct_price=10";//каждый параметр разделяется символом новой строки \n.
echo $renderer->render($module, $options);
?>
А в самом модуле выводить так:
Код: php
<?php 
echo $params->get('product_name');
echo $params->get('product_price');
 ?>
Продолжение следует...
*

mohax

  • Давно я тут
  • 901
  • 66 / 3
вообще можно в компоненте прописать вызов модуля  ^-^
Код: php
<?php
$module->params = "product_name=".$this->product->name; //задаем значения
$module->params .= "\nproduct_price=10";//каждый параметр разделяется символом новой строки \n.
?>
А так не сработает?
Код
$module->params->set("product_name", $this->product->name) 
*

mocart

  • Захожу иногда
  • 112
  • 9 / 0
А тогда еще вопрос - как на SEO это повлияет, ведь получается что часть контента страницы с товаром дублируется и еще и под display:none? Кажется что это не совсем хорошо...

Я еще думаю в сторону jQuery - при клике на кнопку погрузить информацию из нужных div в модальное окно с формой, как считаете - так лучше будет?
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Еще один вариант передачи данных из компонента в модуль проверено в Joomla 1.5 и 2.5. yes!
Публикуется на форуме ВПЕРВЫЕ!
Ни в одной документации о Joomla вы не найдете такого решения.  yes!
В компоненте пишем:
Код: php-brief
<?php
$document =  JFactory::getDocument();
$document->setBuffer( 'Znachenie', 'component', 'parametr' );
?>
В модуле считываем:
Код: php-brief
<?php
echo JFactory::getDocument()->getBuffer('component', 'parametr');
//return Znachenie
?>
*

mocart

  • Захожу иногда
  • 112
  • 9 / 0
Poznakomlus, просто супер! работает и так :)
Название товара передается - все как надо, а вот картинку и цену так не передать((
Картинка частями формируется
<img id = "main_image_<?php print $image->image_id?>" src = "<?php print $this->image_product_path?>/<?php print $image->image_name;?>" alt="<?php print htmlspecialchars($image->_title)?>" title="<?php print htmlspecialchars($image->_title)?>" />

и вот так ничего не передает
$document->setBuffer( '$image->image_id', 'component', 'параметр' );
возможно, я что-то не так понял

и цена тоже получается на ходу формируется
<?php print formatprice($this->product->getPriceCalculate())?><?php print $this->product->_tmp_var_price_ext;?>
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
В компонент код
Код: php-brief
<?php
$document =  JFactory::getDocument();
$document->setBuffer( json_encode( $image), 'component', 'image' );
?>
В модуль
Код: php-brief
<?php
$document =  JFactory::getDocument();
$image = json_decode($document->getBuffer('component', 'image'));
$image_product_path = "Введите путь к папке картинок он постоянный";
?>
<img id = "main_image_<?php print $image->image_id?>" src = "<?php print $image_product_path;?>/<?php print $image->image_name;?>" alt="<?php print htmlspecialchars($image->_title)?>" title="<?php print htmlspecialchars($image->_title)?>" />
*

Dron79

  • Захожу иногда
  • 321
  • 37 / 0
  • Век живи - век учись!
Еще один вариант передачи данных из компонента в модуль проверено в Joomla 1.5 и 2.5. yes!
Публикуется на форуме ВПЕРВЫЕ!
Ни в одной документации о Joomla вы не найдете такого решения.  yes!
В компоненте пишем:
Код: php-brief
<?php
$document = & JFactory::getDocument();
$document->setBuffer( 'Znachenie', 'component', 'parametr' );
?>
В модуле считываем:
Код: php-brief
<?php
echo JFactory::getDocument()->getBuffer('component', 'parametr');
//return Znachenie
?>
Благодарю за новую инфу.
кодинг на php.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Дополню решением с JRequest::getVar и JRequest::setVar
Код: php-brief
JRequest::setVar('name', 'Myname', 'post');//задаем
echo JRequest::getVar('name', '', 'post'); //считываем
просто и элементарно
API по свежее JInput
Код: php-brief
JFactory::getApplication()->input->set('parametr', 'znachenie');//задаем
echo JFactory::getApplication()->input->get('parametr'); //считываем
         
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Дополню решением с помощью API (setUserState, getUserState)
Код: php-brief
JFactory::getApplication()->setUserState('parametr', 'znachenie'); //задаем
echo JFactory::getApplication()->getUserState('parametr'); //считываем
*

fbr

  • Завсегдатай
  • 1672
  • 206 / 7
Дополню решением с помощью API (setUserState, getUserState)
Код: php-brief
JFactory::getApplication()->setUserState('parametr', 'znachenie'); //задаем
echo JFactory::getApplication()->getUserState('parametr'); //считываем

Супер!
Poznakomlus, спасибо))

я как раз по другому поводу искал решение подобное решение
*

mohax

  • Давно я тут
  • 901
  • 66 / 3
Дополню решением с помощью API (setUserState, getUserState)
Код: php-brief
JFactory::getApplication()->setUserState('parametr', 'znachenie'); //задаем
echo JFactory::getApplication()->getUserState('parametr'); //считываем
Так она на базе сессий и работает же. Зачем городить огород, если можно с сессией работать?
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Модуль mod_custom: где сохраняется добавляемый код?

Автор r0m4n

Ответов: 8
Просмотров: 3203
Последний ответ 20.12.2023, 09:52:48
от kit2m2
Формирование ссылок для компонента Joomla Tags

Автор stepan39

Ответов: 6
Просмотров: 3780
Последний ответ 05.02.2023, 15:22:13
от tweenpix
URL компонента меток

Автор tweenpix

Ответов: 0
Просмотров: 2035
Последний ответ 04.02.2023, 11:08:54
от tweenpix
Не могу установить языковой пакет для компонента Joomla Events Manager ((jem))

Автор Ded Magomed

Ответов: 0
Просмотров: 1764
Последний ответ 24.05.2022, 15:06:38
от Ded Magomed
Передать значение из шаблона в модель

Автор ruyurik

Ответов: 4
Просмотров: 1137
Последний ответ 02.04.2020, 04:47:44
от ruyurik