Example #1
0
 /**
  * Return ratio for product list.
  *
  * @param array|int $product			Product id list.
  * @return array|bool
  * @throws Main\ArgumentException
  */
 public static function getCurrentRatio($product)
 {
     if (!is_array($product)) {
         $product = array($product);
     }
     Main\Type\Collection::normalizeArrayValuesByInt($product, true);
     if (empty($product)) {
         return false;
     }
     $result = array_fill_keys($product, 1);
     $ratioRows = array_chunk($product, 500);
     foreach ($ratioRows as &$row) {
         $ratioIterator = self::getList(array('select' => array('PRODUCT_ID', 'RATIO'), 'filter' => array('@PRODUCT_ID' => $row)));
         while ($ratio = $ratioIterator->fetch()) {
             $ratio['PRODUCT_ID'] = (int) $ratio['PRODUCT_ID'];
             $ratioInt = (int) $ratio['RATIO'];
             $ratioFloat = (double) $ratio['RATIO'];
             $ratioResult = $ratioFloat > $ratioInt ? $ratioFloat : $ratioInt;
             if (abs($ratioResult) < CATALOG_VALUE_EPSILON || $ratioResult < 0) {
                 continue;
             }
             $result[$ratio['PRODUCT_ID']] = $ratioResult;
         }
         unset($module, $moduleIterator);
     }
     unset($row, $ratioRows);
     return $result;
 }
Example #2
0
 function setIBlock($IBLOCK_ID, $propertyID = array())
 {
     $this->VERSION = CIBlockElement::GetIBVersion($IBLOCK_ID);
     if (!empty($propertyID)) {
         Collection::normalizeArrayValuesByInt($propertyID);
     }
     $this->arProperties = array();
     if (!empty($propertyID) || empty($propertyID) && !isset(self::$propertiesCache[$IBLOCK_ID])) {
         $propertyIterator = PropertyTable::getList(array('select' => array('ID', 'IBLOCK_ID', 'NAME', 'ACTIVE', 'SORT', 'CODE', 'DEFAULT_VALUE', 'PROPERTY_TYPE', 'MULTIPLE', 'LINK_IBLOCK_ID', 'VERSION', 'USER_TYPE', 'USER_TYPE_SETTINGS'), 'filter' => empty($propertyID) ? array('IBLOCK_ID' => $IBLOCK_ID) : array('ID' => $propertyID, 'IBLOCK_ID' => $IBLOCK_ID), 'order' => array('ID' => 'ASC')));
         while ($property = $propertyIterator->fetch()) {
             if ($property['USER_TYPE']) {
                 $userType = CIBlockProperty::GetUserType($property['USER_TYPE']);
                 if (isset($userType["ConvertFromDB"])) {
                     if (array_key_exists("DEFAULT_VALUE", $property)) {
                         $value = array("VALUE" => $property["DEFAULT_VALUE"], "DESCRIPTION" => "");
                         $value = call_user_func_array($userType["ConvertFromDB"], array($property, $value));
                         $property["DEFAULT_VALUE"] = $value["VALUE"];
                     }
                 }
             }
             if ($property['USER_TYPE_SETTINGS'] !== '' || $property['USER_TYPE_SETTINGS'] !== null) {
                 $property['USER_TYPE_SETTINGS'] = unserialize($property['USER_TYPE_SETTINGS']);
             }
             $this->arProperties[$property['ID']] = $property;
         }
         unset($property, $propertyIterator);
         if (empty($propertyID)) {
             self::$propertiesCache[$IBLOCK_ID] = $this->arProperties;
         }
     } else {
         $this->arProperties = self::$propertiesCache[$IBLOCK_ID];
     }
 }
Example #3
0
 /**
  * Returns discount list by user groups.
  *
  * @param array $groupList			User group list.
  * @param array $filter				Additional filter.
  * @return array
  */
 public static function getDiscountByGroups($groupList, $filter = array())
 {
     $result = array();
     if (!empty($groupList) && is_array($groupList)) {
         Main\Type\Collection::normalizeArrayValuesByInt($groupList);
         if (!empty($groupList)) {
             if (!is_array($filter)) {
                 $filter = array();
             }
             $groupRows = array_chunk($groupList, 500);
             foreach ($groupRows as &$row) {
                 $filter['@GROUP_ID'] = $row;
                 $groupIterator = self::getList(array('select' => array('DISCOUNT_ID'), 'filter' => $filter));
                 while ($group = $groupIterator->fetch()) {
                     $group['DISCOUNT_ID'] = (int) $group['DISCOUNT_ID'];
                     $result[$group['DISCOUNT_ID']] = true;
                 }
                 unset($group, $groupIterator);
             }
             unset($row, $groupRows);
             if (!empty($result)) {
                 $result = array_keys($result);
             }
         }
     }
     return $result;
 }
Example #4
0
 /**
  * @param int $intProductID
  * @param int $intIBlockID
  * @param array $arCatalogGroups
  * @param array $arUserGroups
  * @param string $strRenewal
  * @param bool|string $siteID
  * @param bool|array $arDiscountCoupons
  * @param bool $boolSKU
  * @param bool $boolGetIDS
  * @return array|false
  */
 public function GetDiscount($intProductID, $intIBlockID, $arCatalogGroups = array(), $arUserGroups = array(), $strRenewal = "N", $siteID = false, $arDiscountCoupons = false, $boolSKU = true, $boolGetIDS = false)
 {
     static $eventOnGetExists = null;
     static $eventOnResultExists = null;
     global $DB, $APPLICATION;
     self::initDiscountSettings();
     if ($eventOnGetExists === true || $eventOnGetExists === null) {
         foreach (GetModuleEvents("catalog", "OnGetDiscount", true) as $arEvent) {
             $eventOnGetExists = true;
             $mxResult = ExecuteModuleEventEx($arEvent, array($intProductID, $intIBlockID, $arCatalogGroups, $arUserGroups, $strRenewal, $siteID, $arDiscountCoupons, $boolSKU, $boolGetIDS));
             if ($mxResult !== true) {
                 return $mxResult;
             }
         }
         if ($eventOnGetExists === null) {
             $eventOnGetExists = false;
         }
     }
     $boolSKU = $boolSKU === true;
     $boolGetIDS = $boolGetIDS === true;
     $intProductID = (int) $intProductID;
     if ($intProductID <= 0) {
         $APPLICATION->ThrowException(Loc::getMessage("BT_MOD_CATALOG_DISC_ERR_PRODUCT_ID_ABSENT"), "NO_PRODUCT_ID");
         return false;
     }
     $intIBlockID = (int) $intIBlockID;
     if ($intIBlockID <= 0) {
         $APPLICATION->ThrowException(Loc::getMessage("BT_MOD_CATALOG_DISC_ERR_IBLOCK_ID_ABSENT"), "NO_IBLOCK_ID");
         return false;
     }
     if (!is_array($arUserGroups)) {
         $arUserGroups = array($arUserGroups);
     }
     $arUserGroups[] = 2;
     if (!empty($arUserGroups)) {
         Main\Type\Collection::normalizeArrayValuesByInt($arUserGroups, true);
     }
     if (!is_array($arCatalogGroups)) {
         $arCatalogGroups = array($arCatalogGroups);
     }
     if (empty($arCatalogGroups)) {
         $catalogGroupIterator = CCatalogGroup::GetGroupsList(array('GROUP_ID' => $arUserGroups, 'BUY' => array('Y', 'N')));
         while ($catalogGroup = $catalogGroupIterator->Fetch()) {
             $arCatalogGroups[$catalogGroup['CATALOG_GROUP_ID']] = $catalogGroup['CATALOG_GROUP_ID'];
         }
         unset($catalogGroup, $catalogGroupIterator);
     }
     if (!empty($arCatalogGroups)) {
         Main\Type\Collection::normalizeArrayValuesByInt($arCatalogGroups, true);
     }
     if (empty($arCatalogGroups)) {
         return false;
     }
     $strRenewal = (string) $strRenewal == 'Y' ? 'Y' : 'N';
     if ($siteID === false) {
         $siteID = SITE_ID;
     }
     $arSKUExt = false;
     if ($boolSKU) {
         $arSKUExt = CCatalogSKU::GetInfoByOfferIBlock($intIBlockID);
         $boolSKU = !empty($arSKUExt);
     }
     $arResult = array();
     $arResultID = array();
     if (self::$useSaleDiscount) {
     } else {
         $strCacheKey = md5('C' . implode('_', $arCatalogGroups) . '-' . 'U' . implode('_', $arUserGroups));
         if (!isset(self::$arCacheDiscountFilter[$strCacheKey])) {
             $arFilter = array('PRICE_TYPE_ID' => $arCatalogGroups, 'USER_GROUP_ID' => $arUserGroups);
             $arDiscountIDs = CCatalogDiscount::__GetDiscountID($arFilter);
             if (!empty($arDiscountIDs)) {
                 sort($arDiscountIDs);
             }
             self::$arCacheDiscountFilter[$strCacheKey] = $arDiscountIDs;
         } else {
             $arDiscountIDs = self::$arCacheDiscountFilter[$strCacheKey];
         }
         $arProduct = array();
         if (!empty($arDiscountIDs)) {
             if ($arDiscountCoupons === false) {
                 if (self::$existCouponsManager && Loader::includeModule('sale')) {
                     $arDiscountCoupons = DiscountCouponsManager::getForApply(array('MODULE' => 'catalog', 'DISCOUNT_ID' => $arDiscountIDs), array('MODULE' => 'catalog', 'PRODUCT_ID' => $intProductID, 'BASKET_ID' => '0'), true);
                     if (!empty($arDiscountCoupons)) {
                         $arDiscountCoupons = array_keys($arDiscountCoupons);
                     }
                 } else {
                     if (!isset($_SESSION['CATALOG_USER_COUPONS']) || !is_array($_SESSION['CATALOG_USER_COUPONS'])) {
                         $_SESSION['CATALOG_USER_COUPONS'] = array();
                     }
                     $arDiscountCoupons = $_SESSION["CATALOG_USER_COUPONS"];
                 }
             }
             if ($arDiscountCoupons === false) {
                 $arDiscountCoupons = array();
             }
             $boolGenerate = false;
             if (empty(self::$cacheDiscountHandlers)) {
                 self::$cacheDiscountHandlers = CCatalogDiscount::getDiscountHandlers($arDiscountIDs);
             } else {
                 $needDiscountHandlers = array();
                 foreach ($arDiscountIDs as &$discountID) {
                     if (!isset(self::$cacheDiscountHandlers[$discountID])) {
                         $needDiscountHandlers[] = $discountID;
                     }
                 }
                 unset($discountID);
                 if (!empty($needDiscountHandlers)) {
                     $discountHandlersList = CCatalogDiscount::getDiscountHandlers($needDiscountHandlers);
                     if (!empty($discountHandlersList)) {
                         foreach ($discountHandlersList as $discountID => $discountHandlers) {
                             self::$cacheDiscountHandlers[$discountID] = $discountHandlers;
                         }
                         unset($discountHandlers, $discountID);
                     }
                     unset($discountHandlersList);
                 }
                 unset($needDiscountHandlers);
             }
             $strCacheKey = 'D' . implode('_', $arDiscountIDs) . '-' . 'S' . $siteID . '-R' . $strRenewal;
             if (!empty($arDiscountCoupons)) {
                 $strCacheKey .= '-C' . implode('|', $arDiscountCoupons);
             }
             $strCacheKey = md5($strCacheKey);
             if (!isset(self::$arCacheDiscountResult[$strCacheKey])) {
                 $arDiscountList = array();
                 $arSelect = array('ID', 'TYPE', 'SITE_ID', 'ACTIVE', 'ACTIVE_FROM', 'ACTIVE_TO', 'RENEWAL', 'NAME', 'SORT', 'MAX_DISCOUNT', 'VALUE_TYPE', 'VALUE', 'CURRENCY', 'PRIORITY', 'LAST_DISCOUNT', 'COUPON', 'COUPON_ONE_TIME', 'COUPON_ACTIVE', 'UNPACK', 'CONDITIONS');
                 $strDate = date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")));
                 $discountRows = array_chunk($arDiscountIDs, 500);
                 foreach ($discountRows as &$row) {
                     $arFilter = array('@ID' => $row, 'SITE_ID' => $siteID, 'TYPE' => self::ENTITY_ID, 'RENEWAL' => $strRenewal, '+<=ACTIVE_FROM' => $strDate, '+>=ACTIVE_TO' => $strDate);
                     if (is_array($arDiscountCoupons)) {
                         $arFilter['+COUPON'] = $arDiscountCoupons;
                     }
                     CTimeZone::Disable();
                     $rsPriceDiscounts = CCatalogDiscount::GetList(array(), $arFilter, false, false, $arSelect);
                     CTimeZone::Enable();
                     while ($arPriceDiscount = $rsPriceDiscounts->Fetch()) {
                         $arPriceDiscount['HANDLERS'] = array();
                         $arPriceDiscount['MODULE_ID'] = 'catalog';
                         $arDiscountList[] = $arPriceDiscount;
                     }
                 }
                 unset($row, $discountRows);
                 self::$arCacheDiscountResult[$strCacheKey] = $arDiscountList;
             } else {
                 $arDiscountList = self::$arCacheDiscountResult[$strCacheKey];
             }
             if (!empty($arDiscountList)) {
                 $discountApply = array();
                 foreach ($arDiscountList as &$arPriceDiscount) {
                     if (!isset($discountApply[$arPriceDiscount['ID']]) && $arPriceDiscount['COUPON_ACTIVE'] != 'N') {
                         if (!$boolGenerate) {
                             if (!isset(self::$arCacheProduct[$intProductID])) {
                                 $arProduct = array('ID' => $intProductID, 'IBLOCK_ID' => $intIBlockID);
                                 if (!self::__GenerateFields($arProduct)) {
                                     return false;
                                 }
                                 if ($boolSKU) {
                                     if (!self::__GenerateParent($arProduct, $arSKUExt)) {
                                         $boolSKU = false;
                                     }
                                 }
                                 $boolGenerate = true;
                                 self::$arCacheProduct[$intProductID] = $arProduct;
                             } else {
                                 $boolGenerate = true;
                                 $arProduct = self::$arCacheProduct[$intProductID];
                             }
                         }
                         $discountApply[$arPriceDiscount['ID']] = true;
                         $applyFlag = true;
                         if (isset(self::$cacheDiscountHandlers[$arPriceDiscount['ID']])) {
                             $arPriceDiscount['HANDLERS'] = self::$cacheDiscountHandlers[$arPriceDiscount['ID']];
                             $moduleList = self::$cacheDiscountHandlers[$arPriceDiscount['ID']]['MODULES'];
                             if (!empty($moduleList)) {
                                 foreach ($moduleList as &$moduleID) {
                                     if (!isset(self::$usedModules[$moduleID])) {
                                         self::$usedModules[$moduleID] = Loader::includeModule($moduleID);
                                     }
                                     if (!self::$usedModules[$moduleID]) {
                                         $applyFlag = false;
                                         break;
                                     }
                                 }
                                 unset($moduleID);
                             }
                             unset($moduleList);
                         }
                         if ($applyFlag && CCatalogDiscount::__Unpack($arProduct, $arPriceDiscount['UNPACK'])) {
                             $arResult[] = $arPriceDiscount;
                             $arResultID[] = $arPriceDiscount['ID'];
                         }
                     }
                 }
                 if (isset($arPriceDiscount)) {
                     unset($arPriceDiscount);
                 }
                 unset($discountApply);
             }
         }
         if (!$boolGetIDS) {
             $arDiscSave = CCatalogDiscountSave::GetDiscount(array('USER_ID' => 0, 'USER_GROUPS' => $arUserGroups, 'SITE_ID' => $siteID));
             if (!empty($arDiscSave)) {
                 $arResult = !empty($arResult) ? array_merge($arResult, $arDiscSave) : $arDiscSave;
             }
         } else {
             $arResult = $arResultID;
         }
     }
     if ($eventOnResultExists === true || $eventOnResultExists === null) {
         foreach (GetModuleEvents("catalog", "OnGetDiscountResult", true) as $arEvent) {
             $eventOnResultExists = true;
             ExecuteModuleEventEx($arEvent, array(&$arResult));
         }
         if ($eventOnResultExists === null) {
             $eventOnResultExists = false;
         }
     }
     return $arResult;
 }
