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

newjey

  • Захожу иногда
  • 405
  • 2 / 0
Подскажите, как можно сделать проверку по наличию товара, что бы товар которого нет на складе не выгружался в прайс.
Сам прайс формируется так:
Код
<?php
//***********************************************************
//
// Версия коннектора к Yandex.Market от 18.04.2009
// автор доработок Саид Дашук (dashuk@ngs.ru)
//
// Доработки:
// 1. Подключение к настройкам Joomla (теперь не надо прописывать реквизиты доступа к БД,
//         а достаточно указать конфигурационный файл 'configuration.php')
// 2. Добавлены комментарии для новичков
// 3. ВЫБОРКА ВСЕХ ТОВАРОВ ПРОИСХОДИТ ОДНИМ ЗАПРОСОМ!
// 4. Добавлен шаблон для описания товара (тег <description>)
// 5. Rурсы валют, приравнены к курсу ЦБРФ
// 6. Добавленны теги "доставка" и "производитель" (просто мне они нужны, а Вы решайте сами)
// а также: форматирование для удобства кода и вывода и еще что то по мелочам.
//
// Проверялось на Joomla! 1.5.9 Production/Stable / VirtueMart 1.1.2 stable
//
//***********************************************************
function ya_unbag ($bug_str) {
$bug_str = str_replace('"','&quot;',$bug_str);
$bug_str = str_replace('&','&amp;',$bug_str);
$bug_str = str_replace('>','&gt;',$bug_str);
$bug_str = str_replace('<','&lt;',$bug_str);
$bug_str = str_replace("'","&apos;",$bug_str);
$bug_str = urlencode($bug_str);
return $bug_str;
}
// Пропишите относительный путь к 'configuration.php' (он находится в корне Joomla)
// Например: include '../configuration.php';
include '/var/www/lipooB/lipoo.com.ua/configuration.php';
$cfg = new JConfig();
//NAME - Короткое название магазина (название, которое выводится в списке найденных на Яндекс.Маркете товаров.
//Не должно содержать более 20 символов). Нельзя использовать слова, не имеющие отношения к
//наименованию магазина ("лучший", "дешевый"), указывать номер телефона и т.п. Название магазина,
//должно совпадать с фактическим названием магазина, которое публикуется на сайте. При несоблюдении
//данного требования наименование может быть изменено Яндексом самостоятельно без уведомления Клиента.
$cfg_name = $cfg->fromname;

//Полное наименование компании, владеющей магазином. Не публикуется, используется для внутренней идентификации.
$cfg_company = $cfg->sitename;

//URL-адрес главной страницы магазина
$cfg_url = 'lipoo.com.ua';

// Шаблон для описания товара
// Вместо {product_name} - будет вставлено наименование товара
// Вместо {product_desc} - будет вставлено краткое описание
// ПРИМЕР:
// $description_template = '{product_name} от производителя';
$description_template = '{product_desc}';

// Ставка за клик (в центах)
$bid = '11';

$hostname = $cfg->host;
$username = $cfg->user;
$password = $cfg->password;
$dbName = $cfg->db;
$category = $cfg->dbprefix."vm_category";
$category_xref = $cfg->dbprefix."vm_category_xref";
$userstable = $cfg->dbprefix."vm_product";
$pricetable = $cfg->dbprefix."vm_product_price";
$product_category_xref = $cfg->dbprefix."vm_product_category_xref";
mysql_connect($hostname,$username,$password) OR DIE("Не могу создать соединение ");
mysql_select_db($dbName) or die(mysql_error());

// Исправтье, если у вас другая кодировка в БД
mysql_query('set names utf8');

echo '<?xml version="1.0" encoding="utf8"?>';
echo"<!DOCTYPE yml_catalog SYSTEM \"shops.dtd\">\n";
echo"<yml_catalog date=\"";
echo date('Y-m-d H:i');
echo"\">\n";
echo"<shop>\n";
echo"<name>".iconv('utf-8', 'utf8', $cfg_name)."</name>\n";
echo"<company>".iconv('utf-8', 'utf8', $cfg_company)."</company>\n";
echo"<url>$cfg_url</url>\n";

