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

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Пользуюсь коннектором от Дашука. У меня внутри родительского товара есть дочерние, категорией которых является сам родитель. Яндекс ругается на это, мол, не существует такой категории.
Вот решил приписать дочерей к категории родителя и заодно выводить цены с учетом скидки.
Может быть, велосипед изобрел, но все равно выкладываю код.
Код
<?php
//***********************************************************
//
// Версия коннектора к Yandex.Market от 18.04.2009
// автор доработок Саид Дашук (dashuk@ngs.ru)
//
// Доработки:
// 1. Подключение к настройкам Joomla (теперь не надо прописывать реквизиты доступа к БД,
//         а достаточно указать конфигурационный файл 'configuration.php')
// 2. Добавлены комментарии для новичков
// 3. ВЫБОРКА ВСЕХ ТОВАРОВ ПРОИСХОДИТ ОДНИМ ЗАПРОСОМ!
// 4. Добавлен шаблон для описания товара (тег <description>)
// 5. Курсы валют, приравнены к курсу ЦБРФ
// 6. Добавлены теги "доставка" и "производитель" (просто мне они нужны, а Вы решайте сами)
// а также: форматирование для удобства кода и вывода и еще что то по мелочам.
//
// Проверялось на Joomla! 1.5.9 Production/Stable / VirtueMart 1.1.2 stable
//
// а также:
// - прикрутить дочерние товары к категории родительского.
// - выводить цены с учетом скидки.
//
// Проверялось на Joomla! 1.5.26 / VirtueMart 1.1.3 robert'ом (nrobert@mail.ru)
//
//***********************************************************
 
 
// Пропишите относительный путь к 'configuration.php' (он находится в корне Joomla)
// Например: include '../configuration.php';
include 'configuration.php';
$cfg = new JConfig();
 
//NAME - Короткое название магазина (название, которое выводится в списке найденных на Яндекс.Маркете товаров.
//Не должно содержать более 20 символов). Нельзя использовать слова, не имеющие отношения к
//наименованию магазина ("лучший", "дешевый"), указывать номер телефона и т.п. Название магазина,
//должно совпадать с фактическим названием магазина, которое публикуется на сайте. При несоблюдении
//данного требования наименование может быть изменено Яндексом самостоятельно без уведомления Клиента.
$cfg_name = $cfg->fromname;
 
//Полное наименование компании, владеющей магазином. Не публикуется, используется для внутренней идентификации.
$cfg_company = $cfg->sitename;
 
//URL-адрес главной страницы магазина без http://
$cfg_url = 'мой_сайт.ru';
 
// Шаблон для описания товара
// Вместо {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";
[color=red]$product_discount = $cfg->dbprefix."vm_product_discount";[/color]
$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=\"utf-8\"?>\n";
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>$cfg_name</name>\n";
echo"<company>$cfg_company</company>\n";
echo"<url>$cfg_url</url>\n";
 
