%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/sale/lib/tradingplatform/vk/feed/data/sources/ |
| Current File : //home/bitrix/www/bitrix/modules/sale/lib/tradingplatform/vk/feed/data/sources/product.php |
<?php
namespace Bitrix\Sale\TradingPlatform\Vk\Feed\Data\Sources;
use Bitrix\Catalog\Ebay\ExportOfferCreator;
use Bitrix\Main\Loader;
use Bitrix\Main\SystemException;
use Bitrix\Main\ArgumentNullException;
use Bitrix\Sale\TradingPlatform\Vk;
/**
* Class Product
* Complex iterator for processing products from several iblocks
*
* @package Bitrix\Sale\TradingPlatform\Vk\Feed\Data\Sources
*/
class Product extends DataSource implements \Iterator
{
protected $feeds = array();
protected $currentFeed;
protected $startPosition = array();
protected $vk;
protected $exportId;
/**
* Product constructor.
* @param $exportId - int value of export ID
* @param $startPosition - can be null. ID of first element to process
*/
public function __construct($exportId, $startPosition)
{
$this->vk = Vk\Vk::getInstance();
if (!$this->vk->isActive())
throw new SystemException("Vk is not active!" . __METHOD__);
// check and set EXPORT ID
if (!isset($exportId) || strlen($exportId) <= 0)
throw new ArgumentNullException("EXPORT_ID");
$this->exportId = $exportId;
// check and set START POSITION
$this->setStartPosition($startPosition);
if (!Loader::includeModule('catalog'))
throw new SystemException("Can't include module \"Catalog\"! " . __METHOD__);
// get items only from sections, that was checked to export. And get them iblocksIds
$sectionsList = new Vk\SectionsList($this->exportId);
$sectionsToExport = $sectionsList->getSectionsToProductExport();
$logger = new Vk\Logger($this->exportId);
if(!empty($sectionsToExport))
{
$logger->addLog('Sections to export', $sectionsToExport);
}
$iblockIds = $sectionsList->getMappedIblocks();
// if not products to export - ERROR
if (empty($sectionsToExport))
{
$logger->addError('EMPTY_SECTIONS_LIST');
}
// create FEEDS
foreach ($iblockIds as $iblockId)
{
$exportOfferParams = array(
"IBLOCK_ID" => $iblockId,
"PRODUCT_GROUPS" => $sectionsToExport[$iblockId],
"INCLUDE_SUBSECTION" => false // we have all sections in PRODUCT_GROUPS, subsections is not needed
);
// set start position, if exist. Set current feed as start
if (isset($this->startPosition[$iblockId]))
{
$exportOfferParams["START_POSITION"] = $this->startPosition[$iblockId];
$this->startFeed = count($this->feeds);
}
$feed = ExportOfferCreator::getOfferObject($exportOfferParams);
if($this->vk->getAvailableFlag($this->exportId))
$feed->setOnlyAvailableFlag(true);
$this->feeds[] = $feed;
unset($feed);
}
}
protected function setStartPosition($startPosition)
{
if (strlen($startPosition) > 0)
{
// todo: maybe can use cache from sectionslist
// find IblockId for this product ID
if (Loader::includeModule("catalog") && Loader::includeModule("iblock"))
{
$resIblockId = \CIBlockElement::GetList(array(), array("ID" => $startPosition), false, false, array("IBLOCK_ID"));
if ($iblockId = $resIblockId->Fetch())
$this->startPosition[$iblockId["IBLOCK_ID"]] = $startPosition;
}
}
}
/**
* Owerwrite ITERATOR method
* @return mixed
*/
public function current()
{
$current = $this->feeds[$this->currentFeed]->current();
return $current;
}
/**
* Owerwrite ITERATOR method
* @return string
*/
public function key()
{
return $this->currentFeed . "_" . $this->feeds[$this->currentFeed]->key();
}
/**
* Owerwrite ITERATOR method
*/
public function next()
{
$this->feeds[$this->currentFeed]->next();
// step to the next product feed
if (!$this->valid() && $this->currentFeed < count($this->feeds) - 1)
{
$this->currentFeed++;
$this->next();
}
}
/**
* Owerwrite ITERATOR method
*/
public function rewind()
{
$this->currentFeed = $this->startFeed;
foreach ($this->feeds as $feed)
$feed->rewind();
}
/**
* Owerwrite ITERATOR method
* @return mixed
*/
public function valid()
{
return $this->feeds[$this->currentFeed]->valid();
}
}