141 lines
4.1 KiB
PHP
141 lines
4.1 KiB
PHP
|
<?php
|
||
|
|
||
|
|
||
|
namespace Intaro\RetailCrm\Icml;
|
||
|
|
||
|
use Bitrix\Main\ArgumentException;
|
||
|
use Bitrix\Main\ORM\Objectify\Collection;
|
||
|
use Bitrix\Main\ORM\Objectify\EntityObject;
|
||
|
use Bitrix\Main\SystemException;
|
||
|
use Intaro\RetailCrm\Model\Bitrix\Xml\XmlCategory;
|
||
|
use Intaro\RetailCrm\Repository\CatalogRepository;
|
||
|
use Intaro\RetailCrm\Repository\FileRepository;
|
||
|
use Intaro\RetailCrm\Repository\SiteRepository;
|
||
|
|
||
|
/**
|
||
|
* Class XmlCategoryDirector
|
||
|
* @package Intaro\RetailCrm\Icml
|
||
|
*/
|
||
|
class XmlCategoryDirector
|
||
|
{
|
||
|
private const MILLION = 1000000;
|
||
|
|
||
|
/**
|
||
|
* @var \Intaro\RetailCrm\Repository\CatalogRepository
|
||
|
*/
|
||
|
private $catalogRepository;
|
||
|
|
||
|
/**
|
||
|
* @var array
|
||
|
*/
|
||
|
private $iblocksForExport;
|
||
|
|
||
|
/**
|
||
|
* @var \Intaro\RetailCrm\Icml\XmlCategoryFactory
|
||
|
*/
|
||
|
private $xmlCategoryFactory;
|
||
|
|
||
|
/**
|
||
|
* @var \Intaro\RetailCrm\Repository\FileRepository
|
||
|
*/
|
||
|
private $fileRepository;
|
||
|
|
||
|
public function __construct(array $iblocksForExport)
|
||
|
{
|
||
|
$this->iblocksForExport = $iblocksForExport;
|
||
|
$this->catalogRepository = new CatalogRepository();
|
||
|
$this->xmlCategoryFactory = new XmlCategoryFactory();
|
||
|
$this->fileRepository = new FileRepository(SiteRepository::getDefaultServerName());
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return XmlCategory[]
|
||
|
*/
|
||
|
public function getXmlCategories(): array
|
||
|
{
|
||
|
$xmlCategories = [];
|
||
|
|
||
|
foreach ($this->iblocksForExport as $iblockId) {
|
||
|
$categories = $this->catalogRepository->getCategoriesByIblockId($iblockId);
|
||
|
|
||
|
if ($categories === null) {
|
||
|
$categoryId = self::MILLION + $iblockId;
|
||
|
$xmlCategory = $this->makeXmlCategoryFromIblock($iblockId, $categoryId);
|
||
|
|
||
|
if (!$xmlCategory) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
$xmlCategories[$categoryId] = $xmlCategory;
|
||
|
}
|
||
|
|
||
|
$xmlCategories = array_merge($xmlCategories, $this->getXmlSubCategories($categories));
|
||
|
}
|
||
|
|
||
|
return $xmlCategories;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Возвращает коллекцию подкатегорий категории
|
||
|
*
|
||
|
* @param \Bitrix\Main\ORM\Objectify\Collection $categories
|
||
|
* @return XmlCategory[]
|
||
|
*/
|
||
|
public function getXmlSubCategories(Collection $categories): array
|
||
|
{
|
||
|
$xmlCategories = [];
|
||
|
|
||
|
foreach ($categories as $categoryKey => $category) {
|
||
|
if (!$category instanceof EntityObject) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
$xmlCategory = $this->xmlCategoryFactory->create(
|
||
|
$category,
|
||
|
$this->fileRepository->getImageUrl($category->get('PICTURE'))
|
||
|
);
|
||
|
|
||
|
if (!$xmlCategory) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
$xmlCategories[$categoryKey] = $this->xmlCategoryFactory->create(
|
||
|
$category,
|
||
|
$this->fileRepository->getImageUrl($category->get('PICTURE'))
|
||
|
);
|
||
|
} catch (ArgumentException | SystemException $exception) {
|
||
|
AddMessage2Log($exception->getMessage());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $xmlCategories;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Создает XmlCategory из инфоблока
|
||
|
*
|
||
|
* @param int $iblockId
|
||
|
* @param int $categoryId
|
||
|
* @return \Intaro\RetailCrm\Model\Bitrix\Xml\XmlCategory|null
|
||
|
*/
|
||
|
public function makeXmlCategoryFromIblock(int $iblockId, int $categoryId): ?XmlCategory
|
||
|
{
|
||
|
$iblock = $this->catalogRepository->getIblockById($iblockId);
|
||
|
|
||
|
if ($iblock === null) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
return $this->xmlCategoryFactory->create(
|
||
|
$iblock,
|
||
|
$this->fileRepository->getImageUrl($iblock->get('PICTURE')),
|
||
|
$categoryId
|
||
|
);
|
||
|
} catch (ArgumentException | SystemException $exception) {
|
||
|
AddMessage2Log($exception->getMessage());
|
||
|
}
|
||
|
}
|
||
|
}
|