// курсы валют, приравнены к курсу ЦБРФ
echo"<currencies>\n";
echo"<currency  id=\"RUR\" rate=\"1\"/>\n";
echo"<currency  id=\"USD\" rate=\"CBRF\"/>\n";
echo"<currency  id=\"EUR\" rate=\"CBRF\"/>\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."\">".$cat_name."</category>\n";
}
else {
echo"<category id=\"".$cat_child_id."\" parentId=\"".$cat_parent_id."\">".$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,
[color=red]$tb_product.product_parent_id,[/color]
$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,
[color=red]$tb_product.product_discount_id,[/color]
$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'];
 
$url="http://$cfg_url/index.php?page=shop.product_details&amp;flypage=shop.flypage&amp;option=com_virtuemart&amp;product_id=".$row[$i]['product_id'];
//$url="http://$cfg_url/client?page=shop.product_details&flypage=flypage-ask.tpl&product_id=".$row[$i]['product_id']."&category_id=".$row[$i]['category_id']."&manufacturer_id=".$row[$i]['manufacturer_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']);
[color=red]$query3 = "SELECT amount FROM $product_discount WHERE discount_id = ".$row[$i]['product_discount_id'];
$res_discount = mysql_query($query3) or die(mysql_error());
$fetch_discount = mysql_fetch_array($res_discount);
$discount_amount = $fetch_discount['amount'];
if($discount_amount == 0) {
$product_price = substr($row[$i]['product_price'], 0, -3);
} else {
$product_price = substr($row[$i]['product_price'], 0, -3) - $discount_amount;
}
$query4 = "SELECT category_id FROM $product_category_xref WHERE product_id = ".$row[$i]['product_parent_id'];
$res_cat2 = mysql_query($query4) or die(mysql_error());
$id_cat=mysql_fetch_array($res_cat2);
$cat_id=$id_cat['category_id'];
if($row[$i]['category_id']) {
$product_cat_id=$row[$i]['category_id'];
} else {
$product_cat_id=$cat_id;
}[/color]
// echo"\n<offer id=\"".$row[$i]['product_id']."\" available=\"true\" bid=\"$bid\">\n";
echo"\n<offer id=\"".$row[$i]['product_id']."\" available=\"true\">\n";
echo"<url>".$url."</url>\n";
echo"<price>$product_price</price>\n";
// Валюта в которой указаны Ваши цены
echo"<currencyId>RUR</currencyId>\n";
echo"<categoryId>".$product_cat_id."</categoryId>\n";
echo"<picture>".$product_full_image ."</picture>\n";
// Возможность доставки
echo"<delivery>true</delivery> \n";
echo"<name>".strip_tags($row[$i]['product_name'])."\"</name>\n";
echo"<description>".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
Извините, сдуру добавил теги [color] в код.
Вот рабочий код
Код
<?php
//***********************************************************
//
// Версия коннектора к Yandex.Market от 18.04.2009
// автор доработок Саид Дашук (dashuk@ngs.ru)
//
// Доработки:
// 1. Подключение к настройкам Joomla (теперь не надо прописывать реквизиты доступа к БД,
//         а достаточно указать конфигурационный файл 'configuration.php')
// 2. Добавлены комментарии для новичков
// 3. ВЫБОРКА ВСЕХ ТОВАРОВ ПРОИСХОДИТ ОДНИМ ЗАПРОСОМ!
// 4. Добавлен шаблон для описания товара (тег <description>)
// 5. Курсы валют, приравнены к курсу ЦБРФ
// 6. Добавлены теги "доставка" и "производитель" (просто мне они нужны, а Вы решайте сами)
// а также: форматирование для удобства кода и вывода и еще что то по мелочам.
//
// Проверялось на Joomla! 1.5.9 Production/Stable / VirtueMart 1.1.2 stable
//
// а также:
// - прикрутить дочерние товары к категории родительского.
// - выводить цены с учетом скидки.
//
// Проверялось на Joomla! 1.5.26 / VirtueMart 1.1.3 robert'ом (nrobert@mail.ru)
//
//***********************************************************
 
 
// Пропишите относительный путь к 'configuration.php' (он находится в корне Joomla)
// Например: include '../configuration.php';
include 'configuration.php';
$cfg = new JConfig();
 
//NAME - Короткое название магазина (название, которое выводится в списке найденных на Яндекс.Маркете товаров.
//Не должно содержать более 20 символов). Нельзя использовать слова, не имеющие отношения к
//наименованию магазина ("лучший", "дешевый"), указывать номер телефона и т.п. Название магазина,
//должно совпадать с фактическим названием магазина, которое публикуется на сайте. При несоблюдении
//данного требования наименование может быть изменено Яндексом самостоятельно без уведомления Клиента.
$cfg_name = $cfg->fromname;
 
//Полное наименование компании, владеющей магазином. Не публикуется, используется для внутренней идентификации.
$cfg_company = $cfg->sitename;
 
//URL-адрес главной страницы магазина без http://
$cfg_url = 'мой_сайт.ru';
 
// Шаблон для описания товара
// Вместо {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_discount = $cfg->dbprefix."vm_product_discount";
$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=\"utf-8\"?>\n";
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>$cfg_name</name>\n";
echo"<company>$cfg_company</company>\n";
echo"<url>$cfg_url</url>\n";
 
// курсы валют, приравнены к курсу ЦБРФ
echo"<currencies>\n";
echo"<currency  id=\"RUR\" rate=\"1\"/>\n";
echo"<currency  id=\"USD\" rate=\"CBRF\"/>\n";
echo"<currency  id=\"EUR\" rate=\"CBRF\"/>\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."\">".$cat_name."</category>\n";
}
else {
echo"<category id=\"".$cat_child_id."\" parentId=\"".$cat_parent_id."\">".$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_parent_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_discount_id,
$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'];
 
$url="http://$cfg_url/index.php?page=shop.product_details&amp;flypage=shop.flypage&amp;option=com_virtuemart&amp;product_id=".$row[$i]['product_id'];
//$url="http://$cfg_url/client?page=shop.product_details&flypage=flypage-ask.tpl&product_id=".$row[$i]['product_id']."&category_id=".$row[$i]['category_id']."&manufacturer_id=".$row[$i]['manufacturer_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']);
$query3 = "SELECT amount FROM $product_discount WHERE discount_id = ".$row[$i]['product_discount_id'];
$res_discount = mysql_query($query3) or die(mysql_error());
$fetch_discount = mysql_fetch_array($res_discount);
$discount_amount = $fetch_discount['amount'];
if($discount_amount == 0) {
$product_price = substr($row[$i]['product_price'], 0, -3);
} else {
$product_price = substr($row[$i]['product_price'], 0, -3) - $discount_amount;
}
$query4 = "SELECT category_id FROM $product_category_xref WHERE product_id = ".$row[$i]['product_parent_id'];
$res_cat2 = mysql_query($query4) or die(mysql_error());
$id_cat=mysql_fetch_array($res_cat2);
$cat_id=$id_cat['category_id'];
if($row[$i]['category_id']) {
$product_cat_id=$row[$i]['category_id'];
} else {
$product_cat_id=$cat_id;
}
// echo"\n<offer id=\"".$row[$i]['product_id']."\" available=\"true\" bid=\"$bid\">\n";
echo"\n<offer id=\"".$row[$i]['product_id']."\" available=\"true\">\n";
echo"<url>".$url."</url>\n";
echo"<price>$product_price</price>\n";
// Валюта в которой указаны Ваши цены
echo"<currencyId>RUR</currencyId>\n";
echo"<categoryId>".$product_cat_id."</categoryId>\n";
echo"<picture>".$product_full_image ."</picture>\n";
// Возможность доставки
echo"<delivery>true</delivery> \n";
echo"<name>".strip_tags($row[$i]['product_name'])."\"</name>\n";
echo"<description>".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
Строки 172, 173, 174, 176 лишние.
Из
Код
if($discount_amount == 0) {
$product_price = substr($row[$i]['product_price'], 0, -3);
} else {
$product_price = substr($row[$i]['product_price'], 0, -3) - $discount_amount;
}
оставьте только
Код
		$product_price = substr($row[$i]['product_price'], 0, -3) - $discount_amount;
Не будь паразитом, сделай что-нибудь самостоятельно!
*

faraon_x

  • Захожу иногда
  • 362
  • 27 / 1
  • Чем смогу, тем помогу )))
