/** * 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; }
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]; } }
/** * 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; }
/** * @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; }
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; }
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; }
/** * 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); }
/** * 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; }
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; }
/** @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); }
/** * 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]; }
/** * 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; }
/** * 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; }
/** * 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) . ')'); }
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); } }
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); }
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; }
/** * 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; }
/** * 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; }
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); }