Your IP : 216.73.216.86


Current Path : /var/www/homesaver/www/bitrix/modules/catalog/lib/grid/row/
Upload File :
Current File : /var/www/homesaver/www/bitrix/modules/catalog/lib/grid/row/productrowassembler.php

<?php

namespace Bitrix\Catalog\Grid\Row;

use Bitrix\Catalog\Grid\Row\Assembler\Factory\PriceFieldAssemblerFactory;
use Bitrix\Catalog\Grid\Row\Assembler\MeasureFieldAssembler;
use Bitrix\Catalog\Grid\Row\Assembler\MorePhotoAssembler;
use Bitrix\Catalog\Grid\Row\Assembler\ProductSelectorFieldAssembler;
use Bitrix\Catalog\Grid\Row\Assembler\ProductTypeFieldAssembler;
use Bitrix\Catalog\Grid\Row\Assembler\LockedFieldAssembler;
use Bitrix\Catalog\Grid\Row\Assembler\ProductNameFieldAssembler;
use Bitrix\Catalog\Grid\Row\Assembler\PurchasingPriceFieldAssembler;
use Bitrix\Catalog\Grid\Row\Assembler\VatFieldAssembler;
use Bitrix\Catalog\Grid\Settings\ProductSettings;
use Bitrix\Catalog\ProductTable;
use Bitrix\Iblock\Grid\Row\Assembler\SectionNameFieldAssembler;
use Bitrix\Iblock\Grid\Row\ElementRowAssembler;
use Bitrix\Main\Loader;

Loader::requireModule('iblock');

/**
 * @property ProductSettings $settings
 */
class ProductRowAssembler extends ElementRowAssembler
{
	private bool $isUseCatalogTab = false;
	private bool $isUseSkuSelector = false;

	public function setUseCatalogTab(bool $value = true): void
	{
		$this->isUseCatalogTab = $value;
	}

	public function setUseSkuSelector(bool $value = true): void
	{
		$this->isUseSkuSelector = $value;
	}

	protected function prepareFieldAssemblers(): array
	{
		$result = parent::prepareFieldAssemblers();

		if ($this->isUseSkuSelector)
		{
			$result[] = new ProductSelectorFieldAssembler(
				'PRODUCT', $this->settings
			);
		}
		else
		{
			$result[] = new ProductNameFieldAssembler(
				['PRODUCT'],
				$this->settings->getUrlBuilder()
			);
		}

		$result[] = new SectionNameFieldAssembler(
			['PRODUCT'],
			$this->settings->getUrlBuilder()
		);

		$result[] = new MeasureFieldAssembler(['MEASURE']);

		$result[] = new ProductTypeFieldAssembler(['TYPE']);

		$result[] = new VatFieldAssembler(['VAT_ID']);

		$result[] = new LockedFieldAssembler($this->settings);

		$result[] = (new PriceFieldAssemblerFactory)->createForCatalogPrices();

		$result[] = new PurchasingPriceFieldAssembler();

		$result[] = new MorePhotoAssembler(
			['MORE_PHOTO'],
			$this->settings
		);

		return $result;
	}

	private function getClearedProductFields(): array
	{
		$result = array_fill_keys(ProductTable::getProductTypes(false), []);

		$baseClearSkuFields = [
			'QUANTITY',
			'QUANTITY_RESERVED',
			'QUANTITY_TRACE',
			'CAN_BUY_ZERO',
			'PURCHASING_PRICE',
			'PURCHASING_CURRENCY',
			'MEASURE',
			'VAT_INCLUDED',
			'VAT_ID',
			'WEIGHT',
			'WIDTH',
			'LENGTH',
			'HEIGHT',
		];

		if (!$this->isUseSkuSelector && !$this->isUseCatalogTab)
		{
			$result[ProductTable::TYPE_SKU] = $baseClearSkuFields;
		}

		if (!$this->isUseCatalogTab)
		{
			$result[ProductTable::TYPE_EMPTY_SKU] = $baseClearSkuFields;
		}

		$result[ProductTable::TYPE_SET] = [
			'QUANTITY_RESERVED',
		];

		$result[ProductTable::TYPE_SERVICE] = [
			'QUANTITY',
			'QUANTITY_RESERVED',
			'QUANTITY_TRACE',
			'CAN_BUY_ZERO',
			'WEIGHT',
			'WIDTH',
			'LENGTH',
			'HEIGHT',
		];

		return $result;
	}

	private function clearProductFields(array $rowsList): array
	{
		$clearedFields = $this->getClearedProductFields();

		foreach ($rowsList as $index => $rowItem)
		{
			$productType = (int)($rowList[$index]['data']['TYPE'] ?? 0);
			if (isset($clearedFields[$productType]))
			{
				foreach ($clearedFields[$productType] as $fieldName)
				{
					if (isset($rowList[$index]['data'][$fieldName]))
					{
						$rowList[$index]['data'][$fieldName] = '';
					}
				}
			}
		}

		return $rowsList;
	}

	public function prepareRows(array $rowsList): array
	{
		$rowsList = $this->clearProductFields($rowsList);

		return parent::prepareRows($rowsList);
	}
}