Всем привет!
Подскажите кто сделал все таки, чтобы в категории у дочернего товара выводились id категории и описание родительского товара (или что-нибудь одно, второе сделаю по аналогии)?
Код
<?php
//Пропишите для своей БД, пропишите наименование магазина, про адрес www.**********.ru тоже не забудьте
$hostname = "########";
$username = "########";
$password = "########";
$dbName = "########";
$category = "jos_vm_category";
$category_xref = "jos_vm_category_xref";
$userstable = "jos_vm_product";
$pricetable = "jos_vm_product_price";

$product_category_xref =  "jos_vm_product_category_xref";
mysql_connect($hostname,$username,$password) OR DIE("Не могу создать соединение ");
mysql_select_db($dbName) or die(mysql_error());
//mysql_query('set names utf8');

include '../configuration.php';

$cfg = new JConfig();


echo"<?xml version='1.0' encoding='windows-1251'?>\n";
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>############</name>\n";
echo"<company>########</company>\n";
echo"<url>###########</url>\n";
echo"<currencies>\n";
echo"<currency  id=\"RUR\" rate=\"1\"/>\n";
echo"<currency  id=\"USD\" rate=\"CBRF\"/>\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=htmlspecialchars($name_cat['category_name']);
if ($cat_parent_id==0) {
echo"<category id=\"".$cat_child_id."\">".$cat_name."</category>\n";
}
else {
echo"<category id=\"".$cat_child_id."\" parentId=\"".$cat_parent_id."\">".$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_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'and $tb_price.product_price > 0 and $tb_product.product_parent_id > 0 and $tb_product.product_in_stock > 0

";



$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'];




$url="########/index.php?page=shop.product_details&amp;option=com_virtuemart&amp;flypage=flypage.tpl&amp;product_id=".$row[$i]['product_id'];



$product_full_image = "########/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_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>RUR</currencyId>\n";

echo"<categoryId>".$product_cat_id."</categoryId>\n";

echo"<picture>".$product_full_image ."</picture>\n";

// Возможность доставки

echo"<delivery>true</delivery> \n";

echo"<name>".HtmlSpecialChars(strip_tags($row[$i]['product_name']))."\"</name>\n";

echo"<description>".HtmlSpecialChars(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;

}


?>
« Последнее редактирование: 09.12.2012, 15:26:18 от faraon_x »
Вопросы по JFORMS, можно ещё попробовать задать здесь
Российский 3d сканер от разработчиков и производителей
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Повнимательнее читайте
Пользуюсь коннектором от Дашука. У меня внутри родительского товара есть дочерние, категорией которых является сам родитель. Яндекс ругается на это, мол, не существует такой категории.
Вот решил приписать дочерей к категории родителя и заодно выводить цены с учетом скидки.
Может быть, велосипед изобрел, но все равно выкладываю код.
Код
	$tb_product.product_parent_id,
...
$query4 = "SELECT category_id FROM $product_category_xref WHERE product_id = ".$row[$i]['product_parent_id'];
$res_cat2 = mysql_query($query4) or die(mysql_error());
$id_cat=mysql_fetch_array($res_cat2);
$cat_id=$id_cat['category_id'];
if($row[$i]['category_id']) {
$product_cat_id=$row[$i]['category_id'];
} else {
$product_cat_id=$cat_id;
}
Надеюсь, кому-то пригодится.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

faraon_x

  • Захожу иногда
  • 362
  • 27 / 1
  • Чем смогу, тем помогу )))