Example #5
0
 protected function getDiscountHandlers($discountList)
 {
     global $DB;
     $defaultRes = array('MODULES' => array(), 'EXT_FILES' => array());
     $result = array();
     Main\Type\Collection::normalizeArrayValuesByInt($discountList, true);
     if (!empty($discountList)) {
         $result = array_fill_keys($discountList, $defaultRes);
         $discountRows = array_chunk($discountList, 500);
         foreach ($discountRows as &$oneRow) {
             $sqlQuery = 'select * from b_catalog_discount_module where DISCOUNT_ID IN (' . implode(', ', $oneRow) . ')';
             $resQuery = $DB->Query($sqlQuery, false, 'File: ' . __FILE__ . '<br>Line: ' . __LINE__);
             while ($row = $resQuery->Fetch()) {
                 $row['DISCOUNT_ID'] = (int) $row['DISCOUNT_ID'];
                 $result[$row['DISCOUNT_ID']]['MODULES'][] = $row['MODULE_ID'];
             }
             if (isset($row)) {
                 unset($row);
             }
             unset($resQuery, $sqlQuery);
         }
         unset($oneRow, $discountRows);
     }
     return $result;
 }
Example #6
0
 public function CheckFields($ACTION, &$arFields)
 {
     global $DB, $APPLICATION, $USER;
     if (empty($arFields) || !is_array($arFields)) {
         return false;
     }
     $ACTION = strtoupper($ACTION);
     if ('UPDATE' != $ACTION && 'ADD' != $ACTION) {
         return false;
     }
     $discountID = 0;
     if ($ACTION == 'UPDATE') {
         if (isset($arFields['ID'])) {
             $discountID = (int) $arFields['ID'];
         }
         if ($discountID <= 0) {
             return false;
         }
     }
     $clearFields = array('ID', '~ID', 'UNPACK', '~UNPACK', '~CONDITIONS', 'APPLICATION', '~APPLICATION', '~ACTIONS', 'USE_COUPONS', '~USE_COUPONS', 'HANDLERS', '~HANDLERS', '~VERSION', 'TIMESTAMP_X', 'DATE_CREATE', '~DATE_CREATE', '~MODIFIED_BY', '~CREATED_BY', 'EXECUTE_MODULE', '~EXECUTE_MODULE');
     if ($ACTION == 'UPDATE') {
         $clearFields[] = 'CREATED_BY';
     }
     foreach ($clearFields as &$fieldName) {
         if (array_key_exists($fieldName, $arFields)) {
             unset($arFields[$fieldName]);
         }
     }
     unset($fieldName);
     unset($clearFields);
     if ((is_set($arFields, "ACTIVE") || $ACTION == "ADD") && $arFields["ACTIVE"] != "Y") {
         $arFields["ACTIVE"] = "N";
     }
     if ((is_set($arFields, "DISCOUNT_TYPE") || $ACTION == "ADD") && $arFields["DISCOUNT_TYPE"] != self::OLD_DSC_TYPE_PERCENT) {
         $arFields["DISCOUNT_TYPE"] = self::OLD_DSC_TYPE_FIX;
     }
     if ((is_set($arFields, "SORT") || $ACTION == "ADD") && intval($arFields["SORT"]) <= 0) {
         $arFields["SORT"] = 100;
     }
     if ((is_set($arFields, "LID") || $ACTION == "ADD") && strlen($arFields["LID"]) <= 0) {
         return false;
     }
     if (is_set($arFields, "LID")) {
         $dbSite = CSite::GetByID($arFields["LID"]);
         if (!$dbSite->Fetch()) {
             $APPLICATION->ThrowException(Loc::getMessage('SKGD_NO_SITE', array('#ID#' => $arFields['LID'])), 'ERROR_NO_SITE');
             return false;
         }
         $arFields['CURRENCY'] = CSaleLang::GetLangCurrency($arFields["LID"]);
     }
     if ((is_set($arFields, "CURRENCY") || $ACTION == "ADD") && strlen($arFields["CURRENCY"]) <= 0) {
         return false;
     }
     if (is_set($arFields, "CURRENCY")) {
         if (!($arCurrency = CCurrency::GetByID($arFields["CURRENCY"]))) {
             $APPLICATION->ThrowException(Loc::getMessage('SKGD_NO_CURRENCY', array('#ID#' => $arFields['CURRENCY'])), 'ERROR_NO_CURRENCY');
             return false;
         }
     }
     if (is_set($arFields, "DISCOUNT_VALUE") || $ACTION == "ADD") {
         if (!is_set($arFields["DISCOUNT_VALUE"])) {
             $arFields["DISCOUNT_VALUE"] = '';
         }
         $arFields["DISCOUNT_VALUE"] = str_replace(",", ".", $arFields["DISCOUNT_VALUE"]);
         $arFields["DISCOUNT_VALUE"] = doubleval($arFields["DISCOUNT_VALUE"]);
     }
     if (is_set($arFields, "PRICE_FROM")) {
         $arFields["PRICE_FROM"] = str_replace(",", ".", $arFields["PRICE_FROM"]);
         $arFields["PRICE_FROM"] = doubleval($arFields["PRICE_FROM"]);
     }
     if (is_set($arFields, "PRICE_TO")) {
         $arFields["PRICE_TO"] = str_replace(",", ".", $arFields["PRICE_TO"]);
         $arFields["PRICE_TO"] = doubleval($arFields["PRICE_TO"]);
     }
     if ((is_set($arFields, "ACTIVE_FROM") || $ACTION == "ADD") && !$DB->IsDate($arFields["ACTIVE_FROM"], false, LANGUAGE_ID, "FULL")) {
         $arFields["ACTIVE_FROM"] = false;
     }
     if ((is_set($arFields, "ACTIVE_TO") || $ACTION == "ADD") && !$DB->IsDate($arFields["ACTIVE_TO"], false, LANGUAGE_ID, "FULL")) {
         $arFields["ACTIVE_TO"] = false;
     }
     if ((is_set($arFields, 'PRIORITY') || $ACTION == 'ADD') && intval($arFields['PRIORITY']) <= 0) {
         $arFields['PRIORITY'] = 1;
     }
     if ((is_set($arFields, 'LAST_DISCOUNT') || $ACTION == 'ADD') && $arFields["LAST_DISCOUNT"] != "N") {
         $arFields["LAST_DISCOUNT"] = 'Y';
     }
     $arFields['VERSION'] = self::VERSION_NEW;
     $useConditions = array_key_exists('CONDITIONS', $arFields) || $ACTION == 'ADD';
     $useActions = array_key_exists('ACTIONS', $arFields) || $ACTION == 'ADD';
     $updateData = $useConditions || $useActions;
     $usedHandlers = array();
     $usedEntities = array();
     $executeModule = '';
     $conditionData = array('HANDLERS' => array(), 'ENTITY' => array(), 'EXECUTE_MODULE' => array());
     $actionData = array('HANDLERS' => array(), 'ENTITY' => array(), 'EXECUTE_MODULE' => array());
     if ($useConditions) {
         if (!isset($arFields['CONDITIONS']) || empty($arFields['CONDITIONS'])) {
             $APPLICATION->ThrowException(Loc::getMessage("BT_MOD_SALE_DISC_ERR_EMPTY_CONDITIONS"), "CONDITIONS");
             return false;
         } else {
             $arFields['UNPACK'] = '';
             if (!self::prepareDiscountConditions($arFields['CONDITIONS'], $arFields['UNPACK'], $conditionData, self::PREPARE_CONDITIONS, $arFields['LID'])) {
                 return false;
             }
         }
     }
     if ($useActions) {
         if (!isset($arFields['ACTIONS']) || empty($arFields['ACTIONS'])) {
             $APPLICATION->ThrowException(Loc::getMessage("BT_MOD_SALE_DISC_ERR_EMPTY_ACTIONS_EXT"), "ACTIONS");
             return false;
         } else {
             $arFields['APPLICATION'] = '';
             if (!self::prepareDiscountConditions($arFields['ACTIONS'], $arFields['APPLICATION'], $actionData, self::PREPARE_ACTIONS, $arFields['LID'])) {
                 return false;
             }
         }
     }
     if ($updateData) {
         if (!$useConditions) {
             $rsDiscounts = CSaleDiscount::GetList(array(), array('ID' => $discountID), false, false, array('ID', 'CONDITIONS', 'LID'));
             if ($discountInfo = $rsDiscounts->Fetch()) {
                 $discountInfo['UNPACK'] = '';
                 if (!self::prepareDiscountConditions($discountInfo['CONDITIONS'], $discountInfo['UNPACK'], $conditionData, self::PREPARE_CONDITIONS, $discountInfo['LID'])) {
                     return false;
                 }
             } else {
                 return false;
             }
         }
         if (!$useActions) {
             $rsDiscounts = CSaleDiscount::GetList(array(), array('ID' => $discountID), false, false, array('ID', 'ACTIONS', 'LID'));
             if ($discountInfo = $rsDiscounts->Fetch()) {
                 $discountInfo['APPLICATION'] = '';
                 if (!self::prepareDiscountConditions($discountInfo['ACTIONS'], $discountInfo['APPLICATION'], $actionData, self::PREPARE_ACTIONS, $discountInfo['LID'])) {
                     return false;
                 }
             } else {
                 return false;
             }
         }
         if (!empty($conditionData['HANDLERS']) || !empty($actionData['HANDLERS'])) {
             if (!empty($conditionData['HANDLERS'])) {
                 $usedHandlers = $conditionData['HANDLERS'];
             }
             if (!empty($actionData['HANDLERS'])) {
                 if (empty($usedHandlers)) {
                     $usedHandlers = $actionData['HANDLERS'];
                 } else {
                     $usedHandlers['MODULES'] = array_unique(array_merge($usedHandlers['MODULES'], $actionData['HANDLERS']['MODULES']));
                     $usedHandlers['EXT_FILES'] = array_unique(array_merge($usedHandlers['EXT_FILES'], $actionData['HANDLERS']['EXT_FILES']));
                 }
             }
         }
         if (!empty($conditionData['EXECUTE_MODULE']) || !empty($actionData['EXECUTE_MODULE'])) {
             $executeModuleList = array();
             if (!empty($conditionData['EXECUTE_MODULE'])) {
                 $executeModuleList = $conditionData['EXECUTE_MODULE'];
             }
             if (!empty($actionData['EXECUTE_MODULE'])) {
                 $executeModuleList = empty($executeModuleList) ? $actionData['EXECUTE_MODULE'] : array_merge($executeModuleList, $actionData['EXECUTE_MODULE']);
             }
             $executeModuleList = array_unique($executeModuleList);
             if (count($executeModuleList) > 1) {
                 $APPLICATION->ThrowException(Loc::getMessage('BX_SALE_DISC_ERR_MULTIPLE_EXECUTE_MODULE'), 'DISCOUNT');
                 return false;
             }
             $executeModule = current($executeModuleList);
             unset($executeModuleList);
         }
         if (!empty($conditionData['ENTITY']) || !empty($actionData['ENTITY'])) {
             if (!empty($conditionData['ENTITY'])) {
                 $usedEntities = $conditionData['ENTITY'];
             }
             if (!empty($actionData['ENTITY'])) {
                 $usedEntities = empty($usedEntities) ? $actionData['ENTITY'] : array_merge($usedEntities, $actionData['ENTITY']);
             }
         }
     }
     if ($ACTION == 'ADD' && $executeModule == '') {
         $executeModule = 'all';
     }
     if ($executeModule != '') {
         $arFields['EXECUTE_MODULE'] = $executeModule;
     }
     if (!empty($usedHandlers)) {
         $arFields['HANDLERS'] = $usedHandlers;
     }
     if (!empty($usedEntities)) {
         $arFields['ENTITIES'] = $usedEntities;
     }
     if ((is_set($arFields, 'USE_COUPONS') || $ACTION == 'ADD') && 'Y' != $arFields['USE_COUPONS']) {
         $arFields['USE_COUPONS'] = 'N';
     }
     if (array_key_exists('USER_GROUPS', $arFields) || $ACTION == "ADD") {
         Collection::normalizeArrayValuesByInt($arFields['USER_GROUPS']);
         if (empty($arFields['USER_GROUPS']) || !is_array($arFields['USER_GROUPS'])) {
             $APPLICATION->ThrowException(Loc::getMessage("BT_MOD_SALE_DISC_ERR_USER_GROUPS_ABSENT_SHORT"), "USER_GROUPS");
             return false;
         }
     }
     $intUserID = 0;
     $boolUserExist = isset($USER) && $USER instanceof CUser;
     if ($boolUserExist) {
         $intUserID = (int) $USER->GetID();
     }
     $strDateFunction = $DB->GetNowFunction();
     $arFields['~TIMESTAMP_X'] = $strDateFunction;
     if ($boolUserExist) {
         if (!array_key_exists('MODIFIED_BY', $arFields) || (int) $arFields["MODIFIED_BY"] <= 0) {
             $arFields["MODIFIED_BY"] = $intUserID;
         }
     }
     if ($ACTION == 'ADD') {
         $arFields['~DATE_CREATE'] = $strDateFunction;
         if ($boolUserExist) {
             if (!array_key_exists('CREATED_BY', $arFields) || (int) $arFields["CREATED_BY"] <= 0) {
                 $arFields["CREATED_BY"] = $intUserID;
             }
         }
     }
     return true;
 }
