Новости 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 Ответов
  • 172747 Просмотров
*

richman

  • Захожу иногда
  • 50
  • 1 / 0
показывайте яндексу тольку основной товар - поставьте в запросе product_parent=0

как я понял, что Яндекс.Маркет подтовары и так отклоняет, так как у них нет категории, поэтому зачем дополнительно указывать product_parent=0? или ему вообще нельзя показывать подтовары по каким-то причинам?

Есть ли возможность сделать, чтобы он их не отклонял? или это технически не реально сделать?
*

beagler

  • Moderator
  • 3276
  • 392 / 4
  • https://alorisman.ru/
подтовары - это не полноценные товары - это вариант основного.
А чтобы принимал - вытягивайте для них категорию из основного.
*

richman

  • Захожу иногда
  • 50
  • 1 / 0
подтовары - это не полноценные товары - это вариант основного.
А чтобы принимал - вытягивайте для них категорию из основного.


у всех по разному. кто для каких целей их сделал и настроил. в моем случае они могут выступать как полноценные товары, которые входят в комплект основного товара, но могут покупаться независимо от основного товара. У них свои отдельные карточки.

в скрипте нужно разбираться, но как пока не знаю. В данном случае, как вариант, можно сделать дополнительные карточки подтоваров в качестве основных товаров, чтобы Яндекс.Маркет их принял. Соответственно полностью переписав в них тексты, чтобы у Яндекс.Поиска не было претензий к дублированию карточек.
*

Maxversed

  • Новичок
  • 7
  • 0 / 0
День добрый,
нужно настроить выгрузку в .YML из VirtueMart 1.5
Готов заплатить по wmz

Весь день провозился, ничего не выходит.
*

Meteohome

  • Новичок
  • 2
  • 0 / 0
Подскажите пожалуйста, второй день мучаюсь!
 проверка YML выдает
Код
Фатальная ошибка: Ошибка парсинга XML: Error parsing XML feed: Unknown element 'br' (строка 1, столбец 4)
Видел этот вопрос в этой теме, но решения так и не нашел, может не понял, расскажите пожалуйста как исправить, первый раз этим занимаюсь.


Заранее спс ! :)
*

zilonitiz

  • Захожу иногда
  • 427
  • 14 / 1
Цитировать
Неизвестный элемент 'br' (строка 1, столбец 4)
Автоматизация действий в интернете, рутина. Парсеры, постеры, регеры и т.д. Телеграм: @evildance.
*

Meteohome

  • Новичок
  • 2
  • 0 / 0
Ну я понимаю что "неизвестный элемент" а как это исправить понятия не имею, даже не знаю куда лезть
*

belyirb

  • Новичок
  • 3
  • 0 / 0
Не загружать товар без цены без картинки без комментария что куда писать скиньте пожалуйста доработку или ссылки где это разжёвывается!!
За ранее спасибо!
« Последнее редактирование: 06.03.2011, 07:53:04 от belyirb »
*

zilonitiz

  • Захожу иногда
  • 427
  • 14 / 1
Ребята! Выкладываю скрипт немного доработанный, в нем убрана проблема с переменной <sales_notes>

Код
<?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>http://**********</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_publish='Y' and 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_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' 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="http://**********/index.php?page=shop.product_details&amp;option=com_virtuemart&amp;flypage=flypage.tpl&amp;product_id=".$row[$i]['product_id'];



$product_full_image = "http://**********/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>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 "<sales_notes>минимальная сумма заказа 1000 руб</sales_notes> \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;

}


?>


Пробуйте, оценивайте=)


А что именно исправлено? В моем случае в <sales_notes> не воспринимается кирилица. Латиницей указываешь условия - все в порядке.
Автоматизация действий в интернете, рутина. Парсеры, постеры, регеры и т.д. Телеграм: @evildance.
*

zilonitiz

  • Захожу иногда
  • 427
  • 14 / 1
Ну я понимаю что "неизвестный элемент" а как это исправить понятия не имею, даже не знаю куда лезть

Открыть файл и посмотреть в строку 1, столбец 4.
Автоматизация действий в интернете, рутина. Парсеры, постеры, регеры и т.д. Телеграм: @evildance.
*

terr

  • Давно я тут
  • 824
  • 14 / 6
  • Ученик html-я
а с маил торгом ктонить работал, выгружал XML какнить автоматически?
*

richman

  • Захожу иногда
  • 50
  • 1 / 0
