Новости Joomla

Joomla 6 нуждается в вашей помощи с тестированием.Вышел недавно релиз Joomla 6 alpha1

Joomla 6 нуждается в вашей помощи с тестированием.Вышел недавно релиз Joomla 6 alpha1

👩‍💻 Joomla 6 нуждается в вашей помощи с тестированием.Вышел недавно релиз Joomla 6 alpha1. Это релиз, в который включены уже проверенные изменения, но ещё очень многие исправления и улучшения ждут своей очереди. Joomla следит за качеством и безопасностью своего кода и каждое изменение должно быть успешно протестировано как минимум ещё двумя участниками сообщества. Разработка Joomla ведётся на платформе GitHub.Филипп Уолтон (Philip Walton) - один из разработчиков, кто активно вносит свой вклад в ядро Joomla. Он уже несколько месяцев посвящает свои послеполуденные часы пятницы работе с Joomla и предлагает присоединиться к нему. 📆 Пятница, 30 мая 2025, с 15:00 до 17:00 по UTC (Лондон) - с 18:00 до 20:00 по Москве.В чате Google Meet Филипп готов помочь с тестированием тем, кто будет делать это в первый раз. А так же он подготовил список лёгких Pull Request, которые можно протестировать довольно быстро. Чем больше тестов будет проведено сейчас, тем меньше ошибок вылезет потом. На данный момент 148 (уже 147 на момент написания заметки) PR на GitHub Joomla ждут тестирования.👩‍💻 Open to all. All together.Также вам поможет сделать первые шаги это видео.GitHub JoomlaДа, это вечер пятницы. Но тестирование занимает порой минут 15, а доброе дело сделано. Просто убедитесь, что разработчик чего-то не пропустил и всё работает как ожидается.#joomla #joomla6 #community

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

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
Просмотров: 2895
Последний ответ 17.11.2023, 10:27:16
от sergeytolkachyov
Выгрузка товаров в Яндекс.Маркет для VirtueMart 3.x, VirtueMart 4

Автор icom

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

Автор max_max

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

Автор max_max

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

Автор Stasweb

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