Example #7
0
 /**
  * Clear data by discount list.
  *
  * @param array|int $discountList			Discount ids list.
  * @return bool
  */
 public static function clearByDiscount($discountList)
 {
     if (!is_array($discountList)) {
         $discountList = array($discountList);
     }
     if (empty($discountList)) {
         return false;
     }
     Main\Type\Collection::normalizeArrayValuesByInt($discountList, true);
     if (empty($discountList)) {
         return false;
     }
     $conn = Main\Application::getConnection();
     $helper = $conn->getSqlHelper();
     $conn->queryExecute('delete from ' . $helper->quote(self::getTableName()) . ' where ' . $helper->quote('ENTITY_TYPE') . ' = ' . self::ENTITY_TYPE_DISCOUNT . ' and ' . $helper->quote('ENTITY_ID') . ' in (' . implode(',', $discountList) . ')');
     unset($helper, $conn);
     return true;
 }
 /**
  * Save coupons applyed info.
  *
  * @param array $coupons				Coupons list.
  * @param int $userId					User id.
  * @param Main\Type\DateTime $currentTime	Current datetime.
  * @return array|bool
  */
 public static function saveApplied($coupons, $userId, Main\Type\DateTime $currentTime)
 {
     $currentTimestamp = $currentTime->getTimestamp();
     if ($userId === null || (int) $userId == 0) {
         return false;
     }
     $userId = (int) $userId;
     if (!is_array($coupons)) {
         $coupons = array($coupons);
     }
     if (empty($coupons)) {
         return false;
     }
     Main\Type\Collection::normalizeArrayValuesByInt($coupons);
     if (empty($coupons)) {
         return false;
     }
     $deactivateCoupons = array();
     $incrementalCoupons = array();
     $limitedCoupons = array();
     $couponIterator = self::getList(array('select' => array('ID', 'COUPON', 'DISCOUNT_ID', 'TYPE', 'ACTIVE', 'MAX_USE', 'USE_COUNT', 'USER_ID', 'ACTIVE_TO', 'ACTIVE_FROM', 'DISCOUNT_ACTIVE' => 'DISCOUNT.ACTIVE', 'DISCOUNT_ACTIVE_FROM' => 'DISCOUNT.ACTIVE_FROM', 'DISCOUNT_ACTIVE_TO' => 'DISCOUNT.ACTIVE_TO'), 'filter' => array('@ID' => $coupons, '=ACTIVE' => 'Y'), 'order' => array('ID' => 'ASC')));
     while ($existCoupon = $couponIterator->fetch()) {
         if ($existCoupon['DISCOUNT_ACTIVE'] != 'Y') {
             continue;
         }
         if ($existCoupon['DISCOUNT_ACTIVE_FROM'] instanceof Main\Type\DateTime && $existCoupon['DISCOUNT_ACTIVE_FROM']->getTimestamp() > $currentTimestamp || $existCoupon['DISCOUNT_ACTIVE_TO'] instanceof Main\Type\DateTime && $existCoupon['DISCOUNT_ACTIVE_TO']->getTimestamp() < $currentTimestamp) {
             continue;
         }
         $existCoupon['USER_ID'] = (int) $existCoupon['USER_ID'];
         if ($existCoupon['USER_ID'] > 0 && $existCoupon['USER_ID'] != $userId) {
             continue;
         }
         if ($existCoupon['ACTIVE_FROM'] instanceof Main\Type\DateTime && $existCoupon['ACTIVE_FROM']->getTimestamp() > $currentTimestamp || $existCoupon['ACTIVE_TO'] instanceof Main\Type\DateTime && $existCoupon['ACTIVE_TO']->getTimestamp() < $currentTimestamp) {
             continue;
         }
         if ($existCoupon['TYPE'] == self::TYPE_BASKET_ROW || $existCoupon['TYPE'] == self::TYPE_ONE_ORDER) {
             $deactivateCoupons[$existCoupon['COUPON']] = $existCoupon['ID'];
         } elseif ($existCoupon['TYPE'] == self::TYPE_MULTI_ORDER) {
             $existCoupon['MAX_USE'] = (int) $existCoupon['MAX_USE'];
             $existCoupon['USE_COUNT'] = (int) $existCoupon['USE_COUNT'];
             if ($existCoupon['MAX_USE'] > 0 && $existCoupon['USE_COUNT'] >= $existCoupon['MAX_USE']) {
                 continue;
             }
             if ($existCoupon['MAX_USE'] > 0 && $existCoupon['USE_COUNT'] >= $existCoupon['MAX_USE'] - 1) {
                 $limitedCoupons[$existCoupon['COUPON']] = $existCoupon['ID'];
             } else {
                 $incrementalCoupons[$existCoupon['COUPON']] = $existCoupon['ID'];
             }
         }
     }
     unset($existCoupon, $couponIterator, $coupons);
     if (!empty($deactivateCoupons) || !empty($limitedCoupons) || !empty($incrementalCoupons)) {
         $conn = Application::getConnection();
         $helper = $conn->getSqlHelper();
         $tableName = $helper->quote(self::getTableName());
         if (!empty($deactivateCoupons)) {
             $conn->queryExecute('update ' . $tableName . ' set ' . $helper->quote('ACTIVE') . ' = \'N\', ' . $helper->quote('DATE_APPLY') . ' = ' . $helper->getCurrentDateTimeFunction() . ' where ' . $helper->quote('ID') . ' in (' . implode(',', $deactivateCoupons) . ')');
         }
         if (!empty($incrementalCoupons)) {
             $conn->queryExecute('update ' . $tableName . ' set ' . $helper->quote('DATE_APPLY') . ' = ' . $helper->getCurrentDateTimeFunction() . ', ' . $helper->quote('USE_COUNT') . ' = ' . $helper->quote('USE_COUNT') . ' + 1' . ' where ' . $helper->quote('ID') . ' in (' . implode(',', $incrementalCoupons) . ')');
         }
         if (!empty($limitedCoupons)) {
             $conn->queryExecute('update ' . $tableName . ' set ' . $helper->quote('DATE_APPLY') . ' = ' . $helper->getCurrentDateTimeFunction() . ', ' . $helper->quote('ACTIVE') . ' = \'N\', ' . $helper->quote('USE_COUNT') . ' = ' . $helper->quote('USE_COUNT') . ' + 1' . ' where ' . $helper->quote('ID') . ' in (' . implode(',', $limitedCoupons) . ')');
         }
         unset($tableName, $helper);
     }
     return array('DEACTIVATE' => $deactivateCoupons, 'LIMITED' => $limitedCoupons, 'INCREMENT' => $incrementalCoupons);
 }
Example #9
0
 /**
  * Returns ratio and measure for products.
  *
  * @param array|int $product				Product ids.
  * @return array|bool
  * @throws Main\ArgumentException
  */
 public static function getCurrentRatioWithMeasure($product)
 {
     if (!is_array($product)) {
         $product = array($product);
     }
     Main\Type\Collection::normalizeArrayValuesByInt($product, true);
     if (empty($product)) {
         return false;
     }
     $result = array();
     $defaultMeasure = \CCatalogMeasure::getDefaultMeasure(true, true);
     $defaultRow = array('RATIO' => 1, 'MEASURE' => !empty($defaultMeasure) ? $defaultMeasure : array());
     $existProduct = array();
     $measureMap = array();
     $productRows = array_chunk($product, 500);
     foreach ($productRows as &$row) {
         $productIterator = self::getList(array('select' => array('ID', 'MEASURE'), 'filter' => array('@ID' => $row), 'order' => array('ID' => 'ASC')));
         while ($item = $productIterator->fetch()) {
             $item['ID'] = (int) $item['ID'];
             $item['MEASURE'] = (int) $item['MEASURE'];
             self::$existProductCache[$item['ID']] = true;
             $existProduct[] = $item['ID'];
             $result[$item['ID']] = $defaultRow;
             if ($item['MEASURE'] > 0) {
                 if (!isset($measureMap[$item['MEASURE']])) {
                     $measureMap[$item['MEASURE']] = array();
                 }
                 $measureMap[$item['MEASURE']][] =& $result[$item['ID']];
             }
         }
         unset($item, $productIterator);
     }
     unset($row, $productRows);
     unset($defaultRow, $defaultMeasure);
     if (empty($existProduct)) {
         return false;
     }
     $ratioResult = MeasureRatioTable::getCurrentRatio($existProduct);
     if (!empty($ratioResult)) {
         foreach ($ratioResult as $ratioProduct => $ratio) {
             $result[$ratioProduct]['RATIO'] = $ratio;
         }
         unset($ratio, $ratioProduct);
     }
     unset($ratioResult);
     unset($existProduct);
     if (!empty($measureMap)) {
         $measureIterator = \CCatalogMeasure::getList(array(), array('@ID' => array_keys($measureMap)), false, false, array());
         while ($measure = $measureIterator->getNext()) {
             $measure['ID'] = (int) $measure['ID'];
             if (empty($measureMap[$measure['ID']])) {
                 continue;
             }
             foreach ($measureMap[$measure['ID']] as &$product) {
                 $product['MEASURE'] = $measure;
             }
             unset($product);
         }
         unset($measure, $measureIterator);
     }
     unset($measureMap);
     return $result;
 }
Example #10
0
 public static function SetCatalogDiscountCache($arCatalogGroups, $arUserGroups)
 {
     global $DB;
     $result = false;
     if (self::$catalogIncluded === null) {
         self::$catalogIncluded = Loader::includeModule('catalog');
     }
     if (self::$catalogIncluded) {
         if (!is_array($arCatalogGroups) || !is_array($arUserGroups)) {
             return false;
         }
         Main\Type\Collection::normalizeArrayValuesByInt($arCatalogGroups, true);
         if (empty($arCatalogGroups)) {
             return false;
         }
         Main\Type\Collection::normalizeArrayValuesByInt($arUserGroups, true);
         if (empty($arUserGroups)) {
             return false;
         }
         $arRestFilter = array('PRICE_TYPES' => $arCatalogGroups, 'USER_GROUPS' => $arUserGroups);
         $arRest = CCatalogDiscount::GetRestrictions($arRestFilter, false, false);
         $arDiscountFilter = array();
         $arDiscountResult = array();
         if (empty($arRest) || array_key_exists('DISCOUNTS', $arRest) && empty($arRest['DISCOUNTS'])) {
             foreach ($arCatalogGroups as &$intOneGroupID) {
                 $strCacheKey = CCatalogDiscount::GetDiscountFilterCacheKey(array($intOneGroupID), $arUserGroups, false);
                 $arDiscountFilter[$strCacheKey] = array();
             }
             unset($intOneGroupID);
         } else {
             $arResultDiscountList = array();
             $arSelect = array('ID', 'TYPE', 'SITE_ID', 'ACTIVE', 'ACTIVE_FROM', 'ACTIVE_TO', 'RENEWAL', 'NAME', 'SORT', 'MAX_DISCOUNT', 'VALUE_TYPE', 'VALUE', 'CURRENCY', 'PRIORITY', 'LAST_DISCOUNT', 'COUPON', 'COUPON_ONE_TIME', 'COUPON_ACTIVE', 'UNPACK', 'CONDITIONS');
             $strDate = date($DB->DateFormatToPHP(CSite::GetDateFormat('FULL')));
             $discountRows = array_chunk($arRest['DISCOUNTS'], 500);
             foreach ($discountRows as &$row) {
                 $arFilter = array('@ID' => $row, 'SITE_ID' => SITE_ID, 'TYPE' => DISCOUNT_TYPE_STANDART, 'RENEWAL' => 'N', '+<=ACTIVE_FROM' => $strDate, '+>=ACTIVE_TO' => $strDate, '+COUPON' => array());
                 $rsPriceDiscounts = CCatalogDiscount::GetList(array(), $arFilter, false, false, $arSelect);
                 while ($arPriceDiscount = $rsPriceDiscounts->Fetch()) {
                     $arPriceDiscount['ID'] = (int) $arPriceDiscount['ID'];
                     $arResultDiscountList[$arPriceDiscount['ID']] = $arPriceDiscount;
                 }
                 unset($arPriceDiscount, $rsPriceDiscounts, $arFilter);
             }
             unset($row, $discountRows);
             foreach ($arCatalogGroups as &$intOneGroupID) {
                 $strCacheKey = CCatalogDiscount::GetDiscountFilterCacheKey(array($intOneGroupID), $arUserGroups, false);
                 $arDiscountDetailList = array();
                 $arDiscountList = array();
                 foreach ($arRest['RESTRICTIONS'] as $intDiscountID => $arDiscountRest) {
                     if (empty($arDiscountRest['PRICE_TYPE']) || array_key_exists($intOneGroupID, $arDiscountRest['PRICE_TYPE'])) {
                         $arDiscountList[] = $intDiscountID;
                         if (isset($arResultDiscountList[$intDiscountID])) {
                             $arDiscountDetailList[] = $arResultDiscountList[$intDiscountID];
                         }
                     }
                 }
                 sort($arDiscountList);
                 $arDiscountFilter[$strCacheKey] = $arDiscountList;
                 $strResultCacheKey = CCatalogDiscount::GetDiscountResultCacheKey($arDiscountList, SITE_ID, 'N');
                 $arDiscountResult[$strResultCacheKey] = $arDiscountDetailList;
             }
             if (isset($intOneGroupID)) {
                 unset($intOneGroupID);
             }
         }
         $boolFlag = CCatalogDiscount::SetAllDiscountFilterCache($arDiscountFilter, false);
         $boolFlagExt = CCatalogDiscount::SetAllDiscountResultCache($arDiscountResult);
         $result = $boolFlag && $boolFlagExt;
         self::$needDiscountCache = $result;
     }
     return $result;
 }
