Содержание

Киоск

Общие вопросы

Что входит в состав модуля?

В состав модуля входят следующие компоненты:
catalog.basket - компонент отвечающий за отображение товаров в корзине и процедуру оформления заказа
catalog.basket.small - компонент отвечающий за отображение количества товаров в корзине, а так же является обработчиком события добавления товара в корзину. Поэтому данный компонент должен присутствовать на всех страницах, на которых нужен функционал добавления товара в корзине.
market.yandex_market - компонент позволяет генерировать xml для выгрузки товаров в Яндекс.Маркет (находится в папке /ys-ym/ относительно корня сайта). Компонент выводит настройки если вы админ и выводит XML если вы гость. Предварительно зарегистрируйтесь в системе Яндекс.маркет.

Как вывести малую/летающую корзину в публичной части сайта?

Малая корзина отвечает за добавления товара в корзину и поэтому она должна находится перед компонентом каталога.
Для вызова компонента малой корзины используйте следующий код:
&lt? $APPLICATION->IncludeComponent(
	"yenisite:catalog.basket.small", 
	"", 
	array(), 
	false
);?&gt
				

Для отображения малой корзины на всех страницах сайта необходимо поместить ее в header.php вашего шаблона.
Если же хотите отображать корзину только на страницах каталога, то ее необходимо поместить в файл, где непосредственно вызывается компонент каталога (например: /catalog/index.php).
В состав решения входит шаблон bitronic, для малой корзины. Он делает корзину “летающей” и позволяет выбирать количество товара прямо в корзине.

Как вывести кнопки для добавления товара в корзину (без AJAX, универсально для любого шаблона)?

Для работы с каталогом, необходимо использовать стандартный компонент bitrix:catalog
Внимание! Настоятельно рекомендуем скопировать шаблон компонента в шаблон сайта для внесения последующих правок.

Добавление кнопок в список элементов (bitrix:catalog.section)

После того как вы скопировали шаблон комплексного компонента bitrix:catalog в шаблон сайта, необходимо найти следующий файл:

bitrix/templates/ВАШ_ШАБЛОН/components/bitrix/catalog/bitrix/.default/bitrix/catalog.section/.default/template.php

Далее в этом файле ищем часть где выводятся элементы каталога.

Для справки: каждый компонент по завершению своей работы формирует массив результатов. Обычно массив результатов обозначается как $arResult. Компонент bitrix:catalog по умолчанию имеет вложенный массив элементов $arResult[‘ITEMS’]. В нем хранятся данные об элементах (товарах), которые в последующем выводятся в шаблон компонента.

Вывод элементов в шаблоне осуществляется примерно следующим образом:
foreach ($arResult[‘ITEMS’] as $arItem) //цикл для перебора всех элементов в массиве
{
	if ($arItem[‘CAN_BUY’]) //если элемент разрешен к покупке
	{
		//Выводим кнопки “купить” и “в корзину”
	}
}

					

Теперь вставляем код вызова кнопок "купить" и "в корзину" внутри этого цикла, в необходимом месте верстки

foreach ($arResult[‘ITEMS’] as $arItem) //цикл для перебора всех элементов в массиве
{
	if ($arItem[‘CAN_BUY’]) //если элемент разрешен к покупке
	{
		//Выводим кнопки “купить” и “в корзину”
		&ltnoindex&gt 
			&lta href="<?echo $arElement["BUY_URL"]?&gt" rel="nofollow"&gt //Кнопка "купить"
				&lt?echo GetMessage("CATALOG_BUY")?&gt
			&lt/a&gt 
			&lta href="<?echo $arElement["ADD_URL"]?&gt" rel="nofollow"&gt //Кнопка "добавить в корзину"
				&lt?echo GetMessage("CATALOG_ADD")?&gt
			&lt/a&gt 
		&lt/noindex&gt
	}
}
			

Если ничего не выводится, то скорей всего в языковых файлах не определены следующие константы:

$MESS["CATALOG_BUY"] = "Купить";
$MESS["CATALOG_ADD"] = "В корзину";

Как интегрировать Киоск в стандартный AJAX в новых шаблонах каталога?

bitrix:catalog.element

в шаблоне компонента детальной страницы находим файл result_modifier.php и в самый конец файла (до закрывающего тега ?> ) добавляем:

if (CModule::IncludeModule('yenisite.market')) {
	$prices = CMarketPrice::GetItemPriceValues($arResult["ID"], $arResult['PRICES']);
	if(count($prices)>0)
		unset ($arResult["PRICES"]);
	$minPrice = false;
	foreach ($prices as $k => $pr) {
		$pr = floatval($pr);
		$arResult["PRICES"][$k]["VALUE"] = $pr;
		$arResult["PRICES"][$k]["PRINT_VALUE"] = $pr;
		if ((empty($minPrice) || $minPrice > $pr) && $pr > 0) {
			$minPrice = $pr;
			$minPriceId = $k;
		}
	}
	if ($minPrice !== false) {
		$arResult['MIN_PRICE']['PRICE_ID'] = $minPriceId;
		$arResult['MIN_PRICE']['VALUE'] = $minPrice;
		$arResult['MIN_PRICE']['PRINT_VALUE'] = $minPrice;
		$arResult['MIN_PRICE']['DISCOUNT_VALUE'] = $minPrice;
		$arResult['MIN_PRICE']['PRINT_DISCOUNT_VALUE'] = $minPrice;
		$arResult['CAN_BUY'] = true;
	}
	$arResult['CHECK_QUANTITY'] = (CMarketCatalog::UsesQuantity($arParams['IBLOCK_ID']) == 1);
	$arResult['CATALOG_QUANTITY'] = intval($arResult['PROPERTIES']['MARKET_QUANTITY']['VALUE']);
	
	if ($arResult['CHECK_QUANTITY'] && $arResult['CATALOG_QUANTITY'] <= 0) {
		$arResult['CAN_BUY'] = false;
	}
	$arResult['CATALOG_TYPE'] = 1; //simple product
}

Что делает этот код.

  • Выборка минимальной цены из имеющихся в Киоске с учётом права на просмотр.
  • Проверка количественного учёта.
  • Установка типа продукта для корректной работы шаблона и скриптов.

bitrix:catalog.section

в шаблоне компонента страницы раздела каталога находим файл result_modifier.php и в самый конец файла (до закрывающего тега ?> ) добавляем:

if (CModule::IncludeModule('yenisite.market')) {
	$arResult['CHECK_QUANTITY'] = (CMarketCatalog::UsesQuantity($arParams['IBLOCK_ID']) == 1);
	
	foreach ($arResult['ITEMS'] as $index => &$arItem) {
		$prices = CMarketPrice::GetItemPriceValues($arItem['ID'], $arItem['PRICES']);
		if (count($prices) > 0) {
			unset($arItem['PRICES']);
		}
		$minPrice = false;
		foreach ($prices as $k => $pr) {
			$pr = floatval($pr);
			$arItem['PRICES'][$k]['VALUE'] = $pr;
			$arItem['PRICES'][$k]['PRINT_VALUE'] = $pr;
			if ((empty($minPrice) || $minPrice > $pr) && $pr > 0) {
				$minPrice = $pr;
			}
		}
		if ($minPrice !== false) {
			$arItem['MIN_PRICE']['VALUE'] = $minPrice;
			$arItem['MIN_PRICE']['PRINT_VALUE'] = $minPrice;
			$arItem['MIN_PRICE']['DISCOUNT_VALUE'] = $minPrice;
			$arItem['MIN_PRICE']['PRINT_DISCOUNT_VALUE'] = $minPrice;
			$arItem['CATALOG_MEASURE_RATIO'] = 1;
			$arItem['CAN_BUY'] = true;
		}
		$arItem['CHECK_QUANTITY'] = $arResult['CHECK_QUANTITY'];
		$arItem['CATALOG_QUANTITY'] = CMarketCatalogProduct::GetQuantity($arItem['ID'], $arItem['IBLOCK_ID']);
		
		if ($arItem['CHECK_QUANTITY'] && $arItem['CATALOG_QUANTITY'] <= 0) {
			$arItem['CAN_BUY'] = false;
		}
		$arItem['CATALOG_TYPE'] = 1; //simple product
	}
	unset($arItem);
}

bitrix:catalog.top

в шаблоне компонента страницы топа каталога находим файл result_modifier.php и в самый конец файла (до закрывающего тега ?> ) добавляем:

if (CModule::IncludeModule('yenisite.market')) {
	$arResult['CHECK_QUANTITY'] = (CMarketCatalog::UsesQuantity($arParams['IBLOCK_ID']) == 1);

	foreach ($arResult['ITEMS'] as &$itemSection)
	{
		foreach ($itemSection as $index => &$arItem) {
			$prices = CMarketPrice::GetItemPriceValues($arItem['ID'], $arItem['PRICES']);
			if (count($prices) > 0) {
				unset($arItem['PRICES']);
			}
			$minPrice = false;
			foreach ($prices as $k => $pr) {
				$pr = floatval($pr);
				$arItem['PRICES'][$k]['VALUE'] = $pr;
				$arItem['PRICES'][$k]['PRINT_VALUE'] = $pr;
				if ((empty($minPrice) || $minPrice > $pr) && $pr > 0) {
					$minPrice = $pr;
				}
			}

			if ($minPrice !== false) {
				$arItem['MIN_PRICE']['VALUE'] = $minPrice;
				$arItem['MIN_PRICE']['PRINT_VALUE'] = $minPrice;
				$arItem['MIN_PRICE']['DISCOUNT_VALUE'] = $minPrice;
				$arItem['MIN_PRICE']['PRINT_DISCOUNT_VALUE'] = $minPrice;
				$arItem['CATALOG_MEASURE_RATIO'] = 1;
				$arItem['CAN_BUY'] = true;
			}
			$arItem['CHECK_QUANTITY'] = $arResult['CHECK_QUANTITY'];
			$arItem['CATALOG_QUANTITY'] = CMarketCatalogProduct::GetQuantity($arItem['ID'], $arItem['IBLOCK_ID']);
			
			if ($arItem['CHECK_QUANTITY'] && $arItem['CATALOG_QUANTITY'] <= 0) {
				$arItem['CAN_BUY'] = false;
			}
			$arItem['CATALOG_TYPE'] = 1; //simple product
		}
		unset($arItem);
	}
}