// курсы валют, приравнены к курсу ЦБРФ
echo"<currencies>\n";
echo"<currency  id=\"UAH\" rate=\"1\"/>\n";
echo"<currency  id=\"USD\" rate=\"7.9\"/>\n";
echo"<currency  id=\"EUR\" rate=\"9.9\"/>\n";
echo"</currencies>\n";

// Секция категорий
echo"<categories>\n";
$query_cat = "SELECT * FROM $category_xref";
$res_cat = mysql_query($query_cat) or die(mysql_error());
$rw=1;
while ($row_cat=mysql_fetch_array($res_cat)) {
$cat_parent_id=$row_cat['category_parent_id'];
$cat_child_id=$row_cat['category_child_id'];
$query2 = "SELECT category_name FROM $category WHERE category_id=".$row_cat['category_child_id'];
$res_cat1 = mysql_query($query2) or die(mysql_error());
$name_cat=mysql_fetch_array($res_cat1);
$cat_name=$name_cat['category_name'];
if ($cat_parent_id==0) {
echo"<category id=\"".$cat_child_id."\">".iconv('utf-8', 'utf8', $cat_name)."</category>\n";
}
else {
echo"<category id=\"".$cat_child_id."\" parentId=\"".$cat_parent_id."\">".iconv('utf-8', 'utf8', $cat_name)."</category>\n";
}
$rw++;
}
echo"</categories>\n";

// Секция описания товаров
echo"<offers>\n";

$tb_product = $cfg->dbprefix."vm_product";
$tb_manufacturer = $cfg->dbprefix."vm_manufacturer";
$tb_product_mf_xref = $cfg->dbprefix."vm_product_mf_xref";
$tb_category = $cfg->dbprefix."vm_category";
$tb_product_category_xref = $cfg->dbprefix."vm_product_category_xref";
$tb_price = $cfg->dbprefix."vm_product_price";

$query = "
SELECT
$tb_product.product_id,
$tb_product.product_name,
$tb_manufacturer.mf_name,
$tb_manufacturer.manufacturer_id,
$tb_category.category_name,
$tb_category.category_id,
$tb_product_category_xref.category_id,
$tb_price.product_price,
$tb_product.product_sku,
$tb_product.product_in_stock,
$tb_product.product_unit,
$tb_product.product_full_image,
$tb_product.product_s_desc,
$tb_product.product_weight
FROM
($tb_product_category_xref
RIGHT JOIN ($tb_price
RIGHT JOIN (($tb_product_mf_xref
RIGHT JOIN $tb_product
ON $tb_product_mf_xref.product_id = $tb_product.product_id)
LEFT JOIN $tb_manufacturer
ON $tb_product_mf_xref.manufacturer_id = $tb_manufacturer.manufacturer_id)
ON $tb_price.product_id = $tb_product.product_id)
ON $tb_product_category_xref.product_id = $tb_product.product_id)
LEFT JOIN $tb_category
ON $tb_product_category_xref.category_id = $tb_category.category_id
WHERE $tb_product.product_publish='Y'
";

$row = d2a($query);
$product_log = Array();
for($i=0;$i<count($row);$i++) {
if (!in_array($row[$i]['product_id'],$product_log) AND ($row[$i]['product_price'])) {
$product_log[] = $row[$i]['product_id'];

//ссылка для sh404SEF
$url="http://$cfg_url/index.php?option=com_virtuemart&amp;Itemid=71&amp;category_id=".$row[$i]['category_id']."&amp;flypage=flypage.tpl&amp;lang=ru&amp;page=shop.product_details&amp;product_id=".$row[$i]['product_id']."&utm_source=hotline.ua&utm_medium=cpc&utm_campaign=".$row[$i]['product_id'];
$product_full_image = "http://$cfg_url/components/com_virtuemart/shop_image/product/".$row[$i]['product_full_image'];

$tags = Array ('{product_name}','{product_desc}');
$repl = Array ($row[$i]['product_name'],$row[$i]['product_s_desc']);
$product_price = substr($row[$i]['product_price'], 0, -3);
$product_cat_id=$row[$i]['category_id'];
echo"\n<offer id=\"".$row[$i]['product_id']."\" available=\"true\" bid=\"$bid\">\n";
echo"<url>".$url."</url>\n";
echo"<price>$product_price</price>\n";
// Валюта в которой указаны Ваши цены
echo"<currencyId>UAH</currencyId>\n";
echo"<categoryId>".iconv('utf-8', 'utf8', $product_cat_id)."</categoryId>\n";
echo"<picture>".substr($product_full_image, 0, strrpos($product_full_image, '/' ) +1). rawurlencode(substr($product_full_image, strrpos($product_full_image, '/' ) +1 , strlen($product_full_image))). "</picture>\n";
// Возможность доставки
echo"<delivery>true</delivery> \n";
echo"<name>".iconv('utf-8', 'utf8', strip_tags($row[$i]['product_name']))."</name>\n";
echo"<vendor>".iconv('utf-8', 'utf8', strip_tags($row[$i]['mf_name']))."</vendor>\n";
echo"<description>".iconv('utf-8', 'utf8', strip_tags(str_replace($tags,$repl,$description_template)))."</description>\n";
echo"</offer>\n";
}
}
echo"</offers>\n";
echo"</shop>\n";
echo"</yml_catalog>\n";

function d2a($query){
    $result = mysql_query($query) or die("Query failed : " . mysql_error());
    while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {$res[] = $line;}
    mysql_free_result($result);
    return $res;
}
?>
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Код
WHERE $tb_product.product_in_stock > 0
Не будь паразитом, сделай что-нибудь самостоятельно!
*

newjey

  • Захожу иногда
  • 405
  • 2 / 0
Код
WHERE $tb_product.product_in_stock > 0
Что-то подставляю но не получается, подскажите куда  именно вставить надо?Спасибо.
Вставляю
Код
ON $tb_product_mf_xref.manufacturer_id = $tb_manufacturer.manufacturer_id)
ON $tb_price.product_id = $tb_product.product_id)
ON $tb_product_category_xref.product_id = $tb_product.product_id)
LEFT JOIN $tb_category
ON $tb_product_category_xref.category_id = $tb_category.category_id
WHERE $tb_product.product_publish='Y'
WHERE $tb_product.product_in_stock >0
";
Выдаёт ошибку Query failed : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE jos_vm_product.product_in_stock >0' at line 29
« Последнее редактирование: 18.04.2013, 23:06:35 от newjey »
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Код
AND $tb_product.product_in_stock > 0
WHERE - только 1 раз. Учите SQL синтаксис.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

newjey

  • Захожу иногда
  • 405
  • 2 / 0
Код
AND $tb_product.product_in_stock > 0
WHERE - только 1 раз. Учите SQL синтаксис.
Ага, извеняюсь, только что  сам заметил) Спасибо Вам, всё вышло)
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Управление магазином с большим количеством товара

Автор savenko

Ответов: 5
Просмотров: 4891
Последний ответ 16.03.2016, 19:40:19
от Pirojok
Ошибки при импорте товара Joomla 1.5.x + VM 1.1.9 + CSVI 1.9

Автор sda-sot

Ответов: 0
Просмотров: 3721
Последний ответ 27.12.2014, 09:50:06
от sda-sot
Экспорт картинки товара и краткого описания в фотоальбомы в группе ВКонтакте

Автор mostachev

Ответов: 1
Просмотров: 3265
Последний ответ 25.03.2014, 02:07:22
от Dutch
[Решено] Адрес товара в CSV. Экспорт прайса с адресом товара.

Автор Eholov

Ответов: 0
Просмотров: 1436
Последний ответ 26.02.2014, 21:10:43
от Eholov
Запретить обновление категории товара

Автор anteo

Ответов: 1
Просмотров: 1371
Последний ответ 30.08.2013, 09:21:11
от anteo