Example #11
0
/** @deprecated deprecated since catalog 16.0.0
* @see \Bitrix\Main\Type\Collection::normalizeArrayValuesByInt
 *
 * @param array &$arMap
 * @param bool $boolSort
 * @return void
 */
function CatalogClearArray(&$arMap, $boolSort = true)
{
    Main\Type\Collection::normalizeArrayValuesByInt($arMap, $boolSort);
}
Example #12
0
 /**
  * Load from database discount id for user groups.
  *
  * @return void
  * @throws Main\ArgumentException
  */
 protected function loadDiscountByUserGroups()
 {
     if (!array_key_exists('USER_ID', $this->orderData)) {
         return;
     }
     $userGroups = \CUser::getUserGroup($this->orderData['USER_ID']);
     Main\Type\Collection::normalizeArrayValuesByInt($userGroups);
     $cacheKey = md5('U' . implode('_', $userGroups));
     if (!isset($this->discountByUserCache[$cacheKey])) {
         $discountCache = array();
         $groupDiscountIterator = Internals\DiscountGroupTable::getList(array('select' => array('DISCOUNT_ID'), 'filter' => array('@GROUP_ID' => $userGroups, '=ACTIVE' => 'Y'), 'order' => array('DISCOUNT_ID' => 'ASC')));
         while ($groupDiscount = $groupDiscountIterator->fetch()) {
             $groupDiscount['DISCOUNT_ID'] = (int) $groupDiscount['DISCOUNT_ID'];
             if ($groupDiscount['DISCOUNT_ID'] > 0) {
                 $discountCache[$groupDiscount['DISCOUNT_ID']] = $groupDiscount['DISCOUNT_ID'];
             }
         }
         unset($groupDiscount, $groupDiscountIterator);
         if (!empty($discountCache)) {
             $this->discountByUserCache[$cacheKey] = $discountCache;
         }
         unset($discountCache);
     }
     $this->discountIds = $this->discountByUserCache[$cacheKey];
 }
Example #13
0
 /**
  * Calculate discount by new order.
  *
  * @return Result
  */
 protected function calculateFull()
 {
     $result = new Result();
     $this->discountIds = array();
     if (!$this->isMixedBasket()) {
         $this->fillEmptyDiscountResult();
     } else {
         $this->discountResult['ORDER'] = array();
     }
     $order = $this->getOrder();
     $basket = $order->getBasket();
     /** @var BasketItem $basketItem */
     foreach ($basket as $basketItem) {
         $code = $basketItem->getBasketCode();
         if ($this->isCustomPriceByCode($code)) {
             if (array_key_exists($code, $this->basketDiscountList)) {
                 unset($this->basketDiscountList[$code]);
             }
         } else {
             if (!isset($this->basketDiscountList[$code])) {
                 $this->basketDiscountList[$code] = $basketItem->getField('DISCOUNT_LIST');
                 if ($this->basketDiscountList[$code] === null) {
                     unset($this->basketDiscountList[$code]);
                 }
             }
         }
     }
     unset($code, $basketItem, $basket);
     $this->resetBasketPrices();
     if ($this->isMixedBasket()) {
         DiscountCouponsManager::clearApply(false);
         $basketDiscountResult = $this->calculateMixedBasketDiscount();
     } else {
         DiscountCouponsManager::clearApply();
         $basketDiscountResult = $this->calculateFullBasketDiscount();
     }
     if (!$basketDiscountResult->isSuccess()) {
         $result->addErrors($basketDiscountResult->getErrors());
         unset($basketDiscountResult);
         return $result;
     }
     unset($basketDiscountResult);
     $this->roundBasketPrices();
     $codeList = array_keys($this->orderData['BASKET_ITEMS']);
     switch (self::getApplyMode()) {
         case self::APPLY_MODE_DISABLE:
             foreach ($codeList as &$code) {
                 if (isset($this->basketDiscountList[$code]) && !empty($this->basketDiscountList[$code])) {
                     $this->orderData['BASKET_ITEMS'][$code]['LAST_DISCOUNT'] = 'Y';
                 }
             }
             unset($code);
             break;
         case self::APPLY_MODE_LAST:
             foreach ($codeList as &$code) {
                 if (!isset($this->basketDiscountList[$code]) || empty($this->basketDiscountList[$code])) {
                     continue;
                 }
                 $lastDiscount = end($this->basketDiscountList[$code]);
                 if (!empty($lastDiscount['LAST_DISCOUNT']) && $lastDiscount['LAST_DISCOUNT'] == 'Y') {
                     $this->orderData['BASKET_ITEMS'][$code]['LAST_DISCOUNT'] = 'Y';
                 }
             }
             unset($code);
             break;
         case self::APPLY_MODE_ADD:
             break;
     }
     unset($codeList);
     $userGroups = \CUser::getUserGroup($this->orderData['USER_ID']);
     Main\Type\Collection::normalizeArrayValuesByInt($userGroups);
     $cacheKey = md5('U' . implode('_', $userGroups));
     if (!isset($this->discountByUserCache[$cacheKey])) {
         $discountCache = array();
         $groupDiscountIterator = Internals\DiscountGroupTable::getList(array('select' => array('DISCOUNT_ID'), 'filter' => array('@GROUP_ID' => $userGroups, '=ACTIVE' => 'Y')));
         while ($groupDiscount = $groupDiscountIterator->fetch()) {
             $groupDiscount['DISCOUNT_ID'] = (int) $groupDiscount['DISCOUNT_ID'];
             if ($groupDiscount['DISCOUNT_ID'] > 0) {
                 $discountCache[$groupDiscount['DISCOUNT_ID']] = $groupDiscount['DISCOUNT_ID'];
             }
         }
         unset($groupDiscount, $groupDiscountIterator);
         if (!empty($discountCache)) {
             Main\Type\Collection::normalizeArrayValuesByInt($discountCache);
             $this->discountByUserCache[$cacheKey] = $discountCache;
         }
         unset($discountCache);
     }
     if (!empty($this->discountByUserCache[$cacheKey])) {
         $this->discountIds = $this->discountByUserCache[$cacheKey];
     }
     if (empty($this->discountIds)) {
         $this->discountIds = null;
     } else {
         $this->getDiscountModules();
         $couponList = DiscountCouponsManager::getForApply(array('MODULE' => 'sale', 'DISCOUNT_ID' => $this->discountIds), array(), true);
         $cacheKey = md5('D' . implode('_', $this->discountIds));
         if (!empty($couponList)) {
             $cacheKey .= '-C' . implode('_', array_keys($couponList));
         }
         $currentList = array();
         if (!isset($this->saleDiscountCache[$cacheKey])) {
             $discountApply = array();
             $currentDatetime = new Main\Type\DateTime();
             $discountSelect = array('ID', 'PRIORITY', 'SORT', 'LAST_DISCOUNT', 'UNPACK', 'APPLICATION', 'USE_COUPONS', 'EXECUTE_MODULE', 'NAME', 'CONDITIONS_LIST', 'ACTIONS_LIST');
             $discountOrder = array('PRIORITY' => 'DESC', 'SORT' => 'ASC', 'ID' => 'ASC');
             $discountFilter = array('@ID' => $this->discountIds, '=LID' => $this->orderData['SITE_ID'], '@EXECUTE_MODULE' => array('sale', 'all'), array('LOGIC' => 'OR', 'ACTIVE_FROM' => '', '<=ACTIVE_FROM' => $currentDatetime), array('LOGIC' => 'OR', 'ACTIVE_TO' => '', '>=ACTIVE_TO' => $currentDatetime));
             unset($currentDatetime);
             if (empty($couponList)) {
                 $discountFilter['=USE_COUPONS'] = 'N';
             } else {
                 $discountFilter[] = array('LOGIC' => 'OR', '=USE_COUPONS' => 'N', array('=USE_COUPONS' => 'Y', '@COUPON.COUPON' => array_keys($couponList)));
                 $discountSelect['DISCOUNT_COUPON'] = 'COUPON.COUPON';
             }
             $discountIterator = Internals\DiscountTable::getList(array('select' => $discountSelect, 'filter' => $discountFilter, 'order' => $discountOrder));
             while ($discount = $discountIterator->fetch()) {
                 $discount['ID'] = (int) $discount['ID'];
                 if (isset($discountApply[$discount['ID']])) {
                     continue;
                 }
                 $discountApply[$discount['ID']] = true;
                 if (!$this->loadDiscountModules('sale' . $discount['ID'])) {
                     continue;
                 }
                 if ($discount['USE_COUPONS'] == 'Y') {
                     $discount['COUPON'] = $couponList[$discount['DISCOUNT_COUPON']];
                 }
                 $discount['CONDITIONS'] = $discount['CONDITIONS_LIST'];
                 $discount['ACTIONS'] = $discount['ACTIONS_LIST'];
                 $discount['MODULE_ID'] = 'sale';
                 if (isset($this->cacheDiscountModules['sale' . $discount['ID']])) {
                     $discount['MODULES'] = $this->cacheDiscountModules['sale' . $discount['ID']];
                 }
                 unset($discount['ACTIONS_LIST'], $discount['CONDITIONS_LIST']);
                 $currentList[] = $discount;
             }
             unset($discount, $discountIterator, $discountApply);
             $this->saleDiscountCache[$cacheKey] = $currentList;
         } else {
             $currentList = $this->saleDiscountCache[$cacheKey];
         }
         unset($couponList);
         $this->discountIds = array();
         if (!empty($currentList)) {
             foreach ($currentList as &$discount) {
                 $this->discountIds[] = $discount['ID'];
             }
             unset($discount);
             $this->extendOrderData();
             foreach ($currentList as $indexDiscount => $discount) {
                 $this->fillCurrentStep(array('discount' => $discount));
                 if (!self::checkDiscountConditions()) {
                     continue;
                 }
                 $actionsResult = $this->applySaleDiscount();
                 if (!$actionsResult->isSuccess()) {
                     $result->addErrors($actionsResult->getErrors());
                     unset($actionsResult);
                     return $result;
                 }
                 if ($this->currentStep['stop']) {
                     break;
                 }
             }
             unset($discount, $indexDiscount, $currentList);
         }
         $this->fillEmptyCurrentStep();
     }
     return $result;
 }
Example #14
0
 /**
  * Returns list of recommended products for specific product.
  *
  * @param int $USER_ID							User id.
  * @param string $LID							Site id.
  * @param array $arFilterRecomendet				Recomendation filter.
  * @param string $recomMore						Get more.
  * @param int $cntProductDefault				Max count.
  * @return array
  */
 function GetRecommendetProduct($USER_ID, $LID, $arFilterRecomendet = array(), $recomMore = 'N', $cntProductDefault = 2)
 {
     $arRecomendetResult = array();
     if (CModule::IncludeModule('catalog') && !empty($arFilterRecomendet)) {
         $arRecomendet = array();
         if (!is_array($arFilterRecomendet)) {
             $arFilterRecomendet = array($arFilterRecomendet);
         }
         Main\Type\Collection::normalizeArrayValuesByInt($arFilterRecomendet);
         if (empty($arFilterRecomendet)) {
             return $arRecomendetResult;
         }
         $iblockRecommended = array();
         $productIterator = Iblock\ElementTable::getList(array('select' => array('ID', 'IBLOCK_ID'), 'filter' => array('@ID' => $arFilterRecomendet, '=ACTIVE' => 'Y')));
         while ($product = $productIterator->fetch()) {
             $product['ID'] = (int) $product['ID'];
             $product['IBLOCK_ID'] = (int) $product['IBLOCK_ID'];
             if (!isset($iblockRecommended[$product['IBLOCK_ID']])) {
                 $iblockRecommended[$product['IBLOCK_ID']] = array();
             }
             $iblockRecommended[$product['IBLOCK_ID']][] = $product['ID'];
         }
         unset($product, $productIterator);
         if (empty($iblockRecommended)) {
             return $arRecomendetResult;
         }
         $propertyList = array();
         $propertyIterator = Iblock\PropertyTable::getList(array('select' => array('ID', 'IBLOCK_ID'), 'filter' => array('@IBLOCK_ID' => array_keys($iblockRecommended), '=CODE' => 'RECOMMEND', '=PROPERTY_TYPE' => Iblock\PropertyTable::TYPE_ELEMENT)));
         while ($property = $propertyIterator->fetch()) {
             $property['ID'] = (int) $property['ID'];
             $property['IBLOCK_ID'] = (int) $property['IBLOCK_ID'];
             $propertyList[$property['IBLOCK_ID']] = $property['ID'];
         }
         unset($property, $propertyIterator);
         if (empty($propertyList)) {
             return $arRecomendetResult;
         }
         foreach ($propertyList as $iblockID => $propertyID) {
             $propertyValue = 'PROPERTY_' . $propertyID;
             $filter = array('ID' => $iblockRecommended[$iblockID], 'IBLOCK_ID' => $iblockID);
             $select = array('ID', 'IBLOCK_ID', $propertyValue);
             $propertyValue .= '_VALUE';
             $elementIterator = CIBlockElement::GetList(array(), $filter, false, false, $select);
             while ($element = $elementIterator->Fetch()) {
                 if (empty($element[$propertyValue])) {
                     continue;
                 }
                 if (is_array($element[$propertyValue])) {
                     foreach ($element[$propertyValue] as &$recId) {
                         $recId = (int) $recId;
                         if ($recId > 0) {
                             $arRecomendet[$recId] = true;
                         }
                     }
                     unset($recId);
                 } else {
                     $recId = (int) $element[$propertyValue];
                     if ($recId > 0) {
                         $arRecomendet[$recId] = true;
                     }
                 }
             }
         }
         unset($element, $elementIterator, $select, $filter, $propertyValue, $propertyID, $iblockID, $propertyList);
         if (!empty($arRecomendet)) {
             $arRecomendet = array_keys($arRecomendet);
             $arBuyerGroups = CUser::GetUserGroup($USER_ID);
             $arFilter = array("ID" => $arRecomendet, "ACTIVE" => "Y");
             $rsElement = CIBlockElement::GetList(array(), $arFilter, false, false, array("NAME", "ID", "LID", 'IBLOCK_ID', 'IBLOCK_SECTION_ID', "DETAIL_PICTURE", "PREVIEW_PICTURE", "DETAIL_PAGE_URL"));
             $currentVatMode = CCatalogProduct::getPriceVatIncludeMode();
             $currentUseDiscount = CCatalogProduct::getUseDiscount();
             CCatalogProduct::setUseDiscount(true);
             CCatalogProduct::setPriceVatIncludeMode(true);
             CCatalogProduct::setUsedCurrency(CSaleLang::GetLangCurrency($LID));
             $i = 0;
             while ($arElement = $rsElement->GetNext()) {
                 if (in_array($arElement["ID"], $arFilterRecomendet)) {
                     continue;
                 }
                 if ($recomMore == "N" && $i < $cntProductDefault || $recomMore == "Y") {
                     $arElement["MODULE"] = "catalog";
                     $arElement["PRODUCT_PROVIDER_CLASS"] = "CCatalogProductProvider";
                     $arElement["PRODUCT_ID"] = $arElement["ID"];
                     $arPrice = CCatalogProduct::GetOptimalPrice($arElement["ID"], 1, $arBuyerGroups, "N", array(), $LID, array());
                     $currentPrice = $arPrice['RESULT_PRICE']['DISCOUNT_PRICE'];
                     $arElement["PRICE"] = $currentPrice;
                     $arElement["CURRENCY"] = $arPrice["RESULT_PRICE"]["CURRENCY"];
                     $arElement["DISCOUNT_PRICE"] = $arPrice['RESULT_PRICE']['DISCOUNT'];
                     if ($arElement["IBLOCK_ID"] > 0 && $arElement["IBLOCK_SECTION_ID"] > 0) {
                         $arElement["EDIT_PAGE_URL"] = CIBlock::GetAdminElementEditLink($arElement["IBLOCK_ID"], $arElement["PRODUCT_ID"], array("find_section_section" => $arElement["IBLOCK_SECTION_ID"], 'WF' => 'Y'));
                     }
                     $arRecomendetResult[] = $arElement;
                     $i++;
                 }
             }
             CCatalogProduct::clearUsedCurrency();
             CCatalogProduct::setPriceVatIncludeMode($currentVatMode);
             CCatalogProduct::setUseDiscount($currentUseDiscount);
             unset($currentUseDiscount, $currentVatMode);
         }
     }
     return $arRecomendetResult;
 }
Example #15
0
 /**
  * Set exist coupons flag for discount list.
  *
  * @param array $discountList			Discount ids for update.
  * @param string $use				Value for update use coupons.
  * @return void
  */
 public static function setUseCoupons($discountList, $use)
 {
     if (!is_array($discountList)) {
         $discountList = array($discountList);
     }
     $use = (string) $use;
     if ($use !== 'Y' && $use !== 'N') {
         return;
     }
     Main\Type\Collection::normalizeArrayValuesByInt($discountList);
     if (empty($discountList)) {
         return;
     }
     $conn = Application::getConnection();
     $helper = $conn->getSqlHelper();
     $conn->queryExecute('update ' . $helper->quote(self::getTableName()) . ' set ' . $helper->quote('USE_COUPONS') . ' = \'' . $use . '\' where ' . $helper->quote('ID') . ' in (' . implode(',', $discountList) . ')');
 }