bitrix:catalog

в параметрах комплексного компонента необходимо указать путь к странице, на которой расположен компонент с большой корзиной Киоска:



Где и в каком виде хранятся заказы клиентов?

Заказы клиентов хранятся в инфоблоке "Заказы" (тип инфоблока "yenisite_market")

Каждый элемент данного инфоблока - отдельный заказ



Как создать несколько типов цен?

Прежде чем создать новый тип цены, необходимо добавить свойство в инфоблок каталога для его хранения:


Далее переходим в раздел "типы цен" (Сервисы->Киоск->Типы цен)

И добавляем новый тип цены


В форме добавления необходимо указать следующие параметры:

  • Название типа цены
  • Символьный код - должен соответствовать символьному коду свойства, которое создали для хранения данного типа цены
  • Выбрать необходимые группы пользователей, которым будет доступна данный тип цены


Может ли Киоск работать на многосайтовости, что для этого нужно сделать?

Да, Киоск может работать на многосайтовости. Для этого необходимо, cкопировать папку /account/ в корневой каталог каждого сайта (где предполагается использование модуля Киоск)*

Далее при оформлении заказа происходит передача перменной SITE_ID в свойство заказа, которые в последующем фильтрутся для каждого сайта

* - данный раздел копируются только на один сайт (который стоит по умолчанию).
В файле /account/order/index.php в параметрах компонента bitrix:news.list (вывод списка заказов), происходит передача SITE_ID для фильтрации заказов по сайту. 

Так же необходимо отметить в шаблонах почтовых собыитий SALE_ORDER и SALE_ORDER_ADMIN галочку для использования их на новых сайтах.

Переходим в почтовое событие


Переходим в шаблон почтового события


И выбираем необходимые сайты уже в шаблоне



Как подключить автоматический обработчик платёжной системы Платрон?

В первую очередь необходимо подключить свой сайт к платежной системе Платрон. Это можно сделать на следующей странице: https://www.platron.ru/info/connect/

После установки модуля "Киоск" в системе появится инфоблок "Платежные системы" типа "Справочники". В этом инфоблоке уже содержится запись для подключения платежной системы. Ее необходимо активировать:


У данного элемента НЕОБХОДИМО либо оставить название "Platron", либо задать символьный код "platron" (с версии 1.5.1)
Далее необходимо изменить элемент "Platron" и указать идентификатор магазина и кодовое слово, которые вы получите, подключив свой сайт к платежной системе.  
Теперь магазин готов к приему платежей через систему Платрон: Скриншот 1 Скриншот 2

Как именно работает «Количественный учёт» в Киоске?

В инфоблоке, указанном как торговый каталог, создается числовое свойство MARKET_QUANTITY для хранения количества товара. Если в настройках Киоска включить количественный учет для каталога товаров, значение в этом поле будет автоматически уменьшаться при оформлении заказа с помощью большой корзины Киоска.

Включение количественного учета


Форма редактирования товара


Получить текущий остаток товара можно с помощью метода CMarketCatalogProduct::GetQuantity($elementID, $iblockID), подробнее в четвёртом примере использования API.

Компонент большой корзины yenisite:catalog.basket для товаров, у которых включен количественный учёт, производит сверку между количеством положенным в корзину и имеющимся количеством в наличии на данный момент. Количество товара автоматически уменьшается до максимально возможного. Если это происходит в момент оформления заказа, например, когда кто-то другой уже оформил заказ с этим же товаром, оформление заказа прерывается и выдаётся сообщение о том, что содержимое корзины изменилось.


Какие настройки нужно обязательно сделать в административном разделе?

1) Отмечаем инфоблоки, которые являются торговыми каталогами нажимаем кнопку “Сохранить”

В инфоблоке, указанном как торговый каталог, создается числовое свойство MARKET_QUANTITY для хранения количества товара и PRICE_BASE для хранения цены (тип цены PRICE_BASE создается по умолчанию, для его редактирования и создания новых типов цен см. пункт "Как создать несколько типов цен").
Если в настройках Киоска включить количественный учет для каталога товаров, значение в этом поле будет автоматически уменьшаться при оформлении заказа с помощью большой корзины Киоска.

2) Далее необходимо заполнить цены и количество каждого товара

Что происходит в процессе установки модуля?

При первой установке модуля "Киоск", автоматически создаются разделы:
/account/orders/ - отображение заказов пользователя;
/account/cart/ - корзина;

После установки модуля во вкладке “Сервисы” будет создано меню настройки модуля “Киоск”.

Модуль создаёт два типа почтовых событий и по одному почтовому шаблону для каждого из них: SALE_ORDER и SALE_ORDER_ADMIN. Первый используется для отправки писем клиенту об успешном оформлении заказа. Второй используется для отправки аналогичного письма администратору сайта (указывается в параметрах компонента yenisite:catalog.basket).


Может ли Киоск оповещать о создании нового заказа? Куда приходят письма?

Да, Киоск оповещает о создании нового заказа как клиента, так и администратора интернет магазина

Адрес администратора необходимо указывать в настройках компонента yenisite:catalog.basket (большая корзина)

Как добавить свойство в умный фильтр?

Для этого необходимо зайти в параметры редактирования соответствующего свойства:

Далее сделать следующие настройки:

Как настроить, чтобы разные группы пользователей видели разные типы цен?

В каждом типе цены нужно указать, каким группам пользователей он доступен (см. предыдущий пункт). Для того, чтобы получить список цен, доступных текущему пользователю, используется метод CMarketPrice::GetItemPriceValues($elementID, $arPrices) - подробнее в третьем примере использования API.

Как настроить добавление свойств в корзину (покупка с характеристикой)?

вывод свойств для покупки в комплексном компоненте bitrix:catalog и всех остальных компонентах каталога активируется с помощью четырёх параметров, которые находятся в группе "Добавление в корзину":

Описание параметров в официальной документации Битрикса.

Вид параметров в настройках компонента.

В качестве PRODUCT_PROPS_VARIABLE необходимо указать стандартное название переменной "prop". Необходимые для добавления характеристики появятся в arResult компонента. В шаблоне нужно вывести поля для выбора характеристик. Можно посмотреть, как это выглядит в стандартных шаблонах Битрикса. Все необходимые свойства товара должны передаваться на сервер в момент добавления в корзину в массиве prop[код_свойства] = ID значения.

При передаче запроса на добавление в корзину должен передаваться массив PROP, содержащий коды свойств в качестве ключей и ID элементов списка в качестве значений.

Передающиеся параметры.

Свойство инфоблока типа "Список".

Свойства, с которыми товар был добавлен в корзину, будут отображаться в шаблонах малой и большой корзины Киоска. В истории заказов в публичной части сайта (шаблон bitronic для компонента bitrix:news.detail). В письмах, которые отправляются администратору и покупателю после оформления заказа. А также в административной части в текстовом поле с описанием заказа.

Проверить, является ли инфоблок торговым каталогом.

CMarketCatalog::IsCatalog($iblockID);

$iblockID - идентификатор проверяемого инфоблока

Метод возвращает 1, если инфоблок является торговым каталогом в Киоске. В противном случае - 0.

Проверить, включен ли количественный учёт для указанного инфоблока.

CMarketCatalog::UsesQuantity($iblockID);

$iblockID - идентификатор проверяемого инфоблока

Метод возвращает 1, если в указанном инфоблоке производится количественный учёт. В противном случае - 0.

Получить список цен, доступных текущему пользователю.

CMarketPrice::GetItemPriceValues($elementID, $arPrices);

$elementID - идентификатор элемента инфоблока (товара)

$arPrices - массив с ценами, где в качестве ключей массива выступают символьные коды типов цен, которые необходимо обработать. Например, массив со списком цен может задаваться в параметрах компонента. После чего, его нужно передать в этот метод, чтобы отсеять цены, недоступные текущему пользователю. В шаблоне компонента bitrix:catalog.element сюда можно передавать массив $arResult['PRICES'], в шаблоне компонентов bitrix:catalog.section и bitrix:catalog.top - массив $arItem['PRICES'] (из цикла перебора товаров). Если второй аргумент не указать, или передать пустой массив, будут выбраны все типы цен, доступные текущему пользователю.

Метод возвращает массив с парами ("КОД_ТИПА_ЦЕНЫ" => "СТОИМОСТЬ_ТОВАРА").

Получить доступное количество для указанного товара.

CMarketCatalogProduct::GetQuantity($elementID, $iblockID);

$elementID - идентификатор элемента инфоблока (товара)

$iblockID - идентификатор инфоблока с каталогом (необязателен, но его отсутствие приводит к дополнительному запросу к базе данных).

Метод возвращает целое число с количеством товара. При возникновении ошибки (товар не найден, отсутствует свойство с количеством) метод возвращает false.

Как поменять текст о новом заказе, который приходит на почту клиенту / админу

Для этого необходимо открыть файл как PHP:
/bitrix/components/yenisite/catalog.basket/lang/ru/component.php

Далее внутри файла видим два шаблона: http://screencast.com/t/3zrFSpmpogX
Соответственно $MESS ['TEXT'] -- шаблон, который уходит на почту клиенту и $MESS ['TEXT_ADMIN'] -- шаблон, который приходит на почту администратору.

