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

aleks_yug

  • Давно я тут
  • 628
  • 83 / 0
как уменьшить картинку товара? сделать мини эскиз пример 40 на 40?
Самый простой способ:
чтобы не трогать генерацию размера превьюшек в остальных модулях и в самом компоненте создайте в ps_product.php дубликат функции - function image_tag (весь код функции, буквально) и обзовите новую функцию как-нибудь иначе - например image_tag1.
В конце новоявленной функции увидите фрагмент кода:
return vmCommonHTML::imageTag( $url, '', '', $height, $width, '', '', $args.' '.$border );
и замените на:
$width=40;
return vmCommonHTML::imageTag( $url, '', '', '', $width, '', '', $args.' '.$border );

присвоив переменной $width буквальное значение (в данном случае 40).

В самом файле: mod_virtuemart1.1.x_recently_viewed_products найти фрагмент кода:
'.ps_product::image_tag($name3).'
и заменить image_tag на image_tag1
Ну вот что-то типа того...
*

newjey

  • Захожу иногда
  • 405
  • 2 / 0
В самом файле: mod_virtuemart1.1.x_recently_viewed_products найти фрагмент кода:
'.ps_product::image_tag($name3).'
и заменить image_tag на image_tag1
Ну вот что-то типа того...

не могу найти такой функции у меня всё что есть
Код
$name3 = $row1->product_thumb_image;
*

newjey

  • Захожу иногда
  • 405
  • 2 / 0
И ещё вопрос как быть с ЧПУ ссылками?
*

aleks_yug

  • Давно я тут
  • 628
  • 83 / 0
И ещё вопрос как быть с ЧПУ ссылками?
И ещё вопрос как быть с ЧПУ ссылками?
Код файла в студию, пожалуйста! Сейчас разберемся...
*

newjey

  • Захожу иногда
  • 405
  • 2 / 0
Код
<?php
if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' );

global $mosConfig_absolute_path, $product_id, $dd_list;
// 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' );
}

require_once(CLASSPATH.'ps_product.php');
$ps_product = new ps_product;

require_once(CLASSPATH.'ps_product_category.php');
$ps_product_category = new ps_product_category;

$db=new ps_DB;

$cookie_expire = trim($params->get ('cookie_expire', 3600));
$max_numb = trim($params->get ('max_numb', 20));//maximum number of links
$pre_content_template = trim($params->get ('pre_content_template', " "));

$rvp_bmb_list = vmGet( $_COOKIE, "rvp_bmb", '' );
if($rvp_bmb_list) {
$rvp_bmb_list2 = explode("|", $rvp_bmb_list);
$n = count($rvp_bmb_list2);
if($n >$max_numb) $n = $max_numb;
 // echo "<ul>\n";
$t =1;
for($i = 0; $i < $n; $i++) {

$product2_id = $rvp_bmb_list2[$i];
   // echo "<li style='margin-left:15px; font-size:11px; border-bottom:1px dashed #999999;'>\n";
if($i == 0) {
$rvp_bmb_list3 = $product2_id;
} else {
$rvp_bmb_list3 .='|'.$product2_id;
}
$q  = "select product_name, product_thumb_image FROM #__{vm}_product ";
$q .= "WHERE product_id = '".$product2_id."' ";
$q .= "and product_publish = 'Y'";
$db->setQuery( $q );
$rows = $db->loadObjectList();
foreach ($rows as $row1) {
$name2 = $row1->product_name;
$name3 = $row1->product_thumb_image;
}

$q  = "select category_id FROM #__{vm}_product_category_xref ";
$q .= "WHERE product_id = '".$product2_id."' ";
$q .= "and product_publish = 'Y'";
$db->setQuery( $q );
$rows = $db->loadObjectList();

echo '<div><a href="'.$mosConfig_live_site.'/index.php?option=com_virtuemart&amp;page=shop.product_details&amp;flypage=flypage.tpl&amp;product_id='.$product2_id.'&category_id='.$category2_id.'">'.$name2.ps_product::image_tag($name3, "title=\"".$name2."\"").'</a></div>'."\n";
if($product2_id == $product_id) {
$t = 2;
}
}
 // echo '</li>'."\n";
 // echo '</ul>'."\n";
if($product_id != 0){
$rvp_bmb_list = $product_id.'|';
} else {
$rvp_bmb_list = '';
}
$rvp_bmb_list .= $rvp_bmb_list3;
// echo $rvp_bmb_list;
if ($t == 1)
setcookie('rvp_bmb', $rvp_bmb_list, time()+$cookie_expire,'/');
} else {
$rvp_bmb_list =$product_id ;
setcookie('rvp_bmb', $rvp_bmb_list, time()+$cookie_expire,'/');

if ($product_id != 0 ) {
$q  = "select product_name, product_thumb_image FROM #__{vm}_product ";
$q .= "WHERE product_id = '".$product_id."' ";
$q .= "and product_publish = 'Y'";
$db->setQuery( $q );
$rows = $db->loadObjectList();
foreach ($rows as $row1) {
$name = $row1->product_name;
}

$q  = "select category_id FROM #__{vm}_product_category_xref ";
$q .= "WHERE product_id = '".$product_id."' ";
$q .= "and product_publish = 'Y'";
$db->setQuery( $q );
$rows = $db->loadObjectList();
}
else{
// echo $pre_content_template;
}
}
?>
*

aleks_yug

  • Давно я тут
  • 628
  • 83 / 0
echo '<div><a href="'.$mosConfig_live_site.'/index.php?option=com_virtuemart&amp;page=shop.product_details&amp;flypage=flypage.tpl&amp;product_id='.$product2_id.'&category_id='.$category2_id.'">'.$name2.ps_product::image_tag($name3, "title=\"".$name2."\"").'</a></div>'."\n";
А это что?
Ну и напиши - ps_product::image_tag1
*

newjey

  • Захожу иногда
  • 405
  • 2 / 0
echo '<div><a href="'.$mosConfig_live_site.'/index.php?option=com_virtuemart&amp;page=shop.product_details&amp;flypage=flypage.tpl&amp;product_id='.$product2_id.'&category_id='.$category2_id.'">'.$name2.ps_product::image_tag($name3, "title=\"".$name2."\"").'</a></div>'."\n";
А это что?
Ну и напиши - ps_product::image_tag1

Спасибо, помогло.Сразу не увидел(
а как быть с чпу ссылками и можно ли как-то вывести фото в ряд?
*

newjey

  • Захожу иногда
  • 405
  • 2 / 0
Спасибо, помогло.Сразу не увидел(
а как быть с чпу ссылками и можно ли как-то вывести фото в ряд?
Вывести в ряд к примеру по 3 фото в ряду
*

aleks_yug

  • Давно я тут
  • 628
  • 83 / 0
Вывести в ряд к примеру по 3 фото в ряду
А зачем они нужны, человечьи ссылки после перехода из модуля? Человек уже на сайте -это его сессия. Он что. в адресную строку заглядывать будет??
Что касается вывода в строку, это уже вопрос верстки модуля. Он изначально был задуман для вывода в столбце (левом  или правом) в вертикальном варианте. Где-то на форуме попадались материалы по переделке меню в горизонтальный вывод. Здесь. вероятно можно сделать что-то подобное...
*

newjey

  • Захожу иногда
  • 405
  • 2 / 0
А зачем они нужны, человечьи ссылки после перехода из модуля? Человек уже на сайте -это его сессия. Он что. в адресную строку заглядывать будет??
Что касается вывода в строку, это уже вопрос верстки модуля. Он изначально был задуман для вывода в столбце (левом  или правом) в вертикальном варианте. Где-то на форуме попадались материалы по переделке меню в горизонтальный вывод. Здесь. вероятно можно сделать что-то подобное...
Мне и надо в колонке правой вывести этот модуль в таком виде:
*

newjey

  • Захожу иногда
  • 405
  • 2 / 0
А чпу тоже хотелось бы
*

newjey

  • Захожу иногда
  • 405
  • 2 / 0
с горизонтальным выводом разобрался
*

newjey

  • Захожу иногда
  • 405
  • 2 / 0
Вот так вот вышло
*

aleks_yug

  • Давно я тут
  • 628
  • 83 / 0
Вот так вот вышло

Ну так бы и сказал, что только картинки. Я думал, титль тоже выводить нужно. Но вариант есть и с титлем. Li заменить на дивы и выставить float:left
*

newjey

  • Захожу иногда
  • 405
  • 2 / 0
И всё же как ссылки на чпу заменить?Есть варианты?
*

aleks_yug

  • Давно я тут
  • 628
  • 83 / 0
И всё же как ссылки на чпу заменить?Есть варианты?
Если честно, даже не думал... А все же - зачем? Чисто принципиальные соображения, или есть нечто большее? Поисковики вряд ли будут индексировать дубликаты, сгенерированные в модуле. Это во первых, а во вторых можно же поставить запрет на индексацию в .htaccess.
Или есть еще какие-то соображения по сему вопросу?
*

newjey

  • Захожу иногда
  • 405
  • 2 / 0
Хотелось бы что бы всё было как надо, ну и мысли о дубликатах тоже посещали
*

aleks_yug

  • Давно я тут
  • 628
  • 83 / 0
А с титлем вывод под горизонтальный модуль уже слепил
*

newjey

  • Захожу иногда
  • 405
  • 2 / 0
А с титлем вывод под горизонтальный модуль уже слепил
Мне титл не нужен, просто фото
*

aleks_yug

  • Давно я тут
  • 628
  • 83 / 0
Мне титл не нужен, просто фото
Нужно смотреть, как формируются ссылки в SEF компоненте, или в роутере (если есть). И потом уже пробовать сформировать ссылку в самом модуле. По-моему, только так...
*

newjey

  • Захожу иногда
  • 405
  • 2 / 0
Нужно смотреть, как формируются ссылки в SEF компоненте, или в роутере (если есть). И потом уже пробовать сформировать ссылку в самом модуле. По-моему, только так...
А если подключить роутер к модулю?
*

aleks_yug

  • Давно я тут
  • 628
  • 83 / 0
А если подключить роутер к модулю?
какой вид у ссылки в адресной строке на карточке товара?
*

newjey

  • Захожу иногда
  • 405
  • 2 / 0
какой вид у ссылки в адресной строке на карточке товара?
site.com.ua/home/dlya-kupaniya/ugolok-s-vishivkoy.html
*

aleks_yug

  • Давно я тут
  • 628
  • 83 / 0
site.com.ua/home/dlya-kupaniya/ugolok-s-vishivkoy.html
Ну судя по виду ссылки - SEF404? Как с ним - не знаю. С роутером от Даника поковырялся - подставить можно, но ссылка все равно генерируется немного не того вида (хотя и отрабатывает) Получается:
http://сайт.ru/component/virtuemart/category/product/category_id= /product_id=2
В общем, пока ответить не готов. Пробовать нужно...
*

aleks_yug

  • Давно я тут
  • 628
  • 83 / 0
Добавляем переменную:
$link = JRoute::_('index.php?page=shop.product_details&flypage=flypage.tpl&product_id='.$product2_id.'&category_id='.$category2_id.'&option=com_virtuemart&Itemid='. $Itemid, false);
А ссылку сделать такого вида:
<a href="'.$link.'">'.$name2.'</a>
По идее, должно работать (но смотря, какой роутер)
С включенным стандартным сефом Joomla - работает правильно.

*

newjey

  • Захожу иногда
  • 405
  • 2 / 0
Добавляем переменную:
$link = JRoute::_('index.php?page=shop.product_details&flypage=flypage.tpl&product_id='.$product2_id.'&category_id='.$category2_id.'&option=com_virtuemart&Itemid='. $Itemid, false);
А ссылку сделать такого вида:
<a href="'.$link.'">'.$name2.'</a>
По идее, должно работать (но смотря, какой роутер)
С включенным стандартным сефом Joomla - работает правильно.
Формирует но чуть Неправильно
сейчас формирует так:
/component/virtuemart/zheleznaja-doroga-na-radioupravlenii.html
а надо вот так
/home/zheleznye-dorogi-i-treki/zheleznaja-doroga-na-radioupravlenii.html
где можно сменить приставку /component/virtuemart/ на /home/ ? и подставить название раздела?
*

aleks_yug

  • Давно я тут
  • 628
  • 83 / 0
где можно сменить приставку /component/virtuemart/ на /home/ ? и подставить название раздела?
Я уже предупреждал. что не со всеми роутерами получается. Если используется какой-либо из тех. которые можно найти на форуме, лучше посмотреть в теме, где он он и обсуждался. Там скорее найдется ответ.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
aleks_yug Скажите а зачем в модуле какие-то запросы к базе данных. Путь к картинке, товару, наименование и цену и т. д., спокойно можно сохранять в куках. Зачем лишние запросы?
Немного позже.
Смотрите вот пример. Последние посещенные страницы пользователем
Фактически на данной основе легко сделать последние посещенные ..., сравнение товаров и т. д.
*

aleks_yug

  • Давно я тут
  • 628
  • 83 / 0
aleks_yug Скажите а зачем в модуле какие-то запросы к базе данных. Путь к картинке, товару, наименование и цену и т. д., спокойно можно сохранять в куках. Зачем лишние запросы?
Ну во это вполне можно убрать:
$q  = "select category_id FROM #__{vm}_product_category_xref ";
   $q .= "WHERE product_id = '".$product2_id."' ";
   $q .= "and product_publish = 'Y'";

А product_name и т.д. ну никак не выкинешь. Или есть вариант? Чем проще, тем лучше - это не споришь...
*

newjey

  • Захожу иногда
  • 405
  • 2 / 0
Я уже предупреждал. что не со всеми роутерами получается. Если используется какой-либо из тех. которые можно найти на форуме, лучше посмотреть в теме, где он он и обсуждался. Там скорее найдется ответ.
Вот этот роутер использую http://joomlaforum.ru/index.php/topic,130264.new.html
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

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

Автор bork

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

Автор 4kict

Ответов: 25
Просмотров: 10377
Последний ответ 14.01.2021, 00:09:53
от gartes
Как реализовать: товары, которых нет в наличии в конец списка категории?

Автор Girevik

Ответов: 1
Просмотров: 1498
Последний ответ 02.11.2017, 10:52:04
от P_B
[Решено] Чебокс "Показывать только товары, которые есть в наличии"

Автор artMelnikov

Ответов: 20
Просмотров: 7739
Последний ответ 28.06.2017, 11:19:51
от OutLaw1
IceVmCart - новый бесплатный модуль корзины для VirtueMart

Автор Grig2009

Ответов: 105
Просмотров: 53917
Последний ответ 05.02.2017, 11:44:02
от Super_Panda