Example #16
0
 public static function GetPropertyValuesArray(&$result, $iblockID, $filter, $propertyFilter = array())
 {
     $iblockExtVersion = CIBlockElement::GetIBVersion($iblockID) == 2;
     $propertiesList = array();
     $mapCodes = array();
     $userTypesList = array();
     $existList = array();
     $selectListMultiply = array('SORT' => SORT_ASC, 'VALUE' => SORT_STRING);
     $selectAllMultiply = array('PROPERTY_VALUE_ID' => SORT_ASC);
     $propertyListFilter = array('IBLOCK_ID' => $iblockID);
     $propertyID = array();
     if (isset($propertyFilter['ID'])) {
         $propertyID = is_array($propertyFilter['ID']) ? $propertyFilter['ID'] : array($propertyFilter['ID']);
         Collection::normalizeArrayValuesByInt($propertyID);
     }
     if (!empty($propertyID)) {
         $propertyListFilter['@ID'] = $propertyID;
     } elseif (isset($propertyFilter['CODE'])) {
         if (!is_array($propertyFilter['CODE'])) {
             $propertyFilter['CODE'] = array($propertyFilter['CODE']);
         }
         $propertyCodes = array();
         if (!empty($propertyFilter['CODE'])) {
             foreach ($propertyFilter['CODE'] as &$code) {
                 $code = (string) $code;
                 if ($code !== '') {
                     $propertyCodes[] = $code;
                 }
             }
             unset($code);
         }
         if (!empty($propertyCodes)) {
             $propertyListFilter['@CODE'] = $propertyCodes;
         }
         unset($propertyCodes);
     }
     $propertyListFilter['=ACTIVE'] = isset($propertyFilter['ACTIVE']) && ($propertyFilter['ACTIVE'] == 'Y' || $propertyFilter['ACTIVE'] == 'N') ? $propertyFilter['ACTIVE'] : 'Y';
     $propertyID = array();
     $propertyIterator = PropertyTable::getList(array('select' => array('ID', 'IBLOCK_ID', 'NAME', 'ACTIVE', 'SORT', 'CODE', 'DEFAULT_VALUE', 'PROPERTY_TYPE', 'ROW_COUNT', 'COL_COUNT', 'LIST_TYPE', 'MULTIPLE', 'XML_ID', 'FILE_TYPE', 'MULTIPLE_CNT', 'LINK_IBLOCK_ID', 'WITH_DESCRIPTION', 'SEARCHABLE', 'FILTRABLE', 'IS_REQUIRED', 'VERSION', 'USER_TYPE', 'USER_TYPE_SETTINGS', 'HINT'), 'filter' => $propertyListFilter, 'order' => array('SORT' => 'ASC', 'ID' => 'ASC')));
     while ($property = $propertyIterator->fetch()) {
         $propertyID[] = (int) $property['ID'];
         $property['CODE'] = trim((string) $property['CODE']);
         if ($property['CODE'] === '') {
             $property['CODE'] = $property['ID'];
         }
         $code = $property['CODE'];
         $property['~NAME'] = $property['NAME'];
         if (preg_match("/[;&<>\"]/", $property['NAME'])) {
             $property['NAME'] = htmlspecialcharsex($property['NAME']);
         }
         if ($property['USER_TYPE']) {
             $userType = CIBlockProperty::GetUserType($property['USER_TYPE']);
             if (isset($userType['ConvertFromDB'])) {
                 $userTypesList[$property['ID']] = $userType;
                 if (array_key_exists("DEFAULT_VALUE", $property)) {
                     $value = array("VALUE" => $property["DEFAULT_VALUE"], "DESCRIPTION" => "");
                     $value = call_user_func_array($userType["ConvertFromDB"], array($property, $value));
                     $property["DEFAULT_VALUE"] = $value["VALUE"];
                 }
             }
         }
         if ($property['USER_TYPE_SETTINGS'] !== '' || $property['USER_TYPE_SETTINGS'] !== null) {
             $property['USER_TYPE_SETTINGS'] = unserialize($property['USER_TYPE_SETTINGS']);
         }
         $property['~DEFAULT_VALUE'] = $property['DEFAULT_VALUE'];
         if (is_array($property['DEFAULT_VALUE']) || preg_match("/[;&<>\"]/", $property['DEFAULT_VALUE'])) {
             $property['DEFAULT_VALUE'] = htmlspecialcharsex($property['DEFAULT_VALUE']);
         }
         if ($property['PROPERTY_TYPE'] == PropertyTable::TYPE_LIST) {
             $existList[] = $property['ID'];
         }
         $mapCodes[$property['ID']] = $code;
         $propertiesList[$code] = $property;
     }
     unset($property, $propertyIterator);
     if (empty($propertiesList)) {
         return;
     }
     if (!empty($existList)) {
         $enumList = array();
         $enumIterator = PropertyEnumerationTable::getList(array('select' => array('ID', 'PROPERTY_ID', 'VALUE', 'SORT', 'XML_ID'), 'filter' => array('PROPERTY_ID' => $existList), 'order' => array('PROPERTY_ID' => 'ASC', 'SORT' => 'ASC', 'VALUE' => 'ASC')));
         while ($enum = $enumIterator->fetch()) {
             if (!isset($enumList[$enum['PROPERTY_ID']])) {
                 $enumList[$enum['PROPERTY_ID']] = array();
             }
             $enumList[$enum['PROPERTY_ID']][$enum['ID']] = array('ID' => $enum['ID'], 'VALUE' => $enum['VALUE'], 'SORT' => $enum['SORT'], 'XML_ID' => $enum['XML_ID']);
         }
         unset($enum, $enumIterator);
     }
     $valuesRes = !empty($propertyID) ? CIBlockElement::GetPropertyValues($iblockID, $filter, true, array('ID' => $propertyID)) : CIBlockElement::GetPropertyValues($iblockID, $filter, true);
     while ($value = $valuesRes->Fetch()) {
         $elementID = $value['IBLOCK_ELEMENT_ID'];
         if (!isset($result[$elementID])) {
             continue;
         }
         $elementValues = array();
         $existDescription = isset($value['DESCRIPTION']);
         foreach ($propertiesList as $code => $property) {
             $existElementDescription = isset($value['DESCRIPTION']) && array_key_exists($property['ID'], $value['DESCRIPTION']);
             $existElementPropertyID = isset($value['PROPERTY_VALUE_ID']) && array_key_exists($property['ID'], $value['PROPERTY_VALUE_ID']);
             $elementValues[$code] = $property;
             $elementValues[$code]['VALUE_ENUM'] = null;
             $elementValues[$code]['VALUE_XML_ID'] = null;
             $elementValues[$code]['VALUE_SORT'] = null;
             $elementValues[$code]['VALUE'] = null;
             if ('Y' === $property['MULTIPLE']) {
                 $elementValues[$code]['PROPERTY_VALUE_ID'] = false;
                 if (!isset($value[$property['ID']]) || empty($value[$property['ID']])) {
                     $elementValues[$code]['DESCRIPTION'] = false;
                     $elementValues[$code]['VALUE'] = false;
                     $elementValues[$code]['~DESCRIPTION'] = false;
                     $elementValues[$code]['~VALUE'] = false;
                     if ('L' == $property['PROPERTY_TYPE']) {
                         $elementValues[$code]['VALUE_ENUM_ID'] = false;
                         $elementValues[$code]['VALUE_ENUM'] = false;
                         $elementValues[$code]['VALUE_XML_ID'] = false;
                         $elementValues[$code]['VALUE_SORT'] = false;
                     }
                 } else {
                     if ($existElementPropertyID) {
                         $elementValues[$code]['PROPERTY_VALUE_ID'] = $value['PROPERTY_VALUE_ID'][$property['ID']];
                     }
                     if (isset($userTypesList[$property['ID']])) {
                         foreach ($value[$property['ID']] as $valueKey => $oneValue) {
                             $raw = call_user_func_array($userTypesList[$property['ID']]['ConvertFromDB'], array($property, array('VALUE' => $oneValue, 'DESCRIPTION' => $existElementDescription ? $value['DESCRIPTION'][$property['ID']][$valueKey] : '')));
                             $value[$property['ID']][$valueKey] = $raw['VALUE'];
                             if (!$existDescription) {
                                 $value['DESCRIPTION'] = array();
                                 $existDescription = true;
                             }
                             if (!$existElementDescription) {
                                 $value['DESCRIPTION'][$property['ID']] = array();
                                 $existElementDescription = true;
                             }
                             $value['DESCRIPTION'][$property['ID']][$valueKey] = (string) $raw['DESCRIPTION'];
                         }
                         if (isset($oneValue)) {
                             unset($oneValue);
                         }
                     }
                     if ('L' == $property['PROPERTY_TYPE']) {
                         if (empty($value[$property['ID']])) {
                             $elementValues[$code]['VALUE_ENUM_ID'] = $value[$property['ID']];
                             $elementValues[$code]['DESCRIPTION'] = $existElementDescription ? $value['DESCRIPTION'][$property['ID']] : array();
                         } else {
                             $selectedValues = array();
                             foreach ($value[$property['ID']] as $listKey => $listValue) {
                                 if (isset($enumList[$property['ID']][$listValue])) {
                                     $selectedValues[$listKey] = $enumList[$property['ID']][$listValue];
                                     $selectedValues[$listKey]['DESCRIPTION'] = $existElementDescription && array_key_exists($listKey, $value['DESCRIPTION'][$property['ID']]) ? $value['DESCRIPTION'][$property['ID']][$listKey] : '';
                                     $selectedValues[$listKey]['PROPERTY_VALUE_ID'] = $existElementPropertyID && array_key_exists($listKey, $value['PROPERTY_VALUE_ID'][$property['ID']]) ? $value['PROPERTY_VALUE_ID'][$property['ID']][$listKey] : '';
                                 }
                             }
                             if (empty($selectedValues)) {
                                 $elementValues[$code]['VALUE_ENUM_ID'] = $value[$property['ID']];
                                 $elementValues[$code]['DESCRIPTION'] = $existElementDescription ? $value['DESCRIPTION'][$property['ID']] : array();
                             } else {
                                 Collection::sortByColumn($selectedValues, $selectListMultiply);
                                 $elementValues[$code]['VALUE_ENUM_ID'] = array();
                                 $elementValues[$code]['VALUE'] = array();
                                 $elementValues[$code]['VALUE_ENUM'] = array();
                                 $elementValues[$code]['VALUE_XML_ID'] = array();
                                 $elementValues[$code]['DESCRIPTION'] = array();
                                 $elementValues[$code]['PROPERTY_VALUE_ID'] = array();
                                 foreach ($selectedValues as $listValue) {
                                     if (!isset($elementValues[$code]['VALUE_SORT'])) {
                                         $elementValues[$code]['VALUE_SORT'] = array($listValue['SORT']);
                                     }
                                     $elementValues[$code]['VALUE_ENUM_ID'][] = $listValue['ID'];
                                     $elementValues[$code]['VALUE'][] = $listValue['VALUE'];
                                     $elementValues[$code]['VALUE_ENUM'][] = $listValue['VALUE'];
                                     $elementValues[$code]['VALUE_XML_ID'][] = $listValue['XML_ID'];
                                     $elementValues[$code]['PROPERTY_VALUE_ID'][] = $listValue['PROPERTY_VALUE_ID'];
                                     $elementValues[$code]['DESCRIPTION'][] = $listValue['DESCRIPTION'];
                                 }
                                 unset($selectedValues);
                             }
                         }
                     } else {
                         if (empty($value[$property['ID']]) || !$existElementPropertyID || isset($userTypesList[$property['ID']])) {
                             $elementValues[$code]['VALUE'] = $value[$property['ID']];
                             $elementValues[$code]['DESCRIPTION'] = $existElementDescription ? $value['DESCRIPTION'][$property['ID']] : array();
                         } else {
                             $selectedValues = array();
                             foreach ($value['PROPERTY_VALUE_ID'][$property['ID']] as $propKey => $propValueID) {
                                 $selectedValues[$propKey] = array('PROPERTY_VALUE_ID' => $propValueID, 'VALUE' => $value[$property['ID']][$propKey]);
                                 if ($existElementDescription) {
                                     $selectedValues[$propKey]['DESCRIPTION'] = $value['DESCRIPTION'][$property['ID']][$propKey];
                                 }
                             }
                             unset($propValueID, $propKey);
                             Collection::sortByColumn($selectedValues, $selectAllMultiply);
                             $elementValues[$code]['PROPERTY_VALUE_ID'] = array();
                             $elementValues[$code]['VALUE'] = array();
                             $elementValues[$code]['DESCRIPTION'] = array();
                             foreach ($selectedValues as &$propValue) {
                                 $elementValues[$code]['PROPERTY_VALUE_ID'][] = $propValue['PROPERTY_VALUE_ID'];
                                 $elementValues[$code]['VALUE'][] = $propValue['VALUE'];
                                 if ($existElementDescription) {
                                     $elementValues[$code]['DESCRIPTION'][] = $propValue['DESCRIPTION'];
                                 }
                             }
                             unset($propValue, $selectedValues);
                         }
                     }
                 }
                 $elementValues[$code]['~VALUE'] = $elementValues[$code]['VALUE'];
                 if (is_array($elementValues[$code]['VALUE'])) {
                     foreach ($elementValues[$code]['VALUE'] as &$oneValue) {
                         $isArr = is_array($oneValue);
                         if ($isArr || '' !== $oneValue && null !== $oneValue) {
                             if ($isArr || preg_match("/[;&<>\"]/", $oneValue)) {
                                 $oneValue = htmlspecialcharsEx($oneValue);
                             }
                         }
                     }
                     if (isset($oneValue)) {
                         unset($oneValue);
                     }
                 } else {
                     if ('' !== $elementValues[$code]['VALUE'] && null !== $elementValues[$code]['VALUE']) {
                         if (preg_match("/[;&<>\"]/", $elementValues[$code]['VALUE'])) {
                             $elementValues[$code]['VALUE'] = htmlspecialcharsEx($elementValues[$code]['VALUE']);
                         }
                     }
                 }
                 $elementValues[$code]['~DESCRIPTION'] = $elementValues[$code]['DESCRIPTION'];
                 if (is_array($elementValues[$code]['DESCRIPTION'])) {
                     foreach ($elementValues[$code]['DESCRIPTION'] as &$oneDescr) {
                         $isArr = is_array($oneDescr);
                         if ($isArr || !$isArr && '' !== $oneDescr && null !== $oneDescr) {
                             if ($isArr || preg_match("/[;&<>\"]/", $oneDescr)) {
                                 $oneDescr = htmlspecialcharsEx($oneDescr);
                             }
                         }
                     }
                     if (isset($oneDescr)) {
                         unset($oneDescr);
                     }
                 } else {
                     if ('' !== $elementValues[$code]['DESCRIPTION'] && null !== $elementValues[$code]['DESCRIPTION']) {
                         if (preg_match("/[;&<>\"]/", $elementValues[$code]['DESCRIPTION'])) {
                             $elementValues[$code]['DESCRIPTION'] = htmlspecialcharsEx($elementValues[$code]['DESCRIPTION']);
                         }
                     }
                 }
             } else {
                 $elementValues[$code]['VALUE_ENUM'] = $iblockExtVersion ? '' : null;
                 $elementValues[$code]['PROPERTY_VALUE_ID'] = $iblockExtVersion ? $elementID . ':' . $property['ID'] : null;
                 if (!isset($value[$property['ID']]) || false === $value[$property['ID']]) {
                     $elementValues[$code]['DESCRIPTION'] = '';
                     $elementValues[$code]['VALUE'] = '';
                     $elementValues[$code]['~DESCRIPTION'] = '';
                     $elementValues[$code]['~VALUE'] = '';
                     if ('L' == $property['PROPERTY_TYPE']) {
                         $elementValues[$code]['VALUE_ENUM_ID'] = null;
                     }
                 } else {
                     if ($existElementPropertyID) {
                         $elementValues[$code]['PROPERTY_VALUE_ID'] = $value['PROPERTY_VALUE_ID'][$property['ID']];
                     }
                     if (isset($userTypesList[$property['ID']])) {
                         $raw = call_user_func_array($userTypesList[$property['ID']]['ConvertFromDB'], array($property, array('VALUE' => $value[$property['ID']], 'DESCRIPTION' => $existElementDescription ? $value['DESCRIPTION'][$property['ID']] : '')));
                         $value[$property['ID']] = $raw['VALUE'];
                         if (!$existDescription) {
                             $value['DESCRIPTION'] = array();
                             $existDescription = true;
                         }
                         $value['DESCRIPTION'][$property['ID']] = (string) $raw['DESCRIPTION'];
                         $existElementDescription = true;
                     }
                     if ('L' == $property['PROPERTY_TYPE']) {
                         $elementValues[$code]['VALUE_ENUM_ID'] = $value[$property['ID']];
                         if (isset($enumList[$property['ID']][$value[$property['ID']]])) {
                             $elementValues[$code]['VALUE'] = $enumList[$property['ID']][$value[$property['ID']]]['VALUE'];
                             $elementValues[$code]['VALUE_ENUM'] = $elementValues[$code]['VALUE'];
                             $elementValues[$code]['VALUE_XML_ID'] = $enumList[$property['ID']][$value[$property['ID']]]['XML_ID'];
                             $elementValues[$code]['VALUE_SORT'] = $enumList[$property['ID']][$value[$property['ID']]]['SORT'];
                         }
                         $elementValues[$code]['DESCRIPTION'] = $existElementDescription ? $value['DESCRIPTION'][$property['ID']] : null;
                     } else {
                         $elementValues[$code]['VALUE'] = $value[$property['ID']];
                         $elementValues[$code]['DESCRIPTION'] = $existElementDescription ? $value['DESCRIPTION'][$property['ID']] : '';
                     }
                 }
                 $elementValues[$code]['~VALUE'] = $elementValues[$code]['VALUE'];
                 $isArr = is_array($elementValues[$code]['VALUE']);
                 if ($isArr || '' !== $elementValues[$code]['VALUE'] && null !== $elementValues[$code]['VALUE']) {
                     if ($isArr || preg_match("/[;&<>\"]/", $elementValues[$code]['VALUE'])) {
                         $elementValues[$code]['VALUE'] = htmlspecialcharsEx($elementValues[$code]['VALUE']);
                     }
                 }
                 $elementValues[$code]['~DESCRIPTION'] = $elementValues[$code]['DESCRIPTION'];
                 $isArr = is_array($elementValues[$code]['DESCRIPTION']);
                 if ($isArr || '' !== $elementValues[$code]['DESCRIPTION'] && null !== $elementValues[$code]['DESCRIPTION']) {
                     if ($isArr || preg_match("/[;&<>\"]/", $elementValues[$code]['DESCRIPTION'])) {
                         $elementValues[$code]['DESCRIPTION'] = htmlspecialcharsEx($elementValues[$code]['DESCRIPTION']);
                     }
                 }
             }
         }
         if (isset($result[$elementID]['PROPERTIES'])) {
             $result[$elementID]['PROPERTIES'] = $elementValues;
         } else {
             $result[$elementID] = $elementValues;
         }
         unset($elementValues);
     }
 }
Example #17
0
	public static function getProductList($offerID, $iblockID = 0)
	{
		$iblockID = (int)$iblockID;
		if (!is_array($offerID))
			$offerID = array($offerID);
		Collection::normalizeArrayValuesByInt($offerID);
		if (empty($offerID))
			return false;

		$iblockSku = array();
		$iblockOffers = array();
		if ($iblockID == 0)
		{
			$iblockList = array();
			$elementIterator = Iblock\ElementTable::getList(array(
				'select' => array('ID', 'IBLOCK_ID'),
				'filter' => array('=ID' => $offerID)
			));
			while ($element = $elementIterator->fetch())
			{
				$element['ID'] = (int)$element['ID'];
				$element['IBLOCK_ID'] = (int)$element['IBLOCK_ID'];
				if (!isset($iblockList[$element['IBLOCK_ID']]))
					$iblockList[$element['IBLOCK_ID']] = array();
				$iblockList[$element['IBLOCK_ID']][] = $element['ID'];
			}
			unset($element, $elementIterator);
			if (!empty($iblockList))
			{
				$iblockIterator = Catalog\CatalogIblockTable::getList(array(
					'select' => array('IBLOCK_ID', 'PRODUCT_IBLOCK_ID', 'SKU_PROPERTY_ID', 'VERSION' => 'IBLOCK.VERSION'),
					'filter' => array('=IBLOCK_ID' => array_keys($iblockList), '!PRODUCT_IBLOCK_ID' => 0)
				));
				while ($iblock = $iblockIterator->fetch())
				{
					$iblock['IBLOCK_ID'] = (int)$iblock['IBLOCK_ID'];
					$iblock['PRODUCT_IBLOCK_ID'] = (int)$iblock['PRODUCT_IBLOCK_ID'];
					$iblock['SKU_PROPERTY_ID'] = (int)$iblock['SKU_PROPERTY_ID'];
					$iblock['VERSION'] = (int)$iblock['VERSION'];
					$iblockSku[$iblock['IBLOCK_ID']] = $iblock;
					self::$arProductCache[$iblock['PRODUCT_IBLOCK_ID']] = $iblock;
					$iblockOffers[$iblock['IBLOCK_ID']] = $iblockList[$iblock['IBLOCK_ID']];
				}
				unset($iblock, $iblockIterator);
			}
			unset($iblockList);
		}
		else
		{
			$iblockIterator = Catalog\CatalogIblockTable::getList(array(
				'select' => array('IBLOCK_ID', 'PRODUCT_IBLOCK_ID', 'SKU_PROPERTY_ID', 'VERSION' => 'IBLOCK.VERSION'),
				'filter' => array('=IBLOCK_ID' => $iblockID, '!PRODUCT_IBLOCK_ID' => 0)
			));
			if ($iblock = $iblockIterator->fetch())
			{
				$iblock['IBLOCK_ID'] = (int)$iblock['IBLOCK_ID'];
				$iblock['PRODUCT_IBLOCK_ID'] = (int)$iblock['PRODUCT_IBLOCK_ID'];
				$iblock['SKU_PROPERTY_ID'] = (int)$iblock['SKU_PROPERTY_ID'];
				$iblock['VERSION'] = (int)$iblock['VERSION'];
				$iblockSku[$iblock['IBLOCK_ID']] = $iblock;
				self::$arProductCache[$iblock['PRODUCT_IBLOCK_ID']] = $iblock;
				$iblockOffers[$iblockID] = $offerID;
			}
			unset($iblock, $iblockIterator);
		}
		if (empty($iblockOffers))
			return array();

		$result = array_fill_keys($offerID, array());

		foreach ($iblockOffers as $iblockID => $offerList)
		{
			$skuProperty = 'PROPERTY_'.$iblockSku[$iblockID]['SKU_PROPERTY_ID'];
			$iblockFilter = array(
				'IBLOCK_ID' => $iblockID,
				'=ID' => $offerList
			);
			$iblockFields = array('ID', 'IBLOCK_ID', $skuProperty);
			$skuProperty .= '_VALUE';

			$offersIterator = CIBlockElement::GetList(
				array('ID' => 'ASC'),
				$iblockFilter,
				false,
				false,
				$iblockFields
			);
			while ($offer = $offersIterator->Fetch())
			{
				$currentOffer = (int)$offer['ID'];
				$productID = (int)$offer[$skuProperty];
				if (!isset($result[$currentOffer]) || $productID <= 0)
					continue;
				unset($offer[$skuProperty]);

				$result[$currentOffer] = array(
					'ID' => $productID,
					'IBLOCK_ID' => $iblockSku[$iblockID]['PRODUCT_IBLOCK_ID'],
					'OFFER_IBLOCK_ID' => $iblockID,
					'SKU_PROPERTY_ID' => $iblockSku[$iblockID]['SKU_PROPERTY_ID']
				);
			}
			unset($currentOffer, $offer, $offersIterator, $skuProperty);
		}

		unset($iblockID, $iblockOffers);

		return array_filter($result);
	}