ВНИМАНИЕ! Фразы в шаблоне, которые находятся между решеток менять нельзя! (пример: #FIO#) их можно только менять местами, т.к. это макросы для вставки данных о заказе.

Администрирование

Как настроить возможность оплаты заказов через сервис Robokassa?

После установки модуля "Киоск" в системе появится инфоблок "Платежные системы" типа "Справочники" (Контент -> Справочники -> Платежные системы). В этом инфоблоке уже содержится запись для подключения платежной системы. Ее необходимо активировать.
Если модуль "Киоск" был обновлен до версии 1.7.0, тогда необходимо добавить элемент с именем и символьным кодом "robokassa".
http://screencast.com/t/HPKQOtAqHn7k

0. Указать в "Путь до обработчика" путь до обработчика робокассы, если его нет. По умолчанию "/bitrix/modules/yenisite.market/payment/roboxchange/payment.php"


1. Зарегистрируйтесь и оформите свой магазин на сайте робокассы https://auth.robokassa.ru/my/Account/

Пройдите регистрацию в системе ROBOKASSA (http://docs.robokassa.ru/ru#1049)

Создайте магазин в системе ROBOKASSA (http://docs.robokassa.ru/ru#1140)

Выполните техническую настройку (http://docs.robokassa.ru/ru#1160)


2. Обязательные значения для некоторых параметров для регистрации:
https://www.screencast.com/t/yIqpBLbrRJz
id сайта в системе битрикс - https://www.screencast.com/t/JsjiIp01wcYI
Алгоритм расчета хеша - MD5
Метод отсылки данных по Result Url - GET или POST
Result Url - путь до обработчика result робокассы, по умолчанию http://адрес-вашего-сайта/bitrix/tools/yenisite.market/roboxchange/result.php (например http://apparel-lite.romza.ru/bitrix/tools/yenisite.market/roboxchange/result.php)
Success Url - путь до обработчика success робокассы, по умолчанию http://адрес-вашего-сайта/bitrix/tools/yenisite.market/roboxchange/success.php (например http://apparel-lite.romza.ru/bitrix/tools/yenisite.market/roboxchange/success.php)
Fail Url - путь до обработчика success робокассы, по умолчанию http://адрес-вашего-сайта/bitrix/tools/yenisite.market/roboxchange/fail.php (например http://apparel-lite.romza.ru/bitrix/tools/yenisite.market/roboxchange/fail.php)

3. Перенесите некоторые параметры, заполненные при регистрации, создании магазина и технической настройке в параметры элемента робокассы у себя на сайте:
http://screencast.com/t/InGYJHKmwlg
Идентификатор магазина - Логин магазинa (robokassa)
Данное свойство множественное и имеет описание.
Каждый логин магазинa (robokassa) должен соответствовать отдельному идентификатору магазина, созданного вами на сайте робокассы. http://screencast.com/t/i6cS33P5n
В описание необходимо добавить идентификатор соответствующего сайта (например - s1).

Пароль #1 - Пароль магазина (robokassa)
Пароль #2 - Пароль магазина #2 (robokassa)
Пароль #1 - Тестовый пароль магазина (robokassa)
Пароль #2 - Тестовый пароль магазина #2 (robokassa)

Пароли должны быть ОДИНАКОВЫМИ для ВСЕХ магазинов, созданных вами на сайте робокассы.

Тестовый режим
1 - Включить тестовый режим (используется для отладки)
0 или пусто - Выключить тестовый режим
Прочее - ошибка

4. Настройте страницы вашего сайта для граничного взаимодействия пользователя с робокассой:

  При нажатии на кнопку Оформить заказ http://screencast.com/t/yQwWwK0Bx, пользователь попадает на страницу подтверждения создания заказа и кнопки оплаты http://screencast.com/t/1JYqgOF9. Что-бы изменить текст до кнопки оплаты робокассы: Создайте в публичке своего сайта файл \personal\order\payment.php (например Сайт.ru\personal\order\payment.php). Если данный файл будет отсутствовать, тогда будет добавлена стандартная вставка - http://screencast.com/t/yQwWwK0Bx.

  При ошибке оплаты робокассы или отказа от оплаты пользователь попадает на страницу Fail URL http://screencast.com/t/9wQ7fNKq7. Что-бы изменить текст: Создайте в публичке своего сайта файл \personal\order\fail.php (например Сайт.ru\personal\order\fail.php). Если данный файл будет отсутствовать, тогда будет добавлена стандартная вставка - http://screencast.com/t/aFyfcGa6Yf.

  При удачной оплате пользователь попадает на страницу Success URL http://screencast.com/t/n5YcwmqUv9dG. Что-бы изменить текст: Создайте в публичке своего сайта файл \personal\order\fail.php (например Сайт.ru\personal\order\fail.php). Если данный файл будет отсутствовать, тогда будет добавлена стандартная вставка - http://screencast.com/t/Z37McvVI7.

В своих страницах можно использовать переменную $inv_id - номер заказа.
Так же $out_summ - сумма заказа и $Email - E-mail.
В fail в success переменные можно извлечь из $_REQUEST.


5. Протестируйте работу обработчика робокассы на тестовом режиме (не взимается оплата).
По завершении проверки подайте заявку на активацию.

Для разработчиков

Class CMarketBasket

CMarketBasket::Add($id, $props = array(), $quantity = 1);
Добавляет в корзину товар. Количество товаров в корзине записывается в $_SESSION по закодированным параметрам $id и $props.
$id - id товара (обязательное)
$props - код множественного свойства (или в случае свойства-справочникаXML_ID) товара (если есть)(необязательное)
$quantity - количество товара (необязательное)(ВНИМАНИЕ! При превышении данным параметром значения свойства MARKET_QUANTITY, ответственного за количество товара, MARKET_QUANTITY уйдет в минус)

CMarketBasket::DecodeBasketItems($key);
Раскодирует ключ использующийся для записи количества товаров в $_SESSION при добавлении в корзину.
Возвращает массив содержащий $id товара и $props - код(ы) множественного свойства товара.
$key - строка - закодированный товар (обязательное)

CMarketBasket::EncodeBasketItems($id, $props);
Возвращает ключ использующийся для записи количества товаров в $_SESSION при добавлении в корзину. Кодирует ключ из параметров $id и $props.
$id - id товара (обязательное)
$props - массив из кодов множественного свойства (или в случае свойства-справочникаXML_ID) товара, если у товара нет множественных свойств то необходимо задать пустой массив.

CMarketBasket::Delete($key);
Удаляет товар из корзины. Очищает $_SESSION по ключу $key.
$key - строка - закодированный товар (обязательное)

CMarketBasket::setQuantity($key, $quantity);
При присутствии товара, с указанным ключом, в корзине ($_SESSION['YEN_MARKET_BASKET']) - устанавливает для него количество добавленное в корзину равное $quantity.
$key - строка - закодированный ключ товара (обязательное)
$quantity - число - количество товара (обязательное)(ВНИМАНИЕ! Если $quantity<=0, тогда товар с указанным ключом удаляется из корзины)

CMarketBasket::getCartTotal();
Возвращает массив содержащий общую сумму товаров (SUM_FORMATTED), находящихся в корзине, а так же их суммарное количество (QUANTITY).
array('BUY' => array('SUM_FORMATTED' => XXX, 'QUANTITY' => YYY))

CMarketBasket::GetList($id, $iblock_id = false);
Возвращается объект CDBResult с массивом содержащим перечисление товаров находящихся в указанном заказе ($id).
$id - id заказа (обязательное)
$iblock_id - id инфоблока заказов (необязательное). Если значение не задано, id инфоблока определяется по символьному коду YENISITE_MARKET_ORDER (дополнительные запросы - увеличивают время выполнения)

Class CMarketPrice

CMarketPrice::GetList($by = 'id', $order = 'desc');
Отдает все параметры всех типов цен, записанных в Сервисы -> Киоск -> Типы цен
Ответ формируется из таблицы yen_market_catalog_price, сортировка по полю $by (по дефолту "id") в порядке $order (по дефолту "desc").
$by - поле сортировки (необязательное)
$order - порядок сортировки (необязательное)

CMarketPrice::GetItemPriceValues($productID, $arPrices = array());
Возвращает массив (Тип цены => Значение для товара) все заполненные значения цен для конкретного товара для всех или указанных типов цен.
$productID - id товара (обязательное)
$arPrices - символьные коды типов цен; если передается пустой массив - array() - то для ответа учитываются все типы цен (необязательное)

CMarketPrice::GetPriceGroup($id);
Возвращает массив id групп пользователей, которым доступен указанный тип цены.
Доступность группам пользователей типа цены задается при создании или редактировании типов цен в Сервисы -> Киоск -> Типы цен.
Группы пользователей можно увидеть в Настройки -> Пользователи -> Группы пользователей.
$id - id или символьный код типа цен (обязательное)

CMarketPrice::IsCanAdd($id);
Проверка на доступность пользователю типа цены.
Возвращает 1 если пользователь состоит в группе пользователей которой доступен конкретный тип цен.
Возвращает 0 если пользователь НЕ состоит в группе пользователей которой доступен конкретный тип цен.
$id - id или символьный код типа цен (обязательное)


CMarketPrice::GetByCode($code);
Возвращает объект mysqli_result с параметрами указанного по символьному коду типа цен или false если такого типа цен не существует.
$code - символьный код типа цен (обязательное)
Пример:
$code = "PRICE_BASE";
$db_res = CMarketPrice::GetByCode($code);
$ar_res = $db_res->GetNext();
if ($ar_res != false){
print_r($ar_res);
}

CMarketPrice::GetByID($id);
Возвращает объект mysqli_result с параметрами указанного по id типа цен или false если такого типа цен не существует.
$id - id типа цен (обязательное)
Пример:
$id = 1;
$db_res = CMarketPrice::GetByID($id);
$ar_res = $db_res->GetNext();
if ($ar_res != false){
print_r($ar_res);
}

CMarketPrice::Update($id, $name, $code, $base, $group);
При помощи этой функции можно внести правки в уже существующие типы цен.
$id - id (обязательное) - по этому параметру вносятся изменения.
$name - название типа цен (обязательное)
$code - символьный код типа цен (обязательное)
$base - флаг базового типа цен (обязательное) - принимает значения "Y" и "N" (обязательное)
$group - массив содержащий перечисление групп пользователей для которых доступен данный тип цен (обязательное)
При изменении названия и/или символьного кода типа цен так же будут внесены изменения в название и/или код соответствующего свойства инфоблока каталога товаров.
А так же при присвоении $base значения "Y", тип цены с отмеченным базовым типом будет изменен, т.е. тип цены с отмеченным базовым типом, который был до вызова функции, примет значение $base = "N".
Попытка снять флаг базового типа цен будет проигнорирована - всегда должен быть один базовый тип цен.

CMarketPrice::GetBasePrice();
Возвращает объект mysqli_result с параметрами базового типа цен или false если нет ни одного типа цен
Пример:
$id = 1;
$db_res = CMarketPrice::GetByID($id);
$ar_res = $db_res->GetNext();
if ($ar_res != false){
print_r($ar_res);
}

CMarketPrice::Delete($id);
Удаляет указанный тип цен.
$id - id типа цен (обязательное)

CMarketPrice::Add($name, $code, $base, $group);
При помощи этой функции можно внести правки в уже существующие типы цен.
$name - название типа цен (обязательное)
$code - символьный код типа цен (обязательное)
$base - флаг базового типа цен (обязательное) - принимает значения "Y" и "N" (обязательное)
$group - массив содержащий перечисление групп пользователей для которых доступен данный тип цен (обязательное)
Если символьный код ($code) нового типа цен будет совпадать с символьным кодом уже существующего типа цен, добавления не будет.
А так же при присвоении $base значения "Y", тип цены с отмеченным базовым типом будет изменен, т.е. тип цены с отмеченным базовым типом, который был до вызова функции, примет значение $base = "N".

Class CMarketCatalog

CMarketCatalog::GetList($by = "id", $order = "asc");
Возвращает объект mysqli_result с массивом содержащим id записи, id инфоблока и флаг количественного учета инфоблоков отмеченных как торговые каталоги.
Настройка возможна в административной части Сервисы -> Киоск -> Каталог товаров
Ответ формируется из таблицы yen_market_catalog сортировка по полю $by (по дефолту "id") в порядке $order (по дефолту "asc").
$by - поле сортировки (необязательное)
$order - порядок сортировки (необязательное)

CMarketCatalog::Add($iblock_id, $use_quantity = 0);
Причисляет инфоблок к торговым каталогам (аналогичен отметке "Является торговым каталогом" в Сервисы -> Киоск -> Каталог товаров).
Возвращает 0 если инфоблок уже является торговым каталогом или id добавленной записи в таблице, с инфоблоками являющимися торговыми каталогоми, yen_market_catalog.
$iblock_id - id инфоблока (обязательное)
$use_quantity - отметка включения количественного учета (необязательное), по дефолту количественный учет НЕ включен.

CMarketCatalog::Delete($id);
Снимает отметку "Является торговым каталогом" с инфоблока по id записи в таблице, с инфоблоками являющимися торговыми каталогами, yen_market_catalog.
$id - id инфоблока (обязательное), принимает значения id записи в таблице yen_market_catalog или - '*', тогда флаг "Является торговым каталогом" снимается со всех инфоблоков.

CMarketCatalog::IsCatalog($iblock_id);
Проверка инфоблока на принадлежность к торговым каталогам.
Возвращает 1 если инфоблок является торговым каталогом.
Возвращает 0 если инфоблок НЕ является торговым каталогом.
$iblock_id - id инфоблока (обязательное)

CMarketCatalog::UsesQuantity($iblock_id);
Проверка активности параметра "Количественный учет" для инфоблоков являющихся торговыми каталогами.
Возвращает 1 если параметр "Количественный учет" включен.
Возвращает 0 если параметр "Количественный учет" НЕ включен.
$iblock_id - id инфоблока (обязательное)

Class CMarketCatalogProduct

private CMarketCatalogProduct::_GetByID($element_id, $iblock_id);
Приватный метод.
Возвращает массив со значениями следующих параметров для конкретного товара ($element_id): Количество товара (число или false, если значение отсутствует), включен или нет "Количественный учет" (N/Y), 'CAN_BUY_ZERO' => 'N'.

private CMarketCatalogProduct::_GetQuantity($element_id, $iblock_id);
Приватный метод.
Возвращает количество товара (свойство MARKET_QUANTITY) или false, если значение отсутствует, для конкретного товара ($element_id).

private CMarketCatalogProduct::_TraceQuantity($delta, $element_id, $iblock_id);
Приватный метод.
Уменьшает количество товара (свойство MARKET_QUANTITY) на $delta для конкретного товара ($element_id).
Возвращает false, если не включен количественный учет для инфоблока $iblock_id.
Возвращает true, если уменьшение количества товара прошло штатно.

private CMarketCatalogProduct::__checkID(&$element_id, &$iblock_id);
Приватный метод.
Проверяет id товара и инфоблока на корректность и если это необходимо ищет и восстанавливает id инфоблока по id товара.
Возвращает true, если
$element_id<=0
или обнаружено отсутствие товара при восстановлении значения $iblock_id (если $iblock_id<=0).
Возвращает false, если id товара и инфоблока принимают положительное (корректное) значение.

CMarketCatalogProduct::GetByID($element_id, $iblock_id = 0);
Проверяет на на корректность (положительность) id товара и инфоблока и передает эти значения приватному методу _GetByID.
Возвращает массив со значениями следующих параметров для конкретного товара ($element_id): Количество товара (число или false, если значение отсутствует), включен или нет "Количественный учет" (N/Y), 'CAN_BUY_ZERO' => 'N'.
$element_id - id товара (обязательное)
$iblock_id - id инфоблока (необязательное), если значение не задается или принимает значение <=0, то при проверке на корректность будет найдено и восстановлено по id товара (дополнительные запросы - увеличивают время выполнения)

CMarketCatalogProduct::GetQuantity($element_id, $iblock_id = 0);
Проверяет на на корректность (положительность) id товара и инфоблока и передает эти значения приватному методу _GetQuantity.
Возвращает количество товара (свойство MARKET_QUANTITY) при успешном выполнении.
Возвращает false, если
значение свойства для конкретного товара ($element_id) отсутствует
или сам товар ($element_id) не существует.
$element_id - id товара (обязательное)
$iblock_id - id инфоблока (необязательное), если значение не задается или принимает значение <=0, то при проверке на корректность будет найдено и восстановлено по id товара (дополнительные запросы - увеличивают время выполнения)

CMarketCatalogProduct::TraceQuantity($delta, $element_id, $iblock_id = 0);
Проверяет на на корректность (положительность) $delta, id товара и инфоблока и передает эти значения приватному методу _TraceQuantity.
Уменьшает количество товара (свойство MARKET_QUANTITY) на $delta для конкретного товара ($element_id).
Возвращает false, если
не включен количественный учет для инфоблока $iblock_id,
величина уменьшения количества товара - $delta <=0,
значение свойства для конкретного товара ($element_id) отсутствует
или сам товар ($element_id) не существует.
Возвращает true, если уменьшение количества товара прошло штатно.

Как передавать количество товара в корзину?

Для этого, в первую очередь, нужно в параметрах компонента каталога разрешить указывать количество товара: http://screencast.com/t/mmmpfp5OCvU
Затем это количество необходимо передавать при добавлении в корзину в GET параметре.
Пример ссылки: http://site.ru/catalog/element/71/?action=ADD2BASKET&id=71&quantity=3

Поясним как это сделать.

Для того что бы добавить кнопку купить, для покупки одной единицы товара, мы например, в код компонента bitrix:catalog.element, добавляли следующий код:

<noindex>
< a href="<?echo $arResult["BUY_URL"]?>" rel="nofollow"><?echo GetMessage("CATALOG_BUY")?></a > 
< a href="<?echo $arResult["ADD_URL"]?>" rel="nofollow"><?echo GetMessage("CATALOG_ADD_TO_BASKET")?></a > 
</noindex>

Константы в языковом файле: 
$MESS["CATALOG_ADD_TO_BASKET"] = "В корзину"; 
$MESS["CATALOG_BUY"] = "Купить";


В $arResult["BUY_URL"] содержится http://сайт/раздел каталога/файл.php?action=BUY&id=ИД_элемента
В $arResult["ADD_URL"] содержится http://сайт/раздел каталога/файл.php?action=ADD2BASKET&id=ИД_элемента

Как мы видим данные ссылки немногим отличаются от ссылки для кнопки с передаваемым количеством товара.

Усовершенствуем передачу товаров в корзину, что бы пользователи могли добавлять необходимое им количество товаров.

Для этого вместо тега <a>, для создания ссылки, мы будем использовать тег <form>, для установки формы на странице:
- В форме мы передаем все необходимые параметры, в том числе id товара (name="id") и его количество (name="quantity").
- Поля с именами action и id пользователь изменить не может. Для quantity (количество) пользователь может поставить необходимое ему число.
<form action="<?echo $arResult["BUY_URL"]?>" method="get">
 <input type="text" value="BUY" name="action" hidden />
 <input type="text" value="<?=$arResult["ID"]?>" name="id" hidden />
 <input type="text" value="1" name="quantity" />
 <button type="submit"><?echo GetMessage("CATALOG_BUY")?></button>
</form>

<form action="<?echo $arResult["ADD_URL"]?>" method="get">
 <input type="text" value="ADD2BASKET" name="action" hidden />
 <input type="text" value="<?=$arResult["ID"]?>" name="id" hidden />
 <input type="text" value="1" name="quantity" />
 <button type="submit"><?echo GetMessage("CATALOG_ADD_TO_BASKET")?></button>
</form>

Константы в языковом файле: 
$MESS["CATALOG_ADD_TO_BASKET"] = "В корзину"; 
$MESS["CATALOG_BUY"] = "Купить";


Код для компонента bitrix:catalog.section будет выглядеть так (соответствие может быть не полным - переменные содержащие параметры могут отличаться, все зависит от кастомизируемого шаблона): 

<form action="<?echo $arResult["BUY_URL"]?>" method="get">
 <input type="text" value="BUY" name="action" hidden />
 <input type="text" value="<?=$arItem["ID"]?>" name="id" hidden />
 <input type="text" value="1" name="quantity" />
 <button type="submit"><?echo GetMessage("CATALOG_BUY")?></button>
</form>

<form action="<?echo $arResult["ADD_URL"]?>" method="get">
 <input type="text" value="ADD2BASKET" name="action" hidden />
 <input type="text" value="<?=$arItem["ID"]?>" name="id" hidden />
 <input type="text" value="1" name="quantity" />
 <button type="submit"><?echo GetMessage("CATALOG_ADD_TO_BASKET")?></button>
</form>

Константы в языковом файле: 
$MESS["CATALOG_ADD_TO_BASKET"] = "В корзину"; 
$MESS["CATALOG_BUY"] = "Купить";


Для передачи в корзину товара с выбором характеристик необходимо добавить в ссылке параметры вида:
prop[#КОД свойства#]
http://site.ru/catalog/element/71/?action=ADD2BASKET&id=71&quantity=3&prop[COLOR_REF]=purple&prop[SIZE]=50

На примере формы:
<form action="<?echo $arResult["BUY_URL"]?>" method="get">
 <input type="text" value="BUY" name="action" hidden />
 <input type="text" value="<?=$arItem["ID"]?>" name="id" hidden />
 <input type="text" value="1" name="quantity" />
 <input type="text" value="purple" name="prop[COLOR_REF]" />
 <input type="text" value="50" name="prop[SIZE]" />
 <button type="submit"><?echo GetMessage("CATALOG_BUY")?></button>
</form>

Class CMarketOrderProperties

CMarketOrderProperties::GetList($arSort);
Возвращает объект CDBResult с массивом активных свойств инфоблока заказов. Инфоблок заказов определяется по символьному коду YENISITE_MARKET_ORDER.
$arSort - Массив для сортировки, имеющий вид by1=>order1[,by2=>order2 [, ..]], (обязательное) где: by - поле сортировки, может принимать значения:
id - код;
block_id - код информационного блока, которому принадлежит свойство; name - название;
name - название;
active - активность;
sort - индекс сортировки;
timestamp_x - дата последнего изменения
searchable - по признаку участия значения свойства в поиске;
filtrable - по признаку участия свойства в фильре на странице списка элементов;
order - порядок сортировки, может принимать значения:
asc - по возрастанию;
desc - по убыванию;

CMarketOrderProperties::Add($name, $code, $type = "S", $multiple = "N");
Добавляет новое свойство в инфоблок заказов.
Возвращает id свойства если добавление проведено успешно и 0, если инфоблок заказов (YENISITE_MARKET_ORDER) не существует или свойство с указанным символьным кодом ($code) уже существует или добавление свойтсва оказалось неудачным.
$name - название свойства (обязательное)
$code - символьный код свойства (обязательное)
$type = "S" - тип свойства (необязательное), по дефолту тип - строка
$multiple = "N" - отметка о множественности свойства (необязательное), по умолчанию - свойство не множественное

Class CMarketOrder

CMarketOrder::GetByID($id);
Возвращает массив свойств конкретного заказа ($id), в том числе и данные о платежной системе.
$id - id заказа (обязательное)

CMarketOrder::GetList($arOrder = array("SORT"=>"ASC"), $arFilter = array(), $arGroupBy = false, $arNavStartParams = false, $arSelectFields = array());
Возвращает список активных заказов.
Использует CIBlockElement::GetList.
Устанавливает базовый фильтр:
$baseFilter = array(
"IBLOCK_CODE" => "YENISITE_MARKET_ORDER",
"ACTIVE" => "Y",
"PROPERTY_SITE_ID" => SITE_ID
);
Базовый фильтр ($baseFilter) и фильтр заданный в параметрах ($arFilter) склеиваются и попадают в вызов CIBlockElement::GetLis.
Остальные параметры передаются для вызова CIBlockElement::GetLis без изменений. О них можно прочитать в документации для разработчиков 1C-Битрикс: Управление сайтом https://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockelement/getlist.php.

CMarketOrder::SetStatus($id,$status);
Устанавливает статус конкретного заказа ($id).
$id - id заказа (обязательное)
$status - принимает значение "PAYED", переводя заказ в статус - Оплачен.

CMarketOrder::GetStatus($id);
Определяет статус оплаты конкретного заказа ($id).
Возвращает PAYED, если заказ был оплачен и NOT_PAYED, если не был.
$id - id заказа (обязательное)

CMarketOrder::CheckAccessToOrder($email, $id, $iblock_id);
Определяет доступность заказа для пользователя.
Проверка для зарегистрированного пользователя - выборка заказов по UserID и соответствие их $id проверяемого заказа.
Проверка для НЕ зарегистрированного пользователя - соответствие введенного $email (email или номер телефона) указанному при оформлении заказа $id.
Возвращает массив array(messege, error).
messege - объяснения для пользователя что и куда вводить
error - сообщения о неправильно введенных данных для пользователя
$id - id заказа (обязательное)
$iblock_id - id инфоблока заказов (обязательное)
$email - email или номер телефона для проверки доступности заказа для НЕ зарегистрированных пользователей

Class CMarketPayment

CMarketPayment::GetByName($name);
Возвращает массив с id платежной системы по ее названию или символьному коду.
$name - название или символьный код платежной системы (обязательное)

Как добавить проверку доступности заказа для пользователя?

В $ERROR пишем проверку доступности заказа для пользователя:
$ERROR = CMarketOrder::CheckAccessToOrder($_REQUEST['email'], $_REQUEST['ID'], $IBLOCK_ID);
ps. для начала достаточно передать только id заказа - для зарегистрированного пользователя ошибок не будет - для НЕ зарегистрированного выведется форма проверки доступа
И далее проверка на наличие ошибок в введенных данных у пользователя:
if(!empty($ERROR['error'])){
//Форма ввода id заказа и проверочных данных и вывод предупреждений для пользователя
//Например:
<form action="#" method="post">
<label>
<? foreach($ERROR['messege'] as $messege){ ?>
<p><?= $messege ?></p> // вывод сообщений для объяснения использования данной формы для пользователя 
<? } ?>
<? foreach($ERROR['error'] as $errorMessege){ ?>
<p><?= $errorMessege ?></p> // вывод сообщений об ошибочно введенных пользователем данных
<? } ?>
</label>
<div>
<input name="ID" value="<?= $_REQUEST['ID']?$_REQUEST['ID']:"" ?>"> //id заказа
<input name="email" value="<?= $_REQUEST['email']?$_REQUEST['email']:"" ?>"> // email или номер телефона
<span>
<button>OK</button>
</span>
</div>
</form>
}else{
//проверка пройдена, можно выводить детальную информацию о заказе
}

GoogleCaptcha от ROMZA

Как получить ключи для Google Cpatcha

Для того чтобы получить специальные ключи необходимо зарегистрироваться на сайте гугл https://www.google.com/recaptcha/admin#list .

Далее необходимо зарегистрировать ваш сайт в специальной форме, и заполнить в ней все данные по примеру:

09-08-2018 13-39-44.jpg

после этого у вас появится новый элемент в списке сайтов на странице https://www.google.com/recaptcha/admin#list . Необходимо зайти в него, и вам откроется страница с вашими ключами:

09-08-2018 13-41-40.jpg 

Выгрузка в торговые площадки (компонент 2.0)

Общие вопросы

Что делать, если возникает ошибка "XML declaration allowed only at the start of the document"?

Такая ошибка возникает, если в начале документа выгрузки обнаружены лишние символы: http://screencast.com/t/MtOgPZrakg (чтобы вызвать такое окно, нужно открыть исходный код страницы CTRL + U).

Перед проверкой, нужно убедиться что все файлы в кодировке UTF-8 без BOM.

Здесь необходимо проверить в первую очередь сам сайт на наличие этих пробелов: заходим на главную и нажимаем сочетание CTRL + U (откроется исходный код страницы). Если пробелы находятся на сайте, то нужно проверить следующие файлы на наличие лишних символов в начале файла перед тегом
  1. проверить файл bitrix/php_interface/init.php (и файл bitrix/php_interface/SITE_ID/init.php)
  2. проверить файл header.php вашего шаблона
  3. проверить файл  \bitrix\modules\fileman\fileman.php   http://screencast.com/t/xT0NIGQdeeSO
Если не поможет, то необходимо в файле вызова компонента выгрузки
Вставить вместо require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
Вот такую конструкцию:
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
global $USER;
if($USER->IsAdmin())
      require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");

И протестировать выгрузку.

Как сделать фильтрацию по конкретному значению Highload-блока?

Для фильтрации по выбранному значению необходимо задать фильтр перед вызовом компонента

На примере фильтр по определенному бренду

<?global $arrFilter;
$arrFilter = array("!PROPERTY_BRANDS_REF" => "XML_ID элемента");
?>

Где BRENDS_REF название свойства связанного с Highload-блоком.

Как определить оптимальное количество обрабатываемых товаров для 1 шага

Для этого необходимо включить скрытый параметр "DEBUG_LOG" => true, 
для этого включаем режим правки:


Жмем "Изменить страницу" -> "В режиме PHP-кода"


Добавляем запись "DEBUG_LOG" => true и сохраняем


после генерации рядом с генерируемым файлом будет лежать лог у него такое-же имя с добавленным расширением .log, например ys_ym_1fae10b.xml.log


Открываем или скачиваем файл и изучаем содержимое:


тут 
[STEP 2] — номер шага (если все делается за один шаг то будет всегда 1)
IsAgent: — запуск генерации был на агенте или нет (1 или 0)
StartDate — дата старта генерации шага
Memory — потребляемая память на текущий момент (в скобках с параметром real подробнее про это)
MemoryPeak —  Максимальное количество потребляемой памяти на текущий момент
-- EXECUTE COMPONENT-- — момент выполнения основной части компонента
FinishDate — дата завершения текущего момента 
StepTime — выполнение текущего момента в секундах
-- EXECUTE PARAMS -- — момент получения выбранных свойств для товара
TotalTime — суммарное время выполнения на текущий момент
-- EXECUTE TEMPLATE-- — момент выполнения шаблона

Важно учитывать количество потребляемой скриптом памяти. В пиках она должна быть меньше максимально доступной PHP памяти хотя бы на 10%.
На данном примере выгружается 50 товаров с обработкой ~100 свойств и среднее итоговое время выполнения (последний TotalTime в шаге) по всем шагам примерно 3-4 сек.
Если у вас на сайте Агенты не переведены на CRON (Документация, Статья) то это много, для комфортной работы пользователей, нужно чтобы среднее время обработки шага было в районе 1 секунды (чем меньше тем — лучше).
Рекомендуем переводить выполнение Агентов на CRON.



Как включить пошаговую выгрузку и настроить агента?

включаем режим правки:


Заходим в настройка компонента:


Нас интересуют 3 параметра:


"Количество товаров обрабатываемых за один шаг" —положительное число от 0, если выбран 0 то выгрузка будет проходить за 1 шаг. Внимание! в этом числе НЕ учитываются торговые предложения.
То есть если у вас 1 товар у которого 100 торговых предложений то при обработке шага будут обработаны ВСЕ торговые предложения этого товара. Например если вы выбрали обрабатывать 100 товаров за один шаг и у каждого товара есть по 5 торговых предложений то суммарно за шаг будут обработано не 100, а 500 товаров.
Учитывайте это при выборе нужного числа.
о том как оптимально подобрать оптимальное число читайте ниже

"Обновлять автоматически на Агенте" — если включен этот параметр, то создается агент (подробнее про агентов) который будет обновлять выгрузку через заданный промежуток времени который указывается в соответствующем параметре — "Время в секундах через которое необходимо обновлять выгрузку"

Рекомендуем переводить выполнение агентов на CRON (Документация, Статья)

Для разработчиков

Как выгружать товары с разных складов\городов на Яндекс.Маркет и другие торговые площадки?

Сначала включаем режим правки:


Затем в настройках компонента выбираем нужные нам цены для нужного нам региона
Настройка цен


Жмем "Изменить страницу" -> "В режиме PHP-кода"



Нам надо определить 2 фильтра (один для SKU\Торговых предложений) второй для самих товаров (если у вас не используется торговые предложения то можно только 1 фильтр задействовать:



$arrFilter = &$GLOBALS['arrFilter'];
$arSKUrFilter = &$GLOBALS['arrSKUFilter'];
$arFilter = array(
        ">CATALOG_STORE_AMOUNT_23" => 0,
);
$arrFilter = $arFilter;
$arSKUrFilter = $arFilter;

где определяем что должны выбраться товары и их торговые предложения у которых остаток на складе с ID 23 больше (символ > в начале CATALOG_STORE..) нуля.

Если нужно чтобы в одну выгрузку попали товары которые есть хотя бы на двух складах.
Например для Битроник2 ПРО -- нужно перечислить все склады которые относятся к 1 городу.
То нам нужно определить переменную $arFilter следующим образом:

$arFilter = array(
         array(
                   "LOGIC" => "OR",
                    array(">CATALOG_STORE_AMOUNT_23" => 0,),
                    array(">CATALOG_STORE_AMOUNT_25" => 0,),
                    // перечисляем таким способом все нужные склады
          ),
);

и так далее, а затем обновить файл выгрузки.

Готовые примеры для решения Bitonic2 PRO
Пример для МосквыПример для Красноярска

Выгрузка для Москвы
Выгрузка для Красноярска
Выгрузка для Екатеринбурга
Выгрузка для Новосибирска 

Настройка модулей ROMZA в типовом решении

Как настроить выгрузку в яндекс маркет?

Сразу после установки компонента, на сайте появляется папка ys-ym, в индексной странице которого находится вызов компонента:
2017-05-01_1032.png
В режиме правки необходимо зайти в параметры компонента и выбрать инфоблок для создания файла:
2017-05-01_1034.png
Вы можете выбрать либо весь инфоблок, либо отдельные разделы для выгрузки.

Все обязательные теги поддерживаются шаблоном vendor.model_new

2017-05-18_0904.png


Как добавить теги CPA к товарам в выгрузке?

Для этого необходимо создать свойство в инфоблоке товаров типа список с 2мя значениями:
2017-05-01_1037.png
После этого, в параметрах компонента достаточно указать свойство, откуда брать значения CPA:
2017-05-01_1039.png
И обновить файл выгрузки.

Как выгружать дополнительные параметры товара на Яндекс Маркет?

Для этого необходимо указать, какие параметры необходимо выгружать.
Для этого, в параметрах компонента выгрузки на странице ys-ym необходимо их выбрать:
2017-05-01_1043.png
И обновить файл выгрузки.
На примере артикула:
2017-05-01_1044.png

Как одновременно выгружаться на Яндекс Маркет и в Google Merchant?

Для этого необходимо использовать разные файлы прайс листов с разными шаблонами.
Предположим, что выгрузку для Яндекс маркета вы уже настроили.
Чтобы настроить выгрузку в Google-вам необходимо:
1) С главной страницы сайта создать новый раздел ( назовем его gm ):
2017-05-01_1049.png
Пункт меню создавать не будем, и сразу перейдем к редактированию индексной страницы.
2) Разместим компонент на странице:
2017-05-01_1051.png
3) И выберем шаблон для Google:
2017-05-01_1052.png

Готово!
Сохраняем результат, и теперь-на странице адрес_вашего_сайта/gm/ мы разместили вызов компонента-теперь в режиме правки вам остается настроить компонент и обновить файл.

Не обновляется файл выгрузки-белый экран.

Такое может случиться, если за 1 шаг компонент пытается обработать большое количество товаров-и упирается в лимит по времени или по памяти на вашем веб сервере.
Чтобы этого не происходило, в компонент специально добавлен функционал пошагового создания файла выгрузки.

В параметрах компонента укажите-какое количество товаров обрабатывать за 1 шаг:
2017-05-01_1118.png
Для большинства наших клиентов-оптимальное количество-это 100 товаров за 1 шаг.

Ресайзер 2

Общие вопросы

Можно ли установить на демо-версию Битрикс?


Нет, модуль устанавливается только на ПО 1С-Битрикс с активной возможностью получения обновлений и технической поддержки, поскольку привязывается к лицензионному ключу Битрикс.

Как отображать фото с прозрачным фоном через ресайзер без белой заливки

Чтобы фотографии отображались без заливки необходимо сделать следующее:
1. Зайти в набор Ресайзера 2 (Для каждого набора настраивается отдельно):2017-11-06_15-28-32.png

2. Напротив параметра "Приоритет" из выпадающего списка выберите "Вписать без заливки оставшихся областей"
2017-11-06_15-34-11.png

3. Затем сбросить кеш Ресайзера и кеш сайта
2017-11-08_13-50-11.png
2017-11-08_13-52-09.png

Как вывести водяной знак

Для того, чтобы вывести водяной знак необходимо:
1) В настройках ресайзера внести необходимые параметры водяного знака
Водяной знак 1

2) Переходим в наборы и заходим в параметры набора, для которого хотим вывести водяной знак
Водяной знак 2

3) Ставим галочку в пункте «Водяной знак» и сохраняем
Водяной знак 3