Читал с первой страницы, видимо глаз замылился. Спасибо за наводку, попробую. +1
Вопросы по JFORMS, можно ещё попробовать задать здесь
Российский 3d сканер от разработчиков и производителей
*

Helen74

  • Новичок
  • 8
  • 0 / 0
Подскажите пожалуйста, отправила ссылку на YML файл для добавления в каталог, приняли, но потом написали что цена на все товары стоит 0, хотя на сайте все с ценами. Где искать ошибку? Joomla 1.5.20, VirtueMart 1.1.5 stable. Изините если мало данных я чайник!
« Последнее редактирование: 18.12.2012, 16:33:40 от Helen74 »
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Подскажите пожалуйста, отправила ссылку на YML файл для добавления в каталог, приняли, но потом написали что цена на все товары стоит 0, хотя на сайте все с ценами. Где искать ошибку? Joomla 1.5.20, VirtueMart 1.1.5 stable. Изините если мало данных я чайник!
Ищите в файле YML.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

Helen74

  • Новичок
  • 8
  • 0 / 0
Ищите в файле YML.
А не подскажите где именно ошибка? Спасибо.
Код
<?php
$hostname = "хххххх";
$username = "ххххх";
$password = "хххх";
$dbName = "ххххх";
$category = "jos_vm_category";
$category_xref = "jos_vm_category_xref";
$manufacturer_xref = "jos_vm_product_mf_xref";
$manufacturer = "jos_vm_manufacturer";
$userstable = "jos_vm_product";
$pricetable = "jos_vm_product_price";
$product_category_xref =  "jos_vm_product_category_xref";

