1
0
mirror of synced 2024-11-24 06:16:29 +03:00

ref #93089 Исправлена ошибка подстановки домена при генерации каталога (#342)

This commit is contained in:
Kocmonavtik 2024-04-01 09:34:11 +03:00 committed by GitHub
parent 830fe34e3e
commit 7f69ebfa1f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 80 additions and 20 deletions

View File

@ -1,3 +1,6 @@
## 2024-03-28 v.6.5.12
- Исправлена подстановка домена при генерации каталога
## 2024-03-28 v.6.5.11 ## 2024-03-28 v.6.5.11
- Исправлена ошибка дублирования скидок - Исправлена ошибка дублирования скидок

View File

@ -1 +1 @@
- Исправлена ошибка дублирования скидок - Исправлена подстановка домена при генерации каталога

View File

@ -1,6 +1,6 @@
<?php <?php
$arModuleVersion = [ $arModuleVersion = [
'VERSION' => '6.5.11', 'VERSION' => '6.5.12',
'VERSION_DATE' => '2024-03-28 12:00:00' 'VERSION_DATE' => '2024-03-28 17:00:00'
]; ];

View File

@ -91,9 +91,10 @@ class XmlCategoryDirector
} }
try { try {
$xmlCategory = $this->xmlCategoryFactory->create( $xmlCategory = $this->xmlCategoryFactory->create(
$category, $category,
$this->fileRepository->getImageUrl($category->get('PICTURE')) $this->fileRepository->getImageUrl($category->get('PICTURE'), $category->get('IBLOCK_ID'))
); );
if (!$xmlCategory) { if (!$xmlCategory) {
@ -102,7 +103,7 @@ class XmlCategoryDirector
$xmlCategories[$categoryKey] = $this->xmlCategoryFactory->create( $xmlCategories[$categoryKey] = $this->xmlCategoryFactory->create(
$category, $category,
$this->fileRepository->getImageUrl($category->get('PICTURE')) $this->fileRepository->getImageUrl($category->get('PICTURE'), $category->get('IBLOCK_ID'))
); );
} catch (ArgumentException | SystemException $exception) { } catch (ArgumentException | SystemException $exception) {
AddMessage2Log($exception->getMessage()); AddMessage2Log($exception->getMessage());
@ -130,7 +131,7 @@ class XmlCategoryDirector
try { try {
return $this->xmlCategoryFactory->create( return $this->xmlCategoryFactory->create(
$iblock, $iblock,
$this->fileRepository->getImageUrl($iblock->get('PICTURE')), $this->fileRepository->getImageUrl($iblock->get('PICTURE'), $iblockId),
$categoryId $categoryId
); );
} catch (ArgumentException | SystemException $exception) { } catch (ArgumentException | SystemException $exception) {

View File

@ -42,7 +42,7 @@ class XmlOfferBuilder
/** /**
* @var string|null * @var string|null
*/ */
private $defaultServerName; private $serverName;
/** /**
* @var array * @var array
@ -106,16 +106,16 @@ class XmlOfferBuilder
* *
* @param \Intaro\RetailCrm\Model\Bitrix\Xml\XmlSetup $setup * @param \Intaro\RetailCrm\Model\Bitrix\Xml\XmlSetup $setup
* @param array $measure * @param array $measure
* @param string|null $defaultServerName * @param string|null $serverName
*/ */
public function __construct(XmlSetup $setup, array $measure, ?string $defaultServerName) public function __construct(XmlSetup $setup, array $measure, ?string $serverName)
{ {
$this->setup = $setup; $this->setup = $setup;
$this->purchasePriceNull = RetailcrmConfigProvider::getCrmPurchasePrice(); $this->purchasePriceNull = RetailcrmConfigProvider::getCrmPurchasePrice();
$this->settingsService = SettingsService::getInstance([], ''); $this->settingsService = SettingsService::getInstance([], '');
$this->vatRates = $this->settingsService->vatRates; $this->vatRates = $this->settingsService->vatRates;
$this->measures = $this->prepareMeasures($measure); $this->measures = $this->prepareMeasures($measure);
$this->defaultServerName = $defaultServerName; $this->serverName = $serverName;
} }
/** /**
@ -198,6 +198,11 @@ class XmlOfferBuilder
$this->productPicture = $getProductPicture; $this->productPicture = $getProductPicture;
} }
public function setServerName(string $serverName): void
{
$this->serverName = $serverName;
}
/** /**
* Добавляет в XmlOffer значения настраиваемых параметров, производителя, вес и габариты * Добавляет в XmlOffer значения настраиваемых параметров, производителя, вес и габариты
*/ */
@ -242,7 +247,7 @@ class XmlOfferBuilder
$this->xmlOffer->productType = (int) $item['CATALOG_TYPE']; $this->xmlOffer->productType = (int) $item['CATALOG_TYPE'];
$this->xmlOffer->quantity = $item['CATALOG_QUANTITY'] ?? ''; $this->xmlOffer->quantity = $item['CATALOG_QUANTITY'] ?? '';
$this->xmlOffer->url = $item['DETAIL_PAGE_URL'] $this->xmlOffer->url = $item['DETAIL_PAGE_URL']
? $this->defaultServerName . $item['DETAIL_PAGE_URL'] ? $this->serverName . $item['DETAIL_PAGE_URL']
: ''; : '';
$this->xmlOffer->price = $item['CATALOG_PRICE_' . $this->setup->basePriceId]; $this->xmlOffer->price = $item['CATALOG_PRICE_' . $this->setup->basePriceId];
$this->xmlOffer->purchasePrice = $this->getPurchasePrice( $this->xmlOffer->purchasePrice = $this->getPurchasePrice(

View File

@ -74,6 +74,8 @@ class XmlOfferDirector
$ciBlockResult = $this->catalogRepository->getProductPage($param, $catalogIblockInfo, $this->setup->loadNonActivity); $ciBlockResult = $this->catalogRepository->getProductPage($param, $catalogIblockInfo, $this->setup->loadNonActivity);
$offers = []; $offers = [];
$this->xmlOfferBuilder->setServerName($this->fileRepository->getServerName($catalogIblockInfo->productIblockId));
while ($offer = $ciBlockResult->Fetch()) { while ($offer = $ciBlockResult->Fetch()) {
$categories = $this->catalogRepository->getProductCategories($offer['ID']); $categories = $this->catalogRepository->getProductCategories($offer['ID']);
$offer['DETAIL_PAGE_URL'] = $this->replaceUrlTemplate($offer, $categories); $offer['DETAIL_PAGE_URL'] = $this->replaceUrlTemplate($offer, $categories);
@ -211,7 +213,7 @@ class XmlOfferDirector
$this->xmlOfferBuilder->setPicturesPath( $this->xmlOfferBuilder->setPicturesPath(
$this $this
->fileRepository ->fileRepository
->getProductPicture($product, $pictureProperty ?? '') ->getProductPicture($product, $pictureProperty ?? '', $catalogIblockInfo->productIblockId)
); );
} }

View File

@ -15,6 +15,9 @@ class FileRepository
*/ */
private $defaultServerName; private $defaultServerName;
/** @var array */
private $domainCatalogList = [];
/** /**
* FileRepository constructor. * FileRepository constructor.
* @param string $defaultServerName * @param string $defaultServerName
@ -22,13 +25,14 @@ class FileRepository
public function __construct(string $defaultServerName) public function __construct(string $defaultServerName)
{ {
$this->defaultServerName = $defaultServerName; $this->defaultServerName = $defaultServerName;
$this->domainCatalogList = SiteRepository::getDomainList();
} }
/** /**
* @param int|null $fileId * @param int|null $fileId
* @return string * @return string
*/ */
public function getImageUrl(?int $fileId): string public function getImageUrl(?int $fileId, ?int $iBlockId = null): string
{ {
if (!$fileId) { if (!$fileId) {
return ''; return '';
@ -38,7 +42,7 @@ class FileRepository
$validation = '/^(http|https):\/\/([A-Z0-9][A-Z0-9_-]*(?:\.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?\/?/i'; $validation = '/^(http|https):\/\/([A-Z0-9][A-Z0-9_-]*(?:\.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?\/?/i';
if ((bool) preg_match($validation, $pathImage) === false) { if ((bool) preg_match($validation, $pathImage) === false) {
return $this->defaultServerName . $pathImage; return $this->getServerName($iBlockId) . $pathImage;
} }
return $pathImage; return $pathImage;
@ -49,19 +53,24 @@ class FileRepository
* @param string $pictureProp * @param string $pictureProp
* @return string * @return string
*/ */
public function getProductPicture(array $product, string $pictureProp = ''): string public function getProductPicture(array $product, string $pictureProp = '', ?int $iBlockId = null): string
{ {
$picture = ''; $picture = '';
$pictureId = $product['PROPERTY_' . $pictureProp . '_VALUE'] ?? null; $pictureId = $product['PROPERTY_' . $pictureProp . '_VALUE'] ?? null;
if (isset($product['DETAIL_PICTURE'])) { if (isset($product['DETAIL_PICTURE'])) {
$picture = $this->getImageUrl($product['DETAIL_PICTURE']); $picture = $this->getImageUrl($product['DETAIL_PICTURE'], $iBlockId);
} elseif (isset($product['PREVIEW_PICTURE'])) { } elseif (isset($product['PREVIEW_PICTURE'])) {
$picture = $this->getImageUrl($product['PREVIEW_PICTURE']); $picture = $this->getImageUrl($product['PREVIEW_PICTURE'], $iBlockId);
} elseif ($pictureId !== null) { } elseif ($pictureId !== null) {
$picture = $this->getImageUrl($pictureId); $picture = $this->getImageUrl($pictureId, $iBlockId);
} }
return $picture ?? ''; return $picture ?? '';
} }
public function getServerName(?int $iBlockId): string
{
return $this->domainCatalogList[$iBlockId] ?? $this->defaultServerName;
}
} }

View File

@ -4,6 +4,7 @@ namespace Intaro\RetailCrm\Repository;
use CSite; use CSite;
use RetailcrmConfigProvider; use RetailcrmConfigProvider;
use Bitrix\Iblock\IblockTable;
/** /**
* Class SiteRepository * Class SiteRepository
@ -26,4 +27,43 @@ class SiteRepository
return null; return null;
} }
public static function getDomainList(): ?array
{
$result = [];
$resultBlock = [];
$resultSites = [];
try {
$iBlockResult = IblockTable::GetList(['select' => ['ID', 'LID']], $sort, ['ACTIVE' => 'Y']);
while ($iBlock = $iBlockResult->Fetch()) {
$resultBlock[] = $iBlock;
}
$resultBlock = array_column($resultBlock, 'LID', 'ID');
$rsSites = CSite::GetList($by, $sort, ['ACTIVE' => 'Y']);
while ($site = $rsSites->Fetch()) {
$resultSites[] = $site;
}
$resultSites = array_column($resultSites, 'SERVER_NAME', 'LID');
foreach ($resultBlock as $id => $lid) {
if (isset($resultSites[$lid])) {
$result[$id] = RetailcrmConfigProvider::getProtocol() . $resultSites[$lid];
}
}
} catch (\Throwable $exception) {
RCrmActions::eventLog(
'SiteRepository:getDomainList',
'domain',
'Error when obtaining domains: ' . $exception->getMessage()
);
}
return $result;
}
} }