4) Сбрасываем кеш ресайзера 
Водяной знак 4

Не работает ресайзер на втором сайте в режиме многосайтовости

Модуль ресайзер устанавливается на платформу 1 раз.
При установке в режиме многосайтовости, убедитесь-что вы создали символьные ссылки не только на папку upload и bitrix, а также на папку resizer2.
Подробнее про символьные ссылки на многосайтовости



Предположим, вы хотите-чтобы на разных сайтах в карточке товара на фото выводились разные водяные знаки.
Для этого необходимо создать дополнительный набор для второго сайта,  установить ему необходимый водяной знак.
Пример:

2017-05-26_1350.png

2017-05-26_1352.png


У ресайзенных фото черный фон

Если у изображения оригинала нет черного фона, а у ресайзенной миниатюры появляется черный фон, проверьте следующее:

Включена ли у используемого набора Ресайзера конвертация расширения? Возможна ситуация, что исходное (оригинальное) изображение хранится в формате PNG с прозрачным фоном, и у используемого набора включена конвертация в JPG. Формат JPG не поддерживает использование прозрачных областей на картинке

Для решения данного вопроса мы предлагаем 2 варианта:
1) У используемого набора набора Ресайзера отключить принудительную конвертацию какой-либо формат. Тогда ресайзенные изображения будут создаваться в том же расширении, что и оригинал (рекомендуем этот вариант)
2) У используемого набора набора Ресайзера включить приоритет "Вписать с заливкой оставшихся областей", тогда прозрачные области будут залиты цветом выбранным в настройках (по-умолчанию белый)

