parseCondition($child, $params); // is group if ($child['CLASS_ID'] === 'CondGroup') { $result[] = $childResult; } // same property names not overrides each other elseif (isset($result[key($childResult)])) { $fieldName = key($childResult); if (!isset($result['LOGIC'])) { $result = array( 'LOGIC' => $condition['DATA']['All'], array($fieldName => $result[$fieldName]) ); } $result[][$fieldName] = $childResult[$fieldName]; } else { $result += $childResult; } } if (!empty($result)) { $this->parsePropertyCondition($result, $condition, $params); if (count($result) > 1) { $result['LOGIC'] = $condition['DATA']['All']; } } } } else { $result += $this->parseConditionLevel($condition, $params); } } return $result; } protected function parseConditionLevel($condition, $params) { $result = array(); if (!empty($condition) && is_array($condition)) { $name = $this->parseConditionName($condition); if (!empty($name)) { $operator = $this->parseConditionOperator($condition); $value = $this->parseConditionValue($condition, $name); $result[$operator.$name] = $value; if ($name === 'SECTION_ID') { $result['INCLUDE_SUBSECTIONS'] = isset($params['INCLUDE_SUBSECTIONS']) && $params['INCLUDE_SUBSECTIONS'] === 'N' ? 'N' : 'Y'; if (isset($params['INCLUDE_SUBSECTIONS']) && $params['INCLUDE_SUBSECTIONS'] === 'A') { $result['SECTION_GLOBAL_ACTIVE'] = 'Y'; } $result = array($result); } } } return $result; } protected function parseConditionName(array $condition) { $name = ''; $conditionNameMap = array( 'CondIBIBlock' => 'IBLOCK_ID', 'CondIBElement' => 'ID', 'CondIBXmlID' => 'XML_ID', 'CondIBCode' => 'CODE', 'CondIBName' => 'NAME', 'CondIBSection' => 'SECTION_ID', 'CondIBDateActiveFrom' => 'DATE_ACTIVE_FROM', 'CondIBDateActiveTo' => 'DATE_ACTIVE_TO', 'CondIBSort' => 'SORT', 'CondIBDateCreate' => 'DATE_CREATE', 'CondIBCreatedBy' => 'CREATED_BY', 'CondIBTimestampX' => 'TIMESTAMP_X', 'CondIBModifiedBy' => 'MODIFIED_BY', 'CondIBTags' => 'TAGS', 'CondIBPreviewText' => 'PREVIEW_TEXT', 'CondIBDetailText' => 'DETAIL_TEXT', 'CondCatVatID' => 'VAT_ID', 'CondCatVatIncluded' => 'VAT_INCLUDED', 'CondCatQuantity' => 'QUANTITY', 'CondCatWeight' => 'WEIGHT' ); if (isset($conditionNameMap[$condition['CLASS_ID']])) { $name = $conditionNameMap[$condition['CLASS_ID']]; } elseif (mb_strpos($condition['CLASS_ID'], 'CondIBProp') !== false) { $name = $condition['CLASS_ID']; } return $name; } protected function parseConditionOperator($condition) { $operator = ''; switch ($condition['DATA']['logic']) { case 'Equal': $operator = ''; break; case 'Not': $operator = '!'; break; case 'Contain': $operator = '%'; break; case 'NotCont': $operator = '!%'; break; case 'Great': $operator = '>'; break; case 'Less': $operator = '<'; break; case 'EqGr': $operator = '>='; break; case 'EqLs': $operator = '<='; break; } return $operator; } protected function parseConditionValue($condition, $name) { $value = $condition['DATA']['value']; switch ($name) { case 'DATE_ACTIVE_FROM': case 'DATE_ACTIVE_TO': case 'DATE_CREATE': case 'TIMESTAMP_X': $value = ConvertTimeStamp($value, 'FULL'); break; } return $value; } protected function parsePropertyCondition(array &$result, array $condition, $params) { if (!empty($result)) { $subFilter = array(); foreach ($result as $name => $value) { if (!empty($result[$name]) && is_array($result[$name])) { $this->parsePropertyCondition($result[$name], $condition, $params); } else { if (($ind = mb_strpos($name, 'CondIBProp')) !== false) { [$prefix, $iblock, $propertyId] = explode(':', $name); $operator = $ind > 0? mb_substr($prefix, 0, $ind) : ''; $catalogInfo = \CCatalogSku::GetInfoByIBlock($iblock); if (!empty($catalogInfo)) { if ( $catalogInfo['CATALOG_TYPE'] != \CCatalogSku::TYPE_CATALOG && $catalogInfo['IBLOCK_ID'] == $iblock ) { $subFilter[$operator.'PROPERTY_'.$propertyId] = $value; } else { $result[$operator.'PROPERTY_'.$propertyId] = $value; } } unset($result[$name]); } } } if (!empty($subFilter) && !empty($catalogInfo)) { $offerPropFilter = array( 'IBLOCK_ID' => $catalogInfo['IBLOCK_ID'], 'ACTIVE_DATE' => 'Y', 'ACTIVE' => 'Y' ); if ($params['HIDE_NOT_AVAILABLE_OFFERS'] === 'Y') { $offerPropFilter['HIDE_NOT_AVAILABLE'] = 'Y'; } elseif ($params['HIDE_NOT_AVAILABLE_OFFERS'] === 'L') { $offerPropFilter[] = array( 'LOGIC' => 'OR', 'AVAILABLE' => 'Y', 'SUBSCRIBE' => 'Y' ); } if (count($subFilter) > 1) { $subFilter['LOGIC'] = $condition['DATA']['All']; $subFilter = array($subFilter); } $result['=ID'] = \CIBlockElement::SubQuery( 'PROPERTY_'.$catalogInfo['SKU_PROPERTY_ID'], $offerPropFilter + $subFilter ); } } } } ?>