показывайте яндексу тольку основной товар - поставьте в запросе product_parent=0

Где найти этот запрос? Если вы имеете в виду файл market.php автоматически выгружающий товары в Яндекс.Маркет, то запроса product_parent я там не нашел.

Уточняю так как еще одна проблема возникла с наличием подтоваров. Ранее Яндекс просто писал ошибку, что не видит у подтоваров категории и отклонял подтовары. Но сейчас он стал выдавать новую ошибку, связанную с тем, что стало слишком много отклоненных товаров, и вообще перестал принимать yml-файл. Спросил у техподдержки Яндекс.Маркета можно ли снять это ограничение. Техподдержка сказала уменьшить количество подчиненных товаров, но сколько конкретно уменьшать не сказала пока. Теперь мне придется в самом магазине скрывать подтовары вручную. Получается зря я их скурпулезно ранее заводил. Как сделать в файле market.php, чтобы Яндекс.Маркет на подтовары вообще не обращал внимание, не видел их?
*

richman

  • Захожу иногда
  • 50
  • 1 / 0
Наконец-то я нашел ответ на свой вопрос о выводе категории подтоваров.  ^-^ Файл YML сейчас принимается без ошибок. Яндекс.Маркет воспринимает подтовары как обычные товары. При чем ответ нашел я в этой же теме, после того как повозился с поиском по теме.

Скрипт, доработанный с учетом вывода атрибутов. Теперь им присваивается категория родительского товара, в virtuemarte у них категория - это сам родительский товар, что не всегда удобно+ ссылки, с учетом SEF Joomla, расширенное до virtuemart
В яндексе проверку проходит - зелененький.
Если нет SEF - лоткомментировать второй $url, закомментировать существующий,
И товары не должны иметь одинаковое наименование Или Описание
Код: php
<?php
include 'configuration.php';
$cfg = new JConfig();
$cfg_name = 'Название магазина';
$cfg_company = 'Название компании';
$cfg_url = 'ссылка';

$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";
$product_discount = $cfg->dbprefix."vm_product_discount";

mysql_connect($hostname,$username,$password) OR DIE("Не могу создать соединение ");
mysql_select_db($dbName) or die(mysql_error());

mysql_query('set names cp1251');

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>$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_discount_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_price.product_currency,
$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'];
$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_discount_id = $row[$i]['product_discount_id'];
$product_currency = $row[$i]['product_currency'];
$vendor = $row[$i]['mf_name'];
$product_price = substr($row[$i]['product_price'], 0, -3);
$product_parent_id = $row[$i]['product_parent_id'];
if( $product_parent_id != "0" ){
$product_id=$product_parent_id;}
else{
$product_id=$row[$i]['product_id'];
$product_cat_id=$row[$i]['category_id'];}
$url="http://$cfg_url/component/virtuemart/details/".$product_id."/".$row[$i]['category_id']."/";
echo"\n<offer id=\"".$row[$i]['product_id']."\" type=\"vendor.model\" available=\"true\" bid=\"$bid\">\n";
echo"<url>".$url."</url>\n";
$mysql_product_discount = mysql_query("SELECT amount FROM $product_discount WHERE discount_id='$product_discount_id'");
while ($array_product_discount = mysql_fetch_array($mysql_product_discount) )
$product_price = $product_price - $product_price * $array_product_discount['amount']  / 100;
echo"<price>$product_price</price>\n";
if ($product_currency == "RUB"){
         echo"<currencyId>RUR</currencyId>\n";
        } else {
echo"<currencyId>$product_currency</currencyId>\n";
}
echo"<categoryId>".$product_cat_id."</categoryId>\n";

if ($row[$i]['product_full_image']){
        echo"<picture>".$product_full_image ."</picture>\n";
        } else {
}
echo"<delivery>true</delivery> \n";
echo"<vendor>".HtmlSpecialChars($vendor)."</vendor>\n";
echo"<model>".HtmlSpecialChars(strip_tags($row[$i]['product_name']))."</model>\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;
}
?>
*

Night_traveller

  • Новичок
  • 6
  • 2 / 0
удалено
« Последнее редактирование: 21.01.2018, 18:02:58 от Night_traveller »
*

Juseppe

  • Захожу иногда
  • 62
  • 1 / 0
Друзья, подскажите как сделать так, чтобы в yml файле не было товаров, которых нет на складе. Потому как товары, отсутствующие на складе, убираются только на самом сайте, а в YML фале по прежнему живут и здравствуют
*