Как загрузить превью-картинки в облачное хранилище?

Для того, чтобы переместить файловый кеш Ресайзера в облачное хранилище, необходимо зарегистрировать аккаунт в одном из таких хранилищ, которые поддерживаются платформой 1С-Битрикс, настроить подключение к своему облачному хранилищу в административной части вашего сайта и задать необходимые правила для отбора файлов в облачное хранилище. 
Настройка и работа с облачными хранилищами подробно освещена в учебных курсах и документации 1С-Битрикс.

Для того, чтобы кеш Ресайзера загружался в облако, в правилах облачного хранилища необходимо указать модуль "yenisite.resizer2".

4cd29ce5ecbf7a2c831e8732fd32c01f.png


В списке правил нельзя оставлять пустые поля, это приведет к загрузке в облако всех файлов от всех модулей.

d1b8b9cf276e20f366dd625f2b53e7ea.png

Желательно не указывать модуль iblock - если исходные изображения будут выгружены в облако, тогда Ресайзеру придется каждый раз скачивать каждую картинку из облака при необходимости создать уменьшенную копию или копию с водяным знаком. Это может сказаться негативно на времени выполнения первых хитов, когда Ресайзер еще не создал свой кеш.

Также, если выполнение первых хитов с генерацией кеша занимает неприлично много времени, можно деактивировать облачное хранилище. Пройти по страницам сайта, чтобы сгенерировать кеш ресайзера локально. Затем снова активировать облачное хранилище и переместить в него созданные файлы.


