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

zmeyx

  • Захожу иногда
  • 144
  • 7 / 0
  • http://www.nt1.su
Необходимо доаботать поиск VirtueMart. нужно в поиск добавить выбор производителя.  сделать как на сайте http://www.vseinstrumenti.ru/ т.е. ограничить поиск только товарами выбранного производителя.
Готов заплатить в разумных пределах за доработанный модуль....
Сам в PHP не разбираюсь, но так понимаю что работы не особо много.... в общих чертах - объединить 2 модуля mod_virtuemart_search и mod_virtuemart_manufacturers.
Буду благодарен за помощь
*

beagler

  • Moderator
  • 3276
  • 392 / 4
  • https://alorisman.ru/
не проверял, кошелек в профиле
Код
<?php
if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' );
/**
* VirtueMart Search Module
* NOTE: THIS MODULE REQUIRES THE PHPSHOP COMPONENT FOR MOS!
*
* @version $Id: mod_virtuemart_search.php 1159 2008-01-14 20:30:30Z soeren_nb $
* @package VirtueMart
* @subpackage modules
*
* @copyright (C) 2004-2007 soeren
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL
* VirtueMart is Free Software.
* VirtueMart comes with absolute no warranty.
*
* www.virtuemart.net
*/

// Load the VirtueMart main parse code
if( file_exists(dirname(__FILE__).'/../../components/com_virtuemart/virtuemart_parser.php' )) {
require_once( dirname(__FILE__).'/../../components/com_virtuemart/virtuemart_parser.php' );
} else {
require_once( dirname(__FILE__).'/../components/com_virtuemart/virtuemart_parser.php' );
}

global $VM_LANG, $mm_action_url, $sess;

$query_all  = "SELECT m.manufacturer_id,m.mf_name FROM #__{vm}_manufacturer m ";
$query_all .= "ORDER BY m.mf_name ASC";

$db = new ps_DB;
$db->query( $query_all );
$res = $db->record;
$mans='';
foreach( $res as $manufacturer) {
$mans.="<option value=\"".$manufacturer->manufacturer_id ."\" >". $manufacturer->mf_name ."</option>\n"
}
?>
<!--BEGIN Search Box -->
<form action="<?php $sess->purl( $mm_action_url."index.php?page=shop.browse" )?>" method="post">

<p><label for="keyword"><?php echo $VM_LANG->_('PHPSHOP_SEARCH_LBL')?></label></p>
<p>
<input name="keyword" type="text" size="12" title="<?php echo $VM_LANG->_('PHPSHOP_SEARCH_TITLE')?>" class="inputbox" id="keyword"  />
<select class="inputbox" name="manufacturer_id">
            <option value=""><?php echo $VM_LANG->_('PHPSHOP_SELECT')?></option>
<?php echo $mans ?>
</select>
<input class="button" type="submit" name="Search" value="<?php echo $VM_LANG->_('PHPSHOP_SEARCH_TITLE')?>" />
</p>
</form>
<!-- End Search Box -->
*

zmeyx

  • Захожу иногда
  • 144
  • 7 / 0
  • http://www.nt1.su
Спасибо огромное за решение... кошельком в профиле воспользовался)))
в коде всего одна маленькая ошибочка исправленный и рабочий код ниже
Код
<?php
if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' );
/**
* VirtueMart Search Module
* NOTE: THIS MODULE REQUIRES THE PHPSHOP COMPONENT FOR MOS!
*
* @version $Id: mod_virtuemart_search.php 1159 2008-01-14 20:30:30Z soeren_nb $
* @package VirtueMart
* @subpackage modules
*
* @copyright (C) 2004-2007 soeren
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL
* VirtueMart is Free Software.
* VirtueMart comes with absolute no warranty.
*
* www.virtuemart.net
*/

// Load the VirtueMart main parse code
if( file_exists(dirname(__FILE__).'/../../components/com_virtuemart/virtuemart_parser.php' )) {
require_once( dirname(__FILE__).'/../../components/com_virtuemart/virtuemart_parser.php' );
} else {
require_once( dirname(__FILE__).'/../components/com_virtuemart/virtuemart_parser.php' );
}

global $VM_LANG, $mm_action_url, $sess;

$query_all  = "SELECT m.manufacturer_id,m.mf_name FROM #__{vm}_manufacturer m ";
$query_all .= "ORDER BY m.mf_name ASC";

$db = new ps_DB;
$db->query( $query_all );
$res = $db->record;
$mans='';
foreach( $res as $manufacturer) {
$mans.="<option value=\"".$manufacturer->manufacturer_id ."\" >". $manufacturer->mf_name ."</option>\n" }; ?>
<!--BEGIN Search Box -->
<form action="<?php $sess->purl( $mm_action_url."index.php?page=shop.browse" )?>" method="post">