richman

  • Захожу иногда
  • 50
  • 1 / 0
Корректный вывод наличия на складе:
Заменяем:
Код
echo"\n<offer id=\"".$row[$i]['product_id']."\" available=\"true\" bid=\"$bid\">\n";
На
Код
$product_in_stock= $row[$i]['product_in_stock'];
if ($product_in_stock > 0){
echo"\n<offer id=\"".$row[$i]['product_id']."\" available=\"true\" bid=\"$bid\">\n";
}
else {
echo"\n<offer id=\"".$row[$i]['product_id']."\" available=\"false\" bid=\"$bid\">\n";
}

В итоге, если "true", то Яндекс.Маркет присвоит товару статус доступности "в наличии", если "false", то статус "на заказ".
« Последнее редактирование: 15.03.2011, 14:28:56 от richman »
*

richman

  • Захожу иногда
  • 50
  • 1 / 0
Мой ответ конечно немного не соответствует вашему вопросу, но возможно поможет.
*

Night_traveller

  • Новичок
  • 6
  • 2 / 0
удалено
« Последнее редактирование: 21.01.2018, 18:03:24 от Night_traveller »
*

Night_traveller

  • Новичок
  • 6
  • 2 / 0
удалено
« Последнее редактирование: 21.01.2018, 18:04:09 от Night_traveller »
*

Juseppe

  • Захожу иногда
  • 62
  • 1 / 0
В итоге, если "true", то Яндекс.Маркет присвоит товару статус доступности "в наличии", если "false", то статус "на заказ".
Это немного не то, что мне было нужно. Но всё равно спасибо за совет :)
*

andx

  • Захожу иногда
  • 111
  • 6 / 0
Подскажите пожалуйста за я.деньгу (пишите в личку), у меня стало выдавать вот такую ссылку на картинку:
Код
<picture>http://site.ru/components/com_virtuemart/shop_image/product/</picture>
тоесть сам файл картинки отсутствует. Пропустил момент, случайно заметил, но мне кажется это после обновы виртмарта до версии 1.1.7 так стало. Раньше все работало.
*

Тимур

  • Захожу иногда
  • 52
  • 1 / 0
А кто-нибудь пробовал параметры типов импортировать в yml?
*

zema

  • Новичок
  • 2
  • 0 / 0
Народ подскажите в чем проблема Яндекс пишет:  Невалидный XML
*

kiddywear

  • Осваиваюсь на форуме
  • 33
  • 0 / 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
//
//***********************************************************


// Пропишите относительный путь к 'configuration.php' (он находится в корне Joomla)
// Например: include '../configuration.php';
include 'configuration.php';
$cfg = new JConfig();

//NAME - Короткое название магазина (название, которое выводится в списке найденных на Яндекс.Маркете товаров.
//Не должно содержать более 20 символов). Нельзя использовать слова, не имеющие отношения к
//наименованию магазина ("лучший", "дешевый"), указывать номер телефона и т.п. Название магазина,
//должно совпадать с фактическим названием магазина, которое публикуется на сайте. При несоблюдении
//данного требования наименование может быть изменено Яндексом самостоятельно без уведомления Клиента.
$cfg_name ='Магазин....';

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

//URL-адрес главной страницы магазина
$cfg_url = 'www.**********.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_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_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'];
 
 
 
$name = $row[$i]['category_name'];
 
$alias = vm_transliterate($name);
 
 
 
$alias = strtolower( $alias );
 
$alias = preg_replace('/&.+?;/', '', $alias); // kill entities
 
$alias = str_replace( '_', '-', $alias );
 
$alias = preg_replace('/[^a-z0-9\s-.]/', '', $alias);
 
$alias = preg_replace('/\s+/', '-', $alias);
 
$alias = preg_replace('|-+|', '-', $alias);
 
$alias = trim($alias, '-');
 
 
$hvost = $row[$i]['product_name'];
 
if (preg_match('/[^A-Za-z0-9_\-]/',$hvost)) {
 
 
 
$hvost = vm_transliterate($hvost);
 
$hvost = strtolower($hvost);
 
$hvost = preg_replace('/&.+?;/', '',$hvost); // kill entities
 
$hvost = str_replace( '_', '-',$hvost );
 
$hvost = preg_replace('/[^a-z0-9\s-.]/', '',$hvost);
 
$hvost = preg_replace('/\s+/', '-',$hvost);
 
$hvost = preg_replace('|-+|', '-',$hvost);
 
$hvost = trim($hvost, '-');
 
}

$url="http://$cfg_url/catalog/category/product/".$row[$i]['category_id']."-".$alias."/".$row[$i]['product_id']."-".$hvost.".html";
//$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']);
$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>".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;
}

function vm_transliterate($name)
{
$tbl= array(
'а'=>'a', 'б'=>'b', 'в'=>'v', 'г'=>'g', 'д'=>'d', 'е'=>'e', 'ж'=>'g', 'з'=>'z',
'и'=>'i', 'й'=>'y', 'к'=>'k', 'л'=>'l', 'м'=>'m', 'н'=>'n', 'о'=>'o', 'п'=>'p',
'р'=>'r', 'с'=>'s', 'т'=>'t', 'у'=>'u', 'ф'=>'f', 'ы'=>'i', 'э'=>'e', 'А'=>'A',
'Б'=>'B', 'В'=>'V', 'Г'=>'G', 'Д'=>'D', 'Е'=>'E', 'Ж'=>'G', 'З'=>'Z', 'И'=>'I',
'Й'=>'Y', 'К'=>'K', 'Л'=>'L', 'М'=>'M', 'Н'=>'N', 'О'=>'O', 'П'=>'P', 'Р'=>'R',
'С'=>'S', 'Т'=>'T', 'У'=>'U', 'Ф'=>'F', 'Ы'=>'I', 'Э'=>'E', 'ё'=>"yo", 'х'=>"h",
'ц'=>"ts", 'ч'=>"ch", 'ш'=>"sh", 'щ'=>"shch", 'ъ'=>"", 'ь'=>"", 'ю'=>"yu", 'я'=>"ya",
'Ё'=>"Yo", 'Х'=>"H", 'Ц'=>"Ts", 'Ч'=>"Ch", 'Ш'=>"Sh", 'Щ'=>"Shch", 'Ъ'=>"", 'Ь'=>"",
'Ю'=>"Yu", 'Я'=>"Ya"
);
 
return strtr($name, $tbl);
 
}
?>
« Последнее редактирование: 03.04.2011, 14:51:44 от kiddywear »

Кое как что-то работает, НО! на сайте с объемом номенклатуры 1000-1500. А как сделать на сайте с объемом 50000 и более? Как ограничить объем создаваемого файла? Яндекс требует максимум 500Мб. Незнаю сколько весит мой, но он ни в браузере ни в панели Yandex не грузится.
 
*

WooSuuP

  • Захожу иногда
  • 235
  • 11 / 1
  • Ословед Интерсвязи
Оу... Все круто работает! Спасибо вам!
*

orexov_m

  • Захожу иногда
  • 297
  • 24 / 0
почитал тему скрипт работает, но у меня есть необходимость выгружать типы товаров в маркет, а каким образом это сделать никак не пойму.
Может кто подскажет или готовым скриптом поделиться, чтобы ещё и типы товаров выгружались в маркет?
Skype:orekhov.mikhail, ICQ: 580077720, Телега
*

Satool

  • Захожу иногда
  • 139
  • 2 / 0
Спасибо! Работает!
Только вот мне необходимо  выводить не краткое описание, а описание товара причем желательно примерно первых  сто символов. Кто знает как можно это реализовать?
« Последнее редактирование: 20.04.2011, 16:27:44 от Satool »

Joomla 1.5.23
VirtueMart 1.1.8
vmSEF 1.37
Установки Search Engine Optimization:
Включить SEO - Да
Использовать mod_rewrite - Да
Добавить суффикс к URL - Да

под роутер от Даника:
урл выглядит так <url>http://***.***/catalog/category/product/9-aksessuari/736-remen.html</url>
а на самом деле: http://***.***/aksessuary/remen.html

подарок от ANDREW:
урл выглядит так: <url>http://***.***/index.php?page=shop.product_details&amp;flypage=shop.flypage&amp;option=com_virtuemart&amp;product_id=736</url>
урл не очень корректно выглядит но по крайней мере работает

Проблема отображения товаров со скидками:
Цена товара 200 руб, цена товара со скидкой 155 руб. а в файле market.yml отображаеться цена 200 руб. Соответственно при проверке Яндех выдает ошибку что цена товара не соответствует цене указанной на сайте

Кто знает помогите?
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

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

Автор Centoff

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

Автор Gruz

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

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

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

Автор zmeyx

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

Автор gaalferov

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