Почему не сохраняются настройки наборов?



Настройки наборов могут не сохраняться по причине отключенного управляемого кеша на сайте.

Как установить различные водяные знаки для разных из сайтов? (В режиме многосайтовости)



В настройках набора устанавливаем конкретный водяной знак для данного набора (http://prntscr.com/6zska6). Далее используем разные наборы на разных сайтах.

Что такое набор?



Набор - параметры сжатия картинки, в разных частях сайта одна и та же картинка может выводиться по разным наборам, например, на главной в баннере будем использовать набор с параметрами 400*400 пикс а на детальной ту же самую картинку обработаем другим набором параметрами 300*300 пикс. Наборы можно увидеть в админпанели настроек ресайзера (http://prntscr.com/6zsjrj)

Как подключить модуль, если необходим только путь до сжатой картинки? (Вызов самой картинки через компонент необязателен)



В качестве примера рассмотрим компонент catalog.top в стандартном шаблоне eshop

Первое что необходимо сделать - создать наборы для каждого типа выводимых изображений.
Например в "Трендах сезона" выводятся изображения шириной 113px. Т.к. изображения квадратные, то высота будет равна тоже 113px (http://prntscr.com/6tzpbm)
Соответственно необходимо создать набор (http://prntscr.com/6tzqm4). Заметьте ID набора - 8, он понадобится нам в дальнейшем

Далее нужно приспособить данный набор для вывода в этом компоненте (catalog.top - шаблон для секции (section))
Копируем шаблон компонента.

Далее ищем вызов картинки для данного шаблона (файл - /bitrix/templates/ШАБЛОН САЙТА/components/bitrix/catalog.top/НАЗВАНИЕ СКОПИРОВАННОГО ШАБЛОНА/section/template.php) (http://prntscr.com/6tzt0e)

Т.к. вывод картинки в данном шаблоне осуществляется через стили, то вывод компонента здесь будет неуместен и нам необходимо обратиться к API модуля для получения пути до сжатых изображений. Для этого, в файле result_modifier.php ( /bitrix/templates/ВАШ ШАБЛОН/components/bitrix/catalog.top/НАЗВАНИЕ СКОПИРОВАННОГО ШАБЛОНА) в самом конце перед закрывающим тегом ?> добавляем следующий код:

//Подключаем модуль ресайзера
if (CModule::IncludeModule('yenisite.resizer2'))
{
foreach ($arResult['ITEMS'] as $key => $arItem) //создаем цикл по всем элементам массива c товарами
{
//присваиваем значения конечному результирующему массиву arResult
$arResult['ITEMS'][$key]['PREVIEW_PICTURE']['SRC'] = CResizer2Resize::ResizeGD2($arItem['PREVIEW_PICTURE']['SRC'],8); //Вызываем метод сжатия для изображения (цифра 8 говорит об ID набора, который мы создали на первом этапе)
//в данном случае вызываем метод сжатия если есть вторая картинка (!empty($arItem['PREVIEW_PICTURE_SECOND'])) если ее нет, то присваиваем значение PREVIEW_PICTURE
$arResult['ITEMS'][$key]['PREVIEW_PICTURE_SECOND']['SRC'] = !empty($arItem['PREVIEW_PICTURE_SECOND']) ? CResizer2Resize::ResizeGD2($arItem['PREVIEW_PICTURE_SECOND']['SRC'],8) : $arResult['ITEMS'][$key]['PREVIEW_PICTURE']['SRC'];
}
}


$arResult['ITEMS'][$key]['PREVIEW_PICTURE']['SRC'] - свойство в котором храниться путь до перовой картинки
$arResult['ITEMS'][$key]['PREVIEW_PICTURE_SECOND']['SRC'] - свойство в котором хранится путь до второй картинки

Они выводятся в шаблоне (это видно в пункте 3). В этом коде по сути идет переприсваивание исходного пути (с несжатой картинкой) к пути к сжатой картинкой. Тем самым в шаблон попадут те же свойства только теперь уже путь в них будет указывать на сжатую картинку.
Сбрасываем кеш страницы и смотрим результат

ВНИМАНИЕ! Данный код уместен для компонента catalog.top, чтобы создать аналогичные картинки для других компонентов необходимо проделать все этапы (от наборов до внедрения в шаблон). Причем внедрение в шаблон следует делать с осторожностью т.к. свойства в которых хранятся и выводятся картинки могут отличаться.

Модуль не работает



Часто работе модуля мешает некорректное подключение библиотеки jQuery в шаблоне сайта, например:

его необходимо заменить на правильное подключение jQuery через API 1С-Битрикс:
CJSCore::Init(array("jquery"));
и все заработает! 
Если не помогло - пишите в нашу техническую поддержку:http://portal.yenisite.ru/support/ (необходимо зарегистрироваться) 

Размер папки ресайзера на сервере растет почему? Как работает кеш у вашего модуля?



1) Сначала кеш должен один раз создастся на сервере для всех фото, которые показываются через Ресайзер.
2) После этого размер кеша перестанет расти - пока не будут загружены новые фото. 
3) Картинки в хорошем качестве занимают больше места на сервере. 
4) Если происходит переполнение, то можно либо увеличить размер места на диске, либо уменьшать качество (размеры в наборах) фото ресайзера.

Я изменил настройки Ресайзера, что мне нужно после этого сделать?


1) Сохранить изменения.
2) Сбросить кеш ресайзера.
3) Сбросить кеш тех компонентов битрикс, которые в своей работе используют наборы ресайзера.