Example #18
0
 public function GetDiscount($arParams = array(), $getAll = false)
 {
     global $DB, $USER;
     $adminSection = defined('ADMIN_SECTION') && ADMIN_SECTION === true;
     $arResult = array();
     if (!CCatalog::IsUserExists() || !$USER->IsAuthorized() || !self::IsEnabled()) {
         return $arResult;
     }
     foreach (GetModuleEvents("catalog", "OnGetDiscountSave", true) as $arEvent) {
         $mxResult = ExecuteModuleEventEx($arEvent, $arParams);
         if ($mxResult !== true) {
             return $mxResult;
         }
     }
     if (empty($arParams) || !is_array($arParams)) {
         return $arResult;
     }
     $intUserID = 0;
     $arUserGroups = array();
     $strSiteID = false;
     if (isset($arParams['USER_ID'])) {
         $intUserID = (int) $arParams['USER_ID'];
     }
     if (isset($arParams['USER_GROUPS'])) {
         $arUserGroups = $arParams['USER_GROUPS'];
     }
     if (isset($arParams['SITE_ID'])) {
         $strSiteID = $arParams['SITE_ID'];
     }
     if (self::GetDiscountUserID() > 0) {
         $intUserID = (int) self::GetDiscountUserID();
         $arUserGroups = array();
     }
     if ($intUserID <= 0 && !$adminSection) {
         $intUserID = (int) $USER->GetID();
         $arUserGroups = array();
     }
     if (empty($arUserGroups)) {
         if (!isset(self::$userGroups[$intUserID])) {
             self::$userGroups[$intUserID] = $USER->GetUserGroup($intUserID);
         }
         $arUserGroups = self::$userGroups[$intUserID];
     }
     if (empty($arUserGroups) || !is_array($arUserGroups) || $intUserID <= 0) {
         return $arResult;
     }
     $key = array_search(2, $arUserGroups);
     if ($key !== false) {
         unset($arUserGroups[$key]);
     }
     if (empty($arUserGroups)) {
         return $arResult;
     }
     Main\Type\Collection::normalizeArrayValuesByInt($arUserGroups, true);
     if (empty($arUserGroups)) {
         return $arResult;
     }
     if ($strSiteID === false) {
         $strSiteID = SITE_ID;
     }
     $cacheKey = md5('U' . implode('_', $arUserGroups));
     if (!isset(self::$discountFilterCache[$cacheKey])) {
         self::$discountFilterCache[$cacheKey] = CCatalogDiscountSave::__GetDiscountIDByGroup($arUserGroups);
     }
     if (empty(self::$discountFilterCache[$cacheKey])) {
         return $arResult;
     }
     $arCurrentDiscountID = self::$discountFilterCache[$cacheKey];
     if (isset($arParams['ID'])) {
         Main\Type\Collection::normalizeArrayValuesByInt($arUserGroups, true);
         if (!empty($arParams['ID'])) {
             $arCurrentDiscountID = array_intersect($arCurrentDiscountID, $arParams['ID']);
         }
     }
     if (!empty($arCurrentDiscountID)) {
         $getAll = $getAll === true;
         $intCurrentTime = getmicrotime();
         $strDate = date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")), $intCurrentTime);
         $arFilter = array('ID' => $arCurrentDiscountID, 'SITE_ID' => $strSiteID, 'TYPE' => self::ENTITY_ID, 'ACTIVE' => 'Y', '+<=ACTIVE_FROM' => $strDate, '+>=ACTIVE_TO' => $strDate);
         CTimeZone::Disable();
         $rsDiscSaves = CCatalogDiscountSave::GetList(array(), $arFilter);
         CTimeZone::Enable();
         while ($arDiscSave = $rsDiscSaves->Fetch()) {
             $arDiscSave['ACTION_SIZE'] = (int) $arDiscSave['ACTION_SIZE'];
             $arDiscSave['COUNT_SIZE'] = (int) $arDiscSave['COUNT_SIZE'];
             $arDiscSave['ACTIVE_FROM_UT'] = false;
             $arDiscSave['ACTIVE_TO_UT'] = false;
             $arDiscSave['COUNT_FROM_UT'] = false;
             $arDiscSave['COUNT_TO_UT'] = false;
             $arDiscSave['TYPE'] = (int) $arDiscSave['TYPE'];
             $arDiscSave['MODULE_ID'] = 'catalog';
             $strCountPeriod = self::COUNT_TIME_ALL;
             $strActionPeriod = self::ACTION_TIME_ALL;
             $arCountPeriodBack = array();
             $arActionPeriodBack = array();
             $arActionPeriod = array();
             $arStartDate = false;
             $arOldOrderSumm = false;
             $arOrderSumm = false;
             $boolPeriodInsert = true;
             $intCountTime = $intCurrentTime;
             $arOrderFilter = array('USER_ID' => $intUserID, 'LID' => $arDiscSave['SITE_ID'], 'PAYED' => 'Y', 'CANCELED' => 'N');
             $arOldOrderFilter = $arOrderFilter;
             if (!empty($arDiscSave['ACTIVE_FROM']) || !empty($arDiscSave['ACTIVE_TO'])) {
                 $strActionPeriod = self::ACTION_TIME_INTERVAL;
                 if (!empty($arDiscSave['ACTIVE_FROM'])) {
                     $arDiscSave['ACTIVE_FROM_UT'] = MakeTimeStamp($arDiscSave['ACTIVE_FROM']);
                 }
                 if (!empty($arDiscSave['ACTIVE_TO'])) {
                     $arDiscSave['ACTIVE_TO_UT'] = MakeTimeStamp($arDiscSave['ACTIVE_TO']);
                 }
             } elseif ($arDiscSave['ACTION_SIZE'] > 0 && in_array($arDiscSave['ACTION_TYPE'], array('D', 'M', 'Y'))) {
                 $strActionPeriod = self::ACTION_TIME_PERIOD;
                 $arActionPeriodBack = CCatalogDiscountSave::__GetTimeStampArray($arDiscSave['ACTION_SIZE'], $arDiscSave['ACTION_TYPE']);
                 $arActionPeriod = CCatalogDiscountSave::__GetTimeStampArray($arDiscSave['ACTION_SIZE'], $arDiscSave['ACTION_TYPE'], true);
             }
             if (!empty($arDiscSave['COUNT_FROM']) || !empty($arDiscSave['COUNT_TO'])) {
                 $strCountPeriod = self::COUNT_TIME_INTERVAL;
                 if (!empty($arDiscSave['COUNT_FROM'])) {
                     $arDiscSave['COUNT_FROM_UT'] = MakeTimeStamp($arDiscSave['COUNT_FROM']);
                 }
                 if (!empty($arDiscSave['COUNT_TO'])) {
                     $arDiscSave['COUNT_TO_UT'] = MakeTimeStamp($arDiscSave['COUNT_TO']);
                     if ($arDiscSave['COUNT_TO_UT'] > $intCountTime) {
                         $arDiscSave['COUNT_TO_UT'] = $intCountTime;
                         $arDiscSave['COUNT_TO'] = ConvertTimeStamp($intCountTime, 'FULL');
                     }
                 }
             } elseif ($arDiscSave['COUNT_SIZE'] > 0 && in_array($arDiscSave['COUNT_TYPE'], array('D', 'M', 'Y'))) {
                 $strCountPeriod = self::COUNT_TIME_PERIOD;
                 $arCountPeriodBack = CCatalogDiscountSave::__GetTimeStampArray($arDiscSave['COUNT_SIZE'], $arDiscSave['COUNT_TYPE']);
             }
             if ($strCountPeriod == self::COUNT_TIME_INTERVAL) {
                 if (false !== $arDiscSave['COUNT_FROM_UT']) {
                     if ($arDiscSave['COUNT_FROM_UT'] > $intCountTime) {
                         continue;
                     }
                     if (false !== $arDiscSave['COUNT_TO_UT'] && $arDiscSave['COUNT_TO_UT'] <= $arDiscSave['COUNT_FROM_UT']) {
                         continue;
                     }
                     if (false !== $arDiscSave['ACTIVE_TO_UT'] && $arDiscSave['COUNT_FROM_UT'] >= $arDiscSave['ACTIVE_TO_UT']) {
                         continue;
                     }
                 }
                 if (false !== $arDiscSave['COUNT_TO_UT']) {
                     if ($strActionPeriod == self::ACTION_TIME_PERIOD && $arDiscSave['COUNT_TO_UT'] < AddToTimeStamp($arActionPeriodBack, $intCountTime)) {
                         continue;
                     }
                 }
             }
             if ($strActionPeriod == self::ACTION_TIME_PERIOD) {
                 if ($strCountPeriod == self::COUNT_TIME_PERIOD) {
                     $arStartDate = CCatalogDiscountSave::__GetUserInfoByDiscount(array('DISCOUNT_ID' => $arDiscSave['ID'], 'USER_ID' => $intUserID, 'ACTIVE_FROM' => date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")), AddToTimeStamp($arActionPeriodBack, $intCountTime))));
                     if (is_array($arStartDate) && !empty($arStartDate)) {
                         $arOldOrderFilter['<DATE_INSERT'] = $arStartDate['ACTIVE_FROM_FORMAT'];
                         $arOldOrderFilter['>=DATE_INSERT'] = date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")), AddToTimeStamp($arCountPeriodBack, MakeTimeStamp($arStartDate['ACTIVE_FROM_FORMAT'])));
                         $arOldOrderSumm = CCatalogDiscountSave::__SaleOrderSumm($arOldOrderFilter, $arDiscSave['CURRENCY']);
                     }
                 } else {
                     $arStartDate = CCatalogDiscountSave::__GetUserInfoByDiscount(array('DISCOUNT_ID' => $arDiscSave['ID'], 'USER_ID' => $intUserID), array('ACTIVE_FROM' => false, 'DELETE' => false));
                     if (is_array($arStartDate) && !empty($arStartDate)) {
                         $intTimeStart = MakeTimeStamp($arStartDate['ACTIVE_FROM_FORMAT']);
                         $intTimeFinish = MakeTimeStamp($arStartDate['ACTIVE_TO_FORMAT']);
                         if (!($intTimeStart <= $intCountTime && $intTimeFinish >= $intCountTime)) {
                             continue;
                         } else {
                             $boolPeriodInsert = false;
                         }
                     }
                 }
             }
             $intTimeStart = false;
             $intTimeFinish = false;
             if ($strCountPeriod == self::COUNT_TIME_INTERVAL) {
                 $intTimeStart = !empty($arDiscSave['COUNT_FROM']) ? $arDiscSave['COUNT_FROM'] : false;
                 $intTimeFinish = !empty($arDiscSave['COUNT_TO']) ? $arDiscSave['COUNT_TO'] : false;
             } elseif ($strCountPeriod == self::COUNT_TIME_PERIOD) {
                 $intTimeStart = date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")), AddToTimeStamp($arCountPeriodBack, $intCountTime));
             }
             if ($intTimeStart) {
                 $arOrderFilter['>=DATE_INSERT'] = $intTimeStart;
             }
             if ($intTimeFinish) {
                 $arOrderFilter['<DATE_INSERT'] = $intTimeFinish;
             }
             $arOrderSumm = CCatalogDiscountSave::__SaleOrderSumm($arOrderFilter, $arDiscSave['CURRENCY']);
             if (is_array($arOldOrderSumm) && 0 < $arOldOrderSumm['RANGE_SUMM']) {
                 if ($arOrderSumm['RANGE_SUMM'] <= $arOldOrderSumm['RANGE_SUMM']) {
                     $arOrderSumm = $arOldOrderSumm;
                 } else {
                     $arOldOrderSumm = false;
                 }
             }
             $rsRanges = CCatalogDiscountSave::GetRangeByDiscount(array('RANGE_FROM' => 'DESC'), array('DISCOUNT_ID' => $arDiscSave['ID'], '<=RANGE_FROM' => $arOrderSumm['RANGE_SUMM']), false, array('nTopCount' => 1));
             $arRange = $rsRanges->Fetch();
             if (!empty($arRange) || $getAll) {
                 if (!empty($arRange)) {
                     if ($strActionPeriod == self::ACTION_TIME_PERIOD) {
                         if ($strCountPeriod == self::COUNT_TIME_PERIOD) {
                             if (!is_array($arOldOrderSumm)) {
                                 CCatalogDiscountSave::__UpdateUserInfoByDiscount(array('DISCOUNT_ID' => $arDiscSave['ID'], 'USER_ID' => $intUserID, 'ACTIVE_FROM' => date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")), $intCountTime), 'ACTIVE_TO' => date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")), AddToTimeStamp($arActionPeriod, $intCountTime)), 'RANGE_FROM' => -1));
                             }
                         } else {
                             if ($boolPeriodInsert) {
                                 CCatalogDiscountSave::__UpdateUserInfoByDiscount(array('DISCOUNT_ID' => $arDiscSave['ID'], 'USER_ID' => $intUserID, 'ACTIVE_FROM' => date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")), $intCountTime), 'ACTIVE_TO' => date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")), AddToTimeStamp($arActionPeriod, $intCountTime)), 'RANGE_FROM' => -1), array('SEARCH' => true, 'DELETE' => false));
                             }
                         }
                     }
                 }
                 unset($arDiscSave['ACTIVE_FROM_UT'], $arDiscSave['ACTIVE_TO_UT'], $arDiscSave['COUNT_FROM_UT'], $arDiscSave['COUNT_TO_UT']);
                 $arOneResult = $arDiscSave;
                 if (!empty($arRange)) {
                     $arOneResult['VALUE'] = $arRange['VALUE'];
                     $arOneResult['VALUE_TYPE'] = $arRange['TYPE'];
                     $arOneResult['RANGE_FROM'] = $arRange['RANGE_FROM'];
                     $arOneResult['MAX_DISCOUNT'] = 0;
                 } else {
                     $arOneResult['VALUE'] = 0;
                     $arOneResult['VALUE_TYPE'] = self::TYPE_PERCENT;
                     $arOneResult['MAX_DISCOUNT'] = 0;
                     $rsRanges = CCatalogDiscountSave::GetRangeByDiscount(array('RANGE_FROM' => 'ASC'), array('DISCOUNT_ID' => $arDiscSave['ID']), false, array('nTopCount' => 1));
                     $arRange = $rsRanges->Fetch();
                     $arOneResult['NEXT_RANGE_FROM'] = $arRange['RANGE_FROM'];
                     $arOneResult['NEXT_VALUE'] = $arRange['VALUE'];
                     $arOneResult['NEXT_VALUE_TYPE'] = $arRange['TYPE'];
                 }
                 $arOneResult['SUMM'] = $arOrderSumm['SUMM'];
                 $arOneResult['SUMM_CURRENCY'] = $arOrderSumm['CURRENCY'];
                 $arOneResult['RANGE_SUMM'] = $arOrderSumm['RANGE_SUMM'];
                 $arOneResult['LAST_ORDER_DATE'] = $arOrderSumm['LAST_ORDER_DATE'];
                 $arResult[] = $arOneResult;
             }
         }
     }
     return $arResult;
 }
