andreich
есть код выгрузки в YML на joomla+VM
нужно чтобы в саом XML присутствовал не только
<price></price>
но и <oldprice></oldprice>
<?php
/*
* @package VirtueMart
* @version 2.0.9 2013-12-23
* @author Kaurava Legh, iMaud studio
* @copyright Copyright (C) 2013 kauravalegh.com. All rights reserved.
* Для магазина на CMS Joomla! и компоненте VirtueMart генерирует прайс товара
* формата YML (xml) для предоставления ЯНДЕКС.Маркет.
* Описание формата YML размещено на сайте Яндекс:
*
http://partner.market.yandex.ua/legal/tt_rus/
*
http://legal.yandex.ru/market_adv_rules/
* Файл-результат ymlexport.xml содержит описание магазина и полный прайс.
*/
define('_JEXEC', 1);
defined('DS') or define('DS', DIRECTORY_SEPARATOR);
define('JPATH_BASE', '..'.DS.'..'.DS.'..'.DS);
require_once(JPATH_BASE.'includes'.DS.'defines.php');
require_once(JPATH_BASE.'includes'.DS.'framework.php');
$app = JFactory::getApplication('site');
$app->initialise();
$db = JFactory::getDBO();
require_once(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_virtuemart'.DS.'helpers'.DS.'config.php');
require_once(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_virtuemart'.DS.'helpers'.DS.'calculationh.php');
require_once(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_virtuemart'.DS.'helpers'.DS.'vmmodel.php');
include(dirname(__FILE__)."/functions.php");
VmConfig::loadConfig();
$calculator = calculationHelper::getInstance();
$im_juri = JURI::getInstance();
$imliveurl = $im_juri->toString( array("scheme","host", "port")); // url корень сайта без закрывающего слеш
$plg_folder = str_replace("exportyml.php",'',$im_juri->toString(array("path"))); // папка плагина от корня сайта
$lang = VmConfig::get("vmlang", "en_gb");
$tbvm_curr = '#__virtuemart_currencies';
$tbvm_cats = '#__virtuemart_category_categories';
$tbvm_cats_lang = '#__virtuemart_categories_'.$lang;
$tbvm_prod = '#__virtuemart_products';
$tbvm_prod_lang = '#__virtuemart_products_'.$lang;
$tbvm_prod_cats = '#__virtuemart_product_categories';
$tbvm_prices = '#__virtuemart_product_prices';
$tbvm_manuf = '#__virtuemart_product_manufacturers';
$tbvm_manuf_lang = '#__virtuemart_manufacturers_'.$lang;
$tbvm_medias = '#__virtuemart_medias';
$tbvm_prod_medias = '#__virtuemart_product_medias';
$tbvm_customs = '#__virtuemart_customs';
$tbvm_prod_customfields = '#__virtuemart_product_customfields';
$query = $db->getQuery(true);
$query->select('enabled, params')
->from('#__extensions')
->where('element = '.$db->Quote('exportyml'));
$db->setQuery($query);
if (is_null($res = $db->loadAssoc())) {
echo '<p>'.nl2br($db->getErrorMsg()).'</p>';
die;
}
if (!$res['enabled']) die; // плагин отключен? уходим из скрипта
$vendorId = 1; // выбираем данные для продавца с id=1
$vendorModel = VmModel::getModel('Vendor');
$vendor = $vendorModel->getVendor ($vendorId);
$storeName = $vendor->vendor_store_name; // название магазина
$companyName = $vendor->vendor_name; // название компании
$storeURL = $vendor->vendor_url;
$storeURL = $storeURL ? $storeURL : $imliveurlhost; // адрес сайта из VM или по-умолчанию
$currencyCode = $vendor->vendor_currency; // внутренний код валюты
$currenciesArray = $vendor->vendor_accepted_currencies; // массив кодов активных валют
$params = json_decode($res['params'], true);
$my_agency_name = htmlspecialchars($params['developer_name']);
$my_agency_email = $params['developer_email'];
$export_filename = $params['export_filename'] ? $params['export_filename'] : 'ymlexport.xml';
$exclude_categoryes = listInt($params['exclude_categoryes']);
$exclude_items = listInt($params['exclude_items']);
$min_quantity = $params['min_quantity'];
$query = $db->getQuery(true);
$query->select( 'currency_code_3' );
$query->from($tbvm_curr);
$query->where('virtuemart_currency_id ='.$db->quote((int)$currencyCode));
$db->setQuery($query);
if (is_null($currencyName = $db->loadResult())) {
echo '<p>'.nl2br($db->getErrorMsg()).'</p>';
die;
}
if ($params['notes_sw']) {
$sales_notes = trim(htmlspecialchars($params['sales_notes']));
} else {
$sales_notes = false;
}
// заголовок файла
$imp=new DOMImplementation;
// создаём DOMDocumentType с заданными параметрами
$dtd = $imp->createDocumentType('yml_catalog', '', 'shops.dtd');
// создаём сам документ с указанным выше DOCTYPE
$xml = $imp->createDocument("", "", $dtd);
// указываем дополнительные параметры xml
$xml->version = '1.0';
$xml->encoding = 'UTF-8';
// Описание HTML5 DOMDocument
http://php5.kiev.ua/manual/ru/class.domdocument.html
$yml_catalog = $xml->appendChild($xml->createElement('yml_catalog'));
$yml_catalog->setAttribute('date',date('Y-m-d H:i'));
$shop = $yml_catalog->appendChild($xml->createElement('shop'));
$sh_name = $shop->appendChild($xml->createElement('name'));
$sh_name->appendChild($xml->createTextNode(htmlspecialchars($storeName)));
// $sh_name->appendChild($xml->createTextNode(htmlspecialchars(mb_substr($storeName, 0, 20, 'UTF-8'))));
$sh_company = $shop->appendChild($xml->createElement('company'));
$sh_company->appendChild($xml->createTextNode(htmlspecialchars($companyName)));
$sh_url = $shop->appendChild($xml->createElement('url'));
$sh_url->appendChild($xml->createTextNode($storeURL));
if (!empty($my_agency_name)) {
$agency = $shop->appendChild($xml->createElement('agency'));
$agency->appendChild($xml->createTextNode(htmlspecialchars($my_agency_name)));
}
if (!empty($my_agency_email)) {
if (emailValidate($my_agency_email)) {
$email = $shop->appendChild($xml->createElement('email'));
$email->appendChild($xml->createTextNode($my_agency_email));
} else {
echo '<p class="ymlexport_errormsg">'._JSHOP_IMDEXPORTYML_EMAIL_WRONG.'</p>';
}
}
$currencies = $shop->appendChild($xml->createElement('currencies'));
$currency = $currencies->appendChild($xml->createElement('currency'));
$currency->setAttribute('id',$currencyName);
$currency->setAttribute('rate','1');
$query = $db->getQuery(true);
$query->select( 'a.category_child_id, a.category_parent_id, b.category_name');
$query->from($tbvm_cats.' AS a');
$query->rightJoin($tbvm_cats_lang.' AS b ON b.virtuemart_category_id = a.category_child_id');
$query->where('a.category_child_id NOT IN ('.$exclude_categoryes.')');
$query->order('a.category_child_id');
$db->setQuery($query);
if (is_null($rows = $db->loadObjectList())) {
echo '<p>'.nl2br($db->getErrorMsg()).'</p>';
die;
}
$exclude_cat_arr = explode(',', $exclude_categoryes);
$categories = $shop->appendChild($xml->createElement('categories'));
$category_name = array();
foreach ($rows as $row) {
$cat_parent_id = $row->category_parent_id;
$cat_child_id = $row->category_child_id;
$cat_name = htmlspecialchars(trim(strip_tags($row->category_name)));
if ($cat_name) $category_name[$cat_child_id] = $cat_name;
if ($cat_name == '') {
continue;
} elseif (($cat_parent_id > 0) && (in_array($cat_parent_id, $exclude_cat_arr))) {
if (!(in_array($cat_child_id, $exclude_cat_arr))) {
array_push($exclude_cat_arr, $cat_child_id);
$exclude_categoryes .= ','.$cat_child_id;
}
continue;
}
$shop_cat = $categories->appendChild($xml->createElement('category'));
$shop_cat->setAttribute('id',$cat_child_id);
$shop_cat->appendChild($xml->createTextNode($cat_name));
if ($cat_parent_id > 0) {
$shop_cat->setAttribute('parentId',$cat_parent_id);
}
}
// Информация о доставке
switch($params['delivery']) {
case 1: // самовывоз
$deliv = $shop->appendChild($xml->createElement('delivery'));
$deliv->appendChild($xml->createTextNode("false"));
break;
case 2: // доставка включена в стоимость
$deliv = $shop->appendChild($xml->createElement('delivery'));
$deliv->appendChild($xml->createTextNode("true"));
$deliv = $shop->appendChild($xml->createElement('deliveryIncluded'));
$deliv = $shop->appendChild($xml->createElement('local_delivery_cost'));
$deliv->appendChild($xml->createTextNode((float)$params['delivery_cost']));
break;
case 3: // стоимость доставки дополнительно
$deliv = $shop->appendChild($xml->createElement('delivery'));
$deliv->appendChild($xml->createTextNode("true"));
$deliv = $shop->appendChild($xml->createElement('local_delivery_cost'));
$deliv->appendChild($xml->createTextNode((float)$params['delivery_cost']));
break;
}
if ($params['adult']) {
// Товары для удовлетворения сексуальных потребностей - тег <adult>
$adult = $shop->appendChild($xml->createElement('adult'));
$adult->appendChild($xml->createTextNode("true"));
}
$descr_field = '';
if ($params['prod_short_description']) $descr_field = 'b.product_s_desc, ';
if ($params['prod_full_description']) $descr_field .= 'b.product_desc, ';
// выбираем полную информацию по каждому наименованию товара из БД
$query = $db->getQuery(true);
$query = 'SELECT DISTINCT '.
$query .= $descr_field;
$query .= 'a.virtuemart_product_id,
a.product_in_stock,
b.product_name,
d.product_price,
d.product_currency,
e.mf_name,
g.virtuemart_category_id
FROM ('.$tbvm_prod_cats.' AS g
LEFT JOIN ('.$tbvm_prices.' AS d
RIGHT JOIN (
('.$tbvm_manuf.' AS f RIGHT JOIN '.$tbvm_prod.' AS a ON f.virtuemart_product_id = a.virtuemart_product_id)
LEFT JOIN '.$tbvm_manuf_lang.' AS e ON f.virtuemart_manufacturer_id = e.virtuemart_manufacturer_id
LEFT JOIN '.$tbvm_prod_lang.' b ON b.virtuemart_product_id = a.virtuemart_product_id)
ON d.virtuemart_product_id = a.virtuemart_product_id)
ON g.virtuemart_product_id = a.virtuemart_product_id)
WHERE (a.published = '.$db->Quote('1').')
AND (d.product_price > 0)
AND (b.product_name IS NOT NULL)
AND (g.virtuemart_category_id NOT IN ('.$exclude_categoryes.'))
AND (a.virtuemart_product_id NOT IN ('.$exclude_items.'))
GROUP BY a.virtuemart_product_id';
$db->setQuery($query);
$rows = $db->loadObjectList();
if (is_null($rows = $db->loadObjectList())) {
echo '<p>'.nl2br($db->getErrorMsg()).'</p>';
ob_end_clean();
die;
}
$typePrefixOn = ($params['type_prefix'] AND (int)$params['type_prefix']);
$offers = $shop->appendChild($xml->createElement('offers'));
foreach ($rows as $row) {
$product_name = htmlspecialchars(trim(strip_tags($row->product_name)));
$product_cat_id = $row->virtuemart_category_id;
if ((strlen($product_name)== 0) OR ($product_cat_id == 0)) {
continue;
}
$product_id = $row->virtuemart_product_id;
$prices = $calculator->getProductPrices($row);
$type = $row->mf_name ? ' type="vendor.model"' : '';
$url = $imliveurl.DS.JRoute::_('index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id='.$product_id.'&virtuemart_category_id='.$product_cat_id);
$url = str_replace($plg_folder, '', $url);
$offer = $offers->appendChild($xml->createElement('offer'));
$offer->setAttribute('id',$product_id);
if ($params['stock_enabled']) {
// проверяем остаток товара на складе
$inStock = ($row->product_in_stock < $min_quantity) ? 'false' : 'true';
$offer->setAttribute('available',$inStock);
} else {
// товар всегда доступен
$offer->setAttribute('available','true');
}
$seturl = $offer->appendChild($xml->createElement('url'));
$seturl->appendChild($xml->createTextNode($url));
$price = $offer->appendChild($xml->createElement('price'));
$price->appendChild($xml->createTextNode($prices['salesPrice']));
$currencyId = $offer->appendChild($xml->createElement('currencyId'));
$currencyId->appendChild($xml->createTextNode($currencyName));
$categoryId = $offer->appendChild($xml->createElement('categoryId'));
$categoryId->appendChild($xml->createTextNode($product_cat_id));
$query = $db->getQuery(true);
$query->select('a.file_url');
$query->from($tbvm_medias.' AS a');
$query->leftJoin($tbvm_prod_medias.' AS b ON b.virtuemart_media_id = a.virtuemart_media_id');
$query->where('a.published ='.$db->Quote('1'));
$query->where('b.virtuemart_product_id = '.(int)$product_id.' LIMIT 10'); // не больше 10 изображений товара
$db->setQuery($query);
if (!(is_null($imgrows = $db->loadObjectList()))) {
foreach ($imgrows as $imgrow) {
$picture = $offer->appendChild($xml->createElement('picture'));
$picture->appendChild($xml->createTextNode($imliveurl.DS.htmlspecialchars(str_replace(' ', '%20', $imgrow->file_url))));
}
}
$prod_vendor = $row->mf_name;
if ($prod_vendor!="0" and strlen($prod_vendor)>0) {
// если есть производитель, то схема vendor.model
if($typePrefixOn) {
// вычислить поле для тега typePrefix
$query = $db->getQuery(true);
$query->select('b.custom_value AS value');
$query->from($tbvm_prod_customfields.' AS b');
$query->leftJoin($tbvm_customs.' AS a ON a.virtuemart_custom_id = b.virtuemart_custom_id');
$query->where('a.published ='.$db->Quote('1'));
$query->where('a.virtuemart_custom_id ='.$db->Quote((int)$params['type_prefix_id']));
$query->where('b.virtuemart_product_id = '.$db->Quote($product_id));
$db->setQuery($query);
$res_custom = $db->loadObject();
if (!is_null($res_custom)) {
$type_prefix = $offer->appendChild($xml->createElement('typePrefix'));
$type_prefix->appendChild($xml->createTextNode($res_custom->value));
}
}
// сокращаем название производителя до первой запятой
$prod_vendor = strtok($prod_vendor,",");
$offer->setAttribute('type','vendor.model');
$vendor = $offer->appendChild($xml->createElement('vendor'));
$vendor->appendChild($xml->createTextNode(htmlspecialchars($prod_vendor)));
if ($params['clear_vendor']) {
// если в названии товара есть название производителя, то убираем его оттуда вместе с разными видами кавычек
$product_name = clearVendorModel($product_name, $prod_vendor);
}
$model = $offer->appendChild($xml->createElement('model'));
$model->appendChild($xml->createTextNode($product_name));
} else {
// если не тип vendor.model, то добавляем name
$name = $offer->appendChild($xml->createElement('name'));
$prod_name = htmlspecialchars($row->prod_name);
$name->appendChild($xml->createTextNode($product_name));
}
$prod_desc = '';
if ($params['prod_short_description']) $prod_desc = (string)$row->product_s_desc.' ';
if ($params['prod_full_description']) $prod_desc .= (string)$row->product_desc;
if (!empty($prod_desc)) {
$description = $offer->appendChild($xml->createElement('description'));
if ($params['cdata']) {
$prod_desc = "<![CDATA[".$prod_desc."]]>";
} else {
$prod_desc = ltrim(clearProductDescription($prod_desc));
}
$description->appendChild($xml->createTextNode($prod_desc));
}
if ($sales_notes) {
$notes_tag = $offer->appendChild($xml->createElement('sales_notes'));
$notes_tag->appendChild($xml->createTextNode($sales_notes));
}
// параметры (настраиваемые поля) товара
$query = $db->getQuery(true);
$query->select('a.custom_title AS title, b.custom_value AS value, b.virtuemart_custom_id as id');
$query->from($tbvm_prod_customfields.' AS b');
$query->leftJoin($tbvm_customs.' AS a ON a.virtuemart_custom_id = b.virtuemart_custom_id');
$query->where('a.published ='.$db->Quote('1'));
$query->where('a.is_hidden ='.$db->Quote('0'));
// $query->where('a.is_cart_attribute ='.$db->Quote('1'));
$query->where('b.virtuemart_product_id = '.$db->Quote($product_id));
$query->where("a.field_type IN ('I','B','V','P','S')");
$db->setQuery($query);
$custfields = $db->loadObjectList();
if ($params['custfields'] AND !is_null($custfields)) {
foreach ($custfields as $custfield) {
if (!($typePrefixOn AND $custfield->id == (int)$params['type_prefix_id']) AND ($custfield->title) AND (($custfield->value) OR ($custfield->value === '0'))) { // если название и значение не пустые
$cfvalue = $custfield->value;
if ($cfvalue === '1') $cfvalue = 'Да';
if ($cfvalue === '0') $cfvalue = 'Нет';
$param = $offer->appendChild($xml->createElement('param'));
$param->setAttribute('name', $custfield->title);
$param->appendChild($xml->createTextNode($cfvalue));
}
}
}
}
$xml->formatOutput = true;
if ($params['export_method']) {
// сохраняем прайс в файл
header("Content-Type: text/html; charset=UTF-8");
$filename = $export_filename.'.xml';
$fsurl = rtrim($params['export_path2save'], '/').'/';
if ($params['export_path2save']) {
if(substr($params['export_path2save'],0,1) == '/') {
$path2save = $_SERVER["DOCUMENT_ROOT"].$fsurl;
} else {
$fsurl = $plg_folder.$fsurl;
$path2save = $_SERVER["DOCUMENT_ROOT"].$fsurl;
}
if(!file_exists($path2save)) {
echo "<h2>Нет такой папки на сайте!</h2>";
echo "<p><code>".$fsurl."</code></p>";
echo "<p>Исправьте значение параметра: [ <strong>Путь к файлу</strong> ] или создайте эту папку вручную.</p>";
die;
}
} else {
$fsurl = "/tmp/";
$path2save = $app->getCfg('tmp_path').'/';
}
$fssrv = $path2save.$export_filename;
$fsurl = $fsurl.$export_filename;
echo '<p>Данные сохранены в файл <a href="'.$fsurl.'">'.$export_filename.'</a> ('.$xml->save($fssrv).' байт).</p>';
} else {
// динамический файл (php)
header("Content-Type: application/xml; charset=UTF-8");
echo $xml->saveXML();
}