Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Никто не хочет ковырнуть один файлик ?
цитата
30/10/17 в 14:37
 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();
}


Эта страница в полной версии