Где найти API модуля?


Подробное описание версии 2.0..Описание API модуля для разработчиков..Подробное описание версии 2.5..Подробное описание работы режимов масштабирования с примерами..Ссылка на видео настройки дополнительных фото каталога..Ссылка на видео настройки всплывающих фото на статических страницах..

Где найти инструкцию?



Подробную справку по настройке модуля смотрите в админке после установки:
Рабочий стол —> Сервисы —> Ресайзер 2.0 —> Справка
Так же прочитайте статью:http://dev.1c-bitrix.ru/community/webdev/user/51651/blog/resizer2-setup/
  

Как установить?



Установка автоматическая. После нее модуль можно найти в админке Рабочий стол —> Сервисы —> Ресайзер 2.0 и произвести настройки.

Почему качество накладываемого водяного знака намного хуже чем оригинал?

На некоторых версиях php неверно отрабатывают функции
imagealphablending и imagesavealpha

Следующий код выполненный на php


$wmpath = 'путь до картинки водяного знака';

$wm = imagecreatefrompng($wmpath);

imagealphablending($wm, false);
imagesavealpha($wm, true);

imagepng ( $wm, $_SERVER["DOCUMENT_ROOT"].'/upload/resizer_test/water.png', 0 );


должен брать картинку водяного знака и сохранять ее без изменений в файл
/upload/resizer_test/water.png

Если это не так, значит версия php установленная на вашем хостинге выполняет некорректно функции
imagealphablending($water, false);
imagesavealpha($water, true);

Необходимо изменить версию php на хостинге.

Администрирование

Как узнать какой набор ресайзера отвечает за ту или иную картинку

Что бы узнать какой набор Ресайзера выводит картинку, нужно:
Нажать правой кнопкой мыши на картинку и нажать "Посмотреть код" Скриншот
В открывшемся окне показан набор ресайзера в самой ссылке к изображению: Скриншот 
В нашем случае номер набора 120

Группировка свойств + подсказки с описанием

Для разработчиков

Описание API модуля

Возвращает группы свойств, идентификаторы свойств вошедших в группы и их комментарии для инфоблока или раздела:

CYenisiteInfoblockpropsplus::GetInitArray( 
arFilter=array()
);
Параметр Описание
$arFilter Принимает значения:
array("IBLOCK_ID" => ) - для инфоблока
и
array("IBLOCK_ID" => , "SECTION_ID" => ) - для раздела



Добавить группу:

CYenisiteInfoblockpropsplus::AddGroup( 
$iblock_id,
$group_name,
$group_sorting,
$section_id
);
Параметр Описание
$iblock_id Идентификатор инфоблока
$group_name Наименование группы
$group_sorting Значение сортировки (число) - чем меньше значение параметра тем выше распологается группа
$section_id Идентификатор раздела
Если параметр передается пустым, принимает значение по умолчанию равное "0".



Удалить группу:

CYenisiteInfoblockpropsplus::RemoveGroup( 
$group_id
);
Параметр Описание
$group_id Идентификатор группы свойств.



Обновить группу:

CYenisiteInfoblockpropsplus::UpdateGroup( 
$group_id,
$group_name,
$group_sorting,
$iblock_id,
$section_id,
$in_section_edit
);
Параметр Описание
$group_id Идентификатор группы которую нужно изменить
Обязательный параметр, в случае его отутствия будет добавлена новая группа с указанными параметрами ($group_name, $group_sorting, $iblock_id, $section_id)
$group_name Новое наименование группы
Обязательный параметр
$group_sorting Значение сортировки (число) - чем меньше значение параметра тем выше распологается группа
Необязательный параметр
$iblock_id Идентификатор инфоблока
Обязательный параметр
$section_id Новое значение идентификатора раздела
Если передается не число или пустое значение, идентификатор раздела не изменится
Должно принимать пустое значение если группа изменяется в общем списке свойств для инфоблока
$in_section_edit Принимает значение "y" или "n": "y" - изменению подвергается группа для раздела, "n" - изменению подвергается для инфоблока
По умолчанию принимает занчение "n"
При изменении группы для раздела, данный параметр обязательно должен принимать значение "y" - изменение значения сортировки для раздела запрещено, т.к. может нарушить работу модуля для общего списка свойств для инфоблока.



Добавить свойство в группу:

CYenisiteInfoblockpropsplus::AddPropsToGroup( 
$props=array(),
$iblock_id,
$group_id
);
Параметр Описание
$props массив идентификаторов свойств
$iblock_id Идентификатор инфоблока
$group_id Идентификатор группы свойств.



Изменить комментарий:

CYenisiteInfoblockpropsplus::EditPropComment( 
$prop_id,
$iblock_id,
$comment
);
Параметр Описание
$prop_id Идентификатор свойства
$iblock_id Идентификатор инфоблока
$comment Новое значаение комментария.



В модуле также вызываются следующие обработчики:

Обработчик Событие Описание
OnIBlockDelete OnIBlockDelete В момент удаления информационного блока очищает группы привязанные к инфоблоку, привязку свойств к группам и их комментарии
OnIBlockPropertyDelete OnIBlockPropertyDelete В момент удаления свойства очищает привязку свойства к группам и его комментарии

Администрирование

Как привязать свойства к разделам и отредактировать форму редактирования элементов для каждого раздела?

Для того что бы показать необходимые свойства для определенного раздела нужно:

Создать свойство для раздела: (http://prntscr.com/8zkii4) -> (http://prntscr.com/8zkirw) -> (http://prntscr.com/8zkj1d) ->
-> (http://prntscr.com/8zkjed) -> (http://prntscr.com/8zkjww) Вот такие свойства у нас получились для раздела "чехлы"(Группу свойств вы создаете сами и название группе так же пишите которое вы хотите)
Настроить форму добавления товара: (http://prntscr.com/8zkkmy) -> (http://prntscr.com/8zkksa) ->
-> Выделить таккак показано на рис (http://prntscr.com/8zklud) -> нажать кнопку удалить (http://prntscr.com/8zkmha)

Теперь при выборе раздела свойства меняются:
Выбран раздел "Авто" (http://prntscr.com/8zkn0g) его свойства: (http://prntscr.com/8zkn6s)
Выбран раздел "Чехлы" (http://prntscr.com/8zknbt) его свойства : (http://prntscr.com/8zknhi)  

Так же можете изучить текст статьи http://dev.1c-bitrix.ru/community/blogs/product_features/smart_filter.php
В 12 версии БУСа вышел функционал, позволяющий в одном инфоблоке хранить разнотипные товары с присущими им свойствами. При этом товары «не мешают» друг другу в каталоге, поскольку не перекрещиваются по свойствам. Свойства привязываются к категориям товаров, каждая категория наследует свойства вышестоящей.
В данном примере я буду настравивать свойства для двух разделов инфоблока: “Бумага для оргтехники” и ”Картриджи”.
Общие свойства: Артикул (строка), Производитель (строка)
Свойства элементов раздела “Бумага для оргтехники”: Класс (список), Кол-во листов в пачке (число), Формат (список)
Свойства элементов раздела “ Картриджи ”: Ресурс (число)
И так,Имеется инфоблок. После того, как в его настройках отмечена опция “ Является торговым каталогом”, инфоблок становится доступен в разделе “Магазин”. Отсюда и рекомендуется производить дальнейшее управление и работу с разделами, товарами и их свойствами.
Создаём требуемые свойства.
Далее в настройках каталога указываем свойства, которые присущи всем товарам.
В этот список автоматически попадают свойства, в параметрах которых отмечена опция “Показывать на странице редактирования элемента ”.
Создаем и настраиваем разделы
Кроме обычных параметров указываем какими свойствами будут обладать товары раздела“Бумага для оргтехники”
Указываем, что по этим свойствам возможна фильтрация товаров в умном фильтре.
Настраиваем второй раздел
Настраиваем форму добавления товара, чтобы показывались свойства текущего раздела.
Удаляем из формы свойства и заголовок “—Значения свойств”.
После сохранения получаем:
Вид формы, если раздел не выбран
Вид формы при добавлении товара в раздел “Бумага для оргтехники”
Вид формы при добавлении товара в раздел “Картриджи”Данная настройка поддерживатеся только в форме товаров в разделе “Магазин”.

Общие вопросы

Почему не выводятся созданные свойства в публичной части?

Чтобы выводились свойства в публичной части, необходимо выбрать вывод этих свойств в параметре компонента каталога:



Связь цен и складов с местоположением

Редакция PRO

Настройки технологии "Композитный сайт"

Если Вы при использовании ПРО версии решения используете поддомены для каждого региона (города), то в настройках технологии "Композитный сайт" необходимо указать все поддомены Вашего сайта - скриншот

После регистрации пользователю назначается группа администратора

Если после регистрации пользователю назначается группа Администратора, то нужно проверить настройку в модуле связь складов с местоположением:

2017-08-01_1002.png

В данной настройке указывается группа пользователей для конкретного региона, что бы при регистрации из региона пользователю присваивалась группа для региона и относительно остальных настроек показывались доступные цены к покупке товара

Настройка модулей ROMZA в типовом решении

Можно ли сделать ссылку на сайт, по которой у посетителя будет выбран конкретный город?

Установить город посетителя можно с помощью параметра cityId в адресной строке.
ID городов можно найти на странице редактирования связи местоположения и складов в списке местоположений, определяемых по IP.




Или просто в базе веб-аналитики.



Например, открыть демо-сайт для города Адлер:
http://bitronic2-pro.romza.ru/?cityId=7276
http://shinmarket-pro.romza.ru/?cityId=7276

Общие вопросы

Самостоятельная интеграция модуля Связь цен и складов с местоположением (yenisite.geoipstore)

Вся интеграция модуля сводится к 3 моментам:

1) Установка и настройка модуля по инструкции — http://dev.1c-bitrix.ru/community/webdev/user/3308/blog/8152/

2) размещение компонента yenisite:geoip.store и интеграция дизайна шаблона в том месте где должен быть выбор города (ДО вывода любого компонента который выводит товары) пример кода:

	// Вызываем компонент, в этот момент выводится шаблон
	// а результат выполнения компонента — массив вида
	// array(
	// 	"PRICES" => array(), // массив типов цен который выбраны в этом городе
	//	"STORES" => array(), // массив с ID складов которые выбраны в этом городе
	// )
	// записывается в глобальную переменную
        if(CModule::IncludeModule('yenisite.geoipstore')){
	   $GLOBALS['GEOIP'] = $APPLICATION->IncludeComponent(
		"yenisite:geoip.store","",array(),
		false
	   );
        }

3) Теперь надо заменить в публичной части у тех компонентов, которые должны менять цену, ограничивать склады, следующие параметры на примере bitrix:catalog:

$APPLICATION->IncludeComponent(
	"bitrix:catalog", 
	".default", 
	array(
		"IBLOCK_TYPE" => "catalog",
		"IBLOCK_ID" => "1",
		// PRICE_CODE — массив типов цен для отображения
		"PRICE_CODE" => $GLOBALS['GEOIP']['PRICES'],
		// STORES — массив ID складов
		"STORES" => $GLOBALS['GEOIP']["STORES"],
		...
	),
	false
);

Администрирование

Можно ли вывести в SEO-данных название города-склада?

Для настроек SEO на вашем сайте можно использовать два макроса:

#STORE_CITY# - подставить текущий город в именительном падеже.
Например, "самые лучшие цены в городе #STORE_CITY#" превратится в "самые лучшие цены в городе Красноярск".

#STORE_CITY_PREP# - подставить текущий город в предложном падеже.
Например, "Купить {=this.Name} в #STORE_CITY_PREP#" превратится в "Купить iPhone 7 в Красноярске".
Использовать осторожно. Пока что не все города склоняются корректно. Перед использованием, пожалуйста, убедитесь, что название вашего города склоняется в предложный падеж правильно.

Пример заполнения свойств страницы/разделов:








Пример настроек SEO в инфоблоке:


Автозаполнение

Общие вопросы

При заполнении выдает ошибку 28 (OPERATION_TIMEOUT) или 56 (RECEIVE_ERROR)



Если часто возникает такая ошибка, то необходимо обновить список proxy.


Описание полного списка ошибок можно увидеть на следующей странице


Список proxy можно взять на следующих сайтах: 
1) http://hideme.ru/proxy-list/
В настройках поиска прокси рекомендуется выставлять следующие параметры http://screencast.com/t/7RbUBOtPHIxt
2) http://ru.checkerproxy.net/



Переходим в архив актуальных proxy


Далее копируем список из нескоольких proxy (10-15 будет достаточно)


Вставляем адреса в соответствующее поле. Так же рекомендуе увеличить количество запросов и время ожидания, если позволяют настройки PHP, для большей уверенности в получении страницы

Что делать если товар не находится по названию в Яндекс Маркете?


Необходимо в настройках модуля включить опцию "Отключить повторный поиск товаров"http://screencast.com/t/2rl75BQM
,после этого поиск товара будет производится не по названию товара, а по ID товара на Яндекс маркете http://screencast.com/t/O5cwaEy2eV
которой должен быть предварительно указан у ваших товаров в свойстве TURBO_YANDEX_LINKhttp://screencast.com/t/FJpFq0O5PIe

Какие типы прокси-серверов подходят для работы с модулем

Яндекс.Маркет полностью перешел на работу через протокол HTTPS.
По этой причине для работы модуля подходят только HTTPS прокси.
Обычные HTTP-прокси не могут загрузить страницы и всё время возвращают ошибки.

GeoIP — определение местоположения по IP-адресу

Общие вопросы

Что необходимо сделать для автоподстановки местпоположения при оформлении заказа?



Необходимо в параметрах компонента настроить параметры подстановки города при оформлении заказа

Скриншот

В выбранных свойствах местположения необходимо проверить галочку "Использовать как местоположение"

Скриншот 1
Скриншот 2

Так же свойство должно быть активным



С версии 1.6.0 город подставляется во все незаполненные свойства заказа типа LOCATION (Местоположение), а не только в те, которые отмечены как местоположения для доставки.

Настройка модулей ROMZA в типовом решении

Можно ли сделать ссылку на сайт, по которой у посетителя будет выбран конкретный город?

Установить город посетителя можно с помощью параметра cityId в адресной строке.
ID городов можно найти на странице редактирования связи местоположения и складов в списке местоположений, определяемых по IP.