Перейти к содержимому


яндекс маркет тег Sales Notes как прописать?

sales notes яндекс маркет тег sales notes opencart яндекс маркет

Сообщений в теме: 3

#1 ALEKSFLY

    Пользователь

  • Пользователи
  • PipPip
  • 27 сообщений

Отправлено 21 Февраль 2012 - 18:46

Доброго времени суток! при регистрации магазина в Яндекс маркете пришло письмо со следующим текстом!

Цитата

Шезлонг Сочи с Подушкой
1 200 руб. в наличии в КЕНГОМАРТ магазин
Доставка: не доставляется в ваш регион.
На странице товарного предложения указано: (Этот товар имеет минимальное количество из 3) и в корзину данный товар добавляется в количестве 3 шт.
Укажите, пожалуйста, информацию о минимальной партии товара в теге Sales Notes.

помогите как правильно прописать????? =((( для количества товаров??? вот код.. тег там присутствует

<?php
/**
* Класс YML экспорта
* YML (Yandex Market Language) - стандарт, разработанный "Яндексом"
* для принятия и публикации информации в базе данных Яндекс.Маркет
* YML основан на стандарте XML (Extensible Markup Language)
* описание формата YML http://partner.market.yandex.ru/legal/tt/
*/
class ControllerExportYml 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 ($this->config->get('yandex_market_status')) {
   $this->load->model('export/yandex_market');
   $this->load->model('localisation/currency');
   $this->load->model('tool/image');
		    $this->load->model('tool/seo_url');
   // Магазин
   $this->setShop('name', $this->config->get('yandex_market_shopname'));
   $this->setShop('company', $this->config->get('yandex_market_company'));
   $this->setShop('url', HTTP_SERVER);
   $this->setShop('phone', $this->config->get('config_telephone'));
   $this->setShop('platform', 'ocStore');
   $this->setShop('version', VERSION);
   // Валюты
   // TODO: Добавить возможность настраивать проценты в админке.
   $offers_currency = $this->config->get('yandex_market_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_yandex_market->getCategory();
   foreach ($categories as $category) {
    $this->setCategory($category['name'], $category['category_id'], $category['parent_id']);
   }
   // Товарные предложения
   $products = $this->model_export_yandex_market->getProduct();
   foreach ($products as $product) {
    $data = array();
    // Атрибуты товарного предложения
    $data['id'] = $product['product_id'];
//    $data['type'] = 'vendor.model';
    $data['available'] = ($product['stock_status_id'] != 5); // 5 - id статуса "Нет на складе" (под заказ)
//    $data['bid'] = 10;
//    $data['cbid'] = 15;
    // Параметры товарного предложения
    $data['url'] = $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/product&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['local_delivery_cost'] = 100;
    $data['name'] = $product['name'];
    $data['vendor'] = $product['manufacturer'];
    $data['vendorCode'] = $product['model'];
    $data['model'] = $product['name'];
    $data['description'] = $product['description'];
    $data['manufacturer_warranty'] = 'true';
//    $data['barcode'] = $product['sku'];
    if ($product['image']) {
	 $data['picture'] = $this->model_tool_image->resize($product['image'], 100, 100);
    }
/*
    // пример структуры массива для вывода параметров
    $data['param'] = array(
	 array(
	  'name'=>'Wi-Fi',
	  'value'=>'есть'
	 ), array(
	  'name'=>'Размер экрана',
	  'unit'=>'дюйм',
	  'value'=>'20'
	 ), array(
	  'name'=>'Вес',
	  'unit'=>'кг',
	  'value'=>'4.6'
	 )
    );
*/
    $this->setOffer($data);
   }
   $this->response->addHeader('Content-Type: application/xml');
   $this->response->setOutput($this->getYml());
  }
}
/**
  * Методы формирования YML
  */
/**
  * Формирование массива для элемента shop описывающего магазин
  *
  * @param string $name - Название элемента
  * @param string $value - Значение элемента
  */
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);
  }
}
/**
  * Валюты
  *
  * @param string $id - код валюты (RUR, RUB, USD, BYR, KZT, EUR, UAH)
  * @param float|string $rate - курс этой валюты к валюте, взятой за единицу.
  * Параметр rate может иметь так же следующие значения:
  *  CBRF - курс по Центральному банку РФ.
  *  NBU - курс по Национальному банку Украины.
  *  NBK - курс по Национальному банку Казахстана.
  *  СВ - курс по банку той страны, к которой относится интернет-магазин
  *   по Своему региону, указанному в Партнерском интерфейсе Яндекс.Маркета.
  * @param float $plus - используется только в случае rate = CBRF, NBU, NBK или СВ
  *  и означает на сколько увеличить курс в процентах от курса выбранного банка
  * @return bool
  */
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;
}
/**
  * Категории товаров
  *
  * @param string $name - название рубрики
  * @param int $id - id рубрики
  * @param int $parent_id - id родительской рубрики
  * @return bool
  */