//Определяем сегодняшнюю дату в формате, который используется на сайте cbr.ru
$date = date("d/m/Y");
//Определим код нашей валюты на сайте cbr.ru
//Евро
//$code='R01239';
//Выполняем первый пункт, считываем страницу с курсами валют в переменную
//$file = file_get_contents("http://www.cbr.ru/scripts/XML_daily.asp?date_req=".$date);
//Разбираем страницу с помощью регулярок:
/*preg_match("#<Valute ID=\"" . $code . "\".*?>(.*?)</Valute>#is", $file, $m);
preg_match("#<Value>(.*?)</Value>#is", $m[1], $r);
//Запятую, отделяющую дробную часть заменяем на точку, и у нас в переменной $euro находится курс евро.
$euro = str_replace(",", ".", $r[1]);
//$euro = "1";*/

mysql_connect($hostname,$username,$password) OR DIE("Не могу создать соединение ");
mysql_query( "set session character_set_server=utf8;");
mysql_query( "set session character_set_database=utf8;");
mysql_query( "set session character_set_connection=utf8;");
mysql_query( "set session character_set_results=utf8;");
mysql_query( "set session character_set_client=utf8;");
mysql_select_db($dbName) or die(mysql_error());
echo"<?xml version=\"1.0\" encoding=\"utf8\"?>\n";
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>xn--80apfaecrdir6f2b6a.xn--p1ai</name>\n";

echo"<company>xn--80apfaecrdir6f2b6a.xn--p1ai</company>\n";
echo"<url>xn--80apfaecrdir6f2b6a.xn--p1ai</url>\n";

echo"<currencies>\n";
echo"<currency id=\"RUR\" rate=\"1\"/>\n";
echo"<currency id=\"USD\" rate=\"CBRF\"/>\n";
//echo"<currency id=\"EUR\" rate=\"CBRF\"/>\n";
echo"<currency id=\"EUR\" rate=\"1\"/>\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."\">".$cat_name."</category>\n";
}

else {
echo"<category id=\"".$cat_child_id."\" parentId=\"".$cat_parent_id."\">".$cat_name."</category>\n";
}

$rw++;

}

echo"</categories>\n";


echo"<offers>\n";
$query = "SELECT * FROM $userstable WHERE product_publish='Y'";
$res = mysql_query($query) or die(mysql_error());
$rw=1;

