Пример #1
0
 public function getSkuPropsData($arBasketItems, $arParents, $arSkuProps = array())
 {
     $arRes = array();
     $arSkuIblockID = array();
     if (is_array($arParents)) {
         foreach ($arBasketItems as &$arItem) {
             if (array_key_exists($arItem["PRODUCT_ID"], $arParents)) {
                 $arSKU = CCatalogSKU::GetInfoByProductIBlock($arParents[$arItem["PRODUCT_ID"]]["IBLOCK_ID"]);
                 if (!array_key_exists($arSKU["IBLOCK_ID"], $arSkuIblockID)) {
                     $arSkuIblockID[$arSKU["IBLOCK_ID"]] = $arSKU;
                 }
                 $arItem["IBLOCK_ID"] = $arSKU["IBLOCK_ID"];
                 $arItem["SKU_PROPERTY_ID"] = $arSKU["SKU_PROPERTY_ID"];
             }
         }
         unset($arItem);
         foreach ($arSkuIblockID as $skuIblockID => $arSKU) {
             // possible props values
             $rsProps = CIBlockProperty::GetList(array('SORT' => 'ASC', 'ID' => 'ASC'), array('IBLOCK_ID' => $skuIblockID, 'ACTIVE' => 'Y'));
             while ($arProp = $rsProps->Fetch()) {
                 if ($arProp['PROPERTY_TYPE'] == 'L' || $arProp['PROPERTY_TYPE'] == 'E' || $arProp['PROPERTY_TYPE'] == 'S' && $arProp['USER_TYPE'] == 'directory') {
                     if ($arProp['XML_ID'] == 'CML2_LINK') {
                         continue;
                     }
                     if (!in_array($arProp['CODE'], $arSkuProps)) {
                         continue;
                     }
                     $arValues = array();
                     if ($arProp['PROPERTY_TYPE'] == 'L') {
                         $arValues = array();
                         $rsPropEnums = CIBlockProperty::GetPropertyEnum($arProp['ID']);
                         while ($arEnum = $rsPropEnums->Fetch()) {
                             $arValues['n' . $arEnum['ID']] = array('ID' => $arEnum['ID'], 'NAME' => $arEnum['VALUE'], 'PICT' => false);
                         }
                     } elseif ($arProp['PROPERTY_TYPE'] == 'E') {
                         $rsPropEnums = CIBlockElement::GetList(array('SORT' => 'ASC'), array('IBLOCK_ID' => $arProp['LINK_IBLOCK_ID'], 'ACTIVE' => 'Y'), false, false, array('ID', 'NAME', 'PREVIEW_PICTURE'));
                         while ($arEnum = $rsPropEnums->Fetch()) {
                             $arEnum['PREVIEW_PICTURE'] = CFile::GetFileArray($arEnum['PREVIEW_PICTURE']);
                             if (!is_array($arEnum['PREVIEW_PICTURE'])) {
                                 $arEnum['PREVIEW_PICTURE'] = false;
                             }
                             if ($arEnum['PREVIEW_PICTURE'] !== false) {
                                 $productImg = CFile::ResizeImageGet($arEnum['PREVIEW_PICTURE'], array('width' => 80, 'height' => 80), BX_RESIZE_IMAGE_PROPORTIONAL, false, false);
                                 $arEnum['PREVIEW_PICTURE']['SRC'] = $productImg['src'];
                             }
                             $arValues['n' . $arEnum['ID']] = array('ID' => $arEnum['ID'], 'NAME' => $arEnum['NAME'], 'SORT' => $arEnum['SORT'], 'PICT' => $arEnum['PREVIEW_PICTURE']);
                         }
                     } elseif ($arProp['PROPERTY_TYPE'] == 'S' && $arProp['USER_TYPE'] == 'directory') {
                         if (self::$highLoadInclude === null) {
                             self::$highLoadInclude = Loader::includeModule('highloadblock');
                         }
                         if (self::$highLoadInclude) {
                             $hlblock = HL\HighloadBlockTable::getList(array("filter" => array("=TABLE_NAME" => $arProp["USER_TYPE_SETTINGS"]["TABLE_NAME"])))->fetch();
                             if ($hlblock) {
                                 $entity = HL\HighloadBlockTable::compileEntity($hlblock);
                                 $entity_data_class = $entity->getDataClass();
                                 $rsData = $entity_data_class::getList();
                                 while ($arData = $rsData->fetch()) {
                                     $arValues['n' . $arData['ID']] = array('ID' => $arData['ID'], 'NAME' => $arData['UF_NAME'], 'SORT' => $arData['UF_SORT'], 'FILE' => $arData['UF_FILE'], 'PICT' => false, 'XML_ID' => $arData['UF_XML_ID']);
                                 }
                             }
                         }
                     }
                     if (!empty($arValues) && is_array($arValues)) {
                         $arRes[$skuIblockID][$arProp['ID']] = array('ID' => $arProp['ID'], 'CODE' => $arProp['CODE'], 'NAME' => $arProp['NAME'], 'TYPE' => $arProp['PROPERTY_TYPE'], 'USER_TYPE' => $arProp['USER_TYPE'], 'VALUES' => $arValues);
                     }
                 }
             }
         }
         foreach ($arBasketItems as &$arItem) {
             if (isset($arItem["IBLOCK_ID"]) && (int) $arItem["IBLOCK_ID"] > 0 && isset($arRes[$arItem["IBLOCK_ID"]])) {
                 $arItem["SKU_DATA"] = $arRes[$arItem["IBLOCK_ID"]];
                 $arUsedValues = array();
                 $arTmpRes = array();
                 $arOfFilter = array("IBLOCK_ID" => $arItem["IBLOCK_ID"], "PROPERTY_" . $arSkuIblockID[$arItem["IBLOCK_ID"]]["SKU_PROPERTY_ID"] => $arParents[$arItem["PRODUCT_ID"]]["PRODUCT_ID"]);
                 $rsOffers = CIBlockElement::GetList(array(), $arOfFilter, false, false, array("ID", "IBLOCK_ID"));
                 while ($obOffer = $rsOffers->GetNextElement()) {
                     $arProps = $obOffer->GetProperties();
                     foreach ($arProps as $propName => $propValue) {
                         if (in_array($propName, $arSkuProps)) {
                             if (array_key_exists('VALUE', $propValue)) {
                                 if (strlen($propValue['VALUE']) > 0 && (!is_array($arUsedValues[$arItem["PRODUCT_ID"]][$propName]) || !in_array($propValue['VALUE'], $arUsedValues[$arItem["PRODUCT_ID"]][$propName]))) {
                                     $arUsedValues[$arItem["PRODUCT_ID"]][$propName][] = $propValue['VALUE'];
                                 }
                             }
                         }
                     }
                 }
                 if (!empty($arUsedValues)) {
                     // add only used values to the item SKU_DATA
                     foreach ($arRes[$arItem["IBLOCK_ID"]] as $propId => $arProp) {
                         if (!array_key_exists($arProp["CODE"], $arUsedValues[$arItem["PRODUCT_ID"]])) {
                             continue;
                         }
                         $arTmpRes['n' . $propId] = array();
                         foreach ($arProp["VALUES"] as $valId => $arValue) {
                             // properties of various type have different values in the used values data
                             if ($arProp["TYPE"] == "L" && in_array($arValue["NAME"], $arUsedValues[$arItem["PRODUCT_ID"]][$arProp["CODE"]]) || $arProp["TYPE"] == "E" && in_array($arValue["ID"], $arUsedValues[$arItem["PRODUCT_ID"]][$arProp["CODE"]]) || $arProp["TYPE"] == "S" && in_array($arValue["XML_ID"], $arUsedValues[$arItem["PRODUCT_ID"]][$arProp["CODE"]])) {
                                 if ($arProp["TYPE"] == "S") {
                                     if (!empty($arValue["FILE"])) {
                                         $arTmpFile = CFile::GetFileArray($arValue["FILE"]);
                                         if (!empty($arTmpFile)) {
                                             $tmpImg = CFile::ResizeImageGet($arTmpFile, array('width' => 80, 'height' => 80), BX_RESIZE_IMAGE_PROPORTIONAL, false, false);
                                             $arValue['PICT']['SRC'] = $tmpImg['src'];
                                         }
                                     }
                                 }
                                 $arTmpRes['n' . $propId]["CODE"] = $arProp["CODE"];
                                 $arTmpRes['n' . $propId]["NAME"] = $arProp["NAME"];
                                 $arTmpRes['n' . $propId]["VALUES"][$valId] = $arValue;
                             }
                         }
                     }
                 }
                 $arItem["SKU_DATA"] = $arTmpRes;
             }
         }
         unset($arItem);
     }
     return $arBasketItems;
 }