Example #19
0
 /**
  * Return entity by discount list.
  *
  * @param array $discountList			Discount id list.
  * @param array $filter				Additional filter.
  * @param bool $groupModule			Group by modules.
  * @return array
  */
 public static function getByDiscount($discountList, $filter = array(), $groupModule = true)
 {
     $groupModule = $groupModule === true;
     $result = array();
     if (!empty($discountList) && is_array($discountList)) {
         Main\Type\Collection::normalizeArrayValuesByInt($discountList);
         if (!empty($discountList)) {
             if (!is_array($filter)) {
                 $filter = array();
             }
             $discountRows = array_chunk($discountList, 500);
             foreach ($discountRows as &$row) {
                 $filter['@DISCOUNT_ID'] = $row;
                 $entityIterator = self::getList(array('select' => array('DISCOUNT_ID', 'MODULE_ID', 'ENTITY', 'FIELD_ENTITY', 'FIELD_TABLE'), 'filter' => $filter));
                 if ($groupModule) {
                     while ($entity = $entityIterator->fetch()) {
                         unset($entity['DISCOUNT_ID']);
                         if (!isset($result[$entity['MODULE_ID']])) {
                             $result[$entity['MODULE_ID']] = array();
                         }
                         if (!isset($result[$entity['MODULE_ID']][$entity['ENTITY']])) {
                             $result[$entity['MODULE_ID']][$entity['ENTITY']] = array();
                         }
                         $result[$entity['MODULE_ID']][$entity['ENTITY']][$entity['FIELD_ENTITY']] = $entity;
                     }
                 } else {
                     while ($entity = $entityIterator->fetch()) {
                         $entity['DISCOUNT_ID'] = (int) $entity['DISCOUNT_ID'];
                         if (!isset($result[$entity['DISCOUNT_ID']])) {
                             $result[$entity['DISCOUNT_ID']] = array();
                         }
                         $result[$entity['DISCOUNT_ID']][] = $entity;
                     }
                 }
                 unset($entity, $entityIterator);
             }
             unset($row, $discountRows);
         }
     }
     return $result;
 }
Example #20
0
 /**
  * Returns modules by discount list.
  *
  * @param array $discountList			Discount list.
  * @param array $filter				Additional filter.
  * @return array
  */
 public static function getByDiscount($discountList, $filter = array())
 {
     $result = array();
     if (!empty($discountList) && is_array($discountList)) {
         Main\Type\Collection::normalizeArrayValuesByInt($discountList);
         if (!empty($discountList)) {
             if (!is_array($filter)) {
                 $filter = array();
             }
             $discountRows = array_chunk($discountList, 500);
             foreach ($discountRows as &$row) {
                 $filter['@DISCOUNT_ID'] = $row;
                 $moduleIterator = self::getList(array('select' => array('DISCOUNT_ID', 'MODULE_ID'), 'filter' => $filter));
                 while ($module = $moduleIterator->fetch()) {
                     $module['DISCOUNT_ID'] = (int) $module['DISCOUNT_ID'];
                     if (!isset($result[$module['DISCOUNT_ID']])) {
                         $result[$module['DISCOUNT_ID']] = array();
                     }
                     $result[$module['DISCOUNT_ID']][] = $module['MODULE_ID'];
                 }
                 unset($module, $moduleIterator);
             }
             unset($row, $discountRows);
         }
     }
     return $result;
 }
Example #21
0
 public static function getProductList($offerID, $iblockID = 0)
 {
     $iblockID = (int) $iblockID;
     if (!is_array($offerID)) {
         $offerID = array($offerID);
     }
     Collection::normalizeArrayValuesByInt($offerID);
     if (empty($offerID)) {
         return false;
     }
     $iblockSku = array();
     $iblockOffers = array();
     if ($iblockID == 0) {
         $iblockList = array();
         $elementIterator = Iblock\ElementTable::getList(array('select' => array('ID', 'IBLOCK_ID'), 'filter' => array('@ID' => $offerID)));
         while ($element = $elementIterator->fetch()) {
             $element['ID'] = (int) $element['ID'];
             $element['IBLOCK_ID'] = (int) $element['IBLOCK_ID'];
             if (!isset($iblockList[$element['IBLOCK_ID']])) {
                 $iblockList[$element['IBLOCK_ID']] = array();
             }
             $iblockList[$element['IBLOCK_ID']][] = $element['ID'];
         }
         unset($element, $elementIterator);
         if (!empty($iblockList)) {
             $iblockListIds = array_keys($iblockList);
             foreach ($iblockListIds as &$oneIblock) {
                 if (!empty(self::$arProductCache[$oneIblock])) {
                     unset($iblockList[$oneIblock]);
                     continue;
                 }
                 if (isset(self::$arOfferCache[$oneIblock])) {
                     if (!empty(self::$arOfferCache[$oneIblock])) {
                         $iblockSku[$oneIblock] = self::$arOfferCache[$oneIblock];
                         $iblockOffers[$oneIblock] = $iblockList[$oneIblock];
                     }
                     unset($iblockList[$oneIblock]);
                 }
             }
             unset($oneIblock, $iblockListIds);
             if (!empty($iblockList)) {
                 $iblockIterator = Catalog\CatalogIblockTable::getList(array('select' => array('IBLOCK_ID', 'PRODUCT_IBLOCK_ID', 'SKU_PROPERTY_ID', 'VERSION' => 'IBLOCK.VERSION'), 'filter' => array('@IBLOCK_ID' => array_keys($iblockList), '!=PRODUCT_IBLOCK_ID' => 0)));
                 while ($iblock = $iblockIterator->fetch()) {
                     $iblock['IBLOCK_ID'] = (int) $iblock['IBLOCK_ID'];
                     $iblock['PRODUCT_IBLOCK_ID'] = (int) $iblock['PRODUCT_IBLOCK_ID'];
                     $iblock['SKU_PROPERTY_ID'] = (int) $iblock['SKU_PROPERTY_ID'];
                     $iblock['VERSION'] = (int) $iblock['VERSION'];
                     $iblockSku[$iblock['IBLOCK_ID']] = $iblock;
                     self::$arProductCache[$iblock['PRODUCT_IBLOCK_ID']] = $iblock;
                     self::$arProductCache[$iblock['IBLOCK_ID']] = false;
                     self::$arOfferCache[$iblock['IBLOCK_ID']] = $iblock;
                     self::$arOfferCache[$iblock['PRODUCT_IBLOCK_ID']] = false;
                     self::$arPropertyCache[$iblock['SKU_PROPERTY_ID']] = $iblock;
                     $iblockOffers[$iblock['IBLOCK_ID']] = $iblockList[$iblock['IBLOCK_ID']];
                 }
                 unset($iblock, $iblockIterator);
             }
         }
         unset($iblockList);
     } else {
         if (empty(self::$arProductCache[$iblockID])) {
             if (isset(self::$arOfferCache[$iblockID])) {
                 if (!empty(self::$arOfferCache[$iblockID])) {
                     $iblockSku[$iblockID] = self::$arOfferCache[$iblockID];
                     $iblockOffers[$iblockID] = $offerID;
                 }
             } else {
                 $iblockIterator = Catalog\CatalogIblockTable::getList(array('select' => array('IBLOCK_ID', 'PRODUCT_IBLOCK_ID', 'SKU_PROPERTY_ID', 'VERSION' => 'IBLOCK.VERSION'), 'filter' => array('=IBLOCK_ID' => $iblockID, '!=PRODUCT_IBLOCK_ID' => 0)));
                 if ($iblock = $iblockIterator->fetch()) {
                     $iblock['IBLOCK_ID'] = (int) $iblock['IBLOCK_ID'];
                     $iblock['PRODUCT_IBLOCK_ID'] = (int) $iblock['PRODUCT_IBLOCK_ID'];
                     $iblock['SKU_PROPERTY_ID'] = (int) $iblock['SKU_PROPERTY_ID'];
                     $iblock['VERSION'] = (int) $iblock['VERSION'];
                     $iblockSku[$iblock['IBLOCK_ID']] = $iblock;
                     self::$arProductCache[$iblock['PRODUCT_IBLOCK_ID']] = $iblock;
                     self::$arProductCache[$iblock['IBLOCK_ID']] = false;
                     self::$arOfferCache[$iblock['IBLOCK_ID']] = $iblock;
                     self::$arOfferCache[$iblock['PRODUCT_IBLOCK_ID']] = false;
                     self::$arPropertyCache[$iblock['SKU_PROPERTY_ID']] = $iblock;
                     $iblockOffers[$iblockID] = $offerID;
                 }
                 unset($iblock, $iblockIterator);
             }
         }
     }
     if (empty($iblockOffers)) {
         return array();
     }
     $result = array_fill_keys($offerID, array());
     $conn = Application::getConnection();
     $helper = $conn->getSqlHelper();
     $offerField = $helper->quote('IBLOCK_ELEMENT_ID');
     $propertyIdField = $helper->quote('IBLOCK_PROPERTY_ID');
     foreach ($iblockOffers as $iblockID => $offerList) {
         $sku = $iblockSku[$iblockID];
         if ($sku['VERSION'] == 2) {
             $productField = $helper->quote('PROPERTY_' . $sku['SKU_PROPERTY_ID']);
             $sqlQuery = 'select ' . $productField . ' as PRODUCT_ID, ' . $offerField . ' as ID from ' . $helper->quote('b_iblock_element_prop_s' . $sku['IBLOCK_ID']) . ' where ' . $offerField . ' IN (' . implode(',', $offerList) . ')';
         } else {
             $productField = $helper->quote('VALUE_NUM');
             $sqlQuery = 'select ' . $productField . ' as PRODUCT_ID, ' . $offerField . ' as ID from ' . $helper->quote('b_iblock_element_property') . ' where ' . $propertyIdField . ' = ' . $sku['SKU_PROPERTY_ID'] . ' and ' . $offerField . ' IN (' . implode(',', $offerList) . ')';
         }
         unset($productField);
         $offersIterator = $conn->query($sqlQuery);
         while ($offer = $offersIterator->fetch()) {
             $currentOffer = (int) $offer['ID'];
             $productID = (int) $offer['PRODUCT_ID'];
             if (!isset($result[$currentOffer]) || $productID <= 0) {
                 continue;
             }
             $result[$currentOffer] = array('ID' => $productID, 'IBLOCK_ID' => $sku['PRODUCT_IBLOCK_ID'], 'OFFER_IBLOCK_ID' => $iblockID, 'SKU_PROPERTY_ID' => $sku['SKU_PROPERTY_ID']);
         }
         unset($sku);
     }
     unset($iblockID, $iblockOffers);
     unset($helper, $conn);
     return array_filter($result);
 }