403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/yandex.market/lib/export/run/counter/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/yandex.market/lib/export/run/counter/manual.php
<?php

namespace Yandex\Market\Export\Run\Counter;

use Yandex\Market;

class Manual extends Base
{
	protected $excludeList = [];
	protected $distinctList = [];

	public function start()
	{
		// nothing
	}

	public function count($filter, $context)
	{
		if ($filter['DIRECTION'] === 'OFFER')
		{
			$result = $this->countByOffers($filter, $context);
		}
		else
		{
			$result = $this->countByElements($filter, $context);
		}

		return $result;
	}

	protected function countByElements($filter, $context)
	{
		$result = 0;
		$pageOffset = 0;
		$elementSelect = $this->getElementSelect($context);
		$elementFilterOriginal = $filter['ELEMENT'];

		do
		{
			$pageElementCount = 0;
			$parentList = [];
			$elementFilter = $elementFilterOriginal;

			if ($pageOffset > 0)
			{
				$elementFilter[] = [ '>ID' => $pageOffset ];
			}

			$queryElementList = \CIBlockElement::GetList(
				[ 'ID' => 'ASC' ],
				$elementFilter,
				false,
				[ 'nTopCount' => $context['PAGE_SIZE'], 'checkOutOfRange' => true ],
				$elementSelect
			);

			while ($element = $queryElementList->Fetch())
			{
				if ($context['USE_DISTINCT'] && isset($this->distinctList[$element['ID']]))
				{
					// nothing
				}
				else if ($context['CATALOG_TYPE_COMPATIBILITY'])
				{
					$parentList[$element['ID']] = true;

					$this->excludeList[$element['ID']] = true;
					++$result;
				}
				else if ($this->isElementHasOffers($element, $context))
				{
					$parentList[$element['ID']] = true;
				}
				else if (!isset($this->excludeList[$element['ID']]))
				{
					$this->excludeList[$element['ID']] = true;
					++$result;
				}

				$pageOffset = (int)$element['ID'];
				$pageElementCount++;
			}

			if (!empty($parentList) && $context['HAS_OFFER']) // has parents by catalog_type
			{
				$skuPropertyKey = 'PROPERTY_' . $context['OFFER_PROPERTY_ID'];
				$skuPropertyValueKey = $skuPropertyKey . '_VALUE';

				$offerSelect = [
					'IBLOCK_ID',
					'ID',
					$skuPropertyKey
				];

				$offerFilter = $filter['OFFERS'];
				$offerFilter['=' . $skuPropertyKey] = array_keys($parentList);

				$queryOffers = \CIBlockElement::GetList(
					[],
					$offerFilter,
					false,
					false,
					$offerSelect
				);

				while ($offer = $queryOffers->Fetch())
				{
					$offerElementId = (int)$offer[$skuPropertyValueKey];

					if (
						isset($parentList[$offerElementId])
						&& (!$context['USE_DISTINCT'] || !isset($this->distinctList[$offerElementId]))
					)
					{
						if ($context['CATALOG_TYPE_COMPATIBILITY'] && isset($this->excludeList[$offerElementId]))
						{
							unset($this->excludeList[$offerElementId]);
							--$result;
						}

						if (!isset($this->excludeList[$offer['ID']]))
						{
							$this->excludeList[$offer['ID']] = true;
							++$result;
						}

						if ($context['USE_DISTINCT'])
						{
							$this->distinctList[$offerElementId] = true;
						}
					}
				}
			}
		}
		while ($context['PAGE_SIZE'] <= $pageElementCount); // has next (iblock DISTINCT)

		return $result;
	}

	protected function countByOffers($filter, $context)
	{
		$result = 0;
		$pageOffset = 0;

		if (!$context['HAS_OFFER']) { return $result; }

		do
		{
			$pageElementCount = 0;
			$parentMap = [];

			$skuPropertyKey = 'PROPERTY_' . $context['OFFER_PROPERTY_ID'];
			$skuPropertyValueKey = $skuPropertyKey . '_VALUE';

			$offerFilter = $filter['OFFERS'];

			if ($pageOffset > 0)
			{
				$offerFilter[] = [ '>ID' => $pageOffset ];
			}

			$queryOffers = \CIBlockElement::GetList(
				[ 'ID' => 'ASC' ],
				$offerFilter,
				false,
				[ 'nTopCount' => $context['PAGE_SIZE'], 'checkOutOfRange' => true ],
				[ 'IBLOCK_ID', 'ID', $skuPropertyKey ]
			);

			while ($offer = $queryOffers->Fetch())
			{
				$offerId = (int)$offer['ID'];
				$parentId = (int)$offer[$skuPropertyValueKey];

				if ($parentId > 0 && !isset($this->excludeList[$offerId]))
				{
					if (!isset($parentMap[$parentId]))
					{
						$parentMap[$parentId] = [];
					}

					$parentMap[$parentId][] = $offerId;

					$this->excludeList[$offerId] = true;
					++$result;
				}

				$pageOffset = $offerId;
				$pageElementCount++;
			}

			if (!empty($parentMap)) // fetch exists parents
			{
				$foundParents = [];
				$elementFilter = $filter['ELEMENT'];
				$elementFilter['=ID'] = array_keys($parentMap);

				$queryElements = \CIBlockElement::GetList(
					[],
					$elementFilter,
					false,
					false,
					[ 'IBLOCK_ID', 'ID' ]
				);

				while ($element = $queryElements->Fetch())
				{
					$foundParents[$element['ID']] = true;
				}

				foreach ($parentMap as $parentId => $offerIds)
				{
					if (!isset($foundParents[$parentId]))
					{
						$result -= count($offerIds);
					}
				}
			}
		}
		while ($context['PAGE_SIZE'] <= $pageElementCount); // has next (iblock DISTINCT)

		return $result;
	}

	public function finish()
	{
		$this->excludeList = [];
		$this->distinctList = [];
	}

	protected function getElementSelect($context)
	{
		$result = [ 'IBLOCK_ID', 'ID' ];

		if (!$context['CATALOG_TYPE_COMPATIBILITY'] && !$context['OFFER_ONLY'])
		{
			$result[] = Market\Export\Entity\Catalog\Provider::useCatalogShortFields()
				? 'TYPE'
				: 'CATALOG_TYPE';
		}

		return $result;
	}

	protected function isElementHasOffers($element, $context)
	{
		$result = false;

		if (!$context['HAS_OFFER'])
		{
			$result = false;
		}
		else if ($context['OFFER_ONLY'])
		{
			$result = true;
		}
		else if (isset($element['TYPE']))
		{
			$result = (int)$element['TYPE'] === Market\Export\Run\Steps\Offer::ELEMENT_TYPE_SKU;
		}
		else if (isset($element['CATALOG_TYPE']))
		{
			$result = (int)$element['CATALOG_TYPE'] === Market\Export\Run\Steps\Offer::ELEMENT_TYPE_SKU;
		}
		else if (array_key_exists('CATALOG_TYPE', $element) || array_key_exists('TYPE', $element))
		{
			$result = true;
		}

		return $result;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit