• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/compatible/ordercompatibility.php
  • Класс: BitrixSaleCompatibleOrderCompatibility
  • Вызов: OrderCompatibility::parseField
public function parseField($key)
{
	$output = null;
	$locationPropInfo = CSaleOrder::getLocationPropertyInfo();

	static $propIndex = 0;

	$propIDTmp = false;
	if (mb_strpos($key, "PROPERTY_ID_") === 0)
	{
		$propIndex++;
		$this->addPropertyRuntime($propIndex);
		if (!($propRuntimeName = $this->getPropertyRuntimeName($propIndex)))
		{
			return null;
		}

		$propIDTmp = intval(mb_substr($key, mb_strlen("PROPERTY_ID_")));

		$this->query->addFilter('='.$propRuntimeName.'.ORDER_PROPS_ID', $propIDTmp);
		if(isset($locationPropInfo['ID'][$propIDTmp]))
		{
			$this->addQueryAlias('PROPERTY_ID_'.$propIDTmp, 'LOCATION.ID');
		}
		else
		{
			$this->addQueryAlias('PROPERTY_ID_'.$propIDTmp, $propRuntimeName.'.ID');
		}

		$output = 'PROPERTY_ID_'.$propIDTmp;

	}
	elseif (mb_strpos($key, "PROPERTY_ORDER_PROPS_ID_") === 0)
	{
		$propIndex++;
		$this->addPropertyRuntime($propIndex);
		if (!($propRuntimeName = $this->getPropertyRuntimeName($propIndex)))
		{
			return null;
		}

		$propIDTmp = intval(mb_substr($key, mb_strlen("PROPERTY_ORDER_PROPS_ID_")));

		$this->query->addFilter('='.$propRuntimeName.'.ORDER_PROPS_ID', $propIDTmp);
		if(isset($locationPropInfo['ID'][$propIDTmp]))
		{
			$this->addQueryAlias('PROPERTY_ORDER_PROPS_ID_'.$propIDTmp, 'LOCATION.ID');
		}
		else
		{
			$this->addQueryAlias('PROPERTY_ORDER_PROPS_ID_'.$propIDTmp, $propRuntimeName.'.ORDER_PROPS_ID');
		}

		$output = 'PROPERTY_ORDER_PROPS_ID_'.$propIDTmp;
	}
	elseif (mb_strpos($key, "PROPERTY_NAME_") === 0)
	{
		$propIndex++;
		$this->addPropertyRuntime($propIndex);
		if (!($propRuntimeName = $this->getPropertyRuntimeName($propIndex)))
		{
			return null;
		}

		$propIDTmp = intval(mb_substr($key, mb_strlen("PROPERTY_NAME_")));

		$this->addQueryAlias('PROPERTY_NAME_'.$propIDTmp, $propRuntimeName.'.NAME');
		$this->query->addFilter('='.$propRuntimeName.'.ORDER_PROPS_ID', $propIDTmp);

		$output = 'PROPERTY_NAME_'.$propIDTmp;
	}
	elseif (mb_strpos($key, "PROPERTY_VALUE_") === 0)
	{
		$propIndex++;
		$this->addPropertyRuntime($propIndex);
		if (!($propRuntimeName = $this->getPropertyRuntimeName($propIndex)))
		{
			return null;
		}

		$propIDTmp = intval(mb_substr($key, mb_strlen("PROPERTY_VALUE_")));

		if(isset($locationPropInfo['ID'][$propIDTmp]))
		{
			$this->addQueryAlias('PROPERTY_ID_'.$propIDTmp, 'LOCATION.ID');
		}
		else
		{
			$this->addQueryAlias('PROPERTY_ID_'.$propIDTmp, $propRuntimeName.'.VALUE');
		}

		$output = 'PROPERTY_ID_'.$propIDTmp;
	}
	elseif (mb_strpos($key, "PROPERTY_CODE_") === 0)
	{
		$propIndex++;
		$this->addPropertyRuntime($propIndex);
		if (!($propRuntimeName = $this->getPropertyRuntimeName($propIndex)))
		{
			return null;
		}

		$propIDTmp = intval(mb_substr($key, mb_strlen("PROPERTY_CODE_")));
		$this->addQueryAlias('PROPERTY_CODE_'.$propIDTmp, $propRuntimeName.'.CODE');
		$this->query->addFilter('='.$propRuntimeName.'.ORDER_PROPS_ID', $propIDTmp);

		$output = 'PROPERTY_CODE_'.$propIDTmp;
	}
	elseif (mb_strpos($key, "PROPERTY_VAL_BY_CODE_") === 0)
	{
		$propIndex++;
		$this->addPropertyRuntime($propIndex);
		if (!($propRuntimeName = $this->getPropertyRuntimeName($propIndex)))
		{
			return null;
		}

		$propIDTmp = preg_replace("/[^a-zA-Z0-9_-]/is", "", trim(mb_substr($key, mb_strlen("PROPERTY_VAL_BY_CODE_"))));

		$this->addQueryAlias('PROPERTY_VAL_BY_CODE_'.$propIDTmp, $propRuntimeName.'.VALUE');
		if(isset($locationPropInfo['CODE'][$propIDTmp]))
		{
			$this->addQueryAlias('PROPERTY_VAL_BY_CODE_'.$propIDTmp, 'LOCATION.ID');
		}
		else
		{
			$this->addQueryAlias('PROPERTY_VAL_BY_CODE_'.$propIDTmp, $propRuntimeName.'.VALUE');
		}

		$this->query->addFilter('='.$propRuntimeName.'.CODE', $propIDTmp);

		$output = 'PROPERTY_VAL_BY_CODE_'.$propIDTmp;
	}
	elseif (mb_strpos($key, "BASKET_") === 0)
	{
		$output = static::addBasketRuntime($key);
	}

	if(isset($locationPropInfo['ID'][$propIDTmp]))
	{
		$this->query->registerRuntimeField(
			'LOCATION',
			array(
				'data_type' => 'BitrixSaleLocationLocationTable',
				'reference' => array(
					'=this.PROPERTY.VALUE' => 'ref.CODE'
				),
				'join_type' => 'inner'
			)
		);
	}

	return $output;
}