Создание и редактирование прайс-листа

Создавать и изменять прайс-листы можно с помощью пользовательских событий. Вы можете написать собственный PHP-код, который внесет изменения в прайс-лист при срабатывании события.

Подробнее о событиях см. в курсе Разработчик Bitrix Framework.

Создание прайс-листа выполняется в три шага:

  1. 1. Запрос и дополнение данных
  2. 2. Создание и изменение элементов
  3. 3. Запись в файл

1. Запрос и дополнение данных

На этом этапе из базы данных сайта выбирается информация на основе данных из формы редактирования прайс-листа.

Список событий

  • onExportRootExtendData — изменение корневого элемента YML-файла;
  • onExportOfferExtendData — изменение элемента <offer>;
  • onExportCategoryExtendData — изменение элемента <category>;
  • onExportCurrencyExtendData — изменение элемента <currency>.

Подробнее об элементах, использующихся для описания товара, см. в Справке Маркета для модели ADV.

Параметры события

Параметр Описание Массив
TAG_VALUE_LIST Список значений. $elementId → Yandex\Market\Result\XmlValue
ELEMENT_LIST Список данных предложений. $elementId → $elementRow
Поля $elementRow:
  • IBLOCK_ID
  • ID
  • CATALOG_TYPE
  • PARENT_ID
CONTEXT Контекст выгрузки.
PARENT_LIST Данные родительских элементов торговых предложений.

Присутствует только в событии onExportOfferExtendData.

$parentId → $parentRow
Поля $parentRow:
  • IBLOCK_ID
  • ID
  • CATALOG_TYPE
Пример. Добавление дополнительных параметров запроса к элементу url
use Bitrix\Main;
use Yandex\Market;

$eventManager = Main\EventManager::getInstance();

$eventManager->addEventHandler('yandex.market', 'onExportOfferExtendData', function(Main\Event $event) {

	/** @var $tagValueList Market\Result\XmlValue[] */
	/** @var $elementList array */
	/** @var $context array */
	/** @var $parentList array */
	$tagValueList = $event->getParameter('TAG_VALUE_LIST');
	$elementList = $event->getParameter('ELEMENT_LIST');
	$context = $event->getParameter('CONTEXT');
	$parentList = $event->getParameter('PARENT_LIST');

	foreach ($tagValueList as $elementId => $tagValue)
	{
		$element = $elementList[$elementId];
		$parent = null;
		$urlQueryParams = [
			'setup_id' => $context['SETUP_ID'],
			'offer_id' => $element['ID']
		];

		if (isset($element['PARENT_ID']))
		{
			$parent = $parentList[$element['PARENT_ID']];

			$urlQueryParams['parent_id'] = $parent['ID'];
		}

		$tagUrlValue = $tagValue->getTagValue('url');
		$tagUrlValue .= (strpos($tagUrlValue, '?') === false ? '?' : '&') . http_build_query($urlQueryParams);

		$tagValue->setTagValue('url', $tagUrlValue);
	}

});

  		
Скопировано
Пример. Установка атрибута available на основании mt_rand
use Bitrix\Main;
use Yandex\Market;

$eventManager = Main\EventManager::getInstance();

$eventManager->addEventHandler('yandex.market', 'onExportOfferExtendData', function(Main\Event $event) {

	/** @var $tagValueList Market\Result\XmlValue[] */
	$tagValueList = $event->getParameter('TAG_VALUE_LIST');

	foreach ($tagValueList as $elementId => $tagValue)
	{
		$tagValue->setTagAttribute('offer', 'available', mt_rand(0, 100) > 50);
	}

});
        	
Скопировано

2. Создание и изменение элементов

На этом этапе данные представляются в формате YML. Вы можете изменить содержимое элемента:

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

Список событий

  • onExportRootWriteData — изменение корневого элемента YML-файла;
  • onExportOfferWriteData — изменение элемента <offer>;
  • onExportCategoryWriteData — изменение элемента <category>;
  • onExportCurrencyWriteData — изменение элемента <currency>.

Параметры события

Параметр Описание Массив
TAG_RESULT_LIST Список значений. $elementId → Yandex\Market\Result\XmlNode
ELEMENT_LIST Список данных предложений. $elementId → $elementRow
Поля $elementRow:
  • IBLOCK_ID
  • ID
  • CATALOG_TYPE
  • PARENT_ID
CONTEXT Контекст выгрузки.
PARENT_LIST Данные родительских элементов торговых предложений.

Присутствует только в событии onExportOfferExtendData.

$parentId → $parentRow
Поля $parentRow:
  • IBLOCK_ID
  • ID
  • CATALOG_TYPE
Пример. Добавление элементов и атрибутов
use Bitrix\Main;
use Yandex\Market;

$eventManager = Main\EventManager::getInstance();

$eventManager->addEventHandler('yandex.market', 'onExportOfferWriteData', function(Main\Event $event) {

	/** @var $tagResultList Market\Result\XmlNode[] */
	/** @var $elementList array */
	/** @var $context array */
	/** @var $parentList array */
	/** @var $tagElement \SimpleXMLElement */
	$tagResultList = $event->getParameter('TAG_RESULT_LIST');
	$elementList = $event->getParameter('ELEMENT_LIST');
	$context = $event->getParameter('CONTEXT');
	$parentList = $event->getParameter('PARENT_LIST');

	foreach ($tagResultList as $elementId => $tagResult)
	{
		if ($tagResult->isSuccess())
		{
			$tagNode = $tagResult->getXmlElement();
			$element = $elementList[$elementId];
			$parent = null;

			$tagNode->addChild('setup_id', $context['SETUP_ID']);
			$tagNode->addChild('offer_id', $element['ID']);

			if (isset($element['PARENT_ID']))
			{
				$parent = $parentList[$element['PARENT_ID']];

				$tagNode->addChild('offer_id', $parent['ID']);
			}

			$tagNode->addAttribute('custom', 'Y');

			$tagResult->invalidateXmlContents();
		}
	}

});
  	
Скопировано
Пример. Отмена выгрузки товаров, недоступных для продажи
use Bitrix\Main;
use Yandex\Market;

$eventManager = Main\EventManager::getInstance();

$eventManager->addEventHandler('yandex.market', 'onExportOfferWriteData', function(Main\Event $event) {

	/** @var $tagResultList Market\Result\XmlNode[] */
	/** @var $tagElement \SimpleXMLElement */
	$tagResultList = $event->getParameter('TAG_RESULT_LIST');

	foreach ($tagResultList as $elementId => $tagResult)
	{
		if ($tagResult->isSuccess())
		{
			$tagNode = $tagResult->getXmlElement();
			$attributeList = $tagNode->attributes();

			if (!isset($attributeList['available']) || (string)$attributeList['available'] !== 'true')
			{
				$tagResult->invalidate();
			}
		}
	}

});
Скопировано

3. Запись в файл

На этом этапе собранная информация о товарах добавляется в прайс-лист и обновляется в YML-файле.
  • Если вы создали новый файл, устраните ошибки и укажите ссылку на новый файл в кабинете на Маркете. Подробнее см. раздел Как сформировать YML-файл и устранить ошибки.
  • Если вы отредактировали файл и ранее указывали ссылку на него в кабинете на Маркете, информация обновится автоматически, а ссылка останется прежней.