alexvas0912 Опубліковано: 16 грудня 2018 Share Опубліковано: 16 грудня 2018 10 Скачать / Купить дополнение Yml opencart (мульти) Yml opencart (мульти) дает возможность выгружать неограниченное количество выгрузок. Каждая выгрузка будет формироваться автоматически в момент вызова ссылки, что делает фиды всегда актуальными. Для каждой выгрузки можно указать свои настройки: - вкл/выкл - название магазина - наименование компании - категории, которые необходимо выгружать - валюта - статус если товар в наличии - статус если товара нет наличии Установка для движка версии 2.0 и выше: 1) Установить архив через панель администратора через Установка дополнений. 2) Войти в настройки модуля в Дополнения - Каналы продвижения - Мульти yml , и выставить необходимые настройки. Сохранить. 3) Url для каждого фида будет показан в настройках в поле "Url фида". Установка для движка версии 1.5: 1) Содержимое папки upload скопировать в корень сайта. 2) Зайди в Система - Пользователи - Группы пользователей и внести изменения в вашей группе пользователя. Поставить галочки напротив module/multiyml в блоках "Разрешен просмотр" и "Разрешено внесение изменений". 3) Войти в Дополнения - Каналы продвижения. Установить модуль Мульти yml , и выставить необходимые настройки. Сохранить. 4) Url для каждого фида будет показан в настройках в поле "Url фида". Демо:http://9505831828.myjino.ruhttp://9505831828.myjino.ru/admindemodemo Добавил alexvas0912 Добавлено 15.12.2018 Категория Обмен данными Системные требования Метод активации Без активации Ioncube Loader Нет ocStore 3.02.3.0.2.42.32.22.11.5.5.1.21.5.5.1.11.5.5.11.5.4.1.21.5.4.1.11.5.4.11.5.3.11.5.2.11.5.1.3 OpenCart.Pro, ocShop Opencart.pro 2.3Opencart.pro 2.1OcShop 2.0.3.хOcShop 1.5.6.4.х Обращение к серверу разработчика Нет Надіслати Поділитися на інших сайтах More sharing options... 4 weeks later... KomissarJuve Опубліковано: 10 січня 2019 Share Опубліковано: 10 січня 2019 мало настроек для яндекс маркета судя по демо скромные возможности Надіслати Поділитися на інших сайтах More sharing options... 1 month later... alexvas0912 Опубліковано: 6 березня 2019 Автор Share Опубліковано: 6 березня 2019 В 10.01.2019 в 19:21, KomissarJuve сказал: мало настроек для яндекс маркета судя по демо скромные возможности тут основная возможность, это генерация нескольких выгрузок, доступных по отдельной ссылке. Надіслати Поділитися на інших сайтах More sharing options... 5 weeks later... navsesluchai Опубліковано: 5 квітня 2019 Share Опубліковано: 5 квітня 2019 Здравствуйте. Для экспорта товаров с сайта с последущим импортом на торговые площадки, такие как пульс цен, тиу, итд нужен yml файл. Правильно я понял что ваш модуль подойдет для этого? И будет ли он работать если товаров на сайте 20 000 шт? Надіслати Поділитися на інших сайтах More sharing options... 1 month later... MoMoMoskva Опубліковано: 13 травня 2019 Share Опубліковано: 13 травня 2019 Скажите, пожалуйста, если из нескольких тыс. товаров нужно выгружать единичные, как это делается? Может быть, есть список, в который можно включать сразу по несколько позиций? Например, из 3500 тыс. товаров нужно выгрузить 50 в YML. Нужно вручную делать все 50? Надіслати Поділитися на інших сайтах More sharing options... 9 months later... helen2014 Опубліковано: 12 березня 2020 Share Опубліковано: 12 березня 2020 Здравствуйте! Можете поправить? Пример структуры - YML файле: <offer id="9013" available="true"> <url> http://zamki-dveri.com/punto-200-2v-100h75- cf </url> <price>90.0</price> <currencyId>RUR</currencyId> <categoryId>325</categoryId> <picture> http://zamki-dveri.com/sites/default/files/1338.jpg </picture> <name>PUNTO 200-2В 100х75 CF </name> <vendorCode>00-00001338</vendorCode> <description> Кофематовый</description> </offer> 1.Тег <url> нужен- это ссылка на магазин <url> http://zamki-dveri.com/punto-200-2v-100h75- cf </url> 2.Теги <price> и <picture> не обязательны. Надіслати Поділитися на інших сайтах More sharing options... 2 weeks later... helen2014 Опубліковано: 21 березня 2020 Share Опубліковано: 21 березня 2020 Почему в XML не выводится <vendorCode>00-00001338</vendorCode> <offer> <price>750</price> <currencyId>RUB</currencyId> <categoryId>519</categoryId> <name> Ручка защелка Fuaro (Фуаро) 637/BL РB-Е (золото) кл/фик. </name> <model>38003</model> <description/> </offer> Надіслати Поділитися на інших сайтах More sharing options... 4 months later... Otche94 Опубліковано: 23 липня 2020 Share Опубліковано: 23 липня 2020 как вывести аттрибуты ? есть аналогичный модуль но там импорт все в один файл, яндекс ругается на него, по причине не корректных parent id, там надо чтобы все подкатегории были вложены в главную самую, там менял и убирал парент айди вывод вообще, этой проблемы не было но надо разделять было, взял этот а тут аттрибуты не выводятся ( пойду пытаться делать вывод аттрибутов ) Надіслати Поділитися на інших сайтах More sharing options... Otche94 Опубліковано: 23 липня 2020 Share Опубліковано: 23 липня 2020 кому интересно нашел решение, в файле /public_html/catalog/controller/extension/feed/multiyml.php после закрывающей скобки } и перед строкой $this->setOffer($data); нужно дописать код $attribute_groups = $this->model_catalog_product->getProductAttributes($product['product_id']); if ($attribute_groups) { $data['param'] = array(); foreach ($attribute_groups as $attribute_group) { foreach ($attribute_group['attribute'] as $attribute) { $data['param'][] = array( 'name' => $attribute['name'], 'value' => $attribute['text'] ); } } } вот этот код, между скобкой закрывающей и $this->setOffer($data) Решение проблемы с тем что яндекс ругается на parent_id , строка $this->setCategory($category['name'], $category['category_id'], $category['parent_id']); удаляем парент ид чтобы получилось вот так $this->setCategory($category['name'], $category['category_id']); Кому лень возиться, вот полный код, можете полностью заменить. <?php class ControllerExtensionFeedMultiyml extends Controller { private $shop = array(); private $currencies = array(); private $categories = array(); private $offers = array(); private $from_charset = 'utf-8'; private $eol = "\n"; public function index() { if (isset($this->request->get['feed']) && $this->request->get['feed']) { $feed_num = $this->request->get['feed']; } else { $feed_num = 0; } $multiyml_feeds = $this->config->get('feed_multiyml_feeds'); if (isset($multiyml_feeds[$feed_num]) && $multiyml_feeds[$feed_num]['multiyml_status']) { $multiyml_feed = $multiyml_feeds[$feed_num]; if (!($allowed_categories = implode(",",$multiyml_feed['multiyml_categories']))) exit(); $this->load->model('export/multiyml'); $this->load->model('localisation/currency'); $this->load->model('tool/image'); $this->setShop('name', $multiyml_feed['multiyml_shopname']); $this->setShop('company', $multiyml_feed['multiyml_company']); if ($this->request->server['HTTPS']) { $this->setShop('url', HTTPS_SERVER); } else { $this->setShop('url', HTTP_SERVER); } $this->setShop('phone', $this->config->get('config_telephone')); $this->setShop('platform', 'Opencart'); $this->setShop('version', VERSION); $offers_currency = $multiyml_feed['multiyml_currency']; if (!$this->currency->has($offers_currency)) exit(); $decimal_place = $this->currency->getDecimalPlace($offers_currency); $shop_currency = $this->config->get('config_currency'); $this->setCurrency($offers_currency, 1); $currencies = $this->model_localisation_currency->getCurrencies(); $supported_currencies = array('RUR', 'RUB', 'USD', 'BYR', 'KZT', 'EUR', 'UAH'); $currencies = array_intersect_key($currencies, array_flip($supported_currencies)); foreach ($currencies as $currency) { if ($currency['code'] != $offers_currency && $currency['status'] == 1) { $this->setCurrency($currency['code'], number_format(1/$this->currency->convert($currency['value'], $offers_currency, $shop_currency), 4, '.', '')); } } // Категории $categories = $this->model_export_multiyml->getCategory(); foreach ($categories as $category) { $this->setCategory($category['name'], $category['category_id']); } // Товары $in_stock_id = $multiyml_feed['multiyml_in_stock']; $out_of_stock_id = $multiyml_feed['multiyml_out_of_stock']; $vendor_required = false; $products = $this->model_export_multiyml->getProduct($allowed_categories, $out_of_stock_id, $vendor_required); foreach ($products as $product) { $data = array(); // Атрибуты товара $data['id'] = $product['product_id']; $data['available'] = ($product['quantity'] > 0 || $product['stock_status_id'] == $in_stock_id); // Параметры товара $data['url'] = $this->url->link('product/product', 'path=' . $this->getPath($product['category_id']) . '&product_id=' . $product['product_id']); $data['price'] = number_format($this->currency->convert($this->tax->calculate($product['price'], $product['tax_class_id']), $shop_currency, $offers_currency), $decimal_place, '.', ''); $data['currencyId'] = $offers_currency; $data['categoryId'] = $product['category_id']; $data['delivery'] = 'true'; $data['name'] = $product['name']; $data['vendor'] = $product['manufacturer']; $data['vendorCode'] = $product['model']; $data['model'] = $product['name']; $data['model'] = $product['model']; $data['description'] = $product['description']; if ($product['image']) { $data['picture'] = $this->model_tool_image->resize($product['image'], 100, 100); } $attribute_groups = $this->model_catalog_product->getProductAttributes($product['product_id']); if ($attribute_groups) { $data['param'] = array(); foreach ($attribute_groups as $attribute_group) { foreach ($attribute_group['attribute'] as $attribute) { $data['param'][] = array( 'name' => $attribute['name'], 'value' => $attribute['text'] ); } } } $this->setOffer($data); } $this->categories = array_filter($this->categories, array($this, "filterCategory")); Header('Content-Type: application/xml'); if (isset($this->request->get['export'])) { header('Content-Disposition: attachment; filename="yandex.xml"'); } echo($this->getYml()); } } private function setShop($name, $value) { $allowed = array('name', 'company', 'url', 'phone', 'platform', 'version', 'agency', 'email'); if (in_array($name, $allowed)) { $this->shop[$name] = $this->prepareField($value); } } private function setCurrency($id, $rate = 'CBRF', $plus = 0) { $allow_id = array('RUR', 'RUB', 'USD', 'BYR', 'KZT', 'EUR', 'UAH'); if (!in_array($id, $allow_id)) { return false; } $allow_rate = array('CBRF', 'NBU', 'NBK', 'CB'); if (in_array($rate, $allow_rate)) { $plus = str_replace(',', '.', $plus); if (is_numeric($plus) && $plus > 0) { $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>$rate, 'plus'=>(float)$plus ); } else { $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>$rate ); } } else { $rate = str_replace(',', '.', $rate); if (!(is_numeric($rate) && $rate > 0)) { return false; } $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>(float)$rate ); } return true; } private function setCategory($name, $id, $parent_id = 0) { $id = (int)$id; if ($id < 1 || trim($name) == '') { return false; } if ((int)$parent_id > 0) { $this->categories[$id] = array( 'id'=>$id, 'parentId'=>(int)$parent_id, 'name'=>$this->prepareField($name) ); } else { $this->categories[$id] = array( 'id'=>$id, 'name'=>$this->prepareField($name) ); } return true; } private function setOffer($data) { $offer = array(); $attributes = array('id', 'type', 'available', 'bid', 'cbid', 'param'); $attributes = array_intersect_key($data, array_flip($attributes)); foreach ($attributes as $key => $value) { switch ($key) { case 'id': case 'bid': case 'cbid': $value = (int)$value; if ($value > 0) { $offer[$key] = $value; } break; case 'type': if (in_array($value, array('vendor.model', 'book', 'audiobook', 'artist.title', 'tour', 'ticket', 'event-ticket'))) { $offer['type'] = $value; } break; case 'available': $offer['available'] = ($value ? 'true' : 'false'); break; case 'param': if (is_array($value)) { $offer['param'] = $value; } break; default: break; } } $type = isset($offer['type']) ? $offer['type'] : ''; $allowed_tags = array('url'=>0, 'buyurl'=>0, 'price'=>1, 'wprice'=>0, 'currencyId'=>1, 'xCategory'=>0, 'categoryId'=>1, 'picture'=>0, 'store'=>0, 'pickup'=>0, 'delivery'=>0, 'deliveryIncluded'=>0, 'local_delivery_cost'=>0, 'orderingTime'=>0); switch ($type) { case 'vendor.model': $allowed_tags = array_merge($allowed_tags, array('typePrefix'=>0, 'vendor'=>1, 'vendorCode'=>0, 'model'=>1, 'provider'=>0, 'tarifplan'=>0)); break; case 'book': $allowed_tags = array_merge($allowed_tags, array('author'=>0, 'name'=>1, 'publisher'=>0, 'series'=>0, 'year'=>0, 'ISBN'=>0, 'volume'=>0, 'part'=>0, 'language'=>0, 'binding'=>0, 'page_extent'=>0, 'table_of_contents'=>0)); break; case 'audiobook': $allowed_tags = array_merge($allowed_tags, array('author'=>0, 'name'=>1, 'publisher'=>0, 'series'=>0, 'year'=>0, 'ISBN'=>0, 'volume'=>0, 'part'=>0, 'language'=>0, 'table_of_contents'=>0, 'performed_by'=>0, 'performance_type'=>0, 'storage'=>0, 'format'=>0, 'recording_length'=>0)); break; case 'artist.title': $allowed_tags = array_merge($allowed_tags, array('artist'=>0, 'title'=>1, 'year'=>0, 'media'=>0, 'starring'=>0, 'director'=>0, 'originalName'=>0, 'country'=>0)); break; case 'tour': $allowed_tags = array_merge($allowed_tags, array('worldRegion'=>0, 'country'=>0, 'region'=>0, 'days'=>1, 'dataTour'=>0, 'name'=>1, 'hotel_stars'=>0, 'room'=>0, 'meal'=>0, 'included'=>1, 'transport'=>1, 'price_min'=>0, 'price_max'=>0, 'options'=>0)); break; case 'event-ticket': $allowed_tags = array_merge($allowed_tags, array('name'=>1, 'place'=>1, 'hall'=>0, 'hall_part'=>0, 'date'=>1, 'is_premiere'=>0, 'is_kids'=>0)); break; default: $allowed_tags = array_merge($allowed_tags, array('name'=>1, 'vendor'=>0, 'model'=>1, 'sales_notes'=>1)); break; } $allowed_tags = array_merge($allowed_tags, array('aliases'=>0, 'additional'=>0, 'description'=>0, 'sales_notes'=>0, 'promo'=>0, 'manufacturer_warranty'=>0, 'country_of_origin'=>0, 'downloadable'=>0, 'adult'=>0, 'barcode'=>0)); $required_tags = array_filter($allowed_tags); if (sizeof(array_intersect_key($data, $required_tags)) != sizeof($required_tags)) { return; } $data = array_intersect_key($data, $allowed_tags); $allowed_tags = array_intersect_key($allowed_tags, $data); $offer['data'] = array(); foreach ($allowed_tags as $key => $value) { $offer['data'][$key] = $this->prepareField($data[$key]); } $this->offers[] = $offer; } private function getYml() { $yml = '<?xml version="1.0" encoding="windows-1251"?>' . $this->eol; $yml .= '<!DOCTYPE yml_catalog SYSTEM "shops.dtd">' . $this->eol; $yml .= '<yml_catalog date="' . date('Y-m-d H:i') . '">' . $this->eol; $yml .= '<shop>' . $this->eol; // информация о магазине $yml .= $this->array2Tag($this->shop); // валюты $yml .= '<currencies>' . $this->eol; foreach ($this->currencies as $currency) { $yml .= $this->getElement($currency, 'currency'); } $yml .= '</currencies>' . $this->eol; // категории $yml .= '<categories>' . $this->eol; foreach ($this->categories as $category) { $category_name = $category['name']; unset($category['name'], $category['export']); $yml .= $this->getElement($category, 'category', $category_name); } $yml .= '</categories>' . $this->eol; // товары $yml .= '<offers>' . $this->eol; foreach ($this->offers as $offer) { $tags = $this->array2Tag($offer['data']); unset($offer['data']); if (isset($offer['param'])) { $tags .= $this->array2Param($offer['param']); unset($offer['param']); } $yml .= $this->getElement($offer, 'offer', $tags); } $yml .= '</offers>' . $this->eol; $yml .= '</shop>'; $yml .= '</yml_catalog>'; return $yml; } private function getElement($attributes, $element_name, $element_value = '') { $retval = '<' . $element_name . ' '; foreach ($attributes as $key => $value) { $retval .= $key . '="' . $value . '" '; } $retval .= $element_value ? '>' . $this->eol . $element_value . '</' . $element_name . '>' : '/>'; $retval .= $this->eol; return $retval; } private function array2Tag($tags) { $retval = ''; foreach ($tags as $key => $value) { $retval .= '<' . $key . '>' . $value . '</' . $key . '>' . $this->eol; } return $retval; } private function array2Param($params) { $retval = ''; foreach ($params as $param) { $retval .= '<param name="' . $this->prepareField($param['name']); if (isset($param['unit'])) { $retval .= '" unit="' . $this->prepareField($param['unit']); } $retval .= '">' . $this->prepareField($param['value']) . '</param>' . $this->eol; } return $retval; } private function prepareField($field) { $field = htmlspecialchars_decode($field); $field = strip_tags($field); $from = array('"', '&', '>', '<', '\''); $to = array('"', '&', '>', '<', '''); $field = str_replace($from, $to, $field); if ($this->from_charset != 'windows-1251') { $field = iconv($this->from_charset, 'windows-1251//TRANSLIT//IGNORE', $field); } $field = preg_replace('#[\x00-\x08\x0B-\x0C\x0E-\x1F]+#is', ' ', $field); return trim($field); } protected function getPath($category_id, $current_path = '') { if (isset($this->categories[$category_id])) { $this->categories[$category_id]['export'] = 1; if (!$current_path) { $new_path = $this->categories[$category_id]['id']; } else { $new_path = $this->categories[$category_id]['id'] . '_' . $current_path; } if (isset($this->categories[$category_id]['parentId'])) { return $this->getPath($this->categories[$category_id]['parentId'], $new_path); } else { return $new_path; } } } function filterCategory($category) { return isset($category['export']); } } ?> Надіслати Поділитися на інших сайтах More sharing options... alexvas0912 Опубліковано: 24 липня 2020 Автор Share Опубліковано: 24 липня 2020 В 21.03.2020 в 17:30, helen2014 сказал: Почему в XML не выводится <vendorCode>00-00001338</vendorCode> <offer> <price>750</price> <currencyId>RUB</currencyId> <categoryId>519</categoryId> <name> Ручка защелка Fuaro (Фуаро) 637/BL РB-Е (золото) кл/фик. </name> <model>38003</model> <description/> </offer> в модуле не предусмотрен вывод vendorCode. Есть только vendor и model Надіслати Поділитися на інших сайтах More sharing options... alexvas0912 Опубліковано: 24 липня 2020 Автор Share Опубліковано: 24 липня 2020 14 часов назад, Otche94 сказал: кому интересно нашел решение, в файле /public_html/catalog/controller/extension/feed/multiyml.php после закрывающей скобки } и перед строкой $this->setOffer($data); нужно дописать код $attribute_groups = $this->model_catalog_product->getProductAttributes($product['product_id']); if ($attribute_groups) { $data['param'] = array(); foreach ($attribute_groups as $attribute_group) { foreach ($attribute_group['attribute'] as $attribute) { $data['param'][] = array( 'name' => $attribute['name'], 'value' => $attribute['text'] ); } } } вот этот код, между скобкой закрывающей и $this->setOffer($data) Решение проблемы с тем что яндекс ругается на parent_id , строка $this->setCategory($category['name'], $category['category_id'], $category['parent_id']); удаляем парент ид чтобы получилось вот так $this->setCategory($category['name'], $category['category_id']); Кому лень возиться, вот полный код, можете полностью заменить. <?php class ControllerExtensionFeedMultiyml extends Controller { private $shop = array(); private $currencies = array(); private $categories = array(); private $offers = array(); private $from_charset = 'utf-8'; private $eol = "\n"; public function index() { if (isset($this->request->get['feed']) && $this->request->get['feed']) { $feed_num = $this->request->get['feed']; } else { $feed_num = 0; } $multiyml_feeds = $this->config->get('feed_multiyml_feeds'); if (isset($multiyml_feeds[$feed_num]) && $multiyml_feeds[$feed_num]['multiyml_status']) { $multiyml_feed = $multiyml_feeds[$feed_num]; if (!($allowed_categories = implode(",",$multiyml_feed['multiyml_categories']))) exit(); $this->load->model('export/multiyml'); $this->load->model('localisation/currency'); $this->load->model('tool/image'); $this->setShop('name', $multiyml_feed['multiyml_shopname']); $this->setShop('company', $multiyml_feed['multiyml_company']); if ($this->request->server['HTTPS']) { $this->setShop('url', HTTPS_SERVER); } else { $this->setShop('url', HTTP_SERVER); } $this->setShop('phone', $this->config->get('config_telephone')); $this->setShop('platform', 'Opencart'); $this->setShop('version', VERSION); $offers_currency = $multiyml_feed['multiyml_currency']; if (!$this->currency->has($offers_currency)) exit(); $decimal_place = $this->currency->getDecimalPlace($offers_currency); $shop_currency = $this->config->get('config_currency'); $this->setCurrency($offers_currency, 1); $currencies = $this->model_localisation_currency->getCurrencies(); $supported_currencies = array('RUR', 'RUB', 'USD', 'BYR', 'KZT', 'EUR', 'UAH'); $currencies = array_intersect_key($currencies, array_flip($supported_currencies)); foreach ($currencies as $currency) { if ($currency['code'] != $offers_currency && $currency['status'] == 1) { $this->setCurrency($currency['code'], number_format(1/$this->currency->convert($currency['value'], $offers_currency, $shop_currency), 4, '.', '')); } } // Категории $categories = $this->model_export_multiyml->getCategory(); foreach ($categories as $category) { $this->setCategory($category['name'], $category['category_id']); } // Товары $in_stock_id = $multiyml_feed['multiyml_in_stock']; $out_of_stock_id = $multiyml_feed['multiyml_out_of_stock']; $vendor_required = false; $products = $this->model_export_multiyml->getProduct($allowed_categories, $out_of_stock_id, $vendor_required); foreach ($products as $product) { $data = array(); // Атрибуты товара $data['id'] = $product['product_id']; $data['available'] = ($product['quantity'] > 0 || $product['stock_status_id'] == $in_stock_id); // Параметры товара $data['url'] = $this->url->link('product/product', 'path=' . $this->getPath($product['category_id']) . '&product_id=' . $product['product_id']); $data['price'] = number_format($this->currency->convert($this->tax->calculate($product['price'], $product['tax_class_id']), $shop_currency, $offers_currency), $decimal_place, '.', ''); $data['currencyId'] = $offers_currency; $data['categoryId'] = $product['category_id']; $data['delivery'] = 'true'; $data['name'] = $product['name']; $data['vendor'] = $product['manufacturer']; $data['vendorCode'] = $product['model']; $data['model'] = $product['name']; $data['model'] = $product['model']; $data['description'] = $product['description']; if ($product['image']) { $data['picture'] = $this->model_tool_image->resize($product['image'], 100, 100); } $attribute_groups = $this->model_catalog_product->getProductAttributes($product['product_id']); if ($attribute_groups) { $data['param'] = array(); foreach ($attribute_groups as $attribute_group) { foreach ($attribute_group['attribute'] as $attribute) { $data['param'][] = array( 'name' => $attribute['name'], 'value' => $attribute['text'] ); } } } $this->setOffer($data); } $this->categories = array_filter($this->categories, array($this, "filterCategory")); Header('Content-Type: application/xml'); if (isset($this->request->get['export'])) { header('Content-Disposition: attachment; filename="yandex.xml"'); } echo($this->getYml()); } } private function setShop($name, $value) { $allowed = array('name', 'company', 'url', 'phone', 'platform', 'version', 'agency', 'email'); if (in_array($name, $allowed)) { $this->shop[$name] = $this->prepareField($value); } } private function setCurrency($id, $rate = 'CBRF', $plus = 0) { $allow_id = array('RUR', 'RUB', 'USD', 'BYR', 'KZT', 'EUR', 'UAH'); if (!in_array($id, $allow_id)) { return false; } $allow_rate = array('CBRF', 'NBU', 'NBK', 'CB'); if (in_array($rate, $allow_rate)) { $plus = str_replace(',', '.', $plus); if (is_numeric($plus) && $plus > 0) { $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>$rate, 'plus'=>(float)$plus ); } else { $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>$rate ); } } else { $rate = str_replace(',', '.', $rate); if (!(is_numeric($rate) && $rate > 0)) { return false; } $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>(float)$rate ); } return true; } private function setCategory($name, $id, $parent_id = 0) { $id = (int)$id; if ($id < 1 || trim($name) == '') { return false; } if ((int)$parent_id > 0) { $this->categories[$id] = array( 'id'=>$id, 'parentId'=>(int)$parent_id, 'name'=>$this->prepareField($name) ); } else { $this->categories[$id] = array( 'id'=>$id, 'name'=>$this->prepareField($name) ); } return true; } private function setOffer($data) { $offer = array(); $attributes = array('id', 'type', 'available', 'bid', 'cbid', 'param'); $attributes = array_intersect_key($data, array_flip($attributes)); foreach ($attributes as $key => $value) { switch ($key) { case 'id': case 'bid': case 'cbid': $value = (int)$value; if ($value > 0) { $offer[$key] = $value; } break; case 'type': if (in_array($value, array('vendor.model', 'book', 'audiobook', 'artist.title', 'tour', 'ticket', 'event-ticket'))) { $offer['type'] = $value; } break; case 'available': $offer['available'] = ($value ? 'true' : 'false'); break; case 'param': if (is_array($value)) { $offer['param'] = $value; } break; default: break; } } $type = isset($offer['type']) ? $offer['type'] : ''; $allowed_tags = array('url'=>0, 'buyurl'=>0, 'price'=>1, 'wprice'=>0, 'currencyId'=>1, 'xCategory'=>0, 'categoryId'=>1, 'picture'=>0, 'store'=>0, 'pickup'=>0, 'delivery'=>0, 'deliveryIncluded'=>0, 'local_delivery_cost'=>0, 'orderingTime'=>0); switch ($type) { case 'vendor.model': $allowed_tags = array_merge($allowed_tags, array('typePrefix'=>0, 'vendor'=>1, 'vendorCode'=>0, 'model'=>1, 'provider'=>0, 'tarifplan'=>0)); break; case 'book': $allowed_tags = array_merge($allowed_tags, array('author'=>0, 'name'=>1, 'publisher'=>0, 'series'=>0, 'year'=>0, 'ISBN'=>0, 'volume'=>0, 'part'=>0, 'language'=>0, 'binding'=>0, 'page_extent'=>0, 'table_of_contents'=>0)); break; case 'audiobook': $allowed_tags = array_merge($allowed_tags, array('author'=>0, 'name'=>1, 'publisher'=>0, 'series'=>0, 'year'=>0, 'ISBN'=>0, 'volume'=>0, 'part'=>0, 'language'=>0, 'table_of_contents'=>0, 'performed_by'=>0, 'performance_type'=>0, 'storage'=>0, 'format'=>0, 'recording_length'=>0)); break; case 'artist.title': $allowed_tags = array_merge($allowed_tags, array('artist'=>0, 'title'=>1, 'year'=>0, 'media'=>0, 'starring'=>0, 'director'=>0, 'originalName'=>0, 'country'=>0)); break; case 'tour': $allowed_tags = array_merge($allowed_tags, array('worldRegion'=>0, 'country'=>0, 'region'=>0, 'days'=>1, 'dataTour'=>0, 'name'=>1, 'hotel_stars'=>0, 'room'=>0, 'meal'=>0, 'included'=>1, 'transport'=>1, 'price_min'=>0, 'price_max'=>0, 'options'=>0)); break; case 'event-ticket': $allowed_tags = array_merge($allowed_tags, array('name'=>1, 'place'=>1, 'hall'=>0, 'hall_part'=>0, 'date'=>1, 'is_premiere'=>0, 'is_kids'=>0)); break; default: $allowed_tags = array_merge($allowed_tags, array('name'=>1, 'vendor'=>0, 'model'=>1, 'sales_notes'=>1)); break; } $allowed_tags = array_merge($allowed_tags, array('aliases'=>0, 'additional'=>0, 'description'=>0, 'sales_notes'=>0, 'promo'=>0, 'manufacturer_warranty'=>0, 'country_of_origin'=>0, 'downloadable'=>0, 'adult'=>0, 'barcode'=>0)); $required_tags = array_filter($allowed_tags); if (sizeof(array_intersect_key($data, $required_tags)) != sizeof($required_tags)) { return; } $data = array_intersect_key($data, $allowed_tags); $allowed_tags = array_intersect_key($allowed_tags, $data); $offer['data'] = array(); foreach ($allowed_tags as $key => $value) { $offer['data'][$key] = $this->prepareField($data[$key]); } $this->offers[] = $offer; } private function getYml() { $yml = '<?xml version="1.0" encoding="windows-1251"?>' . $this->eol; $yml .= '<!DOCTYPE yml_catalog SYSTEM "shops.dtd">' . $this->eol; $yml .= '<yml_catalog date="' . date('Y-m-d H:i') . '">' . $this->eol; $yml .= '<shop>' . $this->eol; // информация о магазине $yml .= $this->array2Tag($this->shop); // валюты $yml .= '<currencies>' . $this->eol; foreach ($this->currencies as $currency) { $yml .= $this->getElement($currency, 'currency'); } $yml .= '</currencies>' . $this->eol; // категории $yml .= '<categories>' . $this->eol; foreach ($this->categories as $category) { $category_name = $category['name']; unset($category['name'], $category['export']); $yml .= $this->getElement($category, 'category', $category_name); } $yml .= '</categories>' . $this->eol; // товары $yml .= '<offers>' . $this->eol; foreach ($this->offers as $offer) { $tags = $this->array2Tag($offer['data']); unset($offer['data']); if (isset($offer['param'])) { $tags .= $this->array2Param($offer['param']); unset($offer['param']); } $yml .= $this->getElement($offer, 'offer', $tags); } $yml .= '</offers>' . $this->eol; $yml .= '</shop>'; $yml .= '</yml_catalog>'; return $yml; } private function getElement($attributes, $element_name, $element_value = '') { $retval = '<' . $element_name . ' '; foreach ($attributes as $key => $value) { $retval .= $key . '="' . $value . '" '; } $retval .= $element_value ? '>' . $this->eol . $element_value . '</' . $element_name . '>' : '/>'; $retval .= $this->eol; return $retval; } private function array2Tag($tags) { $retval = ''; foreach ($tags as $key => $value) { $retval .= '<' . $key . '>' . $value . '</' . $key . '>' . $this->eol; } return $retval; } private function array2Param($params) { $retval = ''; foreach ($params as $param) { $retval .= '<param name="' . $this->prepareField($param['name']); if (isset($param['unit'])) { $retval .= '" unit="' . $this->prepareField($param['unit']); } $retval .= '">' . $this->prepareField($param['value']) . '</param>' . $this->eol; } return $retval; } private function prepareField($field) { $field = htmlspecialchars_decode($field); $field = strip_tags($field); $from = array('"', '&', '>', '<', '\''); $to = array('"', '&', '>', '<', '''); $field = str_replace($from, $to, $field); if ($this->from_charset != 'windows-1251') { $field = iconv($this->from_charset, 'windows-1251//TRANSLIT//IGNORE', $field); } $field = preg_replace('#[\x00-\x08\x0B-\x0C\x0E-\x1F]+#is', ' ', $field); return trim($field); } protected function getPath($category_id, $current_path = '') { if (isset($this->categories[$category_id])) { $this->categories[$category_id]['export'] = 1; if (!$current_path) { $new_path = $this->categories[$category_id]['id']; } else { $new_path = $this->categories[$category_id]['id'] . '_' . $current_path; } if (isset($this->categories[$category_id]['parentId'])) { return $this->getPath($this->categories[$category_id]['parentId'], $new_path); } else { return $new_path; } } } function filterCategory($category) { return isset($category['export']); } } ?> В модуле не предусмотрен вывод атрибутов или опций Надіслати Поділитися на інших сайтах More sharing options... Otche94 Опубліковано: 24 липня 2020 Share Опубліковано: 24 липня 2020 44 минуты назад, alexvas0912 сказал: В модуле не предусмотрен вывод атрибутов или опций да да да , мы с тобой в лс уже пообщались, ты сказал что тебя не интересует мнение клиентов. и поменять две строки в коде тебе лень, все понятно с тобой. Надіслати Поділитися на інших сайтах More sharing options... alexvas0912 Опубліковано: 24 липня 2020 Автор Share Опубліковано: 24 липня 2020 9 минут назад, Otche94 сказал: да да да , мы с тобой в лс уже пообщались, ты сказал что тебя не интересует мнение клиентов. и поменять две строки в коде тебе лень, все понятно с тобой. Поддержку по модулю оказываю исключительно в рамках заявленного функционала. Ваше пожелание обязательно будет учтено при созданий обновлений модуля. Надіслати Поділитися на інших сайтах More sharing options... Otche94 Опубліковано: 24 липня 2020 Share Опубліковано: 24 липня 2020 Только что, alexvas0912 сказал: Поддержку по модулю оказываю исключительно в рамках заявленного функционала. Ваше пожелание обязательно будет учтено при созданий обновлений модуля. его создавать 2 секунды, копировать вставить и все Надіслати Поділитися на інших сайтах More sharing options... 1 year later... Zlobny Опубліковано: 3 листопада 2021 Share Опубліковано: 3 листопада 2021 А будет ли реализован вывод дополнительных изображений товара ? Надіслати Поділитися на інших сайтах More sharing options... alexvas0912 Опубліковано: 3 листопада 2021 Автор Share Опубліковано: 3 листопада 2021 3 часа назад, Zlobny сказал: А будет ли реализован вывод дополнительных изображений товара ? Да, в будущем планировал это реализовать. Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 1 Перейти до списку тем Схожі публікації Модуль Экспорт YML / XML и обмен данными по API PRO в Яндекс.Маркет для Opencart 2.x, 3.x [Поддержка] Автор: invays, 10 листопада 2018 яндекс маркет обновление по api (і ще %d) Теги: яндекс маркет обновление по api api yandex market апи яндекс маркет экспорт yml экспорт xml товары mail.ru 6 відповідей 3 112 перегляди Susia 12 листопада 2020 Universal Marketplace Manager Автор: invays, 30 травня 2018 yandex api yandex (і ще %d) Теги: yandex api yandex mail.ru torg.mail.ru яндекс маркет апи яндекс маркет экспорт yml экспорт yml яндекс маркет авито avito xml google mercant google merchant center feed nadavi ecatalog автоматическая обработка прайс листов экспорт yml opencart яндекс маркет opencart 2 яндекс маркет opencart 3 avito авито opencart 0 коментарів 20 162 перегляди invays 30 травня 2018 Модуль Universal Marketplace Manager [Поддержка] 1 2 3 4 7 Автор: invays, 30 травня 2018 yandex api yandex (і ще %d) Теги: yandex api yandex mail.ru torg.mail.ru яндекс маркет апи яндекс маркет экспорт yml экспорт yml яндекс маркет авито avito xml google mercant google merchant center feed nadavi ecatalog автоматическая обработка прайс листов экспорт yml opencart яндекс маркет opencart 2 яндекс маркет opencart 3 avito авито opencart 155 відповідей 23 399 переглядів Boombaster 31 січня 2023 Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Модулі та розширення Модули обмена данными Модуль Yml opencart (мульти) [Поддержка] Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains 1.0 Синхронізація Замовлень Rozetka.ua та Opencart Автор: sinco Product Manipulator Автор: Hiperlynx007 Видалення дублікатів товарів для OpenCart Автор: Hatshypsut Вибір категорій і виробників для "Знайшли дешевше" шаблону Upstore Автор: Flint2000 × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
KomissarJuve Опубліковано: 10 січня 2019 Share Опубліковано: 10 січня 2019 мало настроек для яндекс маркета судя по демо скромные возможности Надіслати Поділитися на інших сайтах More sharing options...
alexvas0912 Опубліковано: 6 березня 2019 Автор Share Опубліковано: 6 березня 2019 В 10.01.2019 в 19:21, KomissarJuve сказал: мало настроек для яндекс маркета судя по демо скромные возможности тут основная возможность, это генерация нескольких выгрузок, доступных по отдельной ссылке. Надіслати Поділитися на інших сайтах More sharing options... 5 weeks later... navsesluchai Опубліковано: 5 квітня 2019 Share Опубліковано: 5 квітня 2019 Здравствуйте. Для экспорта товаров с сайта с последущим импортом на торговые площадки, такие как пульс цен, тиу, итд нужен yml файл. Правильно я понял что ваш модуль подойдет для этого? И будет ли он работать если товаров на сайте 20 000 шт? Надіслати Поділитися на інших сайтах More sharing options... 1 month later... MoMoMoskva Опубліковано: 13 травня 2019 Share Опубліковано: 13 травня 2019 Скажите, пожалуйста, если из нескольких тыс. товаров нужно выгружать единичные, как это делается? Может быть, есть список, в который можно включать сразу по несколько позиций? Например, из 3500 тыс. товаров нужно выгрузить 50 в YML. Нужно вручную делать все 50? Надіслати Поділитися на інших сайтах More sharing options... 9 months later... helen2014 Опубліковано: 12 березня 2020 Share Опубліковано: 12 березня 2020 Здравствуйте! Можете поправить? Пример структуры - YML файле: <offer id="9013" available="true"> <url> http://zamki-dveri.com/punto-200-2v-100h75- cf </url> <price>90.0</price> <currencyId>RUR</currencyId> <categoryId>325</categoryId> <picture> http://zamki-dveri.com/sites/default/files/1338.jpg </picture> <name>PUNTO 200-2В 100х75 CF </name> <vendorCode>00-00001338</vendorCode> <description> Кофематовый</description> </offer> 1.Тег <url> нужен- это ссылка на магазин <url> http://zamki-dveri.com/punto-200-2v-100h75- cf </url> 2.Теги <price> и <picture> не обязательны. Надіслати Поділитися на інших сайтах More sharing options... 2 weeks later... helen2014 Опубліковано: 21 березня 2020 Share Опубліковано: 21 березня 2020 Почему в XML не выводится <vendorCode>00-00001338</vendorCode> <offer> <price>750</price> <currencyId>RUB</currencyId> <categoryId>519</categoryId> <name> Ручка защелка Fuaro (Фуаро) 637/BL РB-Е (золото) кл/фик. </name> <model>38003</model> <description/> </offer> Надіслати Поділитися на інших сайтах More sharing options... 4 months later... Otche94 Опубліковано: 23 липня 2020 Share Опубліковано: 23 липня 2020 как вывести аттрибуты ? есть аналогичный модуль но там импорт все в один файл, яндекс ругается на него, по причине не корректных parent id, там надо чтобы все подкатегории были вложены в главную самую, там менял и убирал парент айди вывод вообще, этой проблемы не было но надо разделять было, взял этот а тут аттрибуты не выводятся ( пойду пытаться делать вывод аттрибутов ) Надіслати Поділитися на інших сайтах More sharing options... Otche94 Опубліковано: 23 липня 2020 Share Опубліковано: 23 липня 2020 кому интересно нашел решение, в файле /public_html/catalog/controller/extension/feed/multiyml.php после закрывающей скобки } и перед строкой $this->setOffer($data); нужно дописать код $attribute_groups = $this->model_catalog_product->getProductAttributes($product['product_id']); if ($attribute_groups) { $data['param'] = array(); foreach ($attribute_groups as $attribute_group) { foreach ($attribute_group['attribute'] as $attribute) { $data['param'][] = array( 'name' => $attribute['name'], 'value' => $attribute['text'] ); } } } вот этот код, между скобкой закрывающей и $this->setOffer($data) Решение проблемы с тем что яндекс ругается на parent_id , строка $this->setCategory($category['name'], $category['category_id'], $category['parent_id']); удаляем парент ид чтобы получилось вот так $this->setCategory($category['name'], $category['category_id']); Кому лень возиться, вот полный код, можете полностью заменить. <?php class ControllerExtensionFeedMultiyml extends Controller { private $shop = array(); private $currencies = array(); private $categories = array(); private $offers = array(); private $from_charset = 'utf-8'; private $eol = "\n"; public function index() { if (isset($this->request->get['feed']) && $this->request->get['feed']) { $feed_num = $this->request->get['feed']; } else { $feed_num = 0; } $multiyml_feeds = $this->config->get('feed_multiyml_feeds'); if (isset($multiyml_feeds[$feed_num]) && $multiyml_feeds[$feed_num]['multiyml_status']) { $multiyml_feed = $multiyml_feeds[$feed_num]; if (!($allowed_categories = implode(",",$multiyml_feed['multiyml_categories']))) exit(); $this->load->model('export/multiyml'); $this->load->model('localisation/currency'); $this->load->model('tool/image'); $this->setShop('name', $multiyml_feed['multiyml_shopname']); $this->setShop('company', $multiyml_feed['multiyml_company']); if ($this->request->server['HTTPS']) { $this->setShop('url', HTTPS_SERVER); } else { $this->setShop('url', HTTP_SERVER); } $this->setShop('phone', $this->config->get('config_telephone')); $this->setShop('platform', 'Opencart'); $this->setShop('version', VERSION); $offers_currency = $multiyml_feed['multiyml_currency']; if (!$this->currency->has($offers_currency)) exit(); $decimal_place = $this->currency->getDecimalPlace($offers_currency); $shop_currency = $this->config->get('config_currency'); $this->setCurrency($offers_currency, 1); $currencies = $this->model_localisation_currency->getCurrencies(); $supported_currencies = array('RUR', 'RUB', 'USD', 'BYR', 'KZT', 'EUR', 'UAH'); $currencies = array_intersect_key($currencies, array_flip($supported_currencies)); foreach ($currencies as $currency) { if ($currency['code'] != $offers_currency && $currency['status'] == 1) { $this->setCurrency($currency['code'], number_format(1/$this->currency->convert($currency['value'], $offers_currency, $shop_currency), 4, '.', '')); } } // Категории $categories = $this->model_export_multiyml->getCategory(); foreach ($categories as $category) { $this->setCategory($category['name'], $category['category_id']); } // Товары $in_stock_id = $multiyml_feed['multiyml_in_stock']; $out_of_stock_id = $multiyml_feed['multiyml_out_of_stock']; $vendor_required = false; $products = $this->model_export_multiyml->getProduct($allowed_categories, $out_of_stock_id, $vendor_required); foreach ($products as $product) { $data = array(); // Атрибуты товара $data['id'] = $product['product_id']; $data['available'] = ($product['quantity'] > 0 || $product['stock_status_id'] == $in_stock_id); // Параметры товара $data['url'] = $this->url->link('product/product', 'path=' . $this->getPath($product['category_id']) . '&product_id=' . $product['product_id']); $data['price'] = number_format($this->currency->convert($this->tax->calculate($product['price'], $product['tax_class_id']), $shop_currency, $offers_currency), $decimal_place, '.', ''); $data['currencyId'] = $offers_currency; $data['categoryId'] = $product['category_id']; $data['delivery'] = 'true'; $data['name'] = $product['name']; $data['vendor'] = $product['manufacturer']; $data['vendorCode'] = $product['model']; $data['model'] = $product['name']; $data['model'] = $product['model']; $data['description'] = $product['description']; if ($product['image']) { $data['picture'] = $this->model_tool_image->resize($product['image'], 100, 100); } $attribute_groups = $this->model_catalog_product->getProductAttributes($product['product_id']); if ($attribute_groups) { $data['param'] = array(); foreach ($attribute_groups as $attribute_group) { foreach ($attribute_group['attribute'] as $attribute) { $data['param'][] = array( 'name' => $attribute['name'], 'value' => $attribute['text'] ); } } } $this->setOffer($data); } $this->categories = array_filter($this->categories, array($this, "filterCategory")); Header('Content-Type: application/xml'); if (isset($this->request->get['export'])) { header('Content-Disposition: attachment; filename="yandex.xml"'); } echo($this->getYml()); } } private function setShop($name, $value) { $allowed = array('name', 'company', 'url', 'phone', 'platform', 'version', 'agency', 'email'); if (in_array($name, $allowed)) { $this->shop[$name] = $this->prepareField($value); } } private function setCurrency($id, $rate = 'CBRF', $plus = 0) { $allow_id = array('RUR', 'RUB', 'USD', 'BYR', 'KZT', 'EUR', 'UAH'); if (!in_array($id, $allow_id)) { return false; } $allow_rate = array('CBRF', 'NBU', 'NBK', 'CB'); if (in_array($rate, $allow_rate)) { $plus = str_replace(',', '.', $plus); if (is_numeric($plus) && $plus > 0) { $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>$rate, 'plus'=>(float)$plus ); } else { $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>$rate ); } } else { $rate = str_replace(',', '.', $rate); if (!(is_numeric($rate) && $rate > 0)) { return false; } $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>(float)$rate ); } return true; } private function setCategory($name, $id, $parent_id = 0) { $id = (int)$id; if ($id < 1 || trim($name) == '') { return false; } if ((int)$parent_id > 0) { $this->categories[$id] = array( 'id'=>$id, 'parentId'=>(int)$parent_id, 'name'=>$this->prepareField($name) ); } else { $this->categories[$id] = array( 'id'=>$id, 'name'=>$this->prepareField($name) ); } return true; } private function setOffer($data) { $offer = array(); $attributes = array('id', 'type', 'available', 'bid', 'cbid', 'param'); $attributes = array_intersect_key($data, array_flip($attributes)); foreach ($attributes as $key => $value) { switch ($key) { case 'id': case 'bid': case 'cbid': $value = (int)$value; if ($value > 0) { $offer[$key] = $value; } break; case 'type': if (in_array($value, array('vendor.model', 'book', 'audiobook', 'artist.title', 'tour', 'ticket', 'event-ticket'))) { $offer['type'] = $value; } break; case 'available': $offer['available'] = ($value ? 'true' : 'false'); break; case 'param': if (is_array($value)) { $offer['param'] = $value; } break; default: break; } } $type = isset($offer['type']) ? $offer['type'] : ''; $allowed_tags = array('url'=>0, 'buyurl'=>0, 'price'=>1, 'wprice'=>0, 'currencyId'=>1, 'xCategory'=>0, 'categoryId'=>1, 'picture'=>0, 'store'=>0, 'pickup'=>0, 'delivery'=>0, 'deliveryIncluded'=>0, 'local_delivery_cost'=>0, 'orderingTime'=>0); switch ($type) { case 'vendor.model': $allowed_tags = array_merge($allowed_tags, array('typePrefix'=>0, 'vendor'=>1, 'vendorCode'=>0, 'model'=>1, 'provider'=>0, 'tarifplan'=>0)); break; case 'book': $allowed_tags = array_merge($allowed_tags, array('author'=>0, 'name'=>1, 'publisher'=>0, 'series'=>0, 'year'=>0, 'ISBN'=>0, 'volume'=>0, 'part'=>0, 'language'=>0, 'binding'=>0, 'page_extent'=>0, 'table_of_contents'=>0)); break; case 'audiobook': $allowed_tags = array_merge($allowed_tags, array('author'=>0, 'name'=>1, 'publisher'=>0, 'series'=>0, 'year'=>0, 'ISBN'=>0, 'volume'=>0, 'part'=>0, 'language'=>0, 'table_of_contents'=>0, 'performed_by'=>0, 'performance_type'=>0, 'storage'=>0, 'format'=>0, 'recording_length'=>0)); break; case 'artist.title': $allowed_tags = array_merge($allowed_tags, array('artist'=>0, 'title'=>1, 'year'=>0, 'media'=>0, 'starring'=>0, 'director'=>0, 'originalName'=>0, 'country'=>0)); break; case 'tour': $allowed_tags = array_merge($allowed_tags, array('worldRegion'=>0, 'country'=>0, 'region'=>0, 'days'=>1, 'dataTour'=>0, 'name'=>1, 'hotel_stars'=>0, 'room'=>0, 'meal'=>0, 'included'=>1, 'transport'=>1, 'price_min'=>0, 'price_max'=>0, 'options'=>0)); break; case 'event-ticket': $allowed_tags = array_merge($allowed_tags, array('name'=>1, 'place'=>1, 'hall'=>0, 'hall_part'=>0, 'date'=>1, 'is_premiere'=>0, 'is_kids'=>0)); break; default: $allowed_tags = array_merge($allowed_tags, array('name'=>1, 'vendor'=>0, 'model'=>1, 'sales_notes'=>1)); break; } $allowed_tags = array_merge($allowed_tags, array('aliases'=>0, 'additional'=>0, 'description'=>0, 'sales_notes'=>0, 'promo'=>0, 'manufacturer_warranty'=>0, 'country_of_origin'=>0, 'downloadable'=>0, 'adult'=>0, 'barcode'=>0)); $required_tags = array_filter($allowed_tags); if (sizeof(array_intersect_key($data, $required_tags)) != sizeof($required_tags)) { return; } $data = array_intersect_key($data, $allowed_tags); $allowed_tags = array_intersect_key($allowed_tags, $data); $offer['data'] = array(); foreach ($allowed_tags as $key => $value) { $offer['data'][$key] = $this->prepareField($data[$key]); } $this->offers[] = $offer; } private function getYml() { $yml = '<?xml version="1.0" encoding="windows-1251"?>' . $this->eol; $yml .= '<!DOCTYPE yml_catalog SYSTEM "shops.dtd">' . $this->eol; $yml .= '<yml_catalog date="' . date('Y-m-d H:i') . '">' . $this->eol; $yml .= '<shop>' . $this->eol; // информация о магазине $yml .= $this->array2Tag($this->shop); // валюты $yml .= '<currencies>' . $this->eol; foreach ($this->currencies as $currency) { $yml .= $this->getElement($currency, 'currency'); } $yml .= '</currencies>' . $this->eol; // категории $yml .= '<categories>' . $this->eol; foreach ($this->categories as $category) { $category_name = $category['name']; unset($category['name'], $category['export']); $yml .= $this->getElement($category, 'category', $category_name); } $yml .= '</categories>' . $this->eol; // товары $yml .= '<offers>' . $this->eol; foreach ($this->offers as $offer) { $tags = $this->array2Tag($offer['data']); unset($offer['data']); if (isset($offer['param'])) { $tags .= $this->array2Param($offer['param']); unset($offer['param']); } $yml .= $this->getElement($offer, 'offer', $tags); } $yml .= '</offers>' . $this->eol; $yml .= '</shop>'; $yml .= '</yml_catalog>'; return $yml; } private function getElement($attributes, $element_name, $element_value = '') { $retval = '<' . $element_name . ' '; foreach ($attributes as $key => $value) { $retval .= $key . '="' . $value . '" '; } $retval .= $element_value ? '>' . $this->eol . $element_value . '</' . $element_name . '>' : '/>'; $retval .= $this->eol; return $retval; } private function array2Tag($tags) { $retval = ''; foreach ($tags as $key => $value) { $retval .= '<' . $key . '>' . $value . '</' . $key . '>' . $this->eol; } return $retval; } private function array2Param($params) { $retval = ''; foreach ($params as $param) { $retval .= '<param name="' . $this->prepareField($param['name']); if (isset($param['unit'])) { $retval .= '" unit="' . $this->prepareField($param['unit']); } $retval .= '">' . $this->prepareField($param['value']) . '</param>' . $this->eol; } return $retval; } private function prepareField($field) { $field = htmlspecialchars_decode($field); $field = strip_tags($field); $from = array('"', '&', '>', '<', '\''); $to = array('"', '&', '>', '<', '''); $field = str_replace($from, $to, $field); if ($this->from_charset != 'windows-1251') { $field = iconv($this->from_charset, 'windows-1251//TRANSLIT//IGNORE', $field); } $field = preg_replace('#[\x00-\x08\x0B-\x0C\x0E-\x1F]+#is', ' ', $field); return trim($field); } protected function getPath($category_id, $current_path = '') { if (isset($this->categories[$category_id])) { $this->categories[$category_id]['export'] = 1; if (!$current_path) { $new_path = $this->categories[$category_id]['id']; } else { $new_path = $this->categories[$category_id]['id'] . '_' . $current_path; } if (isset($this->categories[$category_id]['parentId'])) { return $this->getPath($this->categories[$category_id]['parentId'], $new_path); } else { return $new_path; } } } function filterCategory($category) { return isset($category['export']); } } ?> Надіслати Поділитися на інших сайтах More sharing options... alexvas0912 Опубліковано: 24 липня 2020 Автор Share Опубліковано: 24 липня 2020 В 21.03.2020 в 17:30, helen2014 сказал: Почему в XML не выводится <vendorCode>00-00001338</vendorCode> <offer> <price>750</price> <currencyId>RUB</currencyId> <categoryId>519</categoryId> <name> Ручка защелка Fuaro (Фуаро) 637/BL РB-Е (золото) кл/фик. </name> <model>38003</model> <description/> </offer> в модуле не предусмотрен вывод vendorCode. Есть только vendor и model Надіслати Поділитися на інших сайтах More sharing options... alexvas0912 Опубліковано: 24 липня 2020 Автор Share Опубліковано: 24 липня 2020 14 часов назад, Otche94 сказал: кому интересно нашел решение, в файле /public_html/catalog/controller/extension/feed/multiyml.php после закрывающей скобки } и перед строкой $this->setOffer($data); нужно дописать код $attribute_groups = $this->model_catalog_product->getProductAttributes($product['product_id']); if ($attribute_groups) { $data['param'] = array(); foreach ($attribute_groups as $attribute_group) { foreach ($attribute_group['attribute'] as $attribute) { $data['param'][] = array( 'name' => $attribute['name'], 'value' => $attribute['text'] ); } } } вот этот код, между скобкой закрывающей и $this->setOffer($data) Решение проблемы с тем что яндекс ругается на parent_id , строка $this->setCategory($category['name'], $category['category_id'], $category['parent_id']); удаляем парент ид чтобы получилось вот так $this->setCategory($category['name'], $category['category_id']); Кому лень возиться, вот полный код, можете полностью заменить. <?php class ControllerExtensionFeedMultiyml extends Controller { private $shop = array(); private $currencies = array(); private $categories = array(); private $offers = array(); private $from_charset = 'utf-8'; private $eol = "\n"; public function index() { if (isset($this->request->get['feed']) && $this->request->get['feed']) { $feed_num = $this->request->get['feed']; } else { $feed_num = 0; } $multiyml_feeds = $this->config->get('feed_multiyml_feeds'); if (isset($multiyml_feeds[$feed_num]) && $multiyml_feeds[$feed_num]['multiyml_status']) { $multiyml_feed = $multiyml_feeds[$feed_num]; if (!($allowed_categories = implode(",",$multiyml_feed['multiyml_categories']))) exit(); $this->load->model('export/multiyml'); $this->load->model('localisation/currency'); $this->load->model('tool/image'); $this->setShop('name', $multiyml_feed['multiyml_shopname']); $this->setShop('company', $multiyml_feed['multiyml_company']); if ($this->request->server['HTTPS']) { $this->setShop('url', HTTPS_SERVER); } else { $this->setShop('url', HTTP_SERVER); } $this->setShop('phone', $this->config->get('config_telephone')); $this->setShop('platform', 'Opencart'); $this->setShop('version', VERSION); $offers_currency = $multiyml_feed['multiyml_currency']; if (!$this->currency->has($offers_currency)) exit(); $decimal_place = $this->currency->getDecimalPlace($offers_currency); $shop_currency = $this->config->get('config_currency'); $this->setCurrency($offers_currency, 1); $currencies = $this->model_localisation_currency->getCurrencies(); $supported_currencies = array('RUR', 'RUB', 'USD', 'BYR', 'KZT', 'EUR', 'UAH'); $currencies = array_intersect_key($currencies, array_flip($supported_currencies)); foreach ($currencies as $currency) { if ($currency['code'] != $offers_currency && $currency['status'] == 1) { $this->setCurrency($currency['code'], number_format(1/$this->currency->convert($currency['value'], $offers_currency, $shop_currency), 4, '.', '')); } } // Категории $categories = $this->model_export_multiyml->getCategory(); foreach ($categories as $category) { $this->setCategory($category['name'], $category['category_id']); } // Товары $in_stock_id = $multiyml_feed['multiyml_in_stock']; $out_of_stock_id = $multiyml_feed['multiyml_out_of_stock']; $vendor_required = false; $products = $this->model_export_multiyml->getProduct($allowed_categories, $out_of_stock_id, $vendor_required); foreach ($products as $product) { $data = array(); // Атрибуты товара $data['id'] = $product['product_id']; $data['available'] = ($product['quantity'] > 0 || $product['stock_status_id'] == $in_stock_id); // Параметры товара $data['url'] = $this->url->link('product/product', 'path=' . $this->getPath($product['category_id']) . '&product_id=' . $product['product_id']); $data['price'] = number_format($this->currency->convert($this->tax->calculate($product['price'], $product['tax_class_id']), $shop_currency, $offers_currency), $decimal_place, '.', ''); $data['currencyId'] = $offers_currency; $data['categoryId'] = $product['category_id']; $data['delivery'] = 'true'; $data['name'] = $product['name']; $data['vendor'] = $product['manufacturer']; $data['vendorCode'] = $product['model']; $data['model'] = $product['name']; $data['model'] = $product['model']; $data['description'] = $product['description']; if ($product['image']) { $data['picture'] = $this->model_tool_image->resize($product['image'], 100, 100); } $attribute_groups = $this->model_catalog_product->getProductAttributes($product['product_id']); if ($attribute_groups) { $data['param'] = array(); foreach ($attribute_groups as $attribute_group) { foreach ($attribute_group['attribute'] as $attribute) { $data['param'][] = array( 'name' => $attribute['name'], 'value' => $attribute['text'] ); } } } $this->setOffer($data); } $this->categories = array_filter($this->categories, array($this, "filterCategory")); Header('Content-Type: application/xml'); if (isset($this->request->get['export'])) { header('Content-Disposition: attachment; filename="yandex.xml"'); } echo($this->getYml()); } } private function setShop($name, $value) { $allowed = array('name', 'company', 'url', 'phone', 'platform', 'version', 'agency', 'email'); if (in_array($name, $allowed)) { $this->shop[$name] = $this->prepareField($value); } } private function setCurrency($id, $rate = 'CBRF', $plus = 0) { $allow_id = array('RUR', 'RUB', 'USD', 'BYR', 'KZT', 'EUR', 'UAH'); if (!in_array($id, $allow_id)) { return false; } $allow_rate = array('CBRF', 'NBU', 'NBK', 'CB'); if (in_array($rate, $allow_rate)) { $plus = str_replace(',', '.', $plus); if (is_numeric($plus) && $plus > 0) { $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>$rate, 'plus'=>(float)$plus ); } else { $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>$rate ); } } else { $rate = str_replace(',', '.', $rate); if (!(is_numeric($rate) && $rate > 0)) { return false; } $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>(float)$rate ); } return true; } private function setCategory($name, $id, $parent_id = 0) { $id = (int)$id; if ($id < 1 || trim($name) == '') { return false; } if ((int)$parent_id > 0) { $this->categories[$id] = array( 'id'=>$id, 'parentId'=>(int)$parent_id, 'name'=>$this->prepareField($name) ); } else { $this->categories[$id] = array( 'id'=>$id, 'name'=>$this->prepareField($name) ); } return true; } private function setOffer($data) { $offer = array(); $attributes = array('id', 'type', 'available', 'bid', 'cbid', 'param'); $attributes = array_intersect_key($data, array_flip($attributes)); foreach ($attributes as $key => $value) { switch ($key) { case 'id': case 'bid': case 'cbid': $value = (int)$value; if ($value > 0) { $offer[$key] = $value; } break; case 'type': if (in_array($value, array('vendor.model', 'book', 'audiobook', 'artist.title', 'tour', 'ticket', 'event-ticket'))) { $offer['type'] = $value; } break; case 'available': $offer['available'] = ($value ? 'true' : 'false'); break; case 'param': if (is_array($value)) { $offer['param'] = $value; } break; default: break; } } $type = isset($offer['type']) ? $offer['type'] : ''; $allowed_tags = array('url'=>0, 'buyurl'=>0, 'price'=>1, 'wprice'=>0, 'currencyId'=>1, 'xCategory'=>0, 'categoryId'=>1, 'picture'=>0, 'store'=>0, 'pickup'=>0, 'delivery'=>0, 'deliveryIncluded'=>0, 'local_delivery_cost'=>0, 'orderingTime'=>0); switch ($type) { case 'vendor.model': $allowed_tags = array_merge($allowed_tags, array('typePrefix'=>0, 'vendor'=>1, 'vendorCode'=>0, 'model'=>1, 'provider'=>0, 'tarifplan'=>0)); break; case 'book': $allowed_tags = array_merge($allowed_tags, array('author'=>0, 'name'=>1, 'publisher'=>0, 'series'=>0, 'year'=>0, 'ISBN'=>0, 'volume'=>0, 'part'=>0, 'language'=>0, 'binding'=>0, 'page_extent'=>0, 'table_of_contents'=>0)); break; case 'audiobook': $allowed_tags = array_merge($allowed_tags, array('author'=>0, 'name'=>1, 'publisher'=>0, 'series'=>0, 'year'=>0, 'ISBN'=>0, 'volume'=>0, 'part'=>0, 'language'=>0, 'table_of_contents'=>0, 'performed_by'=>0, 'performance_type'=>0, 'storage'=>0, 'format'=>0, 'recording_length'=>0)); break; case 'artist.title': $allowed_tags = array_merge($allowed_tags, array('artist'=>0, 'title'=>1, 'year'=>0, 'media'=>0, 'starring'=>0, 'director'=>0, 'originalName'=>0, 'country'=>0)); break; case 'tour': $allowed_tags = array_merge($allowed_tags, array('worldRegion'=>0, 'country'=>0, 'region'=>0, 'days'=>1, 'dataTour'=>0, 'name'=>1, 'hotel_stars'=>0, 'room'=>0, 'meal'=>0, 'included'=>1, 'transport'=>1, 'price_min'=>0, 'price_max'=>0, 'options'=>0)); break; case 'event-ticket': $allowed_tags = array_merge($allowed_tags, array('name'=>1, 'place'=>1, 'hall'=>0, 'hall_part'=>0, 'date'=>1, 'is_premiere'=>0, 'is_kids'=>0)); break; default: $allowed_tags = array_merge($allowed_tags, array('name'=>1, 'vendor'=>0, 'model'=>1, 'sales_notes'=>1)); break; } $allowed_tags = array_merge($allowed_tags, array('aliases'=>0, 'additional'=>0, 'description'=>0, 'sales_notes'=>0, 'promo'=>0, 'manufacturer_warranty'=>0, 'country_of_origin'=>0, 'downloadable'=>0, 'adult'=>0, 'barcode'=>0)); $required_tags = array_filter($allowed_tags); if (sizeof(array_intersect_key($data, $required_tags)) != sizeof($required_tags)) { return; } $data = array_intersect_key($data, $allowed_tags); $allowed_tags = array_intersect_key($allowed_tags, $data); $offer['data'] = array(); foreach ($allowed_tags as $key => $value) { $offer['data'][$key] = $this->prepareField($data[$key]); } $this->offers[] = $offer; } private function getYml() { $yml = '<?xml version="1.0" encoding="windows-1251"?>' . $this->eol; $yml .= '<!DOCTYPE yml_catalog SYSTEM "shops.dtd">' . $this->eol; $yml .= '<yml_catalog date="' . date('Y-m-d H:i') . '">' . $this->eol; $yml .= '<shop>' . $this->eol; // информация о магазине $yml .= $this->array2Tag($this->shop); // валюты $yml .= '<currencies>' . $this->eol; foreach ($this->currencies as $currency) { $yml .= $this->getElement($currency, 'currency'); } $yml .= '</currencies>' . $this->eol; // категории $yml .= '<categories>' . $this->eol; foreach ($this->categories as $category) { $category_name = $category['name']; unset($category['name'], $category['export']); $yml .= $this->getElement($category, 'category', $category_name); } $yml .= '</categories>' . $this->eol; // товары $yml .= '<offers>' . $this->eol; foreach ($this->offers as $offer) { $tags = $this->array2Tag($offer['data']); unset($offer['data']); if (isset($offer['param'])) { $tags .= $this->array2Param($offer['param']); unset($offer['param']); } $yml .= $this->getElement($offer, 'offer', $tags); } $yml .= '</offers>' . $this->eol; $yml .= '</shop>'; $yml .= '</yml_catalog>'; return $yml; } private function getElement($attributes, $element_name, $element_value = '') { $retval = '<' . $element_name . ' '; foreach ($attributes as $key => $value) { $retval .= $key . '="' . $value . '" '; } $retval .= $element_value ? '>' . $this->eol . $element_value . '</' . $element_name . '>' : '/>'; $retval .= $this->eol; return $retval; } private function array2Tag($tags) { $retval = ''; foreach ($tags as $key => $value) { $retval .= '<' . $key . '>' . $value . '</' . $key . '>' . $this->eol; } return $retval; } private function array2Param($params) { $retval = ''; foreach ($params as $param) { $retval .= '<param name="' . $this->prepareField($param['name']); if (isset($param['unit'])) { $retval .= '" unit="' . $this->prepareField($param['unit']); } $retval .= '">' . $this->prepareField($param['value']) . '</param>' . $this->eol; } return $retval; } private function prepareField($field) { $field = htmlspecialchars_decode($field); $field = strip_tags($field); $from = array('"', '&', '>', '<', '\''); $to = array('"', '&', '>', '<', '''); $field = str_replace($from, $to, $field); if ($this->from_charset != 'windows-1251') { $field = iconv($this->from_charset, 'windows-1251//TRANSLIT//IGNORE', $field); } $field = preg_replace('#[\x00-\x08\x0B-\x0C\x0E-\x1F]+#is', ' ', $field); return trim($field); } protected function getPath($category_id, $current_path = '') { if (isset($this->categories[$category_id])) { $this->categories[$category_id]['export'] = 1; if (!$current_path) { $new_path = $this->categories[$category_id]['id']; } else { $new_path = $this->categories[$category_id]['id'] . '_' . $current_path; } if (isset($this->categories[$category_id]['parentId'])) { return $this->getPath($this->categories[$category_id]['parentId'], $new_path); } else { return $new_path; } } } function filterCategory($category) { return isset($category['export']); } } ?> В модуле не предусмотрен вывод атрибутов или опций Надіслати Поділитися на інших сайтах More sharing options... Otche94 Опубліковано: 24 липня 2020 Share Опубліковано: 24 липня 2020 44 минуты назад, alexvas0912 сказал: В модуле не предусмотрен вывод атрибутов или опций да да да , мы с тобой в лс уже пообщались, ты сказал что тебя не интересует мнение клиентов. и поменять две строки в коде тебе лень, все понятно с тобой. Надіслати Поділитися на інших сайтах More sharing options... alexvas0912 Опубліковано: 24 липня 2020 Автор Share Опубліковано: 24 липня 2020 9 минут назад, Otche94 сказал: да да да , мы с тобой в лс уже пообщались, ты сказал что тебя не интересует мнение клиентов. и поменять две строки в коде тебе лень, все понятно с тобой. Поддержку по модулю оказываю исключительно в рамках заявленного функционала. Ваше пожелание обязательно будет учтено при созданий обновлений модуля. Надіслати Поділитися на інших сайтах More sharing options... Otche94 Опубліковано: 24 липня 2020 Share Опубліковано: 24 липня 2020 Только что, alexvas0912 сказал: Поддержку по модулю оказываю исключительно в рамках заявленного функционала. Ваше пожелание обязательно будет учтено при созданий обновлений модуля. его создавать 2 секунды, копировать вставить и все Надіслати Поділитися на інших сайтах More sharing options... 1 year later... Zlobny Опубліковано: 3 листопада 2021 Share Опубліковано: 3 листопада 2021 А будет ли реализован вывод дополнительных изображений товара ? Надіслати Поділитися на інших сайтах More sharing options... alexvas0912 Опубліковано: 3 листопада 2021 Автор Share Опубліковано: 3 листопада 2021 3 часа назад, Zlobny сказал: А будет ли реализован вывод дополнительных изображений товара ? Да, в будущем планировал это реализовать. Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 1 Перейти до списку тем Схожі публікації Модуль Экспорт YML / XML и обмен данными по API PRO в Яндекс.Маркет для Opencart 2.x, 3.x [Поддержка] Автор: invays, 10 листопада 2018 яндекс маркет обновление по api (і ще %d) Теги: яндекс маркет обновление по api api yandex market апи яндекс маркет экспорт yml экспорт xml товары mail.ru 6 відповідей 3 112 перегляди Susia 12 листопада 2020 Universal Marketplace Manager Автор: invays, 30 травня 2018 yandex api yandex (і ще %d) Теги: yandex api yandex mail.ru torg.mail.ru яндекс маркет апи яндекс маркет экспорт yml экспорт yml яндекс маркет авито avito xml google mercant google merchant center feed nadavi ecatalog автоматическая обработка прайс листов экспорт yml opencart яндекс маркет opencart 2 яндекс маркет opencart 3 avito авито opencart 0 коментарів 20 162 перегляди invays 30 травня 2018 Модуль Universal Marketplace Manager [Поддержка] 1 2 3 4 7 Автор: invays, 30 травня 2018 yandex api yandex (і ще %d) Теги: yandex api yandex mail.ru torg.mail.ru яндекс маркет апи яндекс маркет экспорт yml экспорт yml яндекс маркет авито avito xml google mercant google merchant center feed nadavi ecatalog автоматическая обработка прайс листов экспорт yml opencart яндекс маркет opencart 2 яндекс маркет opencart 3 avito авито opencart 155 відповідей 23 399 переглядів Boombaster 31 січня 2023 Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Модулі та розширення Модули обмена данными Модуль Yml opencart (мульти) [Поддержка] Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains 1.0 Синхронізація Замовлень Rozetka.ua та Opencart Автор: sinco Product Manipulator Автор: Hiperlynx007 Видалення дублікатів товарів для OpenCart Автор: Hatshypsut Вибір категорій і виробників для "Знайшли дешевше" шаблону Upstore Автор: Flint2000 × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
navsesluchai Опубліковано: 5 квітня 2019 Share Опубліковано: 5 квітня 2019 Здравствуйте. Для экспорта товаров с сайта с последущим импортом на торговые площадки, такие как пульс цен, тиу, итд нужен yml файл. Правильно я понял что ваш модуль подойдет для этого? И будет ли он работать если товаров на сайте 20 000 шт? Надіслати Поділитися на інших сайтах More sharing options...
MoMoMoskva Опубліковано: 13 травня 2019 Share Опубліковано: 13 травня 2019 Скажите, пожалуйста, если из нескольких тыс. товаров нужно выгружать единичные, как это делается? Может быть, есть список, в который можно включать сразу по несколько позиций? Например, из 3500 тыс. товаров нужно выгрузить 50 в YML. Нужно вручную делать все 50? Надіслати Поділитися на інших сайтах More sharing options...
helen2014 Опубліковано: 12 березня 2020 Share Опубліковано: 12 березня 2020 Здравствуйте! Можете поправить? Пример структуры - YML файле: <offer id="9013" available="true"> <url> http://zamki-dveri.com/punto-200-2v-100h75- cf </url> <price>90.0</price> <currencyId>RUR</currencyId> <categoryId>325</categoryId> <picture> http://zamki-dveri.com/sites/default/files/1338.jpg </picture> <name>PUNTO 200-2В 100х75 CF </name> <vendorCode>00-00001338</vendorCode> <description> Кофематовый</description> </offer> 1.Тег <url> нужен- это ссылка на магазин <url> http://zamki-dveri.com/punto-200-2v-100h75- cf </url> 2.Теги <price> и <picture> не обязательны. Надіслати Поділитися на інших сайтах More sharing options...
helen2014 Опубліковано: 21 березня 2020 Share Опубліковано: 21 березня 2020 Почему в XML не выводится <vendorCode>00-00001338</vendorCode> <offer> <price>750</price> <currencyId>RUB</currencyId> <categoryId>519</categoryId> <name> Ручка защелка Fuaro (Фуаро) 637/BL РB-Е (золото) кл/фик. </name> <model>38003</model> <description/> </offer> Надіслати Поділитися на інших сайтах More sharing options...
Otche94 Опубліковано: 23 липня 2020 Share Опубліковано: 23 липня 2020 как вывести аттрибуты ? есть аналогичный модуль но там импорт все в один файл, яндекс ругается на него, по причине не корректных parent id, там надо чтобы все подкатегории были вложены в главную самую, там менял и убирал парент айди вывод вообще, этой проблемы не было но надо разделять было, взял этот а тут аттрибуты не выводятся ( пойду пытаться делать вывод аттрибутов ) Надіслати Поділитися на інших сайтах More sharing options... Otche94 Опубліковано: 23 липня 2020 Share Опубліковано: 23 липня 2020 кому интересно нашел решение, в файле /public_html/catalog/controller/extension/feed/multiyml.php после закрывающей скобки } и перед строкой $this->setOffer($data); нужно дописать код $attribute_groups = $this->model_catalog_product->getProductAttributes($product['product_id']); if ($attribute_groups) { $data['param'] = array(); foreach ($attribute_groups as $attribute_group) { foreach ($attribute_group['attribute'] as $attribute) { $data['param'][] = array( 'name' => $attribute['name'], 'value' => $attribute['text'] ); } } } вот этот код, между скобкой закрывающей и $this->setOffer($data) Решение проблемы с тем что яндекс ругается на parent_id , строка $this->setCategory($category['name'], $category['category_id'], $category['parent_id']); удаляем парент ид чтобы получилось вот так $this->setCategory($category['name'], $category['category_id']); Кому лень возиться, вот полный код, можете полностью заменить. <?php class ControllerExtensionFeedMultiyml extends Controller { private $shop = array(); private $currencies = array(); private $categories = array(); private $offers = array(); private $from_charset = 'utf-8'; private $eol = "\n"; public function index() { if (isset($this->request->get['feed']) && $this->request->get['feed']) { $feed_num = $this->request->get['feed']; } else { $feed_num = 0; } $multiyml_feeds = $this->config->get('feed_multiyml_feeds'); if (isset($multiyml_feeds[$feed_num]) && $multiyml_feeds[$feed_num]['multiyml_status']) { $multiyml_feed = $multiyml_feeds[$feed_num]; if (!($allowed_categories = implode(",",$multiyml_feed['multiyml_categories']))) exit(); $this->load->model('export/multiyml'); $this->load->model('localisation/currency'); $this->load->model('tool/image'); $this->setShop('name', $multiyml_feed['multiyml_shopname']); $this->setShop('company', $multiyml_feed['multiyml_company']); if ($this->request->server['HTTPS']) { $this->setShop('url', HTTPS_SERVER); } else { $this->setShop('url', HTTP_SERVER); } $this->setShop('phone', $this->config->get('config_telephone')); $this->setShop('platform', 'Opencart'); $this->setShop('version', VERSION); $offers_currency = $multiyml_feed['multiyml_currency']; if (!$this->currency->has($offers_currency)) exit(); $decimal_place = $this->currency->getDecimalPlace($offers_currency); $shop_currency = $this->config->get('config_currency'); $this->setCurrency($offers_currency, 1); $currencies = $this->model_localisation_currency->getCurrencies(); $supported_currencies = array('RUR', 'RUB', 'USD', 'BYR', 'KZT', 'EUR', 'UAH'); $currencies = array_intersect_key($currencies, array_flip($supported_currencies)); foreach ($currencies as $currency) { if ($currency['code'] != $offers_currency && $currency['status'] == 1) { $this->setCurrency($currency['code'], number_format(1/$this->currency->convert($currency['value'], $offers_currency, $shop_currency), 4, '.', '')); } } // Категории $categories = $this->model_export_multiyml->getCategory(); foreach ($categories as $category) { $this->setCategory($category['name'], $category['category_id']); } // Товары $in_stock_id = $multiyml_feed['multiyml_in_stock']; $out_of_stock_id = $multiyml_feed['multiyml_out_of_stock']; $vendor_required = false; $products = $this->model_export_multiyml->getProduct($allowed_categories, $out_of_stock_id, $vendor_required); foreach ($products as $product) { $data = array(); // Атрибуты товара $data['id'] = $product['product_id']; $data['available'] = ($product['quantity'] > 0 || $product['stock_status_id'] == $in_stock_id); // Параметры товара $data['url'] = $this->url->link('product/product', 'path=' . $this->getPath($product['category_id']) . '&product_id=' . $product['product_id']); $data['price'] = number_format($this->currency->convert($this->tax->calculate($product['price'], $product['tax_class_id']), $shop_currency, $offers_currency), $decimal_place, '.', ''); $data['currencyId'] = $offers_currency; $data['categoryId'] = $product['category_id']; $data['delivery'] = 'true'; $data['name'] = $product['name']; $data['vendor'] = $product['manufacturer']; $data['vendorCode'] = $product['model']; $data['model'] = $product['name']; $data['model'] = $product['model']; $data['description'] = $product['description']; if ($product['image']) { $data['picture'] = $this->model_tool_image->resize($product['image'], 100, 100); } $attribute_groups = $this->model_catalog_product->getProductAttributes($product['product_id']); if ($attribute_groups) { $data['param'] = array(); foreach ($attribute_groups as $attribute_group) { foreach ($attribute_group['attribute'] as $attribute) { $data['param'][] = array( 'name' => $attribute['name'], 'value' => $attribute['text'] ); } } } $this->setOffer($data); } $this->categories = array_filter($this->categories, array($this, "filterCategory")); Header('Content-Type: application/xml'); if (isset($this->request->get['export'])) { header('Content-Disposition: attachment; filename="yandex.xml"'); } echo($this->getYml()); } } private function setShop($name, $value) { $allowed = array('name', 'company', 'url', 'phone', 'platform', 'version', 'agency', 'email'); if (in_array($name, $allowed)) { $this->shop[$name] = $this->prepareField($value); } } private function setCurrency($id, $rate = 'CBRF', $plus = 0) { $allow_id = array('RUR', 'RUB', 'USD', 'BYR', 'KZT', 'EUR', 'UAH'); if (!in_array($id, $allow_id)) { return false; } $allow_rate = array('CBRF', 'NBU', 'NBK', 'CB'); if (in_array($rate, $allow_rate)) { $plus = str_replace(',', '.', $plus); if (is_numeric($plus) && $plus > 0) { $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>$rate, 'plus'=>(float)$plus ); } else { $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>$rate ); } } else { $rate = str_replace(',', '.', $rate); if (!(is_numeric($rate) && $rate > 0)) { return false; } $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>(float)$rate ); } return true; } private function setCategory($name, $id, $parent_id = 0) { $id = (int)$id; if ($id < 1 || trim($name) == '') { return false; } if ((int)$parent_id > 0) { $this->categories[$id] = array( 'id'=>$id, 'parentId'=>(int)$parent_id, 'name'=>$this->prepareField($name) ); } else { $this->categories[$id] = array( 'id'=>$id, 'name'=>$this->prepareField($name) ); } return true; } private function setOffer($data) { $offer = array(); $attributes = array('id', 'type', 'available', 'bid', 'cbid', 'param'); $attributes = array_intersect_key($data, array_flip($attributes)); foreach ($attributes as $key => $value) { switch ($key) { case 'id': case 'bid': case 'cbid': $value = (int)$value; if ($value > 0) { $offer[$key] = $value; } break; case 'type': if (in_array($value, array('vendor.model', 'book', 'audiobook', 'artist.title', 'tour', 'ticket', 'event-ticket'))) { $offer['type'] = $value; } break; case 'available': $offer['available'] = ($value ? 'true' : 'false'); break; case 'param': if (is_array($value)) { $offer['param'] = $value; } break; default: break; } } $type = isset($offer['type']) ? $offer['type'] : ''; $allowed_tags = array('url'=>0, 'buyurl'=>0, 'price'=>1, 'wprice'=>0, 'currencyId'=>1, 'xCategory'=>0, 'categoryId'=>1, 'picture'=>0, 'store'=>0, 'pickup'=>0, 'delivery'=>0, 'deliveryIncluded'=>0, 'local_delivery_cost'=>0, 'orderingTime'=>0); switch ($type) { case 'vendor.model': $allowed_tags = array_merge($allowed_tags, array('typePrefix'=>0, 'vendor'=>1, 'vendorCode'=>0, 'model'=>1, 'provider'=>0, 'tarifplan'=>0)); break; case 'book': $allowed_tags = array_merge($allowed_tags, array('author'=>0, 'name'=>1, 'publisher'=>0, 'series'=>0, 'year'=>0, 'ISBN'=>0, 'volume'=>0, 'part'=>0, 'language'=>0, 'binding'=>0, 'page_extent'=>0, 'table_of_contents'=>0)); break; case 'audiobook': $allowed_tags = array_merge($allowed_tags, array('author'=>0, 'name'=>1, 'publisher'=>0, 'series'=>0, 'year'=>0, 'ISBN'=>0, 'volume'=>0, 'part'=>0, 'language'=>0, 'table_of_contents'=>0, 'performed_by'=>0, 'performance_type'=>0, 'storage'=>0, 'format'=>0, 'recording_length'=>0)); break; case 'artist.title': $allowed_tags = array_merge($allowed_tags, array('artist'=>0, 'title'=>1, 'year'=>0, 'media'=>0, 'starring'=>0, 'director'=>0, 'originalName'=>0, 'country'=>0)); break; case 'tour': $allowed_tags = array_merge($allowed_tags, array('worldRegion'=>0, 'country'=>0, 'region'=>0, 'days'=>1, 'dataTour'=>0, 'name'=>1, 'hotel_stars'=>0, 'room'=>0, 'meal'=>0, 'included'=>1, 'transport'=>1, 'price_min'=>0, 'price_max'=>0, 'options'=>0)); break; case 'event-ticket': $allowed_tags = array_merge($allowed_tags, array('name'=>1, 'place'=>1, 'hall'=>0, 'hall_part'=>0, 'date'=>1, 'is_premiere'=>0, 'is_kids'=>0)); break; default: $allowed_tags = array_merge($allowed_tags, array('name'=>1, 'vendor'=>0, 'model'=>1, 'sales_notes'=>1)); break; } $allowed_tags = array_merge($allowed_tags, array('aliases'=>0, 'additional'=>0, 'description'=>0, 'sales_notes'=>0, 'promo'=>0, 'manufacturer_warranty'=>0, 'country_of_origin'=>0, 'downloadable'=>0, 'adult'=>0, 'barcode'=>0)); $required_tags = array_filter($allowed_tags); if (sizeof(array_intersect_key($data, $required_tags)) != sizeof($required_tags)) { return; } $data = array_intersect_key($data, $allowed_tags); $allowed_tags = array_intersect_key($allowed_tags, $data); $offer['data'] = array(); foreach ($allowed_tags as $key => $value) { $offer['data'][$key] = $this->prepareField($data[$key]); } $this->offers[] = $offer; } private function getYml() { $yml = '<?xml version="1.0" encoding="windows-1251"?>' . $this->eol; $yml .= '<!DOCTYPE yml_catalog SYSTEM "shops.dtd">' . $this->eol; $yml .= '<yml_catalog date="' . date('Y-m-d H:i') . '">' . $this->eol; $yml .= '<shop>' . $this->eol; // информация о магазине $yml .= $this->array2Tag($this->shop); // валюты $yml .= '<currencies>' . $this->eol; foreach ($this->currencies as $currency) { $yml .= $this->getElement($currency, 'currency'); } $yml .= '</currencies>' . $this->eol; // категории $yml .= '<categories>' . $this->eol; foreach ($this->categories as $category) { $category_name = $category['name']; unset($category['name'], $category['export']); $yml .= $this->getElement($category, 'category', $category_name); } $yml .= '</categories>' . $this->eol; // товары $yml .= '<offers>' . $this->eol; foreach ($this->offers as $offer) { $tags = $this->array2Tag($offer['data']); unset($offer['data']); if (isset($offer['param'])) { $tags .= $this->array2Param($offer['param']); unset($offer['param']); } $yml .= $this->getElement($offer, 'offer', $tags); } $yml .= '</offers>' . $this->eol; $yml .= '</shop>'; $yml .= '</yml_catalog>'; return $yml; } private function getElement($attributes, $element_name, $element_value = '') { $retval = '<' . $element_name . ' '; foreach ($attributes as $key => $value) { $retval .= $key . '="' . $value . '" '; } $retval .= $element_value ? '>' . $this->eol . $element_value . '</' . $element_name . '>' : '/>'; $retval .= $this->eol; return $retval; } private function array2Tag($tags) { $retval = ''; foreach ($tags as $key => $value) { $retval .= '<' . $key . '>' . $value . '</' . $key . '>' . $this->eol; } return $retval; } private function array2Param($params) { $retval = ''; foreach ($params as $param) { $retval .= '<param name="' . $this->prepareField($param['name']); if (isset($param['unit'])) { $retval .= '" unit="' . $this->prepareField($param['unit']); } $retval .= '">' . $this->prepareField($param['value']) . '</param>' . $this->eol; } return $retval; } private function prepareField($field) { $field = htmlspecialchars_decode($field); $field = strip_tags($field); $from = array('"', '&', '>', '<', '\''); $to = array('"', '&', '>', '<', '''); $field = str_replace($from, $to, $field); if ($this->from_charset != 'windows-1251') { $field = iconv($this->from_charset, 'windows-1251//TRANSLIT//IGNORE', $field); } $field = preg_replace('#[\x00-\x08\x0B-\x0C\x0E-\x1F]+#is', ' ', $field); return trim($field); } protected function getPath($category_id, $current_path = '') { if (isset($this->categories[$category_id])) { $this->categories[$category_id]['export'] = 1; if (!$current_path) { $new_path = $this->categories[$category_id]['id']; } else { $new_path = $this->categories[$category_id]['id'] . '_' . $current_path; } if (isset($this->categories[$category_id]['parentId'])) { return $this->getPath($this->categories[$category_id]['parentId'], $new_path); } else { return $new_path; } } } function filterCategory($category) { return isset($category['export']); } } ?> Надіслати Поділитися на інших сайтах More sharing options... alexvas0912 Опубліковано: 24 липня 2020 Автор Share Опубліковано: 24 липня 2020 В 21.03.2020 в 17:30, helen2014 сказал: Почему в XML не выводится <vendorCode>00-00001338</vendorCode> <offer> <price>750</price> <currencyId>RUB</currencyId> <categoryId>519</categoryId> <name> Ручка защелка Fuaro (Фуаро) 637/BL РB-Е (золото) кл/фик. </name> <model>38003</model> <description/> </offer> в модуле не предусмотрен вывод vendorCode. Есть только vendor и model Надіслати Поділитися на інших сайтах More sharing options... alexvas0912 Опубліковано: 24 липня 2020 Автор Share Опубліковано: 24 липня 2020 14 часов назад, Otche94 сказал: кому интересно нашел решение, в файле /public_html/catalog/controller/extension/feed/multiyml.php после закрывающей скобки } и перед строкой $this->setOffer($data); нужно дописать код $attribute_groups = $this->model_catalog_product->getProductAttributes($product['product_id']); if ($attribute_groups) { $data['param'] = array(); foreach ($attribute_groups as $attribute_group) { foreach ($attribute_group['attribute'] as $attribute) { $data['param'][] = array( 'name' => $attribute['name'], 'value' => $attribute['text'] ); } } } вот этот код, между скобкой закрывающей и $this->setOffer($data) Решение проблемы с тем что яндекс ругается на parent_id , строка $this->setCategory($category['name'], $category['category_id'], $category['parent_id']); удаляем парент ид чтобы получилось вот так $this->setCategory($category['name'], $category['category_id']); Кому лень возиться, вот полный код, можете полностью заменить. <?php class ControllerExtensionFeedMultiyml extends Controller { private $shop = array(); private $currencies = array(); private $categories = array(); private $offers = array(); private $from_charset = 'utf-8'; private $eol = "\n"; public function index() { if (isset($this->request->get['feed']) && $this->request->get['feed']) { $feed_num = $this->request->get['feed']; } else { $feed_num = 0; } $multiyml_feeds = $this->config->get('feed_multiyml_feeds'); if (isset($multiyml_feeds[$feed_num]) && $multiyml_feeds[$feed_num]['multiyml_status']) { $multiyml_feed = $multiyml_feeds[$feed_num]; if (!($allowed_categories = implode(",",$multiyml_feed['multiyml_categories']))) exit(); $this->load->model('export/multiyml'); $this->load->model('localisation/currency'); $this->load->model('tool/image'); $this->setShop('name', $multiyml_feed['multiyml_shopname']); $this->setShop('company', $multiyml_feed['multiyml_company']); if ($this->request->server['HTTPS']) { $this->setShop('url', HTTPS_SERVER); } else { $this->setShop('url', HTTP_SERVER); } $this->setShop('phone', $this->config->get('config_telephone')); $this->setShop('platform', 'Opencart'); $this->setShop('version', VERSION); $offers_currency = $multiyml_feed['multiyml_currency']; if (!$this->currency->has($offers_currency)) exit(); $decimal_place = $this->currency->getDecimalPlace($offers_currency); $shop_currency = $this->config->get('config_currency'); $this->setCurrency($offers_currency, 1); $currencies = $this->model_localisation_currency->getCurrencies(); $supported_currencies = array('RUR', 'RUB', 'USD', 'BYR', 'KZT', 'EUR', 'UAH'); $currencies = array_intersect_key($currencies, array_flip($supported_currencies)); foreach ($currencies as $currency) { if ($currency['code'] != $offers_currency && $currency['status'] == 1) { $this->setCurrency($currency['code'], number_format(1/$this->currency->convert($currency['value'], $offers_currency, $shop_currency), 4, '.', '')); } } // Категории $categories = $this->model_export_multiyml->getCategory(); foreach ($categories as $category) { $this->setCategory($category['name'], $category['category_id']); } // Товары $in_stock_id = $multiyml_feed['multiyml_in_stock']; $out_of_stock_id = $multiyml_feed['multiyml_out_of_stock']; $vendor_required = false; $products = $this->model_export_multiyml->getProduct($allowed_categories, $out_of_stock_id, $vendor_required); foreach ($products as $product) { $data = array(); // Атрибуты товара $data['id'] = $product['product_id']; $data['available'] = ($product['quantity'] > 0 || $product['stock_status_id'] == $in_stock_id); // Параметры товара $data['url'] = $this->url->link('product/product', 'path=' . $this->getPath($product['category_id']) . '&product_id=' . $product['product_id']); $data['price'] = number_format($this->currency->convert($this->tax->calculate($product['price'], $product['tax_class_id']), $shop_currency, $offers_currency), $decimal_place, '.', ''); $data['currencyId'] = $offers_currency; $data['categoryId'] = $product['category_id']; $data['delivery'] = 'true'; $data['name'] = $product['name']; $data['vendor'] = $product['manufacturer']; $data['vendorCode'] = $product['model']; $data['model'] = $product['name']; $data['model'] = $product['model']; $data['description'] = $product['description']; if ($product['image']) { $data['picture'] = $this->model_tool_image->resize($product['image'], 100, 100); } $attribute_groups = $this->model_catalog_product->getProductAttributes($product['product_id']); if ($attribute_groups) { $data['param'] = array(); foreach ($attribute_groups as $attribute_group) { foreach ($attribute_group['attribute'] as $attribute) { $data['param'][] = array( 'name' => $attribute['name'], 'value' => $attribute['text'] ); } } } $this->setOffer($data); } $this->categories = array_filter($this->categories, array($this, "filterCategory")); Header('Content-Type: application/xml'); if (isset($this->request->get['export'])) { header('Content-Disposition: attachment; filename="yandex.xml"'); } echo($this->getYml()); } } private function setShop($name, $value) { $allowed = array('name', 'company', 'url', 'phone', 'platform', 'version', 'agency', 'email'); if (in_array($name, $allowed)) { $this->shop[$name] = $this->prepareField($value); } } private function setCurrency($id, $rate = 'CBRF', $plus = 0) { $allow_id = array('RUR', 'RUB', 'USD', 'BYR', 'KZT', 'EUR', 'UAH'); if (!in_array($id, $allow_id)) { return false; } $allow_rate = array('CBRF', 'NBU', 'NBK', 'CB'); if (in_array($rate, $allow_rate)) { $plus = str_replace(',', '.', $plus); if (is_numeric($plus) && $plus > 0) { $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>$rate, 'plus'=>(float)$plus ); } else { $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>$rate ); } } else { $rate = str_replace(',', '.', $rate); if (!(is_numeric($rate) && $rate > 0)) { return false; } $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>(float)$rate ); } return true; } private function setCategory($name, $id, $parent_id = 0) { $id = (int)$id; if ($id < 1 || trim($name) == '') { return false; } if ((int)$parent_id > 0) { $this->categories[$id] = array( 'id'=>$id, 'parentId'=>(int)$parent_id, 'name'=>$this->prepareField($name) ); } else { $this->categories[$id] = array( 'id'=>$id, 'name'=>$this->prepareField($name) ); } return true; } private function setOffer($data) { $offer = array(); $attributes = array('id', 'type', 'available', 'bid', 'cbid', 'param'); $attributes = array_intersect_key($data, array_flip($attributes)); foreach ($attributes as $key => $value) { switch ($key) { case 'id': case 'bid': case 'cbid': $value = (int)$value; if ($value > 0) { $offer[$key] = $value; } break; case 'type': if (in_array($value, array('vendor.model', 'book', 'audiobook', 'artist.title', 'tour', 'ticket', 'event-ticket'))) { $offer['type'] = $value; } break; case 'available': $offer['available'] = ($value ? 'true' : 'false'); break; case 'param': if (is_array($value)) { $offer['param'] = $value; } break; default: break; } } $type = isset($offer['type']) ? $offer['type'] : ''; $allowed_tags = array('url'=>0, 'buyurl'=>0, 'price'=>1, 'wprice'=>0, 'currencyId'=>1, 'xCategory'=>0, 'categoryId'=>1, 'picture'=>0, 'store'=>0, 'pickup'=>0, 'delivery'=>0, 'deliveryIncluded'=>0, 'local_delivery_cost'=>0, 'orderingTime'=>0); switch ($type) { case 'vendor.model': $allowed_tags = array_merge($allowed_tags, array('typePrefix'=>0, 'vendor'=>1, 'vendorCode'=>0, 'model'=>1, 'provider'=>0, 'tarifplan'=>0)); break; case 'book': $allowed_tags = array_merge($allowed_tags, array('author'=>0, 'name'=>1, 'publisher'=>0, 'series'=>0, 'year'=>0, 'ISBN'=>0, 'volume'=>0, 'part'=>0, 'language'=>0, 'binding'=>0, 'page_extent'=>0, 'table_of_contents'=>0)); break; case 'audiobook': $allowed_tags = array_merge($allowed_tags, array('author'=>0, 'name'=>1, 'publisher'=>0, 'series'=>0, 'year'=>0, 'ISBN'=>0, 'volume'=>0, 'part'=>0, 'language'=>0, 'table_of_contents'=>0, 'performed_by'=>0, 'performance_type'=>0, 'storage'=>0, 'format'=>0, 'recording_length'=>0)); break; case 'artist.title': $allowed_tags = array_merge($allowed_tags, array('artist'=>0, 'title'=>1, 'year'=>0, 'media'=>0, 'starring'=>0, 'director'=>0, 'originalName'=>0, 'country'=>0)); break; case 'tour': $allowed_tags = array_merge($allowed_tags, array('worldRegion'=>0, 'country'=>0, 'region'=>0, 'days'=>1, 'dataTour'=>0, 'name'=>1, 'hotel_stars'=>0, 'room'=>0, 'meal'=>0, 'included'=>1, 'transport'=>1, 'price_min'=>0, 'price_max'=>0, 'options'=>0)); break; case 'event-ticket': $allowed_tags = array_merge($allowed_tags, array('name'=>1, 'place'=>1, 'hall'=>0, 'hall_part'=>0, 'date'=>1, 'is_premiere'=>0, 'is_kids'=>0)); break; default: $allowed_tags = array_merge($allowed_tags, array('name'=>1, 'vendor'=>0, 'model'=>1, 'sales_notes'=>1)); break; } $allowed_tags = array_merge($allowed_tags, array('aliases'=>0, 'additional'=>0, 'description'=>0, 'sales_notes'=>0, 'promo'=>0, 'manufacturer_warranty'=>0, 'country_of_origin'=>0, 'downloadable'=>0, 'adult'=>0, 'barcode'=>0)); $required_tags = array_filter($allowed_tags); if (sizeof(array_intersect_key($data, $required_tags)) != sizeof($required_tags)) { return; } $data = array_intersect_key($data, $allowed_tags); $allowed_tags = array_intersect_key($allowed_tags, $data); $offer['data'] = array(); foreach ($allowed_tags as $key => $value) { $offer['data'][$key] = $this->prepareField($data[$key]); } $this->offers[] = $offer; } private function getYml() { $yml = '<?xml version="1.0" encoding="windows-1251"?>' . $this->eol; $yml .= '<!DOCTYPE yml_catalog SYSTEM "shops.dtd">' . $this->eol; $yml .= '<yml_catalog date="' . date('Y-m-d H:i') . '">' . $this->eol; $yml .= '<shop>' . $this->eol; // информация о магазине $yml .= $this->array2Tag($this->shop); // валюты $yml .= '<currencies>' . $this->eol; foreach ($this->currencies as $currency) { $yml .= $this->getElement($currency, 'currency'); } $yml .= '</currencies>' . $this->eol; // категории $yml .= '<categories>' . $this->eol; foreach ($this->categories as $category) { $category_name = $category['name']; unset($category['name'], $category['export']); $yml .= $this->getElement($category, 'category', $category_name); } $yml .= '</categories>' . $this->eol; // товары $yml .= '<offers>' . $this->eol; foreach ($this->offers as $offer) { $tags = $this->array2Tag($offer['data']); unset($offer['data']); if (isset($offer['param'])) { $tags .= $this->array2Param($offer['param']); unset($offer['param']); } $yml .= $this->getElement($offer, 'offer', $tags); } $yml .= '</offers>' . $this->eol; $yml .= '</shop>'; $yml .= '</yml_catalog>'; return $yml; } private function getElement($attributes, $element_name, $element_value = '') { $retval = '<' . $element_name . ' '; foreach ($attributes as $key => $value) { $retval .= $key . '="' . $value . '" '; } $retval .= $element_value ? '>' . $this->eol . $element_value . '</' . $element_name . '>' : '/>'; $retval .= $this->eol; return $retval; } private function array2Tag($tags) { $retval = ''; foreach ($tags as $key => $value) { $retval .= '<' . $key . '>' . $value . '</' . $key . '>' . $this->eol; } return $retval; } private function array2Param($params) { $retval = ''; foreach ($params as $param) { $retval .= '<param name="' . $this->prepareField($param['name']); if (isset($param['unit'])) { $retval .= '" unit="' . $this->prepareField($param['unit']); } $retval .= '">' . $this->prepareField($param['value']) . '</param>' . $this->eol; } return $retval; } private function prepareField($field) { $field = htmlspecialchars_decode($field); $field = strip_tags($field); $from = array('"', '&', '>', '<', '\''); $to = array('"', '&', '>', '<', '''); $field = str_replace($from, $to, $field); if ($this->from_charset != 'windows-1251') { $field = iconv($this->from_charset, 'windows-1251//TRANSLIT//IGNORE', $field); } $field = preg_replace('#[\x00-\x08\x0B-\x0C\x0E-\x1F]+#is', ' ', $field); return trim($field); } protected function getPath($category_id, $current_path = '') { if (isset($this->categories[$category_id])) { $this->categories[$category_id]['export'] = 1; if (!$current_path) { $new_path = $this->categories[$category_id]['id']; } else { $new_path = $this->categories[$category_id]['id'] . '_' . $current_path; } if (isset($this->categories[$category_id]['parentId'])) { return $this->getPath($this->categories[$category_id]['parentId'], $new_path); } else { return $new_path; } } } function filterCategory($category) { return isset($category['export']); } } ?> В модуле не предусмотрен вывод атрибутов или опций Надіслати Поділитися на інших сайтах More sharing options... Otche94 Опубліковано: 24 липня 2020 Share Опубліковано: 24 липня 2020 44 минуты назад, alexvas0912 сказал: В модуле не предусмотрен вывод атрибутов или опций да да да , мы с тобой в лс уже пообщались, ты сказал что тебя не интересует мнение клиентов. и поменять две строки в коде тебе лень, все понятно с тобой. Надіслати Поділитися на інших сайтах More sharing options... alexvas0912 Опубліковано: 24 липня 2020 Автор Share Опубліковано: 24 липня 2020 9 минут назад, Otche94 сказал: да да да , мы с тобой в лс уже пообщались, ты сказал что тебя не интересует мнение клиентов. и поменять две строки в коде тебе лень, все понятно с тобой. Поддержку по модулю оказываю исключительно в рамках заявленного функционала. Ваше пожелание обязательно будет учтено при созданий обновлений модуля. Надіслати Поділитися на інших сайтах More sharing options... Otche94 Опубліковано: 24 липня 2020 Share Опубліковано: 24 липня 2020 Только что, alexvas0912 сказал: Поддержку по модулю оказываю исключительно в рамках заявленного функционала. Ваше пожелание обязательно будет учтено при созданий обновлений модуля. его создавать 2 секунды, копировать вставить и все Надіслати Поділитися на інших сайтах More sharing options... 1 year later... Zlobny Опубліковано: 3 листопада 2021 Share Опубліковано: 3 листопада 2021 А будет ли реализован вывод дополнительных изображений товара ? Надіслати Поділитися на інших сайтах More sharing options... alexvas0912 Опубліковано: 3 листопада 2021 Автор Share Опубліковано: 3 листопада 2021 3 часа назад, Zlobny сказал: А будет ли реализован вывод дополнительных изображений товара ? Да, в будущем планировал это реализовать. Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 1 Перейти до списку тем Схожі публікації Модуль Экспорт YML / XML и обмен данными по API PRO в Яндекс.Маркет для Opencart 2.x, 3.x [Поддержка] Автор: invays, 10 листопада 2018 яндекс маркет обновление по api (і ще %d) Теги: яндекс маркет обновление по api api yandex market апи яндекс маркет экспорт yml экспорт xml товары mail.ru 6 відповідей 3 112 перегляди Susia 12 листопада 2020 Universal Marketplace Manager Автор: invays, 30 травня 2018 yandex api yandex (і ще %d) Теги: yandex api yandex mail.ru torg.mail.ru яндекс маркет апи яндекс маркет экспорт yml экспорт yml яндекс маркет авито avito xml google mercant google merchant center feed nadavi ecatalog автоматическая обработка прайс листов экспорт yml opencart яндекс маркет opencart 2 яндекс маркет opencart 3 avito авито opencart 0 коментарів 20 162 перегляди invays 30 травня 2018 Модуль Universal Marketplace Manager [Поддержка] 1 2 3 4 7 Автор: invays, 30 травня 2018 yandex api yandex (і ще %d) Теги: yandex api yandex mail.ru torg.mail.ru яндекс маркет апи яндекс маркет экспорт yml экспорт yml яндекс маркет авито avito xml google mercant google merchant center feed nadavi ecatalog автоматическая обработка прайс листов экспорт yml opencart яндекс маркет opencart 2 яндекс маркет opencart 3 avito авито opencart 155 відповідей 23 399 переглядів Boombaster 31 січня 2023 Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Модулі та розширення Модули обмена данными Модуль Yml opencart (мульти) [Поддержка] Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains 1.0 Синхронізація Замовлень Rozetka.ua та Opencart Автор: sinco Product Manipulator Автор: Hiperlynx007 Видалення дублікатів товарів для OpenCart Автор: Hatshypsut Вибір категорій і виробників для "Знайшли дешевше" шаблону Upstore Автор: Flint2000 × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
Otche94 Опубліковано: 23 липня 2020 Share Опубліковано: 23 липня 2020 кому интересно нашел решение, в файле /public_html/catalog/controller/extension/feed/multiyml.php после закрывающей скобки } и перед строкой $this->setOffer($data); нужно дописать код $attribute_groups = $this->model_catalog_product->getProductAttributes($product['product_id']); if ($attribute_groups) { $data['param'] = array(); foreach ($attribute_groups as $attribute_group) { foreach ($attribute_group['attribute'] as $attribute) { $data['param'][] = array( 'name' => $attribute['name'], 'value' => $attribute['text'] ); } } } вот этот код, между скобкой закрывающей и $this->setOffer($data) Решение проблемы с тем что яндекс ругается на parent_id , строка $this->setCategory($category['name'], $category['category_id'], $category['parent_id']); удаляем парент ид чтобы получилось вот так $this->setCategory($category['name'], $category['category_id']); Кому лень возиться, вот полный код, можете полностью заменить. <?php class ControllerExtensionFeedMultiyml extends Controller { private $shop = array(); private $currencies = array(); private $categories = array(); private $offers = array(); private $from_charset = 'utf-8'; private $eol = "\n"; public function index() { if (isset($this->request->get['feed']) && $this->request->get['feed']) { $feed_num = $this->request->get['feed']; } else { $feed_num = 0; } $multiyml_feeds = $this->config->get('feed_multiyml_feeds'); if (isset($multiyml_feeds[$feed_num]) && $multiyml_feeds[$feed_num]['multiyml_status']) { $multiyml_feed = $multiyml_feeds[$feed_num]; if (!($allowed_categories = implode(",",$multiyml_feed['multiyml_categories']))) exit(); $this->load->model('export/multiyml'); $this->load->model('localisation/currency'); $this->load->model('tool/image'); $this->setShop('name', $multiyml_feed['multiyml_shopname']); $this->setShop('company', $multiyml_feed['multiyml_company']); if ($this->request->server['HTTPS']) { $this->setShop('url', HTTPS_SERVER); } else { $this->setShop('url', HTTP_SERVER); } $this->setShop('phone', $this->config->get('config_telephone')); $this->setShop('platform', 'Opencart'); $this->setShop('version', VERSION); $offers_currency = $multiyml_feed['multiyml_currency']; if (!$this->currency->has($offers_currency)) exit(); $decimal_place = $this->currency->getDecimalPlace($offers_currency); $shop_currency = $this->config->get('config_currency'); $this->setCurrency($offers_currency, 1); $currencies = $this->model_localisation_currency->getCurrencies(); $supported_currencies = array('RUR', 'RUB', 'USD', 'BYR', 'KZT', 'EUR', 'UAH'); $currencies = array_intersect_key($currencies, array_flip($supported_currencies)); foreach ($currencies as $currency) { if ($currency['code'] != $offers_currency && $currency['status'] == 1) { $this->setCurrency($currency['code'], number_format(1/$this->currency->convert($currency['value'], $offers_currency, $shop_currency), 4, '.', '')); } } // Категории $categories = $this->model_export_multiyml->getCategory(); foreach ($categories as $category) { $this->setCategory($category['name'], $category['category_id']); } // Товары $in_stock_id = $multiyml_feed['multiyml_in_stock']; $out_of_stock_id = $multiyml_feed['multiyml_out_of_stock']; $vendor_required = false; $products = $this->model_export_multiyml->getProduct($allowed_categories, $out_of_stock_id, $vendor_required); foreach ($products as $product) { $data = array(); // Атрибуты товара $data['id'] = $product['product_id']; $data['available'] = ($product['quantity'] > 0 || $product['stock_status_id'] == $in_stock_id); // Параметры товара $data['url'] = $this->url->link('product/product', 'path=' . $this->getPath($product['category_id']) . '&product_id=' . $product['product_id']); $data['price'] = number_format($this->currency->convert($this->tax->calculate($product['price'], $product['tax_class_id']), $shop_currency, $offers_currency), $decimal_place, '.', ''); $data['currencyId'] = $offers_currency; $data['categoryId'] = $product['category_id']; $data['delivery'] = 'true'; $data['name'] = $product['name']; $data['vendor'] = $product['manufacturer']; $data['vendorCode'] = $product['model']; $data['model'] = $product['name']; $data['model'] = $product['model']; $data['description'] = $product['description']; if ($product['image']) { $data['picture'] = $this->model_tool_image->resize($product['image'], 100, 100); } $attribute_groups = $this->model_catalog_product->getProductAttributes($product['product_id']); if ($attribute_groups) { $data['param'] = array(); foreach ($attribute_groups as $attribute_group) { foreach ($attribute_group['attribute'] as $attribute) { $data['param'][] = array( 'name' => $attribute['name'], 'value' => $attribute['text'] ); } } } $this->setOffer($data); } $this->categories = array_filter($this->categories, array($this, "filterCategory")); Header('Content-Type: application/xml'); if (isset($this->request->get['export'])) { header('Content-Disposition: attachment; filename="yandex.xml"'); } echo($this->getYml()); } } private function setShop($name, $value) { $allowed = array('name', 'company', 'url', 'phone', 'platform', 'version', 'agency', 'email'); if (in_array($name, $allowed)) { $this->shop[$name] = $this->prepareField($value); } } private function setCurrency($id, $rate = 'CBRF', $plus = 0) { $allow_id = array('RUR', 'RUB', 'USD', 'BYR', 'KZT', 'EUR', 'UAH'); if (!in_array($id, $allow_id)) { return false; } $allow_rate = array('CBRF', 'NBU', 'NBK', 'CB'); if (in_array($rate, $allow_rate)) { $plus = str_replace(',', '.', $plus); if (is_numeric($plus) && $plus > 0) { $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>$rate, 'plus'=>(float)$plus ); } else { $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>$rate ); } } else { $rate = str_replace(',', '.', $rate); if (!(is_numeric($rate) && $rate > 0)) { return false; } $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>(float)$rate ); } return true; } private function setCategory($name, $id, $parent_id = 0) { $id = (int)$id; if ($id < 1 || trim($name) == '') { return false; } if ((int)$parent_id > 0) { $this->categories[$id] = array( 'id'=>$id, 'parentId'=>(int)$parent_id, 'name'=>$this->prepareField($name) ); } else { $this->categories[$id] = array( 'id'=>$id, 'name'=>$this->prepareField($name) ); } return true; } private function setOffer($data) { $offer = array(); $attributes = array('id', 'type', 'available', 'bid', 'cbid', 'param'); $attributes = array_intersect_key($data, array_flip($attributes)); foreach ($attributes as $key => $value) { switch ($key) { case 'id': case 'bid': case 'cbid': $value = (int)$value; if ($value > 0) { $offer[$key] = $value; } break; case 'type': if (in_array($value, array('vendor.model', 'book', 'audiobook', 'artist.title', 'tour', 'ticket', 'event-ticket'))) { $offer['type'] = $value; } break; case 'available': $offer['available'] = ($value ? 'true' : 'false'); break; case 'param': if (is_array($value)) { $offer['param'] = $value; } break; default: break; } } $type = isset($offer['type']) ? $offer['type'] : ''; $allowed_tags = array('url'=>0, 'buyurl'=>0, 'price'=>1, 'wprice'=>0, 'currencyId'=>1, 'xCategory'=>0, 'categoryId'=>1, 'picture'=>0, 'store'=>0, 'pickup'=>0, 'delivery'=>0, 'deliveryIncluded'=>0, 'local_delivery_cost'=>0, 'orderingTime'=>0); switch ($type) { case 'vendor.model': $allowed_tags = array_merge($allowed_tags, array('typePrefix'=>0, 'vendor'=>1, 'vendorCode'=>0, 'model'=>1, 'provider'=>0, 'tarifplan'=>0)); break; case 'book': $allowed_tags = array_merge($allowed_tags, array('author'=>0, 'name'=>1, 'publisher'=>0, 'series'=>0, 'year'=>0, 'ISBN'=>0, 'volume'=>0, 'part'=>0, 'language'=>0, 'binding'=>0, 'page_extent'=>0, 'table_of_contents'=>0)); break; case 'audiobook': $allowed_tags = array_merge($allowed_tags, array('author'=>0, 'name'=>1, 'publisher'=>0, 'series'=>0, 'year'=>0, 'ISBN'=>0, 'volume'=>0, 'part'=>0, 'language'=>0, 'table_of_contents'=>0, 'performed_by'=>0, 'performance_type'=>0, 'storage'=>0, 'format'=>0, 'recording_length'=>0)); break; case 'artist.title': $allowed_tags = array_merge($allowed_tags, array('artist'=>0, 'title'=>1, 'year'=>0, 'media'=>0, 'starring'=>0, 'director'=>0, 'originalName'=>0, 'country'=>0)); break; case 'tour': $allowed_tags = array_merge($allowed_tags, array('worldRegion'=>0, 'country'=>0, 'region'=>0, 'days'=>1, 'dataTour'=>0, 'name'=>1, 'hotel_stars'=>0, 'room'=>0, 'meal'=>0, 'included'=>1, 'transport'=>1, 'price_min'=>0, 'price_max'=>0, 'options'=>0)); break; case 'event-ticket': $allowed_tags = array_merge($allowed_tags, array('name'=>1, 'place'=>1, 'hall'=>0, 'hall_part'=>0, 'date'=>1, 'is_premiere'=>0, 'is_kids'=>0)); break; default: $allowed_tags = array_merge($allowed_tags, array('name'=>1, 'vendor'=>0, 'model'=>1, 'sales_notes'=>1)); break; } $allowed_tags = array_merge($allowed_tags, array('aliases'=>0, 'additional'=>0, 'description'=>0, 'sales_notes'=>0, 'promo'=>0, 'manufacturer_warranty'=>0, 'country_of_origin'=>0, 'downloadable'=>0, 'adult'=>0, 'barcode'=>0)); $required_tags = array_filter($allowed_tags); if (sizeof(array_intersect_key($data, $required_tags)) != sizeof($required_tags)) { return; } $data = array_intersect_key($data, $allowed_tags); $allowed_tags = array_intersect_key($allowed_tags, $data); $offer['data'] = array(); foreach ($allowed_tags as $key => $value) { $offer['data'][$key] = $this->prepareField($data[$key]); } $this->offers[] = $offer; } private function getYml() { $yml = '<?xml version="1.0" encoding="windows-1251"?>' . $this->eol; $yml .= '<!DOCTYPE yml_catalog SYSTEM "shops.dtd">' . $this->eol; $yml .= '<yml_catalog date="' . date('Y-m-d H:i') . '">' . $this->eol; $yml .= '<shop>' . $this->eol; // информация о магазине $yml .= $this->array2Tag($this->shop); // валюты $yml .= '<currencies>' . $this->eol; foreach ($this->currencies as $currency) { $yml .= $this->getElement($currency, 'currency'); } $yml .= '</currencies>' . $this->eol; // категории $yml .= '<categories>' . $this->eol; foreach ($this->categories as $category) { $category_name = $category['name']; unset($category['name'], $category['export']); $yml .= $this->getElement($category, 'category', $category_name); } $yml .= '</categories>' . $this->eol; // товары $yml .= '<offers>' . $this->eol; foreach ($this->offers as $offer) { $tags = $this->array2Tag($offer['data']); unset($offer['data']); if (isset($offer['param'])) { $tags .= $this->array2Param($offer['param']); unset($offer['param']); } $yml .= $this->getElement($offer, 'offer', $tags); } $yml .= '</offers>' . $this->eol; $yml .= '</shop>'; $yml .= '</yml_catalog>'; return $yml; } private function getElement($attributes, $element_name, $element_value = '') { $retval = '<' . $element_name . ' '; foreach ($attributes as $key => $value) { $retval .= $key . '="' . $value . '" '; } $retval .= $element_value ? '>' . $this->eol . $element_value . '</' . $element_name . '>' : '/>'; $retval .= $this->eol; return $retval; } private function array2Tag($tags) { $retval = ''; foreach ($tags as $key => $value) { $retval .= '<' . $key . '>' . $value . '</' . $key . '>' . $this->eol; } return $retval; } private function array2Param($params) { $retval = ''; foreach ($params as $param) { $retval .= '<param name="' . $this->prepareField($param['name']); if (isset($param['unit'])) { $retval .= '" unit="' . $this->prepareField($param['unit']); } $retval .= '">' . $this->prepareField($param['value']) . '</param>' . $this->eol; } return $retval; } private function prepareField($field) { $field = htmlspecialchars_decode($field); $field = strip_tags($field); $from = array('"', '&', '>', '<', '\''); $to = array('"', '&', '>', '<', '''); $field = str_replace($from, $to, $field); if ($this->from_charset != 'windows-1251') { $field = iconv($this->from_charset, 'windows-1251//TRANSLIT//IGNORE', $field); } $field = preg_replace('#[\x00-\x08\x0B-\x0C\x0E-\x1F]+#is', ' ', $field); return trim($field); } protected function getPath($category_id, $current_path = '') { if (isset($this->categories[$category_id])) { $this->categories[$category_id]['export'] = 1; if (!$current_path) { $new_path = $this->categories[$category_id]['id']; } else { $new_path = $this->categories[$category_id]['id'] . '_' . $current_path; } if (isset($this->categories[$category_id]['parentId'])) { return $this->getPath($this->categories[$category_id]['parentId'], $new_path); } else { return $new_path; } } } function filterCategory($category) { return isset($category['export']); } } ?> Надіслати Поділитися на інших сайтах More sharing options... alexvas0912 Опубліковано: 24 липня 2020 Автор Share Опубліковано: 24 липня 2020 В 21.03.2020 в 17:30, helen2014 сказал: Почему в XML не выводится <vendorCode>00-00001338</vendorCode> <offer> <price>750</price> <currencyId>RUB</currencyId> <categoryId>519</categoryId> <name> Ручка защелка Fuaro (Фуаро) 637/BL РB-Е (золото) кл/фик. </name> <model>38003</model> <description/> </offer> в модуле не предусмотрен вывод vendorCode. Есть только vendor и model Надіслати Поділитися на інших сайтах More sharing options... alexvas0912 Опубліковано: 24 липня 2020 Автор Share Опубліковано: 24 липня 2020 14 часов назад, Otche94 сказал: кому интересно нашел решение, в файле /public_html/catalog/controller/extension/feed/multiyml.php после закрывающей скобки } и перед строкой $this->setOffer($data); нужно дописать код $attribute_groups = $this->model_catalog_product->getProductAttributes($product['product_id']); if ($attribute_groups) { $data['param'] = array(); foreach ($attribute_groups as $attribute_group) { foreach ($attribute_group['attribute'] as $attribute) { $data['param'][] = array( 'name' => $attribute['name'], 'value' => $attribute['text'] ); } } } вот этот код, между скобкой закрывающей и $this->setOffer($data) Решение проблемы с тем что яндекс ругается на parent_id , строка $this->setCategory($category['name'], $category['category_id'], $category['parent_id']); удаляем парент ид чтобы получилось вот так $this->setCategory($category['name'], $category['category_id']); Кому лень возиться, вот полный код, можете полностью заменить. <?php class ControllerExtensionFeedMultiyml extends Controller { private $shop = array(); private $currencies = array(); private $categories = array(); private $offers = array(); private $from_charset = 'utf-8'; private $eol = "\n"; public function index() { if (isset($this->request->get['feed']) && $this->request->get['feed']) { $feed_num = $this->request->get['feed']; } else { $feed_num = 0; } $multiyml_feeds = $this->config->get('feed_multiyml_feeds'); if (isset($multiyml_feeds[$feed_num]) && $multiyml_feeds[$feed_num]['multiyml_status']) { $multiyml_feed = $multiyml_feeds[$feed_num]; if (!($allowed_categories = implode(",",$multiyml_feed['multiyml_categories']))) exit(); $this->load->model('export/multiyml'); $this->load->model('localisation/currency'); $this->load->model('tool/image'); $this->setShop('name', $multiyml_feed['multiyml_shopname']); $this->setShop('company', $multiyml_feed['multiyml_company']); if ($this->request->server['HTTPS']) { $this->setShop('url', HTTPS_SERVER); } else { $this->setShop('url', HTTP_SERVER); } $this->setShop('phone', $this->config->get('config_telephone')); $this->setShop('platform', 'Opencart'); $this->setShop('version', VERSION); $offers_currency = $multiyml_feed['multiyml_currency']; if (!$this->currency->has($offers_currency)) exit(); $decimal_place = $this->currency->getDecimalPlace($offers_currency); $shop_currency = $this->config->get('config_currency'); $this->setCurrency($offers_currency, 1); $currencies = $this->model_localisation_currency->getCurrencies(); $supported_currencies = array('RUR', 'RUB', 'USD', 'BYR', 'KZT', 'EUR', 'UAH'); $currencies = array_intersect_key($currencies, array_flip($supported_currencies)); foreach ($currencies as $currency) { if ($currency['code'] != $offers_currency && $currency['status'] == 1) { $this->setCurrency($currency['code'], number_format(1/$this->currency->convert($currency['value'], $offers_currency, $shop_currency), 4, '.', '')); } } // Категории $categories = $this->model_export_multiyml->getCategory(); foreach ($categories as $category) { $this->setCategory($category['name'], $category['category_id']); } // Товары $in_stock_id = $multiyml_feed['multiyml_in_stock']; $out_of_stock_id = $multiyml_feed['multiyml_out_of_stock']; $vendor_required = false; $products = $this->model_export_multiyml->getProduct($allowed_categories, $out_of_stock_id, $vendor_required); foreach ($products as $product) { $data = array(); // Атрибуты товара $data['id'] = $product['product_id']; $data['available'] = ($product['quantity'] > 0 || $product['stock_status_id'] == $in_stock_id); // Параметры товара $data['url'] = $this->url->link('product/product', 'path=' . $this->getPath($product['category_id']) . '&product_id=' . $product['product_id']); $data['price'] = number_format($this->currency->convert($this->tax->calculate($product['price'], $product['tax_class_id']), $shop_currency, $offers_currency), $decimal_place, '.', ''); $data['currencyId'] = $offers_currency; $data['categoryId'] = $product['category_id']; $data['delivery'] = 'true'; $data['name'] = $product['name']; $data['vendor'] = $product['manufacturer']; $data['vendorCode'] = $product['model']; $data['model'] = $product['name']; $data['model'] = $product['model']; $data['description'] = $product['description']; if ($product['image']) { $data['picture'] = $this->model_tool_image->resize($product['image'], 100, 100); } $attribute_groups = $this->model_catalog_product->getProductAttributes($product['product_id']); if ($attribute_groups) { $data['param'] = array(); foreach ($attribute_groups as $attribute_group) { foreach ($attribute_group['attribute'] as $attribute) { $data['param'][] = array( 'name' => $attribute['name'], 'value' => $attribute['text'] ); } } } $this->setOffer($data); } $this->categories = array_filter($this->categories, array($this, "filterCategory")); Header('Content-Type: application/xml'); if (isset($this->request->get['export'])) { header('Content-Disposition: attachment; filename="yandex.xml"'); } echo($this->getYml()); } } private function setShop($name, $value) { $allowed = array('name', 'company', 'url', 'phone', 'platform', 'version', 'agency', 'email'); if (in_array($name, $allowed)) { $this->shop[$name] = $this->prepareField($value); } } private function setCurrency($id, $rate = 'CBRF', $plus = 0) { $allow_id = array('RUR', 'RUB', 'USD', 'BYR', 'KZT', 'EUR', 'UAH'); if (!in_array($id, $allow_id)) { return false; } $allow_rate = array('CBRF', 'NBU', 'NBK', 'CB'); if (in_array($rate, $allow_rate)) { $plus = str_replace(',', '.', $plus); if (is_numeric($plus) && $plus > 0) { $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>$rate, 'plus'=>(float)$plus ); } else { $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>$rate ); } } else { $rate = str_replace(',', '.', $rate); if (!(is_numeric($rate) && $rate > 0)) { return false; } $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>(float)$rate ); } return true; } private function setCategory($name, $id, $parent_id = 0) { $id = (int)$id; if ($id < 1 || trim($name) == '') { return false; } if ((int)$parent_id > 0) { $this->categories[$id] = array( 'id'=>$id, 'parentId'=>(int)$parent_id, 'name'=>$this->prepareField($name) ); } else { $this->categories[$id] = array( 'id'=>$id, 'name'=>$this->prepareField($name) ); } return true; } private function setOffer($data) { $offer = array(); $attributes = array('id', 'type', 'available', 'bid', 'cbid', 'param'); $attributes = array_intersect_key($data, array_flip($attributes)); foreach ($attributes as $key => $value) { switch ($key) { case 'id': case 'bid': case 'cbid': $value = (int)$value; if ($value > 0) { $offer[$key] = $value; } break; case 'type': if (in_array($value, array('vendor.model', 'book', 'audiobook', 'artist.title', 'tour', 'ticket', 'event-ticket'))) { $offer['type'] = $value; } break; case 'available': $offer['available'] = ($value ? 'true' : 'false'); break; case 'param': if (is_array($value)) { $offer['param'] = $value; } break; default: break; } } $type = isset($offer['type']) ? $offer['type'] : ''; $allowed_tags = array('url'=>0, 'buyurl'=>0, 'price'=>1, 'wprice'=>0, 'currencyId'=>1, 'xCategory'=>0, 'categoryId'=>1, 'picture'=>0, 'store'=>0, 'pickup'=>0, 'delivery'=>0, 'deliveryIncluded'=>0, 'local_delivery_cost'=>0, 'orderingTime'=>0); switch ($type) { case 'vendor.model': $allowed_tags = array_merge($allowed_tags, array('typePrefix'=>0, 'vendor'=>1, 'vendorCode'=>0, 'model'=>1, 'provider'=>0, 'tarifplan'=>0)); break; case 'book': $allowed_tags = array_merge($allowed_tags, array('author'=>0, 'name'=>1, 'publisher'=>0, 'series'=>0, 'year'=>0, 'ISBN'=>0, 'volume'=>0, 'part'=>0, 'language'=>0, 'binding'=>0, 'page_extent'=>0, 'table_of_contents'=>0)); break; case 'audiobook': $allowed_tags = array_merge($allowed_tags, array('author'=>0, 'name'=>1, 'publisher'=>0, 'series'=>0, 'year'=>0, 'ISBN'=>0, 'volume'=>0, 'part'=>0, 'language'=>0, 'table_of_contents'=>0, 'performed_by'=>0, 'performance_type'=>0, 'storage'=>0, 'format'=>0, 'recording_length'=>0)); break; case 'artist.title': $allowed_tags = array_merge($allowed_tags, array('artist'=>0, 'title'=>1, 'year'=>0, 'media'=>0, 'starring'=>0, 'director'=>0, 'originalName'=>0, 'country'=>0)); break; case 'tour': $allowed_tags = array_merge($allowed_tags, array('worldRegion'=>0, 'country'=>0, 'region'=>0, 'days'=>1, 'dataTour'=>0, 'name'=>1, 'hotel_stars'=>0, 'room'=>0, 'meal'=>0, 'included'=>1, 'transport'=>1, 'price_min'=>0, 'price_max'=>0, 'options'=>0)); break; case 'event-ticket': $allowed_tags = array_merge($allowed_tags, array('name'=>1, 'place'=>1, 'hall'=>0, 'hall_part'=>0, 'date'=>1, 'is_premiere'=>0, 'is_kids'=>0)); break; default: $allowed_tags = array_merge($allowed_tags, array('name'=>1, 'vendor'=>0, 'model'=>1, 'sales_notes'=>1)); break; } $allowed_tags = array_merge($allowed_tags, array('aliases'=>0, 'additional'=>0, 'description'=>0, 'sales_notes'=>0, 'promo'=>0, 'manufacturer_warranty'=>0, 'country_of_origin'=>0, 'downloadable'=>0, 'adult'=>0, 'barcode'=>0)); $required_tags = array_filter($allowed_tags); if (sizeof(array_intersect_key($data, $required_tags)) != sizeof($required_tags)) { return; } $data = array_intersect_key($data, $allowed_tags); $allowed_tags = array_intersect_key($allowed_tags, $data); $offer['data'] = array(); foreach ($allowed_tags as $key => $value) { $offer['data'][$key] = $this->prepareField($data[$key]); } $this->offers[] = $offer; } private function getYml() { $yml = '<?xml version="1.0" encoding="windows-1251"?>' . $this->eol; $yml .= '<!DOCTYPE yml_catalog SYSTEM "shops.dtd">' . $this->eol; $yml .= '<yml_catalog date="' . date('Y-m-d H:i') . '">' . $this->eol; $yml .= '<shop>' . $this->eol; // информация о магазине $yml .= $this->array2Tag($this->shop); // валюты $yml .= '<currencies>' . $this->eol; foreach ($this->currencies as $currency) { $yml .= $this->getElement($currency, 'currency'); } $yml .= '</currencies>' . $this->eol; // категории $yml .= '<categories>' . $this->eol; foreach ($this->categories as $category) { $category_name = $category['name']; unset($category['name'], $category['export']); $yml .= $this->getElement($category, 'category', $category_name); } $yml .= '</categories>' . $this->eol; // товары $yml .= '<offers>' . $this->eol; foreach ($this->offers as $offer) { $tags = $this->array2Tag($offer['data']); unset($offer['data']); if (isset($offer['param'])) { $tags .= $this->array2Param($offer['param']); unset($offer['param']); } $yml .= $this->getElement($offer, 'offer', $tags); } $yml .= '</offers>' . $this->eol; $yml .= '</shop>'; $yml .= '</yml_catalog>'; return $yml; } private function getElement($attributes, $element_name, $element_value = '') { $retval = '<' . $element_name . ' '; foreach ($attributes as $key => $value) { $retval .= $key . '="' . $value . '" '; } $retval .= $element_value ? '>' . $this->eol . $element_value . '</' . $element_name . '>' : '/>'; $retval .= $this->eol; return $retval; } private function array2Tag($tags) { $retval = ''; foreach ($tags as $key => $value) { $retval .= '<' . $key . '>' . $value . '</' . $key . '>' . $this->eol; } return $retval; } private function array2Param($params) { $retval = ''; foreach ($params as $param) { $retval .= '<param name="' . $this->prepareField($param['name']); if (isset($param['unit'])) { $retval .= '" unit="' . $this->prepareField($param['unit']); } $retval .= '">' . $this->prepareField($param['value']) . '</param>' . $this->eol; } return $retval; } private function prepareField($field) { $field = htmlspecialchars_decode($field); $field = strip_tags($field); $from = array('"', '&', '>', '<', '\''); $to = array('"', '&', '>', '<', '''); $field = str_replace($from, $to, $field); if ($this->from_charset != 'windows-1251') { $field = iconv($this->from_charset, 'windows-1251//TRANSLIT//IGNORE', $field); } $field = preg_replace('#[\x00-\x08\x0B-\x0C\x0E-\x1F]+#is', ' ', $field); return trim($field); } protected function getPath($category_id, $current_path = '') { if (isset($this->categories[$category_id])) { $this->categories[$category_id]['export'] = 1; if (!$current_path) { $new_path = $this->categories[$category_id]['id']; } else { $new_path = $this->categories[$category_id]['id'] . '_' . $current_path; } if (isset($this->categories[$category_id]['parentId'])) { return $this->getPath($this->categories[$category_id]['parentId'], $new_path); } else { return $new_path; } } } function filterCategory($category) { return isset($category['export']); } } ?> В модуле не предусмотрен вывод атрибутов или опций Надіслати Поділитися на інших сайтах More sharing options... Otche94 Опубліковано: 24 липня 2020 Share Опубліковано: 24 липня 2020 44 минуты назад, alexvas0912 сказал: В модуле не предусмотрен вывод атрибутов или опций да да да , мы с тобой в лс уже пообщались, ты сказал что тебя не интересует мнение клиентов. и поменять две строки в коде тебе лень, все понятно с тобой. Надіслати Поділитися на інших сайтах More sharing options... alexvas0912 Опубліковано: 24 липня 2020 Автор Share Опубліковано: 24 липня 2020 9 минут назад, Otche94 сказал: да да да , мы с тобой в лс уже пообщались, ты сказал что тебя не интересует мнение клиентов. и поменять две строки в коде тебе лень, все понятно с тобой. Поддержку по модулю оказываю исключительно в рамках заявленного функционала. Ваше пожелание обязательно будет учтено при созданий обновлений модуля. Надіслати Поділитися на інших сайтах More sharing options... Otche94 Опубліковано: 24 липня 2020 Share Опубліковано: 24 липня 2020 Только что, alexvas0912 сказал: Поддержку по модулю оказываю исключительно в рамках заявленного функционала. Ваше пожелание обязательно будет учтено при созданий обновлений модуля. его создавать 2 секунды, копировать вставить и все Надіслати Поділитися на інших сайтах More sharing options... 1 year later... Zlobny Опубліковано: 3 листопада 2021 Share Опубліковано: 3 листопада 2021 А будет ли реализован вывод дополнительных изображений товара ? Надіслати Поділитися на інших сайтах More sharing options... alexvas0912 Опубліковано: 3 листопада 2021 Автор Share Опубліковано: 3 листопада 2021 3 часа назад, Zlobny сказал: А будет ли реализован вывод дополнительных изображений товара ? Да, в будущем планировал это реализовать. Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 1 Перейти до списку тем Схожі публікації Модуль Экспорт YML / XML и обмен данными по API PRO в Яндекс.Маркет для Opencart 2.x, 3.x [Поддержка] Автор: invays, 10 листопада 2018 яндекс маркет обновление по api (і ще %d) Теги: яндекс маркет обновление по api api yandex market апи яндекс маркет экспорт yml экспорт xml товары mail.ru 6 відповідей 3 112 перегляди Susia 12 листопада 2020 Universal Marketplace Manager Автор: invays, 30 травня 2018 yandex api yandex (і ще %d) Теги: yandex api yandex mail.ru torg.mail.ru яндекс маркет апи яндекс маркет экспорт yml экспорт yml яндекс маркет авито avito xml google mercant google merchant center feed nadavi ecatalog автоматическая обработка прайс листов экспорт yml opencart яндекс маркет opencart 2 яндекс маркет opencart 3 avito авито opencart 0 коментарів 20 162 перегляди invays 30 травня 2018 Модуль Universal Marketplace Manager [Поддержка] 1 2 3 4 7 Автор: invays, 30 травня 2018 yandex api yandex (і ще %d) Теги: yandex api yandex mail.ru torg.mail.ru яндекс маркет апи яндекс маркет экспорт yml экспорт yml яндекс маркет авито avito xml google mercant google merchant center feed nadavi ecatalog автоматическая обработка прайс листов экспорт yml opencart яндекс маркет opencart 2 яндекс маркет opencart 3 avito авито opencart 155 відповідей 23 399 переглядів Boombaster 31 січня 2023 Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Модулі та розширення Модули обмена данными Модуль Yml opencart (мульти) [Поддержка] Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains 1.0 Синхронізація Замовлень Rozetka.ua та Opencart Автор: sinco Product Manipulator Автор: Hiperlynx007 Видалення дублікатів товарів для OpenCart Автор: Hatshypsut Вибір категорій і виробників для "Знайшли дешевше" шаблону Upstore Автор: Flint2000 × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
alexvas0912 Опубліковано: 24 липня 2020 Автор Share Опубліковано: 24 липня 2020 В 21.03.2020 в 17:30, helen2014 сказал: Почему в XML не выводится <vendorCode>00-00001338</vendorCode> <offer> <price>750</price> <currencyId>RUB</currencyId> <categoryId>519</categoryId> <name> Ручка защелка Fuaro (Фуаро) 637/BL РB-Е (золото) кл/фик. </name> <model>38003</model> <description/> </offer> в модуле не предусмотрен вывод vendorCode. Есть только vendor и model Надіслати Поділитися на інших сайтах More sharing options... alexvas0912 Опубліковано: 24 липня 2020 Автор Share Опубліковано: 24 липня 2020 14 часов назад, Otche94 сказал: кому интересно нашел решение, в файле /public_html/catalog/controller/extension/feed/multiyml.php после закрывающей скобки } и перед строкой $this->setOffer($data); нужно дописать код $attribute_groups = $this->model_catalog_product->getProductAttributes($product['product_id']); if ($attribute_groups) { $data['param'] = array(); foreach ($attribute_groups as $attribute_group) { foreach ($attribute_group['attribute'] as $attribute) { $data['param'][] = array( 'name' => $attribute['name'], 'value' => $attribute['text'] ); } } } вот этот код, между скобкой закрывающей и $this->setOffer($data) Решение проблемы с тем что яндекс ругается на parent_id , строка $this->setCategory($category['name'], $category['category_id'], $category['parent_id']); удаляем парент ид чтобы получилось вот так $this->setCategory($category['name'], $category['category_id']); Кому лень возиться, вот полный код, можете полностью заменить. <?php class ControllerExtensionFeedMultiyml extends Controller { private $shop = array(); private $currencies = array(); private $categories = array(); private $offers = array(); private $from_charset = 'utf-8'; private $eol = "\n"; public function index() { if (isset($this->request->get['feed']) && $this->request->get['feed']) { $feed_num = $this->request->get['feed']; } else { $feed_num = 0; } $multiyml_feeds = $this->config->get('feed_multiyml_feeds'); if (isset($multiyml_feeds[$feed_num]) && $multiyml_feeds[$feed_num]['multiyml_status']) { $multiyml_feed = $multiyml_feeds[$feed_num]; if (!($allowed_categories = implode(",",$multiyml_feed['multiyml_categories']))) exit(); $this->load->model('export/multiyml'); $this->load->model('localisation/currency'); $this->load->model('tool/image'); $this->setShop('name', $multiyml_feed['multiyml_shopname']); $this->setShop('company', $multiyml_feed['multiyml_company']); if ($this->request->server['HTTPS']) { $this->setShop('url', HTTPS_SERVER); } else { $this->setShop('url', HTTP_SERVER); } $this->setShop('phone', $this->config->get('config_telephone')); $this->setShop('platform', 'Opencart'); $this->setShop('version', VERSION); $offers_currency = $multiyml_feed['multiyml_currency']; if (!$this->currency->has($offers_currency)) exit(); $decimal_place = $this->currency->getDecimalPlace($offers_currency); $shop_currency = $this->config->get('config_currency'); $this->setCurrency($offers_currency, 1); $currencies = $this->model_localisation_currency->getCurrencies(); $supported_currencies = array('RUR', 'RUB', 'USD', 'BYR', 'KZT', 'EUR', 'UAH'); $currencies = array_intersect_key($currencies, array_flip($supported_currencies)); foreach ($currencies as $currency) { if ($currency['code'] != $offers_currency && $currency['status'] == 1) { $this->setCurrency($currency['code'], number_format(1/$this->currency->convert($currency['value'], $offers_currency, $shop_currency), 4, '.', '')); } } // Категории $categories = $this->model_export_multiyml->getCategory(); foreach ($categories as $category) { $this->setCategory($category['name'], $category['category_id']); } // Товары $in_stock_id = $multiyml_feed['multiyml_in_stock']; $out_of_stock_id = $multiyml_feed['multiyml_out_of_stock']; $vendor_required = false; $products = $this->model_export_multiyml->getProduct($allowed_categories, $out_of_stock_id, $vendor_required); foreach ($products as $product) { $data = array(); // Атрибуты товара $data['id'] = $product['product_id']; $data['available'] = ($product['quantity'] > 0 || $product['stock_status_id'] == $in_stock_id); // Параметры товара $data['url'] = $this->url->link('product/product', 'path=' . $this->getPath($product['category_id']) . '&product_id=' . $product['product_id']); $data['price'] = number_format($this->currency->convert($this->tax->calculate($product['price'], $product['tax_class_id']), $shop_currency, $offers_currency), $decimal_place, '.', ''); $data['currencyId'] = $offers_currency; $data['categoryId'] = $product['category_id']; $data['delivery'] = 'true'; $data['name'] = $product['name']; $data['vendor'] = $product['manufacturer']; $data['vendorCode'] = $product['model']; $data['model'] = $product['name']; $data['model'] = $product['model']; $data['description'] = $product['description']; if ($product['image']) { $data['picture'] = $this->model_tool_image->resize($product['image'], 100, 100); } $attribute_groups = $this->model_catalog_product->getProductAttributes($product['product_id']); if ($attribute_groups) { $data['param'] = array(); foreach ($attribute_groups as $attribute_group) { foreach ($attribute_group['attribute'] as $attribute) { $data['param'][] = array( 'name' => $attribute['name'], 'value' => $attribute['text'] ); } } } $this->setOffer($data); } $this->categories = array_filter($this->categories, array($this, "filterCategory")); Header('Content-Type: application/xml'); if (isset($this->request->get['export'])) { header('Content-Disposition: attachment; filename="yandex.xml"'); } echo($this->getYml()); } } private function setShop($name, $value) { $allowed = array('name', 'company', 'url', 'phone', 'platform', 'version', 'agency', 'email'); if (in_array($name, $allowed)) { $this->shop[$name] = $this->prepareField($value); } } private function setCurrency($id, $rate = 'CBRF', $plus = 0) { $allow_id = array('RUR', 'RUB', 'USD', 'BYR', 'KZT', 'EUR', 'UAH'); if (!in_array($id, $allow_id)) { return false; } $allow_rate = array('CBRF', 'NBU', 'NBK', 'CB'); if (in_array($rate, $allow_rate)) { $plus = str_replace(',', '.', $plus); if (is_numeric($plus) && $plus > 0) { $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>$rate, 'plus'=>(float)$plus ); } else { $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>$rate ); } } else { $rate = str_replace(',', '.', $rate); if (!(is_numeric($rate) && $rate > 0)) { return false; } $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>(float)$rate ); } return true; } private function setCategory($name, $id, $parent_id = 0) { $id = (int)$id; if ($id < 1 || trim($name) == '') { return false; } if ((int)$parent_id > 0) { $this->categories[$id] = array( 'id'=>$id, 'parentId'=>(int)$parent_id, 'name'=>$this->prepareField($name) ); } else { $this->categories[$id] = array( 'id'=>$id, 'name'=>$this->prepareField($name) ); } return true; } private function setOffer($data) { $offer = array(); $attributes = array('id', 'type', 'available', 'bid', 'cbid', 'param'); $attributes = array_intersect_key($data, array_flip($attributes)); foreach ($attributes as $key => $value) { switch ($key) { case 'id': case 'bid': case 'cbid': $value = (int)$value; if ($value > 0) { $offer[$key] = $value; } break; case 'type': if (in_array($value, array('vendor.model', 'book', 'audiobook', 'artist.title', 'tour', 'ticket', 'event-ticket'))) { $offer['type'] = $value; } break; case 'available': $offer['available'] = ($value ? 'true' : 'false'); break; case 'param': if (is_array($value)) { $offer['param'] = $value; } break; default: break; } } $type = isset($offer['type']) ? $offer['type'] : ''; $allowed_tags = array('url'=>0, 'buyurl'=>0, 'price'=>1, 'wprice'=>0, 'currencyId'=>1, 'xCategory'=>0, 'categoryId'=>1, 'picture'=>0, 'store'=>0, 'pickup'=>0, 'delivery'=>0, 'deliveryIncluded'=>0, 'local_delivery_cost'=>0, 'orderingTime'=>0); switch ($type) { case 'vendor.model': $allowed_tags = array_merge($allowed_tags, array('typePrefix'=>0, 'vendor'=>1, 'vendorCode'=>0, 'model'=>1, 'provider'=>0, 'tarifplan'=>0)); break; case 'book': $allowed_tags = array_merge($allowed_tags, array('author'=>0, 'name'=>1, 'publisher'=>0, 'series'=>0, 'year'=>0, 'ISBN'=>0, 'volume'=>0, 'part'=>0, 'language'=>0, 'binding'=>0, 'page_extent'=>0, 'table_of_contents'=>0)); break; case 'audiobook': $allowed_tags = array_merge($allowed_tags, array('author'=>0, 'name'=>1, 'publisher'=>0, 'series'=>0, 'year'=>0, 'ISBN'=>0, 'volume'=>0, 'part'=>0, 'language'=>0, 'table_of_contents'=>0, 'performed_by'=>0, 'performance_type'=>0, 'storage'=>0, 'format'=>0, 'recording_length'=>0)); break; case 'artist.title': $allowed_tags = array_merge($allowed_tags, array('artist'=>0, 'title'=>1, 'year'=>0, 'media'=>0, 'starring'=>0, 'director'=>0, 'originalName'=>0, 'country'=>0)); break; case 'tour': $allowed_tags = array_merge($allowed_tags, array('worldRegion'=>0, 'country'=>0, 'region'=>0, 'days'=>1, 'dataTour'=>0, 'name'=>1, 'hotel_stars'=>0, 'room'=>0, 'meal'=>0, 'included'=>1, 'transport'=>1, 'price_min'=>0, 'price_max'=>0, 'options'=>0)); break; case 'event-ticket': $allowed_tags = array_merge($allowed_tags, array('name'=>1, 'place'=>1, 'hall'=>0, 'hall_part'=>0, 'date'=>1, 'is_premiere'=>0, 'is_kids'=>0)); break; default: $allowed_tags = array_merge($allowed_tags, array('name'=>1, 'vendor'=>0, 'model'=>1, 'sales_notes'=>1)); break; } $allowed_tags = array_merge($allowed_tags, array('aliases'=>0, 'additional'=>0, 'description'=>0, 'sales_notes'=>0, 'promo'=>0, 'manufacturer_warranty'=>0, 'country_of_origin'=>0, 'downloadable'=>0, 'adult'=>0, 'barcode'=>0)); $required_tags = array_filter($allowed_tags); if (sizeof(array_intersect_key($data, $required_tags)) != sizeof($required_tags)) { return; } $data = array_intersect_key($data, $allowed_tags); $allowed_tags = array_intersect_key($allowed_tags, $data); $offer['data'] = array(); foreach ($allowed_tags as $key => $value) { $offer['data'][$key] = $this->prepareField($data[$key]); } $this->offers[] = $offer; } private function getYml() { $yml = '<?xml version="1.0" encoding="windows-1251"?>' . $this->eol; $yml .= '<!DOCTYPE yml_catalog SYSTEM "shops.dtd">' . $this->eol; $yml .= '<yml_catalog date="' . date('Y-m-d H:i') . '">' . $this->eol; $yml .= '<shop>' . $this->eol; // информация о магазине $yml .= $this->array2Tag($this->shop); // валюты $yml .= '<currencies>' . $this->eol; foreach ($this->currencies as $currency) { $yml .= $this->getElement($currency, 'currency'); } $yml .= '</currencies>' . $this->eol; // категории $yml .= '<categories>' . $this->eol; foreach ($this->categories as $category) { $category_name = $category['name']; unset($category['name'], $category['export']); $yml .= $this->getElement($category, 'category', $category_name); } $yml .= '</categories>' . $this->eol; // товары $yml .= '<offers>' . $this->eol; foreach ($this->offers as $offer) { $tags = $this->array2Tag($offer['data']); unset($offer['data']); if (isset($offer['param'])) { $tags .= $this->array2Param($offer['param']); unset($offer['param']); } $yml .= $this->getElement($offer, 'offer', $tags); } $yml .= '</offers>' . $this->eol; $yml .= '</shop>'; $yml .= '</yml_catalog>'; return $yml; } private function getElement($attributes, $element_name, $element_value = '') { $retval = '<' . $element_name . ' '; foreach ($attributes as $key => $value) { $retval .= $key . '="' . $value . '" '; } $retval .= $element_value ? '>' . $this->eol . $element_value . '</' . $element_name . '>' : '/>'; $retval .= $this->eol; return $retval; } private function array2Tag($tags) { $retval = ''; foreach ($tags as $key => $value) { $retval .= '<' . $key . '>' . $value . '</' . $key . '>' . $this->eol; } return $retval; } private function array2Param($params) { $retval = ''; foreach ($params as $param) { $retval .= '<param name="' . $this->prepareField($param['name']); if (isset($param['unit'])) { $retval .= '" unit="' . $this->prepareField($param['unit']); } $retval .= '">' . $this->prepareField($param['value']) . '</param>' . $this->eol; } return $retval; } private function prepareField($field) { $field = htmlspecialchars_decode($field); $field = strip_tags($field); $from = array('"', '&', '>', '<', '\''); $to = array('"', '&', '>', '<', '''); $field = str_replace($from, $to, $field); if ($this->from_charset != 'windows-1251') { $field = iconv($this->from_charset, 'windows-1251//TRANSLIT//IGNORE', $field); } $field = preg_replace('#[\x00-\x08\x0B-\x0C\x0E-\x1F]+#is', ' ', $field); return trim($field); } protected function getPath($category_id, $current_path = '') { if (isset($this->categories[$category_id])) { $this->categories[$category_id]['export'] = 1; if (!$current_path) { $new_path = $this->categories[$category_id]['id']; } else { $new_path = $this->categories[$category_id]['id'] . '_' . $current_path; } if (isset($this->categories[$category_id]['parentId'])) { return $this->getPath($this->categories[$category_id]['parentId'], $new_path); } else { return $new_path; } } } function filterCategory($category) { return isset($category['export']); } } ?> В модуле не предусмотрен вывод атрибутов или опций Надіслати Поділитися на інших сайтах More sharing options... Otche94 Опубліковано: 24 липня 2020 Share Опубліковано: 24 липня 2020 44 минуты назад, alexvas0912 сказал: В модуле не предусмотрен вывод атрибутов или опций да да да , мы с тобой в лс уже пообщались, ты сказал что тебя не интересует мнение клиентов. и поменять две строки в коде тебе лень, все понятно с тобой. Надіслати Поділитися на інших сайтах More sharing options... alexvas0912 Опубліковано: 24 липня 2020 Автор Share Опубліковано: 24 липня 2020 9 минут назад, Otche94 сказал: да да да , мы с тобой в лс уже пообщались, ты сказал что тебя не интересует мнение клиентов. и поменять две строки в коде тебе лень, все понятно с тобой. Поддержку по модулю оказываю исключительно в рамках заявленного функционала. Ваше пожелание обязательно будет учтено при созданий обновлений модуля. Надіслати Поділитися на інших сайтах More sharing options... Otche94 Опубліковано: 24 липня 2020 Share Опубліковано: 24 липня 2020 Только что, alexvas0912 сказал: Поддержку по модулю оказываю исключительно в рамках заявленного функционала. Ваше пожелание обязательно будет учтено при созданий обновлений модуля. его создавать 2 секунды, копировать вставить и все Надіслати Поділитися на інших сайтах More sharing options... 1 year later... Zlobny Опубліковано: 3 листопада 2021 Share Опубліковано: 3 листопада 2021 А будет ли реализован вывод дополнительных изображений товара ? Надіслати Поділитися на інших сайтах More sharing options... alexvas0912 Опубліковано: 3 листопада 2021 Автор Share Опубліковано: 3 листопада 2021 3 часа назад, Zlobny сказал: А будет ли реализован вывод дополнительных изображений товара ? Да, в будущем планировал это реализовать. Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 1 Перейти до списку тем Схожі публікації Модуль Экспорт YML / XML и обмен данными по API PRO в Яндекс.Маркет для Opencart 2.x, 3.x [Поддержка] Автор: invays, 10 листопада 2018 яндекс маркет обновление по api (і ще %d) Теги: яндекс маркет обновление по api api yandex market апи яндекс маркет экспорт yml экспорт xml товары mail.ru 6 відповідей 3 112 перегляди Susia 12 листопада 2020 Universal Marketplace Manager Автор: invays, 30 травня 2018 yandex api yandex (і ще %d) Теги: yandex api yandex mail.ru torg.mail.ru яндекс маркет апи яндекс маркет экспорт yml экспорт yml яндекс маркет авито avito xml google mercant google merchant center feed nadavi ecatalog автоматическая обработка прайс листов экспорт yml opencart яндекс маркет opencart 2 яндекс маркет opencart 3 avito авито opencart 0 коментарів 20 162 перегляди invays 30 травня 2018 Модуль Universal Marketplace Manager [Поддержка] 1 2 3 4 7 Автор: invays, 30 травня 2018 yandex api yandex (і ще %d) Теги: yandex api yandex mail.ru torg.mail.ru яндекс маркет апи яндекс маркет экспорт yml экспорт yml яндекс маркет авито avito xml google mercant google merchant center feed nadavi ecatalog автоматическая обработка прайс листов экспорт yml opencart яндекс маркет opencart 2 яндекс маркет opencart 3 avito авито opencart 155 відповідей 23 399 переглядів Boombaster 31 січня 2023 Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Модулі та розширення Модули обмена данными Модуль Yml opencart (мульти) [Поддержка] Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains 1.0 Синхронізація Замовлень Rozetka.ua та Opencart Автор: sinco Product Manipulator Автор: Hiperlynx007 Видалення дублікатів товарів для OpenCart Автор: Hatshypsut Вибір категорій і виробників для "Знайшли дешевше" шаблону Upstore Автор: Flint2000 × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
alexvas0912 Опубліковано: 24 липня 2020 Автор Share Опубліковано: 24 липня 2020 14 часов назад, Otche94 сказал: кому интересно нашел решение, в файле /public_html/catalog/controller/extension/feed/multiyml.php после закрывающей скобки } и перед строкой $this->setOffer($data); нужно дописать код $attribute_groups = $this->model_catalog_product->getProductAttributes($product['product_id']); if ($attribute_groups) { $data['param'] = array(); foreach ($attribute_groups as $attribute_group) { foreach ($attribute_group['attribute'] as $attribute) { $data['param'][] = array( 'name' => $attribute['name'], 'value' => $attribute['text'] ); } } } вот этот код, между скобкой закрывающей и $this->setOffer($data) Решение проблемы с тем что яндекс ругается на parent_id , строка $this->setCategory($category['name'], $category['category_id'], $category['parent_id']); удаляем парент ид чтобы получилось вот так $this->setCategory($category['name'], $category['category_id']); Кому лень возиться, вот полный код, можете полностью заменить. <?php class ControllerExtensionFeedMultiyml extends Controller { private $shop = array(); private $currencies = array(); private $categories = array(); private $offers = array(); private $from_charset = 'utf-8'; private $eol = "\n"; public function index() { if (isset($this->request->get['feed']) && $this->request->get['feed']) { $feed_num = $this->request->get['feed']; } else { $feed_num = 0; } $multiyml_feeds = $this->config->get('feed_multiyml_feeds'); if (isset($multiyml_feeds[$feed_num]) && $multiyml_feeds[$feed_num]['multiyml_status']) { $multiyml_feed = $multiyml_feeds[$feed_num]; if (!($allowed_categories = implode(",",$multiyml_feed['multiyml_categories']))) exit(); $this->load->model('export/multiyml'); $this->load->model('localisation/currency'); $this->load->model('tool/image'); $this->setShop('name', $multiyml_feed['multiyml_shopname']); $this->setShop('company', $multiyml_feed['multiyml_company']); if ($this->request->server['HTTPS']) { $this->setShop('url', HTTPS_SERVER); } else { $this->setShop('url', HTTP_SERVER); } $this->setShop('phone', $this->config->get('config_telephone')); $this->setShop('platform', 'Opencart'); $this->setShop('version', VERSION); $offers_currency = $multiyml_feed['multiyml_currency']; if (!$this->currency->has($offers_currency)) exit(); $decimal_place = $this->currency->getDecimalPlace($offers_currency); $shop_currency = $this->config->get('config_currency'); $this->setCurrency($offers_currency, 1); $currencies = $this->model_localisation_currency->getCurrencies(); $supported_currencies = array('RUR', 'RUB', 'USD', 'BYR', 'KZT', 'EUR', 'UAH'); $currencies = array_intersect_key($currencies, array_flip($supported_currencies)); foreach ($currencies as $currency) { if ($currency['code'] != $offers_currency && $currency['status'] == 1) { $this->setCurrency($currency['code'], number_format(1/$this->currency->convert($currency['value'], $offers_currency, $shop_currency), 4, '.', '')); } } // Категории $categories = $this->model_export_multiyml->getCategory(); foreach ($categories as $category) { $this->setCategory($category['name'], $category['category_id']); } // Товары $in_stock_id = $multiyml_feed['multiyml_in_stock']; $out_of_stock_id = $multiyml_feed['multiyml_out_of_stock']; $vendor_required = false; $products = $this->model_export_multiyml->getProduct($allowed_categories, $out_of_stock_id, $vendor_required); foreach ($products as $product) { $data = array(); // Атрибуты товара $data['id'] = $product['product_id']; $data['available'] = ($product['quantity'] > 0 || $product['stock_status_id'] == $in_stock_id); // Параметры товара $data['url'] = $this->url->link('product/product', 'path=' . $this->getPath($product['category_id']) . '&product_id=' . $product['product_id']); $data['price'] = number_format($this->currency->convert($this->tax->calculate($product['price'], $product['tax_class_id']), $shop_currency, $offers_currency), $decimal_place, '.', ''); $data['currencyId'] = $offers_currency; $data['categoryId'] = $product['category_id']; $data['delivery'] = 'true'; $data['name'] = $product['name']; $data['vendor'] = $product['manufacturer']; $data['vendorCode'] = $product['model']; $data['model'] = $product['name']; $data['model'] = $product['model']; $data['description'] = $product['description']; if ($product['image']) { $data['picture'] = $this->model_tool_image->resize($product['image'], 100, 100); } $attribute_groups = $this->model_catalog_product->getProductAttributes($product['product_id']); if ($attribute_groups) { $data['param'] = array(); foreach ($attribute_groups as $attribute_group) { foreach ($attribute_group['attribute'] as $attribute) { $data['param'][] = array( 'name' => $attribute['name'], 'value' => $attribute['text'] ); } } } $this->setOffer($data); } $this->categories = array_filter($this->categories, array($this, "filterCategory")); Header('Content-Type: application/xml'); if (isset($this->request->get['export'])) { header('Content-Disposition: attachment; filename="yandex.xml"'); } echo($this->getYml()); } } private function setShop($name, $value) { $allowed = array('name', 'company', 'url', 'phone', 'platform', 'version', 'agency', 'email'); if (in_array($name, $allowed)) { $this->shop[$name] = $this->prepareField($value); } } private function setCurrency($id, $rate = 'CBRF', $plus = 0) { $allow_id = array('RUR', 'RUB', 'USD', 'BYR', 'KZT', 'EUR', 'UAH'); if (!in_array($id, $allow_id)) { return false; } $allow_rate = array('CBRF', 'NBU', 'NBK', 'CB'); if (in_array($rate, $allow_rate)) { $plus = str_replace(',', '.', $plus); if (is_numeric($plus) && $plus > 0) { $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>$rate, 'plus'=>(float)$plus ); } else { $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>$rate ); } } else { $rate = str_replace(',', '.', $rate); if (!(is_numeric($rate) && $rate > 0)) { return false; } $this->currencies[] = array( 'id'=>$this->prepareField(strtoupper($id)), 'rate'=>(float)$rate ); } return true; } private function setCategory($name, $id, $parent_id = 0) { $id = (int)$id; if ($id < 1 || trim($name) == '') { return false; } if ((int)$parent_id > 0) { $this->categories[$id] = array( 'id'=>$id, 'parentId'=>(int)$parent_id, 'name'=>$this->prepareField($name) ); } else { $this->categories[$id] = array( 'id'=>$id, 'name'=>$this->prepareField($name) ); } return true; } private function setOffer($data) { $offer = array(); $attributes = array('id', 'type', 'available', 'bid', 'cbid', 'param'); $attributes = array_intersect_key($data, array_flip($attributes)); foreach ($attributes as $key => $value) { switch ($key) { case 'id': case 'bid': case 'cbid': $value = (int)$value; if ($value > 0) { $offer[$key] = $value; } break; case 'type': if (in_array($value, array('vendor.model', 'book', 'audiobook', 'artist.title', 'tour', 'ticket', 'event-ticket'))) { $offer['type'] = $value; } break; case 'available': $offer['available'] = ($value ? 'true' : 'false'); break; case 'param': if (is_array($value)) { $offer['param'] = $value; } break; default: break; } } $type = isset($offer['type']) ? $offer['type'] : ''; $allowed_tags = array('url'=>0, 'buyurl'=>0, 'price'=>1, 'wprice'=>0, 'currencyId'=>1, 'xCategory'=>0, 'categoryId'=>1, 'picture'=>0, 'store'=>0, 'pickup'=>0, 'delivery'=>0, 'deliveryIncluded'=>0, 'local_delivery_cost'=>0, 'orderingTime'=>0); switch ($type) { case 'vendor.model': $allowed_tags = array_merge($allowed_tags, array('typePrefix'=>0, 'vendor'=>1, 'vendorCode'=>0, 'model'=>1, 'provider'=>0, 'tarifplan'=>0)); break; case 'book': $allowed_tags = array_merge($allowed_tags, array('author'=>0, 'name'=>1, 'publisher'=>0, 'series'=>0, 'year'=>0, 'ISBN'=>0, 'volume'=>0, 'part'=>0, 'language'=>0, 'binding'=>0, 'page_extent'=>0, 'table_of_contents'=>0)); break; case 'audiobook': $allowed_tags = array_merge($allowed_tags, array('author'=>0, 'name'=>1, 'publisher'=>0, 'series'=>0, 'year'=>0, 'ISBN'=>0, 'volume'=>0, 'part'=>0, 'language'=>0, 'table_of_contents'=>0, 'performed_by'=>0, 'performance_type'=>0, 'storage'=>0, 'format'=>0, 'recording_length'=>0)); break; case 'artist.title': $allowed_tags = array_merge($allowed_tags, array('artist'=>0, 'title'=>1, 'year'=>0, 'media'=>0, 'starring'=>0, 'director'=>0, 'originalName'=>0, 'country'=>0)); break; case 'tour': $allowed_tags = array_merge($allowed_tags, array('worldRegion'=>0, 'country'=>0, 'region'=>0, 'days'=>1, 'dataTour'=>0, 'name'=>1, 'hotel_stars'=>0, 'room'=>0, 'meal'=>0, 'included'=>1, 'transport'=>1, 'price_min'=>0, 'price_max'=>0, 'options'=>0)); break; case 'event-ticket': $allowed_tags = array_merge($allowed_tags, array('name'=>1, 'place'=>1, 'hall'=>0, 'hall_part'=>0, 'date'=>1, 'is_premiere'=>0, 'is_kids'=>0)); break; default: $allowed_tags = array_merge($allowed_tags, array('name'=>1, 'vendor'=>0, 'model'=>1, 'sales_notes'=>1)); break; } $allowed_tags = array_merge($allowed_tags, array('aliases'=>0, 'additional'=>0, 'description'=>0, 'sales_notes'=>0, 'promo'=>0, 'manufacturer_warranty'=>0, 'country_of_origin'=>0, 'downloadable'=>0, 'adult'=>0, 'barcode'=>0)); $required_tags = array_filter($allowed_tags); if (sizeof(array_intersect_key($data, $required_tags)) != sizeof($required_tags)) { return; } $data = array_intersect_key($data, $allowed_tags); $allowed_tags = array_intersect_key($allowed_tags, $data); $offer['data'] = array(); foreach ($allowed_tags as $key => $value) { $offer['data'][$key] = $this->prepareField($data[$key]); } $this->offers[] = $offer; } private function getYml() { $yml = '<?xml version="1.0" encoding="windows-1251"?>' . $this->eol; $yml .= '<!DOCTYPE yml_catalog SYSTEM "shops.dtd">' . $this->eol; $yml .= '<yml_catalog date="' . date('Y-m-d H:i') . '">' . $this->eol; $yml .= '<shop>' . $this->eol; // информация о магазине $yml .= $this->array2Tag($this->shop); // валюты $yml .= '<currencies>' . $this->eol; foreach ($this->currencies as $currency) { $yml .= $this->getElement($currency, 'currency'); } $yml .= '</currencies>' . $this->eol; // категории $yml .= '<categories>' . $this->eol; foreach ($this->categories as $category) { $category_name = $category['name']; unset($category['name'], $category['export']); $yml .= $this->getElement($category, 'category', $category_name); } $yml .= '</categories>' . $this->eol; // товары $yml .= '<offers>' . $this->eol; foreach ($this->offers as $offer) { $tags = $this->array2Tag($offer['data']); unset($offer['data']); if (isset($offer['param'])) { $tags .= $this->array2Param($offer['param']); unset($offer['param']); } $yml .= $this->getElement($offer, 'offer', $tags); } $yml .= '</offers>' . $this->eol; $yml .= '</shop>'; $yml .= '</yml_catalog>'; return $yml; } private function getElement($attributes, $element_name, $element_value = '') { $retval = '<' . $element_name . ' '; foreach ($attributes as $key => $value) { $retval .= $key . '="' . $value . '" '; } $retval .= $element_value ? '>' . $this->eol . $element_value . '</' . $element_name . '>' : '/>'; $retval .= $this->eol; return $retval; } private function array2Tag($tags) { $retval = ''; foreach ($tags as $key => $value) { $retval .= '<' . $key . '>' . $value . '</' . $key . '>' . $this->eol; } return $retval; } private function array2Param($params) { $retval = ''; foreach ($params as $param) { $retval .= '<param name="' . $this->prepareField($param['name']); if (isset($param['unit'])) { $retval .= '" unit="' . $this->prepareField($param['unit']); } $retval .= '">' . $this->prepareField($param['value']) . '</param>' . $this->eol; } return $retval; } private function prepareField($field) { $field = htmlspecialchars_decode($field); $field = strip_tags($field); $from = array('"', '&', '>', '<', '\''); $to = array('"', '&', '>', '<', '''); $field = str_replace($from, $to, $field); if ($this->from_charset != 'windows-1251') { $field = iconv($this->from_charset, 'windows-1251//TRANSLIT//IGNORE', $field); } $field = preg_replace('#[\x00-\x08\x0B-\x0C\x0E-\x1F]+#is', ' ', $field); return trim($field); } protected function getPath($category_id, $current_path = '') { if (isset($this->categories[$category_id])) { $this->categories[$category_id]['export'] = 1; if (!$current_path) { $new_path = $this->categories[$category_id]['id']; } else { $new_path = $this->categories[$category_id]['id'] . '_' . $current_path; } if (isset($this->categories[$category_id]['parentId'])) { return $this->getPath($this->categories[$category_id]['parentId'], $new_path); } else { return $new_path; } } } function filterCategory($category) { return isset($category['export']); } } ?> В модуле не предусмотрен вывод атрибутов или опций Надіслати Поділитися на інших сайтах More sharing options... Otche94 Опубліковано: 24 липня 2020 Share Опубліковано: 24 липня 2020 44 минуты назад, alexvas0912 сказал: В модуле не предусмотрен вывод атрибутов или опций да да да , мы с тобой в лс уже пообщались, ты сказал что тебя не интересует мнение клиентов. и поменять две строки в коде тебе лень, все понятно с тобой. Надіслати Поділитися на інших сайтах More sharing options... alexvas0912 Опубліковано: 24 липня 2020 Автор Share Опубліковано: 24 липня 2020 9 минут назад, Otche94 сказал: да да да , мы с тобой в лс уже пообщались, ты сказал что тебя не интересует мнение клиентов. и поменять две строки в коде тебе лень, все понятно с тобой. Поддержку по модулю оказываю исключительно в рамках заявленного функционала. Ваше пожелание обязательно будет учтено при созданий обновлений модуля. Надіслати Поділитися на інших сайтах More sharing options... Otche94 Опубліковано: 24 липня 2020 Share Опубліковано: 24 липня 2020 Только что, alexvas0912 сказал: Поддержку по модулю оказываю исключительно в рамках заявленного функционала. Ваше пожелание обязательно будет учтено при созданий обновлений модуля. его создавать 2 секунды, копировать вставить и все Надіслати Поділитися на інших сайтах More sharing options... 1 year later... Zlobny Опубліковано: 3 листопада 2021 Share Опубліковано: 3 листопада 2021 А будет ли реализован вывод дополнительных изображений товара ? Надіслати Поділитися на інших сайтах More sharing options... alexvas0912 Опубліковано: 3 листопада 2021 Автор Share Опубліковано: 3 листопада 2021 3 часа назад, Zlobny сказал: А будет ли реализован вывод дополнительных изображений товара ? Да, в будущем планировал это реализовать. Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 1 Перейти до списку тем Схожі публікації Модуль Экспорт YML / XML и обмен данными по API PRO в Яндекс.Маркет для Opencart 2.x, 3.x [Поддержка] Автор: invays, 10 листопада 2018 яндекс маркет обновление по api (і ще %d) Теги: яндекс маркет обновление по api api yandex market апи яндекс маркет экспорт yml экспорт xml товары mail.ru 6 відповідей 3 112 перегляди Susia 12 листопада 2020 Universal Marketplace Manager Автор: invays, 30 травня 2018 yandex api yandex (і ще %d) Теги: yandex api yandex mail.ru torg.mail.ru яндекс маркет апи яндекс маркет экспорт yml экспорт yml яндекс маркет авито avito xml google mercant google merchant center feed nadavi ecatalog автоматическая обработка прайс листов экспорт yml opencart яндекс маркет opencart 2 яндекс маркет opencart 3 avito авито opencart 0 коментарів 20 162 перегляди invays 30 травня 2018 Модуль Universal Marketplace Manager [Поддержка] 1 2 3 4 7 Автор: invays, 30 травня 2018 yandex api yandex (і ще %d) Теги: yandex api yandex mail.ru torg.mail.ru яндекс маркет апи яндекс маркет экспорт yml экспорт yml яндекс маркет авито avito xml google mercant google merchant center feed nadavi ecatalog автоматическая обработка прайс листов экспорт yml opencart яндекс маркет opencart 2 яндекс маркет opencart 3 avito авито opencart 155 відповідей 23 399 переглядів Boombaster 31 січня 2023 Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Модулі та розширення Модули обмена данными Модуль Yml opencart (мульти) [Поддержка] Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains 1.0 Синхронізація Замовлень Rozetka.ua та Opencart Автор: sinco Product Manipulator Автор: Hiperlynx007 Видалення дублікатів товарів для OpenCart Автор: Hatshypsut Вибір категорій і виробників для "Знайшли дешевше" шаблону Upstore Автор: Flint2000 × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
Otche94 Опубліковано: 24 липня 2020 Share Опубліковано: 24 липня 2020 44 минуты назад, alexvas0912 сказал: В модуле не предусмотрен вывод атрибутов или опций да да да , мы с тобой в лс уже пообщались, ты сказал что тебя не интересует мнение клиентов. и поменять две строки в коде тебе лень, все понятно с тобой. Надіслати Поділитися на інших сайтах More sharing options... alexvas0912 Опубліковано: 24 липня 2020 Автор Share Опубліковано: 24 липня 2020 9 минут назад, Otche94 сказал: да да да , мы с тобой в лс уже пообщались, ты сказал что тебя не интересует мнение клиентов. и поменять две строки в коде тебе лень, все понятно с тобой. Поддержку по модулю оказываю исключительно в рамках заявленного функционала. Ваше пожелание обязательно будет учтено при созданий обновлений модуля. Надіслати Поділитися на інших сайтах More sharing options... Otche94 Опубліковано: 24 липня 2020 Share Опубліковано: 24 липня 2020 Только что, alexvas0912 сказал: Поддержку по модулю оказываю исключительно в рамках заявленного функционала. Ваше пожелание обязательно будет учтено при созданий обновлений модуля. его создавать 2 секунды, копировать вставить и все Надіслати Поділитися на інших сайтах More sharing options... 1 year later... Zlobny Опубліковано: 3 листопада 2021 Share Опубліковано: 3 листопада 2021 А будет ли реализован вывод дополнительных изображений товара ? Надіслати Поділитися на інших сайтах More sharing options... alexvas0912 Опубліковано: 3 листопада 2021 Автор Share Опубліковано: 3 листопада 2021 3 часа назад, Zlobny сказал: А будет ли реализован вывод дополнительных изображений товара ? Да, в будущем планировал это реализовать. Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 1 Перейти до списку тем Схожі публікації Модуль Экспорт YML / XML и обмен данными по API PRO в Яндекс.Маркет для Opencart 2.x, 3.x [Поддержка] Автор: invays, 10 листопада 2018 яндекс маркет обновление по api (і ще %d) Теги: яндекс маркет обновление по api api yandex market апи яндекс маркет экспорт yml экспорт xml товары mail.ru 6 відповідей 3 112 перегляди Susia 12 листопада 2020 Universal Marketplace Manager Автор: invays, 30 травня 2018 yandex api yandex (і ще %d) Теги: yandex api yandex mail.ru torg.mail.ru яндекс маркет апи яндекс маркет экспорт yml экспорт yml яндекс маркет авито avito xml google mercant google merchant center feed nadavi ecatalog автоматическая обработка прайс листов экспорт yml opencart яндекс маркет opencart 2 яндекс маркет opencart 3 avito авито opencart 0 коментарів 20 162 перегляди invays 30 травня 2018 Модуль Universal Marketplace Manager [Поддержка] 1 2 3 4 7 Автор: invays, 30 травня 2018 yandex api yandex (і ще %d) Теги: yandex api yandex mail.ru torg.mail.ru яндекс маркет апи яндекс маркет экспорт yml экспорт yml яндекс маркет авито avito xml google mercant google merchant center feed nadavi ecatalog автоматическая обработка прайс листов экспорт yml opencart яндекс маркет opencart 2 яндекс маркет opencart 3 avito авито opencart 155 відповідей 23 399 переглядів Boombaster 31 січня 2023 Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Модулі та розширення Модули обмена данными Модуль Yml opencart (мульти) [Поддержка] Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains 1.0 Синхронізація Замовлень Rozetka.ua та Opencart Автор: sinco Product Manipulator Автор: Hiperlynx007 Видалення дублікатів товарів для OpenCart Автор: Hatshypsut Вибір категорій і виробників для "Знайшли дешевше" шаблону Upstore Автор: Flint2000 × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
alexvas0912 Опубліковано: 24 липня 2020 Автор Share Опубліковано: 24 липня 2020 9 минут назад, Otche94 сказал: да да да , мы с тобой в лс уже пообщались, ты сказал что тебя не интересует мнение клиентов. и поменять две строки в коде тебе лень, все понятно с тобой. Поддержку по модулю оказываю исключительно в рамках заявленного функционала. Ваше пожелание обязательно будет учтено при созданий обновлений модуля. Надіслати Поділитися на інших сайтах More sharing options... Otche94 Опубліковано: 24 липня 2020 Share Опубліковано: 24 липня 2020 Только что, alexvas0912 сказал: Поддержку по модулю оказываю исключительно в рамках заявленного функционала. Ваше пожелание обязательно будет учтено при созданий обновлений модуля. его создавать 2 секунды, копировать вставить и все Надіслати Поділитися на інших сайтах More sharing options... 1 year later... Zlobny Опубліковано: 3 листопада 2021 Share Опубліковано: 3 листопада 2021 А будет ли реализован вывод дополнительных изображений товара ? Надіслати Поділитися на інших сайтах More sharing options... alexvas0912 Опубліковано: 3 листопада 2021 Автор Share Опубліковано: 3 листопада 2021 3 часа назад, Zlobny сказал: А будет ли реализован вывод дополнительных изображений товара ? Да, в будущем планировал это реализовать. Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 1 Перейти до списку тем Схожі публікації Модуль Экспорт YML / XML и обмен данными по API PRO в Яндекс.Маркет для Opencart 2.x, 3.x [Поддержка] Автор: invays, 10 листопада 2018 яндекс маркет обновление по api (і ще %d) Теги: яндекс маркет обновление по api api yandex market апи яндекс маркет экспорт yml экспорт xml товары mail.ru 6 відповідей 3 112 перегляди Susia 12 листопада 2020 Universal Marketplace Manager Автор: invays, 30 травня 2018 yandex api yandex (і ще %d) Теги: yandex api yandex mail.ru torg.mail.ru яндекс маркет апи яндекс маркет экспорт yml экспорт yml яндекс маркет авито avito xml google mercant google merchant center feed nadavi ecatalog автоматическая обработка прайс листов экспорт yml opencart яндекс маркет opencart 2 яндекс маркет opencart 3 avito авито opencart 0 коментарів 20 162 перегляди invays 30 травня 2018 Модуль Universal Marketplace Manager [Поддержка] 1 2 3 4 7 Автор: invays, 30 травня 2018 yandex api yandex (і ще %d) Теги: yandex api yandex mail.ru torg.mail.ru яндекс маркет апи яндекс маркет экспорт yml экспорт yml яндекс маркет авито avito xml google mercant google merchant center feed nadavi ecatalog автоматическая обработка прайс листов экспорт yml opencart яндекс маркет opencart 2 яндекс маркет opencart 3 avito авито opencart 155 відповідей 23 399 переглядів Boombaster 31 січня 2023 Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Модулі та розширення Модули обмена данными Модуль Yml opencart (мульти) [Поддержка] Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains 1.0 Синхронізація Замовлень Rozetka.ua та Opencart Автор: sinco Product Manipulator Автор: Hiperlynx007 Видалення дублікатів товарів для OpenCart Автор: Hatshypsut Вибір категорій і виробників для "Знайшли дешевше" шаблону Upstore Автор: Flint2000
Otche94 Опубліковано: 24 липня 2020 Share Опубліковано: 24 липня 2020 Только что, alexvas0912 сказал: Поддержку по модулю оказываю исключительно в рамках заявленного функционала. Ваше пожелание обязательно будет учтено при созданий обновлений модуля. его создавать 2 секунды, копировать вставить и все Надіслати Поділитися на інших сайтах More sharing options... 1 year later... Zlobny Опубліковано: 3 листопада 2021 Share Опубліковано: 3 листопада 2021 А будет ли реализован вывод дополнительных изображений товара ? Надіслати Поділитися на інших сайтах More sharing options... alexvas0912 Опубліковано: 3 листопада 2021 Автор Share Опубліковано: 3 листопада 2021 3 часа назад, Zlobny сказал: А будет ли реализован вывод дополнительных изображений товара ? Да, в будущем планировал это реализовать. Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 1 Перейти до списку тем Схожі публікації Модуль Экспорт YML / XML и обмен данными по API PRO в Яндекс.Маркет для Opencart 2.x, 3.x [Поддержка] Автор: invays, 10 листопада 2018 яндекс маркет обновление по api (і ще %d) Теги: яндекс маркет обновление по api api yandex market апи яндекс маркет экспорт yml экспорт xml товары mail.ru 6 відповідей 3 112 перегляди Susia 12 листопада 2020 Universal Marketplace Manager Автор: invays, 30 травня 2018 yandex api yandex (і ще %d) Теги: yandex api yandex mail.ru torg.mail.ru яндекс маркет апи яндекс маркет экспорт yml экспорт yml яндекс маркет авито avito xml google mercant google merchant center feed nadavi ecatalog автоматическая обработка прайс листов экспорт yml opencart яндекс маркет opencart 2 яндекс маркет opencart 3 avito авито opencart 0 коментарів 20 162 перегляди invays 30 травня 2018 Модуль Universal Marketplace Manager [Поддержка] 1 2 3 4 7 Автор: invays, 30 травня 2018 yandex api yandex (і ще %d) Теги: yandex api yandex mail.ru torg.mail.ru яндекс маркет апи яндекс маркет экспорт yml экспорт yml яндекс маркет авито avito xml google mercant google merchant center feed nadavi ecatalog автоматическая обработка прайс листов экспорт yml opencart яндекс маркет opencart 2 яндекс маркет opencart 3 avito авито opencart 155 відповідей 23 399 переглядів Boombaster 31 січня 2023 Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Модулі та розширення Модули обмена данными Модуль Yml opencart (мульти) [Поддержка]
Zlobny Опубліковано: 3 листопада 2021 Share Опубліковано: 3 листопада 2021 А будет ли реализован вывод дополнительных изображений товара ? Надіслати Поділитися на інших сайтах More sharing options... alexvas0912 Опубліковано: 3 листопада 2021 Автор Share Опубліковано: 3 листопада 2021 3 часа назад, Zlobny сказал: А будет ли реализован вывод дополнительных изображений товара ? Да, в будущем планировал это реализовать. Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 1 Перейти до списку тем Схожі публікації Модуль Экспорт YML / XML и обмен данными по API PRO в Яндекс.Маркет для Opencart 2.x, 3.x [Поддержка] Автор: invays, 10 листопада 2018 яндекс маркет обновление по api (і ще %d) Теги: яндекс маркет обновление по api api yandex market апи яндекс маркет экспорт yml экспорт xml товары mail.ru 6 відповідей 3 112 перегляди Susia 12 листопада 2020 Universal Marketplace Manager Автор: invays, 30 травня 2018 yandex api yandex (і ще %d) Теги: yandex api yandex mail.ru torg.mail.ru яндекс маркет апи яндекс маркет экспорт yml экспорт yml яндекс маркет авито avito xml google mercant google merchant center feed nadavi ecatalog автоматическая обработка прайс листов экспорт yml opencart яндекс маркет opencart 2 яндекс маркет opencart 3 avito авито opencart 0 коментарів 20 162 перегляди invays 30 травня 2018 Модуль Universal Marketplace Manager [Поддержка] 1 2 3 4 7 Автор: invays, 30 травня 2018 yandex api yandex (і ще %d) Теги: yandex api yandex mail.ru torg.mail.ru яндекс маркет апи яндекс маркет экспорт yml экспорт yml яндекс маркет авито avito xml google mercant google merchant center feed nadavi ecatalog автоматическая обработка прайс листов экспорт yml opencart яндекс маркет opencart 2 яндекс маркет opencart 3 avito авито opencart 155 відповідей 23 399 переглядів Boombaster 31 січня 2023 Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку
alexvas0912 Опубліковано: 3 листопада 2021 Автор Share Опубліковано: 3 листопада 2021 3 часа назад, Zlobny сказал: А будет ли реализован вывод дополнительных изображений товара ? Да, в будущем планировал это реализовать. Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 1
Recommended Posts