while ($row=mysql_fetch_array($res)) {

$url="http://xn--80apfaecrdir6f2b6a.xn--p1ai/index.php?option=com_virtuemart&amp;flypage=flypage.tpl&amp;page=shop.product_details&amp;product_id=".$row['product_id'];

if ($row['product_full_image'] != "")
{
    $product_full_image = "http://xn--80apfaecrdir6f2b6a.xn--p1ai/components/com_virtuemart/shop_image/product/".$row['product_full_image'];
}
else
{
    $product_full_image = "http://xn--80apfaecrdir6f2b6a.xn--p1ai/components/com_virtuemart/shop_image/product/noimage.gif";
}

$vowels = array("=", "-", "+", "&");

$product_name = $row['product_name'];
$product_name = strip_tags(str_replace($vowels," ",(trim("$product_name"))));

$product_desc = $row['product_desc'];
$product_desc = strip_tags(str_replace($vowels," ",(trim("$product_desc"))));

$product_s_desc = $row['product_s_desc'];
$product_s_desc = strip_tags(str_replace($vowels," ",(trim("$product_s_desc"))));

$query1 = "SELECT product_price FROM $pricetable WHERE product_id=".$row['product_id'];
$res1 = mysql_query($query1) or die(mysql_error());
$price=mysql_fetch_array($res1);
$product_price = (substr($price['product_price'], 0, -3)) * $euro;

$query3 = "SELECT category_id FROM $product_category_xref WHERE product_id=".$row['product_id'];
$res3 = mysql_query($query3) or die(mysql_error());
$product_cat_id=mysql_fetch_array($res3);
$product_cat_id=$product_cat_id['category_id'];

$query4 = "SELECT manufacturer_id FROM $manufacturer_xref WHERE product_id=".$row['product_id'];
$res4 = mysql_query($query4) or die(mysql_error());
$manufacturer_id1=mysql_fetch_array($res4);
$manufacturer_id=$manufacturer_id1['manufacturer_id'];

$query5 = "SELECT mf_name FROM $manufacturer WHERE manufacturer_id=$manufacturer_id";
$res5 = mysql_query($query5) or die(mysql_error());
$manufacturer_name1=mysql_fetch_array($res5);
$manufacturer_name=$manufacturer_name1['mf_name'];

/* if ($manufacturer_id==27 || $manufacturer_id==32 || $manufacturer_id==32 || $manufacturer_id==24 || $manufacturer_id==33 || $manufacturer_id==35 || $manufacturer_id==26 || $manufacturer_id==25 || $manufacturer_id==30 || $manufacturer_id==28 || $manufacturer_id==29) {
*/ echo"<offer id=\"".$rw."\" available=\"true\" bid=\"11\">\n";
echo"<url>".$url."</url>\n";
echo"<price>".$product_price."</price>\n";
echo"<currencyId>RUR</currencyId>\n";
echo"<categoryId>".$product_cat_id."</categoryId>\n";
echo"<picture>".$product_full_image."</picture>\n";
echo"<delivery>true</delivery>\n";
echo"<name>".$product_name."</name>\n";
echo"<vendor>".$manufacturer_name."</vendor>\n";
echo"<description>".$product_s_desc." ".$product_desc."</description>\n";
echo"</offer>\n";
/* }*/

$rw++;
}

echo"</offers>\n";
echo"</shop>\n";
echo"</yml_catalog>\n";
?>
« Последнее редактирование: 18.12.2012, 17:40:35 от Helen74 »
*

Helen74

  • Новичок
  • 8
  • 0 / 0
Жду помощи, спасибо.
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Видимо, у вас курс евро не определился. Если цены только в рублях, то просто уберите из
Код
$product_price = (substr($price['product_price'], 0, -3)) * $euro;
курс евро
Код
$product_price = (substr($price['product_price'], 0, -3));
Все должно заработать.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

Helen74

  • Новичок
  • 8
  • 0 / 0