private function setCategory($name, $id, $parent_id = 0) {
  if ((int)$id < 1 || trim($name) == '') {
   return false;
  }
  if ((int)$parent_id > 0) {
   $this->categories[] = array(
    'id'=>(int)$id,
    'parentId'=>(int)$parent_id,
    'name'=>$this->prepareField($name)
   );
  } else {
   $this->categories[] = array(
    'id'=>(int)$id,
    'name'=>$this->prepareField($name)
   );
  }
  return true;
}
/**
  * Товарные предложения
  *
  * @param array $data - массив параметров товарного предложения
  */
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, 'vendorCode'=>0));
    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);
//  if (isset($data['tarifplan']) && !isset($data['provider'])) {
//   unset($data['tarifplan']);
//  }
  $allowed_tags = array_intersect_key($allowed_tags, $data);
  // Стандарт XML учитывает порядок следования элементов,
  // поэтому важно соблюдать его в соответствии с порядком описанным в DTD
  $offer['data'] = array();
  foreach ($allowed_tags as $key => $value) {
   $offer['data'][$key] = $this->prepareField($data[$key]);
  }
  $this->offers[] = $offer;
}
/**
  * Формирование YML файла
  *
  * @return string
  */
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']);
   $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;
}
/**
  * Фрмирование элемента
  *
  * @param array $attributes
  * @param string $element_name
  * @param string $element_value
  * @return string
  */
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;
}
/**
  * Преобразование массива в теги
  *
  * @param array $tags
  * @return string
  */
private function array2Tag($tags) {
  $retval = '';
  foreach ($tags as $key => $value) {
   $retval .= '<' . $key . '>' . $value . '</' . $key . '>' . $this->eol;
  }
  return $retval;
}
/**
  * Преобразование массива в теги параметров
  *
  * @param array $params
  * @return string
  */
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;
}
/**
  * Подготовка текстового поля в соответствии с требованиями Яндекса
  * Запрещаем любые html-тэги, стандарт XML не допускает использования в текстовых данных
  * непечатаемых символов с ASCII-кодами в диапазоне значений от 0 до 31 (за исключением
  * символов с кодами 9, 10, 13 - табуляция, перевод строки, возврат каретки). Также этот
  * стандарт требует обязательной замены некоторых символов на их символьные примитивы.
  * @param string $text
  * @return string
  */
private function prepareField($field) {
  $field = htmlspecialchars_decode(trim($field));
  $field = strip_tags($field);
  $from = array('"', '&', '>', '<', '\'');
  $to = array('&quot;', '&amp;', '&gt;', '&lt;', '&apos;');
  $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);
}
}
?>


#2 ALEKSFLY

    Пользователь

  • Пользователи
  • PipPip
  • 27 сообщений

Отправлено 23 Февраль 2012 - 06:14

UPPP что никто не делал?

#3 Yesvik

    Почему программистов все считают телепатами?

  • OC Team
  • PipPipPip
  • 1 612 сообщений
  • ГородМосква

Отправлено 23 Февраль 2012 - 14:11

После строки
$data['description'] = $product['description'];
добавить
if ($product['minimum'] > 1) $data['sales_notes'] = 'Минимальная партия: ' . $product['minimum'] . '.';


#4 ALEKSFLY

    Пользователь

  • Пользователи
  • PipPip
  • 27 сообщений

Отправлено 26 Февраль 2012 - 06:58

большое спасибо вам!





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных