Новости Joomla

Вышли релизы Joomla 6.0.3 и Joomla 5.4.3

Релиз Joomla 6.0.3 и Joomla 5.4.3

Проект Joomla рад сообщить о выпуске Joomla 6.0.3 и Joomla 5.4.3. Это релиз исправлений ошибок и улучшений для серии Joomla 6.0 и Joomla 5.4.

👩‍💻 События плагинов и порядок их срабатывания при работе с пользовательскими полями Joomla и использовании FieldsHelper.

👩‍💻 События плагинов и порядок их срабатывания при работе с пользовательскими полями Joomla и использовании FieldsHelper.

В процессе работы с Joomla бывает необходимо работать с пользовательским интерфейсом более тонко, чем обычно. Все формы Joomla состоят из стандартных полей, содержанием, стилем отображения, состоянием (включено/выключено, доступно для редактирования или нет и т.д.) можно управлять с помощью плагинов. Да и для нестандартных проектов хорошей практикой является создание одного системного или нескольких плагинов групп "под проект", в которых храниться весь "нестандарт".

В этой статье описаны все триггеры, которые вызываются через Event Dispatcher из administrator/components/com_fields/src/Helper/FieldsHelper.php, с привязкой к жизненному циклу (порядку этапов работы запроса), аргументам, изменяемым данным и дальнейшему распространению по Joomla. Это поможет вам работать с Joomla свободнее и не опасаясь при этом потерять изменения при очередном обновлении движка.

Подходы, описанные в статье, полезны в тех случаях, когда вы работаете с данными в com_fields - механизме создания и редактирования пользовательских полей ядра Joomla и при использовании FieldsHelper. Многие сторонние компоненты не используют эту возможность, поэтому данная статья будет полезна лишь частично.

🏆 Открыто голосование за Joomla в премии CMS Critic People’s Choice Awards 2025

🏆 Открыто голосование за Joomla в  премии CMS Critic People’s Choice Awards 2025

🗓 Голосование продлится до 27 февраля 2026 года.

👩‍💻 Проголосовать! 👩‍💻

Номинации, в которых можно проголосовать за Joomla:
⭐️ Best Free CMS
⭐️ Best Open Source CMS
⭐️ Best Enterprise CMS

Также в номинации Best e-Commerce Solution участвуют компоненты интернет-магазинов для Joomla:
⭐️ HikaShop
⭐️ Virtuemart

В номинации Best Website Builder оказались:
⭐️ YooTheme
⭐️ SP Page Builder

Что такое CMS Critic Awards?
С 2012 года премия CMS Critic Awards занимает особое место в сообществе систем управления контентом (CMS). Это единственный в своем роде сайт, который составляет рейтинг системы управления контентом и связанных с ними решений на рынке — от малого до крупного и подчеркивает их инновации и услуги.

Каждый год награда CMS Critic Awards присуждается одному победителю в различных отраслевых категориях, таких как: «Лучшая облачная CMS», «Лучший DXP», «Лучшая Headless CMS и других. Затем результаты оглашаются через СМИ вместе с выбором редакции CMS Critic.
В этом году премия вернулась к своим традициям и только TOP-5 движков по количеству номинаций попали в 2-й этап - голосование.

@joomlafeed

0 Пользователей и 1 Гость просматривают эту тему.
  • 690 Ответов
  • 177999 Просмотров
*

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
Просмотров: 224135
Последний ответ 27.10.2020, 15:32:10
от Leo1986
Импорт из CSV товаров с типами и свойствами из

Автор Gruz

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

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

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

Автор zmeyx

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

Автор gaalferov

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