Видимо, у вас курс евро не определился. Если цены только в рублях, то просто уберите из
Код
$product_price = (substr($price['product_price'], 0, -3)) * $euro;
курс евро
Код
$product_price = (substr($price['product_price'], 0, -3));
Все должно заработать.
Спасибо большое, всё заработало! +1
P.S Не знаю как плюсик в репутацию добавлять(
*

gelx

  • Осваиваюсь на форуме
  • 42
  • 1 / 1
Извините, сдуру добавил теги [color] в код.
Вот рабочий код
Код
...

Выдается ошибка при проверке на маркете:

Предупреждение: Кодировка XML не определена (строка 0, столбец 0)
Фатальная ошибка: Ошибка парсинга XML: Error parsing XML feed: Invalid document structure (строка 50, столбец 48)


Joomla 1.5.26, VM 1.1.9
кодировка базы utf8
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Выдается ошибка при проверке на маркете:

Предупреждение: Кодировка XML не определена (строка 0, столбец 0)
Фатальная ошибка: Ошибка парсинга XML: Error parsing XML feed: Invalid document structure (строка 50, столбец 48)


Joomla 1.5.26, VM 1.1.9
кодировка базы utf8
Соответствующую запись в .htaccess сделали?
Не будь паразитом, сделай что-нибудь самостоятельно!
*

gelx

  • Осваиваюсь на форуме
  • 42
  • 1 / 1
Соответствующую запись в .htaccess сделали?
Точно! Не сделал...  ^-^
Уже установил и настроил компонент из этой темы: http://joomlaforum.ru/index.php/topic,164538.msg889184.html#msg889184

Но все-равно спасибо!
*

rpex

  • Осваиваюсь на форуме
  • 13
  • 0 / 0
robert, Я.Маркет ругается:
Цитировать
Определена кодировка: utf-8 (строка 0, столбец 0)
Дата из файла: 2013-01-29 01:16 (строка 3, столбец 38)
Фатальная ошибка: Ошибка парсинга XML: Error parsing XML feed: Unterminated entity reference, 'D' (строка 41, столбец 36)
Как исправить? Сайт в UTF-8 в скрипте тоже, названия сайта скрипт берет из Joomla я так понял, сам не писал описания. В личку отправил подробности.
По строке столбцу:
<category id="29" parentid="12">C&amp;D Technologies</category>

Вроде так и должно быть... Не пойму...

В итоге дело в знаке & но при замене на &amp;все равно ругается, а если убрать знак & то Яндекс пропускает, как решить?

Пока просто поубирал & и следующие ошибки такого рода:
Цитировать
Ошибка: Значения тегов delivery/pickup/store не соответствуют типу магазина (строка 5046, столбец 10)
Ошибка: Предложение отклонено: http://test.ru/index.php?page=shop.product_details&flypage=shop.flypage&option=com_virtuemart&product_id=52 (строка 228, столбец 9)
« Последнее редактирование: 29.01.2013, 02:10:18 от rpex »
*

rpex

  • Осваиваюсь на форуме
  • 13
  • 0 / 0
Вот блин, еще и все ссылки без SEF, как поправить?
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Вот рабочий вариант, которым сам пользуюсь. Добавлено:
- Прикрутить дочерние товары к категории родительского.
- Выводить цены с учетом скидки.
- Решить проблему "Error parsing XML feed: Unterminated entity reference", связанную с знаком "&" в названиях категории и товаров.
- Динамически определить наличие товаров.
- Динамически определить минимальную сумму покупки.
Спойлер
[свернуть]
« Последнее редактирование: 29.01.2013, 17:29:15 от robert »
Не будь паразитом, сделай что-нибудь самостоятельно!
*

rpex

  • Осваиваюсь на форуме
  • 13
  • 0 / 0
Ошибка с этим скриптом еще круче:
Цитировать
Определена кодировка: iso-8859-5 (строка 0, столбец 0)
Фатальная ошибка: Заявленная кодировка XML ( utf-8) не соответствует действительной ( iso-8859-5)

Хотя в скрипте utf-8 же стоит у тебя.
*

terr

  • Давно я тут
  • 824
  • 14 / 6
  • Ученик html-я
Задача стоит написать проверку колчичества товара и если оно ровно -1 то не выводить в Яндекс маркете набросал примерный код но он не работает, пните а?

Код
$available = 'false';
$quant = (int)$row['product_in_stock'];
if ($quant) {
$available = 'true';
}

$available = "true";
if ($product_in_stock = -1) $available = "false";
*

Alex Revo

  • Завсегдатай
  • 1995
  • 109 / 0
$available = 'false';
$quant = int($row['product_in_stock']);
if ($quant== -1) $available = "false"; else $available = 'true';
*

terr

  • Давно я тут
  • 824
  • 14 / 6
  • Ученик html-я
$available = 'false';
$quant = int($row['product_in_stock']);
if ($quant== -1) $available = "false"; else $available = 'true';

Код
Определена кодировка: windows-1251 (строка 0, столбец 0)
Дата из файла: 2014-01-16 20:13 (строка 3, столбец 38)
Фатальная ошибка: Ошибка парсинга XML: Error parsing XML feed: Unknown element 'br' (строка 138, столбец 4)

Не сконало

А вот в таком виде парсит но на сколько рабочий вариант еще не знаю

Код
$available = 'false';
$quant = (int)$row['product_in_stock'];
if ($quant== -1) $available = "false"; else $available = 'true';


{
$available = 'true';
}
*

Alex Revo

  • Завсегдатай
  • 1995
  • 109 / 0
Не сконало потому что тег <br/> где-то затесался вне XML кода.
*

terr

  • Давно я тут
  • 824
  • 14 / 6
  • Ученик html-я
Не сконало потому что тег <br/> где-то затесался вне XML кода.

Мой варент не работает так -как я индесирует эту позицию, а как найти тег br  я видел это но ненашел

у меня вся выгрузка это 1 php файл
*

Alex Revo

  • Завсегдатай
  • 1995
  • 109 / 0
Яндекс индексирует все позиции, признак available передает только информацию товар в наличии или под заказ.

Цитировать
В атрибуте available указывается статус доступности товара:
• false — товарное предложение на заказ. Магазин готов принять заказ и осуществить поставку товара в течение согласованного с покупателем срока, не превышающего двух месяцев (за исключением товаров, изготавливаемых на заказ, ориентировочный срок поставки которых оговаривается с покупателем во время заказа).
• true — товарное предложение в наличии. Магазин готов сразу договариваться с покупателем о доставке/покупке товара.

Если вы не хотите передавать в Яндекс заказные позиции нужно делать проверку остатков перед формированием тега offer.
*

terr

  • Давно я тут
  • 824
  • 14 / 6
  • Ученик html-я
Нужно сделать если остаток -1 то чтоб Яндекс этот товар не индексировал и не выводил в я маркет а на сайте чтоб можно было его отобразить и продать через корзинку
*

Alex Revo

  • Завсегдатай
  • 1995
  • 109 / 0
Тогда нужно просто всю часть кода с формированием offer заключить в условие
if ($row['product_in_stock']) {
вывод тега оффер и товарного предложения
}

Выгружаете файл и смотрите, там должны быть позиции только в наличии.
Атрибут available в offer везде можно оставить как true, без доп.проверок.
*

terr

  • Давно я тут
  • 824
  • 14 / 6
  • Ученик html-я
Тогда нужно просто всю часть кода с формированием offer заключить в условие
if ($row['product_in_stock']) {
вывод тега оффер и товарного предложения
}

Выгружаете файл и смотрите, там должны быть позиции только в наличии.
Атрибут available в offer везде можно оставить как true, без доп.проверок.

Дак в том то и дело что с обработкой в наличии проблем нет, нужно именно исключить из прасинга яндексом товарс с кол. -1 тоесть одно четкое количество товара) а под заказ и в наличии от 0 и ++++ чтоб Яндекс парсил товар и выгружал на маркет
*