<p><label for="keyword"><?php echo $VM_LANG->_('PHPSHOP_SEARCH_LBL')?></label></p>
<p>
<input name="keyword" type="text" size="12" title="<?php echo $VM_LANG->_('PHPSHOP_SEARCH_TITLE')?>" class="inputbox" id="keyword"  />
<select class="inputbox" name="manufacturer_id">
            <option value=""><?php echo $VM_LANG->_('PHPSHOP_SELECT')?></option>
<?php echo $mans ?>
</select>
<input class="button" type="submit" name="Search" value="<?php echo $VM_LANG->_('PHPSHOP_SEARCH_TITLE')?>" />
</p>
</form>
<!-- End Search Box -->

ЗЫ ошибка была в синтаксисе одной ";" не хватало
*

beagler

  • Moderator
  • 3276
  • 392 / 4
  • https://alorisman.ru/
вполне могла быть ошибка - не проверял.
Бонус - вместо
Код
<input name="keyword" type="text" size="12" title="<?php echo $VM_LANG->_('PHPSHOP_SEARCH_TITLE')?>" class="inputbox" id="keyword"  />
вставьте
Код
<input name="keyword" type="text" size="12" title="<?php echo $VM_LANG->_('PHPSHOP_SEARCH_TITLE')?>" class="inputbox" type="text" id="keyword" value="введите название товара" onblur="if(this.value=='') this.value='введите название товара';" onfocus=" if(this.value=='введите название товара' || keyword.value=='Слишком короткая фраза!') this.value='';"/>

Только сохраните файл в кодировке UTF без BOM
*

witalikm

  • Новичок
  • 2
  • 0 / 0
Спасибо! полезный материал,
есть небольшой вопрос, чтобы вывести все товары определенного производителя необходимо:
1. в поле поиска поставить * или %
2. выбрать производителя
3. Нажать кнопку поиска,
но не все пользователи знают об первом пункте про значки * или %,
где подправить код:
1. чтоб пользователь не меняя поле поиска, где стоит надпись "введите название товара",
2. выбрал производителя
3. Нажать кнопку поиска
И вывелись товары выбранного производителя как и со значками * или %
Спасибо!
*

witalikm

  • Новичок
  • 2
  • 0 / 0
Проблему решил, оказалось чтобы вывести все товары одного производителя достаточно:
1. Выбрать из выпадающего списка производителя
2. Поле поиска оставить пустым (* или % - не нужны)
3. Нажать кнопку поиска
То есть не использовать JavaScript кода:
Код
<input name="keyword" type="text" size="12" title="<?php echo $VM_LANG->_('PHPSHOP_SEARCH_TITLE')?>" class="inputbox" type="text" id="keyword" value="введите название товара" onblur="if(this.value=='') this.value='введите название товара';" onfocus=" if(this.value=='введите название товара' || keyword.value=='Слишком короткая фраза!') this.value='';"/>
А использовать
Код
<input name="keyword" type="text" size="12" title="<?php echo $VM_LANG->_('PHPSHOP_SEARCH_TITLE')?>" class="inputbox" id="keyword"  />

Весь день ломал голову, искал способ как при нажатии кнопки поиска в поле поиска заменять текст "введите название товара" на *
но так и не получилось, оказался выход проще.

Если кто подскажет (а в инете я не нашел), как на лету при отправке формы подменять value текстового поля, было бы замечательно.
пробовал организовать это на JavaScript не получилось, а вот на php не знаю где копать?
Спасибо!
*

beagler

  • Moderator
  • 3276
  • 392 / 4
  • https://alorisman.ru/
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

VirtueMart - SMS уведомления о сделаном заказе.

Автор bork

Ответов: 42
Просмотров: 23302
Последний ответ 26.07.2021, 22:11:25
от Oleg91
Отчеты и статистика для VirtueMart

Автор 4kict

Ответов: 25
Просмотров: 10382
Последний ответ 14.01.2021, 00:09:53
от gartes
IceVmCart - новый бесплатный модуль корзины для VirtueMart

Автор Grig2009

Ответов: 105
Просмотров: 53933
Последний ответ 05.02.2017, 11:44:02
от Super_Panda
Модуль недавно просмотренные товары для VirtueMart 1.1.X

Автор aleks_yug

Ответов: 97
Просмотров: 28034
Последний ответ 25.10.2016, 15:03:07
от Igoritaly
Хаки для убыстрения VirtueMart (уменьшение запросов и т.п.)

Автор yadrinez

Ответов: 197
Просмотров: 81441
Последний ответ 05.02.2016, 21:53:34
от flyingspook