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

a14biz

  • Новичок
  • 3
  • 0 / 0
Export YML, VirtueMart (iMaud)
« : 30.10.2017, 14:20:35 »
добрый день!

сообственно есть данный плагин, все работает четко
но тут появилась необходимость
что бы в YML было не только <price></price> но и <old_price></old_price>

что ковырнуть то в коде


Код
<?php
/*
*  @package      VirtueMart
*  @version      2.0.9 2013-12-23
*  @author       Kaurava Legh, iMaud studio
*  [member=126442]copyright[/member]    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();
}
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

WT VirtueMart Bitrix24, плагин интеграции с CRM Битрикс24

Автор sergeytolkachyov

Ответов: 1
Просмотров: 1756
Последний ответ 17.11.2023, 10:27:16
от sergeytolkachyov
Выгрузка товаров в Яндекс.Маркет для VirtueMart 3.x, VirtueMart 4

Автор icom

Ответов: 791
Просмотров: 131413
Последний ответ 03.07.2023, 10:02:04
от strongest
Ошибка после перехода в корзину VirtueMart

Автор max_max

Ответов: 4
Просмотров: 1374
Последний ответ 07.09.2021, 18:50:25
от max_max
Кнопки операций в VirtueMart не реагируют на клик

Автор max_max

Ответов: 0
Просмотров: 1298
Последний ответ 30.08.2021, 09:43:21
от max_max
Выгрузка товаров с VirtueMart в olx?

Автор Stasweb

Ответов: 1
Просмотров: 1996
Последний ответ 03.03.2019, 16:00:47
от gartes