Alex Revo

  • Завсегдатай
  • 1995
  • 109 / 0
if ($row['product_in_stock']>-1) {
вывод тега оффер и товарного предложения
}
*

stas12

  • Осваиваюсь на форуме
  • 13
  • 1 / 0
Подскажите, столкнулся с проблемой. с сайта идет выгрузка XML на aukro
При добавлении новой категории товаров в VirtueMart, сбивается привязка по категориям на аукро и получается каша.
В настройках VirtueMart смотрел - для новой категории создается новый id. По идее на аукро только должны подвязать новую категорию с нашего сайта к своим категориям.
А у меня получается когда я создаю новую категорию, допустим "Носки" - на аукро она получает id "Трусов". А товары из категории "Трусы" получают id категории "Куртки".
Получается новым категориям присваивается рандомный id уже существующих категорий, а как сделать что новая категория получала новый id и не замещала уже существующий? спасибо.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

1C УТ 8.x &lt;-&gt; VirtueMart по протоколу CommerceML

Автор Centoff

Ответов: 1315
Просмотров: 215067
Последний ответ 27.10.2020, 15:32:10
от Leo1986
Импорт из CSV товаров с типами и свойствами из

Автор Gruz

Ответов: 499
Просмотров: 151014
Последний ответ 23.02.2017, 15:15:42
от orchanin
Как импортировать файл XML в Joomla VirtueMart?

Автор Кот Смюлан

Ответов: 2
Просмотров: 5184
Последний ответ 14.07.2016, 18:40:24
от Berzerker
импорт товаров в YML Яндекс маркет

Автор zmeyx

Ответов: 5
Просмотров: 11479
Последний ответ 14.07.2016, 18:34:28
от Berzerker
Скрипт экспорта товаров в Яндекс маркет (yml)

Автор gaalferov

Ответов: 12
Просмотров: 11794
Последний ответ 08.06.2016, 14:02:27
от DimaXP