function On1CExchAfterIBlockElementAdd(&$arFields) { // Create catalog records for all iblock elements $iblockElementId = intval($arFields['RESULT']); if ($iblockElementId > 0) { $catalogProduct = new CCatalogProduct(); $catalogProduct->Add(array('ID' => $iblockElementId, 'QUANTITY' => 0)); } return true; }
protected function addCatalogProducts($arParams){ if (!CModule::IncludeModule("iblock") && !CModule::IncludeModule("catalog") && !CModule::IncludeModule("sale")): return false; endif; $arFields = array( "ID" => $arParams["PRODUCT_ID"], "QUANTITY" => $arParams["BALANCE"], "CAN_BUY_ZERO" => "Y", "NEGATIVE_AMOUNT_TRACE" => "Y", "QUANTITY_TRACE" => "Y" ); $db_res = CCatalogProduct::GetList( array(), array("ID" => $arParams["PRODUCT_ID"]), false, array() ); if ($ar_res = $db_res->Fetch()): if (!CCatalogProduct::Update($ar_res["ID"], $arFields)): return false; endif; else: if(!CCatalogProduct::Add($arFields)): return false; endif; endif; return true; }
function AddToBasket($pid, $quantity) { if (CModule::IncludeModule("sale") && CModule::IncludeModule("catalog")) { $ar_res = CCatalogProduct::GetByIDEx($pid); if ($ar_res) { $result = Add2BasketByProductID($pid, $quantity); // если ошибки - $ex = $APPLICATION->GetException(); if ($result) { $arrSendResult['ERROR'] = 'N'; $arrSendResult['TEXT'] = 'OK'; echo json_encode($arrSendResult); } else { $arrSendResult['ERROR'] = 'Y'; $arrSendResult['TEXT'] = 'Error'; echo json_encode($arrSendResult); } } else { if (Add2BasketByProductID($pid, $quantity)) { $arrSendResult['ERROR'] = 'N'; $arrSendResult['TEXT'] = 'OK'; echo json_encode($arrSendResult); } } } }
function OnProductCatalogHandler($ID, $arFields) { Bitrix\Main\Loader::includeModule('iblock'); Bitrix\Main\Loader::includeModule('catalog'); define('IBLOCK_ID_PRODUCTS', 2); define('IBLOCK_ID_OFFERS', 3); $query = new \Bitrix\Main\Entity\Query(Bitrix\Iblock\ElementTable::getEntity()); $query->setSelect(array("ID", "IBLOCK_ID"))->setFilter(array("ID" => $ID))->setOrder(array("ID" => "ASC")); $resElement = $query->exec()->fetch(); if ($resElement['IBLOCK_ID'] == IBLOCK_ID_PRODUCTS) { CIBlockElement::SetPropertyValuesEx($ID, $resElement['IBLOCK_ID'], array("AVAILABLE_QUANTITY_CATALOG" => $arFields['QUANTITY'])); } elseif ($resElement['IBLOCK_ID'] == IBLOCK_ID_OFFERS) { //1 $rsElementOffer = CIBlockElement::GetList(array(), array("ID" => $ID), false, false, array("ID", "IBLOCK_ID", 'NAME', "PROPERTY_CML2_LINK"))->fetch(); $resElemOfferProduct = (int) $rsElementOffer['PROPERTY_CML2_LINK_VALUE']; //2 $resOffersCML2 = CIBlockElement::GetList(array(), array("PROPERTY_CML2_LINK" => $resElemOfferProduct, 'IBLOCK_ID' => IBLOCK_ID_OFFERS), false, false, array("ID", "IBLOCK_ID", 'NAME')); //3 $arrOffersIDs = array(); while ($res = $resOffersCML2->fetch()) { $arrOffersIDs[] = $res['ID']; } //4 $availQuant = array(); foreach ($arrOffersIDs as $k => $v) { $ar_res_cat = CCatalogProduct::GetList(array("ID" => "DESC"), array("ID" => (int) $v), false, false, array("ID", "QUANTITY", 'ELEMENT_IBLOCK_ID', 'ELEMENT_NAME'))->fetch(); $availQuant[] = $ar_res_cat['QUANTITY']; } //5 $minAvailQuant = (int) min($availQuant); //6 $resUpdateSCU = CIBlockElement::SetPropertyValuesEx($resElemOfferProduct, IBLOCK_ID_PRODUCTS, array("AVAILABLE_QUANTITY_CATALOG" => $minAvailQuant)); } }
protected function getPriceObj() { if ($this->price === null) { $this->price = \CCatalogProduct::GetOptimalPrice($this->ID); // echo '<pre>'.print_r($this->price,true).'</pre>'; } return $this->price; }
public static function getProductMeasures($productID) { if (!Main\Loader::includeModule('catalog')) { throw new Main\SystemException("Could not load 'catalog' module."); } $productIDs = is_array($productID) ? $productID : array($productID); $measure2product = array(); if (!empty($productIDs)) { $productEntity = new \CCatalogProduct(); $dbProductResult = $productEntity->GetList(array(), array('@ID' => $productIDs), false, false, array('ID', 'MEASURE')); if (is_object($dbProductResult)) { while ($productFields = $dbProductResult->Fetch()) { $measureID = isset($productFields['MEASURE']) ? intval($productFields['MEASURE']) : 0; if ($measureID <= 0) { continue; } if (isset($measure2product[$measureID])) { $measure2product[$measureID] = array(); } $measure2product[$measureID][] = intval($productFields['ID']); } } } $result = array(); if (!empty($measure2product)) { $dbMeasureResult = \CCatalogMeasure::getList(array(), array('@ID' => array_keys($measure2product)), false, false, array('ID', 'CODE', 'SYMBOL_RUS', 'SYMBOL_INTL', 'IS_DEFAULT')); if (is_object($dbMeasureResult)) { while ($measureFields = $dbMeasureResult->Fetch()) { $measureID = intval($measureFields['ID']); $measureInfo = array('ID' => $measureID, 'CODE' => intval($measureFields['CODE']), 'IS_DEFAULT' => isset($measureFields['IS_DEFAULT']) && $measureFields['IS_DEFAULT'] === 'Y', 'SYMBOL' => isset($measureFields['SYMBOL_RUS']) ? $measureFields['SYMBOL_RUS'] : $measureFields['SYMBOL_INTL']); foreach ($measure2product[$measureID] as $productID) { $result[$productID] = array($measureInfo); } } } } return $result; }
protected function loadFromDatabase() { if (!isset($this->fields)) { $this->fields = \CCatalogProduct::getByID($this->id); if (is_array($this->fields)) { if ($this->fields["MEASURE"] > 0) { $this->fields["MEASURE"] = new ElementCatalogMeasure($this->fields["MEASURE"]); } $this->fields["STORE"] = new ElementCatalogStoreList(0); } else { $this->fields["STORE"] = new ElementCatalogStoreList(0); } } return is_array($this->fields); }
/** * @param Basket $basketCollection * @param array $productList * @return array */ public static function getProductList(Basket $basketCollection, array $productList = array()) { $productBasketIndex = array(); $result = array(); foreach ($basketCollection as $basketKey => $basketItem) { $productId = intval($basketItem->getProductId()); if (intval($productId < 0) || sizeof($productList) > 0 && in_array($productId, $productList)) { continue; } $productBasketIndex[$basketKey] = $productId; } $rsProducts = \CCatalogProduct::GetList(array(), array('ID' => $productBasketIndex), false, false, array('ID', 'CAN_BUY_ZERO', 'NEGATIVE_AMOUNT_TRACE', 'QUANTITY_TRACE', 'QUANTITY', 'QUANTITY_RESERVED')); while ($arProduct = $rsProducts->Fetch()) { $result[$arProduct['ID']] = $arProduct; } return $result; }
function add_element($iblock_id, $section_id, $NAME, $PRICE_EUR, $P, $DETAIL_PICTURE) { $el = new CIBlockElement(); //test_dump($P); $arFields = array("IBLOCK_ID" => $iblock_id, "NAME" => $NAME, "CODE" => $P["ARTNUMBER"], "ACTIVE" => "Y", "IBLOCK_SECTION_ID" => $section_id, "DETAIL_TEXT" => $P["DESCRIPTION_TEXT"], "DETAIL_TEXT_TYPE" => "html", "PROPERTY_VALUES" => $P, "DETAIL_PICTURE" => $DETAIL_PICTURE); if ($last_el_id = $el->Add($arFields)) { echo "New ID: " . $last_el_id . "<br>"; $arFields = array("ID" => $last_el_id, "VAT_INCLUDED" => "Y"); if (CCatalogProduct::Add($arFields)) { echo "Добавили параметры товара к элементу каталога " . $last_el_id . "<br>"; $arFields = array("PRODUCT_ID" => $last_el_id, "CATALOG_GROUP_ID" => 1, "PRICE" => $PRICE_EUR, "CURRENCY" => "EUR"); CPrice::Add($arFields); } else { echo "Ошибка добавления параметров товаров"; } } else { echo "Error: " . $el->LAST_ERROR . "<br>"; } }
/** * <p>Метод служит для проверки параметров, переданных в методы <a href="http://dev.1c-bitrix.ru/api_help/catalog/classes/ccatalogproductgroups/ccatalogproductgroups.add.php">CCatalogProductGroups::Add</a> и <a href="http://dev.1c-bitrix.ru/api_help/catalog/classes/ccatalogproductgroups/ccatalogproductgroups.update.php">CCatalogProductGroups::Update</a>.</p> * * * * * @param string $ACTION Указывает, для какого метода идет проверка. Возможные значения: * <br><ul> <li> <b>ADD</b> - для метода <a * href="http://dev.1c-bitrix.ru/api_help/catalog/classes/ccatalogproductgroups/ccatalogproductgroups.add.php">CCatalogProductGroups::Add</a>;</li> * <li> <b>UPDATE</b> - для метода <a * href="http://dev.1c-bitrix.ru/api_help/catalog/classes/ccatalogproductgroups/ccatalogproductgroups.update.php">CCatalogProductGroups::Update</a>.</li> * </ul> * * * * @param array &$arFields Ассоциативный массив параметров информации о связи товаров и * групп пользователей. Допустимые ключи: <ul> <li> <b>PRODUCT_ID</b> - код * товара;</li> <li> <b>GROUP_ID</b> - код группы пользователей;</li> <li> <b>ACCESS_LENGTH</b> * - длина периода, на который пользователь привязывается к группе * пользователей при покупке товара (0 - навсегда);</li> <li> * <b>ACCESS_LENGTH_TYPE</b> - тип периода, на который пользователь * привязывается к группе пользователей при покупке товара ("H" - час, * "D" - сутки, "W" - неделя, "M" - месяц, "Q" - квартал, "S" - полугодие, "Y" - * год).</li> </ul> * * * * @param int $ID = 0 Код записи с информацией о связи товаров и групп пользователей, к * которым пользователь привязывается при покупке товаров. * Параметр является необязательным и имеет смысл только для $ACTION = * 'UPDATE'. * * * * @return bool <p> В случае корректности переданных параметров возвращает true, * иначе - false. Если функция вернула false, с помощью $APPLICATION->GetException() * можно получить текст ошибок.</p> * * * <h4>See Also</h4> * <ul> <li><a href="http://dev.1c-bitrix.ru/api_help/catalog/fields.php">Структура таблицы</a></li> <li><a * href="http://dev.1c-bitrix.ru/api_help/catalog/classes/ccatalogproductgroups/ccatalogproductgroups.add.php">CCatalogProductGroups::Add</a></li> * <li><a * href="http://dev.1c-bitrix.ru/api_help/catalog/classes/ccatalogproductgroups/ccatalogproductgroups.update.php">CCatalogProductGroups::Update</a></li> * </ul> </ht<br><br> * * * @static * @link http://dev.1c-bitrix.ru/api_help/catalog/classes/ccatalogproductgroups/checkfields.php * @author Bitrix */ public static function CheckFields($ACTION, &$arFields, $ID = 0) { if ((is_set($arFields, "PRODUCT_ID") || $ACTION == "ADD") && intval($arFields["PRODUCT_ID"]) <= 0) { return false; } if ((is_set($arFields, "GROUP_ID") || $ACTION == "ADD") && intval($arFields["GROUP_ID"]) <= 0) { return false; } if (is_set($arFields, "ACCESS_LENGTH") || $ACTION == "ADD") { $arFields["ACCESS_LENGTH"] = intval($arFields["ACCESS_LENGTH"]); if ($arFields["ACCESS_LENGTH"] < 0) { $arFields["ACCESS_LENGTH"] = 0; } } if ((is_set($arFields, "ACCESS_LENGTH_TYPE") || $ACTION == "ADD") && !array_key_exists($arFields["ACCESS_LENGTH_TYPE"], CCatalogProduct::GetTimePeriodTypes(true))) { $arFields["ACCESS_LENGTH_TYPE"] = CCatalogProduct::TIME_PERIOD_DAY; } return true; }
public function editContent(&$content) { $replaced_template = "<!--Mneniya.pro-->"; if (strpos($content, $replaced_template) !== false) { if (CModule::IncludeModule("catalog")) { $product_id = 0; if (isset($_SESSION['VIEWED_PRODUCT']) && $_SESSION['VIEWED_PRODUCT']) { $product_id = $_SESSION['VIEWED_PRODUCT']; } else { $product_id = $_SESSION['LAST_VIEW_ID']; } $product_info = CCatalogProduct::GetByIDEx($product_id); $settings = unserialize(COption::GetOptionString("pimentos.mneniyapro", "settings")); if (isset($settings["code"]) && $settings["code"]) { $content = str_replace($replaced_template, '<div class="mp-prod_id" style="display:none">' . $product_id . '</div>' . '<div class="mp-prod_name" style="display:none">' . $product_info['NAME'] . '</div>' . $settings["code"], $content); } } } }
public static function updateAll($page = 0, &$total, $perPage = CAutoPriceUpdater::LIMIT) { $list = CCatalogProduct::GetList(array(), array('IBLOCK_ID' => self::enabledCatalogs()), false, array('iNumPage' => $page + 1, 'nPageSize' => $perPage), array('ID')); $total = $list->NavPageCount; if ($page + 1 > $list->NavPageCount) { return false; } $priceType = COption::GetOptionInt('autoprice', 'priceTypes', 0); while ($res = $list->Fetch()) { $price = CPrice::GetBasePrice($res['ID'], false, false); $priseRub = floatval($price * self::$usdRate); if ($priseRub < 1000 && self::$extras[0]) { self::setExtra($res['ID'], $priceType, self::$extras[0]); } elseif ($priseRub < 10000 && self::$extras[1]) { self::setExtra($res['ID'], $priceType, self::$extras[1]); } elseif ($priseRub < 100000 && self::$extras[2]) { self::setExtra($res['ID'], $priceType, self::$extras[2]); } } return $page + 1 < $total; }
private static function get_ib_items_list($arFilter, $arSelectFields, $with_prices = false) { if (!CModule::IncludeModule("iblock")) { return false; } $arItems = array(); $res = CIBlockElement::GetList(array("SORT" => "ASC", "NAME" => "ASC"), $arFilter, false, false, $arSelectFields); while ($item = $res->GetNext()) { if ($with_prices) { $item["PRICE"] = CCatalogProduct::GetOptimalPrice($item["ID"], self::DEFAULT_PRICE_ID, isset($GLOBALS['USER']) && $GLOBALS['USER'] ? $GLOBALS['USER']->GetUserGroupArray() : 0); if (isset($item["PRICE"]["RESULT_PRICE"]) && $item["PRICE"]["RESULT_PRICE"]) { $item["PRICE_VALUE"] = $item["PRICE"]["RESULT_PRICE"]["BASE_PRICE"]; $item["PRICE_STR_VALUE"] = CurrencyFormat($item["PRICE"]["RESULT_PRICE"]["BASE_PRICE"], $item["PRICE"]["RESULT_PRICE"]["CURRENCY"]); } else { $item["PRICE_VALUE"] = 0; $item["PRICE_STR_VALUE"] = ""; } } $arItems[$item["ID"]] = $item; } return $arItems; }
function addToBascket($arItems){ $num = 0; foreach($arItems as $item){ $tovar=CCatalogProduct::GetByIDEx($item["ID"]); if(intval($item["COUNT"])<=$tovar["PRODUCT"]["QUANTITY"]&&intval($item["COUNT"])>0){ Add2BasketByProductID($item["ID"],intval($item["COUNT"])); $num++; } } ?> <script> $(".CartLink span").text('(<?php echo $num; ?> )'); $('body,html').animate({scrollTop: 0}, 2); </script> <? }
function getAvailableQuantity($arBasketItems) { if (empty($arBasketItems) || !is_array($arBasketItems)) { return array(); } if ($catalogIncluded === null) { $catalogIncluded = Loader::includeModule('catalog'); } if (!$catalogIncluded) { return false; } $arElementId = array(); $productMap = array(); foreach ($arBasketItems as $key => $arItem) { $arElementId[$arItem['PRODUCT_ID']] = $arItem['PRODUCT_ID']; if (!isset($productMap[$arItem['PRODUCT_ID']])) { $productMap[$arItem['PRODUCT_ID']] = array(); } $productMap[$arItem['PRODUCT_ID']][] = $key; } unset($key, $arItem); if (!empty($arElementId)) { $productIterator = CCatalogProduct::GetList(array(), array('ID' => $arElementId), false, false, array('ID', 'QUANTITY')); while ($product = $productIterator->Fetch()) { if (!isset($productMap[$product['ID']])) { continue; } foreach ($productMap[$product['ID']] as $key) { $arBasketItems[$key]['AVAILABLE_QUANTITY'] = $product['QUANTITY']; } unset($key); } unset($product, $productIterator); } unset($productMap, $arElementId); return $arBasketItems; }
/** * [getFavoriteProducts description] * @param array $arFavorites * @return array products */ function getFavoriteProducts($arFavorites) { global $USER; foreach ($arFavorites as $key => $id) { $arSelect = array(); $arFilter = array("IBLOCK_ID" => 17, "ACTIVE" => "Y", "ID" => $id); $res = CIBlockElement::GetList(array(), $arFilter, false, false, $arSelect); if ($ob = $res->GetNextElement()) { $arItems = $ob->GetFields(); $arItems["PROPERTIES"] = $ob->GetProperties(); $dbPrice = CPrice::GetList(array("QUANTITY_FROM" => "ASC", "QUANTITY_TO" => "ASC", "SORT" => "ASC"), array("PRODUCT_ID" => $arItems["ID"]), false, false, array("ID", "CATALOG_GROUP_ID", "PRICE", "CURRENCY", "QUANTITY_FROM", "QUANTITY_TO")); if ($arPrice = $dbPrice->Fetch()) { $arDiscounts = CCatalogDiscount::GetDiscountByPrice($arPrice["ID"], $USER->GetUserGroupArray(), "N", SITE_ID); $discountPrice = CCatalogProduct::CountPriceWithDiscount($arPrice["PRICE"], $arPrice["CURRENCY"], $arDiscounts); $arPrice["DISCOUNT_VALUE"] = $discountPrice; $arItems["PRICES"] = $arPrice; } } if ($arItems) { $arFav[] = $arItems; } } return $arFav; }
function getProductDataToFillBasket($productId, $quantity, $userId, $LID, $userColumns, $tmpId = "") { if (!\Bitrix\Main\Loader::includeModule("catalog")) return array(); $arParams = array(); $productId = (int)$productId; if ($productId <= 0) { return $arParams; } $iblockId = (int)CIBlockElement::GetIBlockByID($productId); if ($iblockId <= 0) { return $arParams; } $arSku2Parent = array(); $arElementId = array(); $arElementId[] = $productId; $arParent = CCatalogSku::GetProductInfo($productId, $iblockId); if ($arParent) { $arElementId[] = $arParent["ID"]; $arSku2Parent[$productId] = $arParent["ID"]; } $arPropertyInfo = array(); $userColumns = (string)$userColumns; $arUserColumns = ($userColumns != '') ? explode(",", $userColumns) : array(); foreach ($arUserColumns as $key => $column) { if (strncmp($column, 'PROPERTY_', 9) != 0) { unset($arUserColumns[$key]); } else { $propertyCode = substr($column, 9); if ($propertyCode == '') { unset($arUserColumns[$key]); continue; } $dbres = CIBlockProperty::GetList(array(), array("CODE" => $propertyCode)); if ($arPropData = $dbres->GetNext()) $arPropertyInfo[$column] = $arPropData; } } $arSelect = array_merge( array("ID", "NAME", "LID", "IBLOCK_ID", "IBLOCK_SECTION_ID", "DETAIL_PICTURE", "PREVIEW_PICTURE", "DETAIL_PAGE_URL", "XML_ID", "IBLOCK_XML_ID"), $arUserColumns ); $arProductData = getProductProps($arElementId, $arSelect); $defaultMeasure = CCatalogMeasure::getDefaultMeasure(true, true); if (!empty($arProductData)) { $arElementInfo = array(); foreach ($arProductData as $elemId => &$arElement) { foreach ($arElement as $key => $value) { if (strncmp($key, 'PROPERTY_', 9) == 0 && substr($key, -6) == "_VALUE") { $columnCode = str_replace("_VALUE", "", $key); $arElement[$key] = getIblockPropInfo($value, $arPropertyInfo[$columnCode], array("WIDTH" => 90, "HEIGHT" => 90)); } } } unset($arElement); if (isset($arProductData[$productId])) $arElementInfo = $arProductData[$productId]; if (isset( $arSku2Parent[$productId])) $arParent = $arProductData[$arSku2Parent[$productId]]; if (!empty($arSku2Parent)) // if sku element doesn't have value of some property - we'll show parent element value instead { foreach ($arUserColumns as $field) { $fieldVal = $field."_VALUE"; $parentId = $arSku2Parent[$productId]; if ((!isset($arElementInfo[$fieldVal]) || (isset($arElementInfo[$fieldVal]) && strlen($arElementInfo[$fieldVal]) == 0)) && (isset($arProductData[$parentId][$fieldVal]) && !empty($arProductData[$parentId][$fieldVal]))) // can be array or string { $arElementInfo[$fieldVal] = $arProductData[$parentId][$fieldVal]; } } if (strpos($arElementInfo["~XML_ID"], '#') === false) { $arElementInfo["~XML_ID"] = $arParent['~XML_ID'].'#'.$arElementInfo["~XML_ID"]; } } $arElementInfo["MODULE"] = "catalog"; $arElementInfo["PRODUCT_PROVIDER_CLASS"] = "CCatalogProductProvider"; $arElementInfo["PRODUCT_ID"] = $arElementInfo["ID"]; if ($arElementInfo["IBLOCK_ID"] > 0) { $arElementInfo["EDIT_PAGE_URL"] = CIBlock::GetAdminElementEditLink($arElementInfo["IBLOCK_ID"], $arElementInfo["PRODUCT_ID"], array( "find_section_section" => $arElementInfo["IBLOCK_SECTION_ID"], 'WF' => 'Y', )); } $arBuyerGroups = CUser::GetUserGroup($userId); // price $arPrice = CCatalogProduct::GetOptimalPrice($arElementInfo["ID"], 1, $arBuyerGroups, "N", array(), $LID); $currentPrice = $arPrice["DISCOUNT_PRICE"]; $arElementInfo["PRICE"] = $currentPrice; $arElementInfo["CURRENCY"] = $arPrice["PRICE"]["CURRENCY"]; $arElementInfo["DISCOUNT_PRICE"] = $arPrice["PRICE"]["PRICE"] - $arPrice["DISCOUNT_PRICE"]; $currentTotalPrice = ($arElementInfo["PRICE"] + $arElementInfo["DISCOUNT_PRICE"]); $discountPercent = 0; if ($arElementInfo["DISCOUNT_PRICE"] > 0) $discountPercent = intval(($arElementInfo["DISCOUNT_PRICE"] * 100) / $currentTotalPrice); $rsProducts = CCatalogProduct::GetList( array(), array('ID' => $productId), false, false, array('ID', 'QUANTITY', 'WEIGHT', 'MEASURE', 'TYPE', 'BARCODE_MULTI') ); if (!($arProduct = $rsProducts->Fetch())) { return array(); } $balance = floatval($arProduct["QUANTITY"]); // sku props $arSkuData = array(); $arProps[] = array( "NAME" => "Catalog XML_ID", "CODE" => "CATALOG.XML_ID", "VALUE" => $arElementInfo['~IBLOCK_XML_ID'] ); $arSkuProperty = CSaleProduct::GetProductSkuProps($productId, '', true); if (!empty($arSkuProperty)) { foreach ($arSkuProperty as &$val) { $arSkuData[] = array( 'NAME' => $val['NAME'], 'VALUE' => $val['VALUE'], 'CODE' => $val['CODE'] ); } unset($val); } $arSkuData[] = array( "NAME" => "Product XML_ID", "CODE" => "PRODUCT.XML_ID", "VALUE" => $arElementInfo["~XML_ID"] ); // currency $arCurFormat = CCurrencyLang::GetCurrencyFormat($arElementInfo["CURRENCY"]); $priceValutaFormat = str_replace("#", "", $arCurFormat["FORMAT_STRING"]); $arElementInfo["WEIGHT"] = $arProduct["WEIGHT"]; // measure $arElementInfo["MEASURE_TEXT"] = ""; if ((int)$arProduct["MEASURE"] > 0) { $dbMeasure = CCatalogMeasure::GetList(array(), array("ID" => intval($arProduct["MEASURE"])), false, false, array("ID", "SYMBOL_RUS", "SYMBOL_INTL")); if ($arMeasure = $dbMeasure->Fetch()) $arElementInfo["MEASURE_TEXT"] = ($arMeasure["SYMBOL_RUS"] != '' ? $arMeasure["SYMBOL_RUS"] : $arMeasure["SYMBOL_INTL"]); } if ($arElementInfo["MEASURE_TEXT"] == '') { $arElementInfo["MEASURE_TEXT"] = ($defaultMeasure["SYMBOL_RUS"] != '' ? $defaultMeasure["SYMBOL_RUS"] : $defaultMeasure["SYMBOL_INTL"]); } // ratio $arElementInfo["RATIO"] = 1; $dbratio = CCatalogMeasureRatio::GetList(array(), array("PRODUCT_ID" => $productId)); if ($arRatio = $dbratio->Fetch()) $arElementInfo["RATIO"] = $arRatio["RATIO"]; // image if ($arElementInfo["PREVIEW_PICTURE"] > 0) $imgCode = $arElementInfo["PREVIEW_PICTURE"]; elseif ($arElementInfo["DETAIL_PICTURE"] > 0) $imgCode = $arElementInfo["DETAIL_PICTURE"]; if ($imgCode == "" && count($arParent) > 0) { if ($arParent["PREVIEW_PICTURE"] > 0) $imgCode = $arParent["PREVIEW_PICTURE"]; elseif ($arParent["DETAIL_PICTURE"] > 0) $imgCode = $arParent["DETAIL_PICTURE"]; } if ($imgCode > 0) { $arFile = CFile::GetFileArray($imgCode); $arImgProduct = CFile::ResizeImageGet($arFile, array('width'=>80, 'height'=>80), BX_RESIZE_IMAGE_PROPORTIONAL, false, false); if (is_array($arImgProduct)) $imgUrl = $arImgProduct["src"]; } $arSetInfo = array(); $arStores = array(); /** @var $productProvider IBXSaleProductProvider */ if ($productProvider = CSaleBasket::GetProductProvider(array("MODULE" => $arElementInfo["MODULE"], "PRODUCT_PROVIDER_CLASS" => $arElementInfo["PRODUCT_PROVIDER_CLASS"]))) { // get set items if it is set if ($arProduct["TYPE"] == CCatalogProduct::TYPE_SET) { if (method_exists($productProvider, "GetSetItems")) { $arSets = $productProvider::GetSetItems($productId, CSaleBasket::TYPE_SET); if ($tmpId == "") $tmpId = randString(7); if (!empty($arSets)) { foreach ($arSets as $arSetData) { foreach ($arSetData["ITEMS"] as $setItem) { $arSetItemParams = getProductDataToFillBasket($setItem["PRODUCT_ID"], $setItem["QUANTITY"], $userId, $LID, $userColumns, $tmpId); // recursive call // re-define some fields with set data values $arSetItemParams["id"] = $setItem["PRODUCT_ID"]; $arSetItemParams["name"] = $setItem["NAME"]; $arSetItemParams["module"] = $setItem["MODULE"]; $arSetItemParams["productProviderClass"] = $setItem["PRODUCT_PROVIDER_CLASS"]; $arSetItemParams["url"] = $setItem["DETAIL_PAGE_URL"]; $arSetItemParams["quantity"] = $setItem["QUANTITY"] * $quantity; $arSetItemParams["barcodeMulti"] = $setItem["BARCODE_MULTI"]; $arSetItemParams["productType"] = $setItem["TYPE"]; $arSetItemParams["weight"] = $setItem["WEIGHT"]; $arSetItemParams["vatRate"] = $setItem["VAT_RATE"]; $arSetItemParams["setItems"] = ""; $arSetItemParams["setParentId"] = $productId."_tmp".$tmpId; $arSetItemParams["isSetItem"] = "Y"; $arSetItemParams["isSetParent"] = "N"; $arSetInfo[] = $arSetItemParams; } } } } } // get stores $storeCount = $productProvider::GetStoresCount(array("SITE_ID" => $LID)); // with exact SITE_ID or SITE_ID = NULL if ($storeCount > 0) { if ($arProductStore = $productProvider::GetProductStores(array("PRODUCT_ID" => $productId, "SITE_ID" => $LID))) $arStores = $arProductStore; } } $currentTotalPrice = (float)$currentTotalPrice; // params array $arParams["id"] = $productId; $arParams["name"] = $arElementInfo["~NAME"]; $arParams["url"] = htmlspecialcharsex($arElementInfo["~DETAIL_PAGE_URL"]); $arParams["urlEdit"] = $arElementInfo["EDIT_PAGE_URL"]; $arParams["urlImg"] = $imgUrl; $arParams["price"] = floatval($arElementInfo["PRICE"]); $arParams["priceBase"] = $currentTotalPrice; $arParams["priceBaseFormat"] = CCurrencyLang::CurrencyFormat($currentTotalPrice, $arElementInfo["CURRENCY"], false); $arParams["priceFormated"] = CCurrencyLang::CurrencyFormat(floatval($arElementInfo["PRICE"]), $arElementInfo["CURRENCY"], false); $arParams["valutaFormat"] = $priceValutaFormat; $arParams["dimensions"] = serialize(array("WIDTH" => $arElementInfo["WIDTH"], "HEIGHT" => $arElementInfo["HEIGHT"], "LENGTH" => $arElementInfo["LENGTH"])); $arParams["priceDiscount"] = floatval($arElementInfo["DISCOUNT_PRICE"]); $arParams["priceTotalFormated"] = CCurrencyLang::CurrencyFormat($currentTotalPrice, $arElementInfo["CURRENCY"], true); $arParams["discountPercent"] = $discountPercent; $arParams["summaFormated"] = CCurrencyLang::CurrencyFormat($arElementInfo["PRICE"], $arElementInfo["CURRENCY"], false); $arParams["quantity"] = $quantity; $arParams["module"] = $arElementInfo["MODULE"]; $arParams["currency"] = $arElementInfo["CURRENCY"]; $arParams["weight"] = $arElementInfo["WEIGHT"]; $arParams["vatRate"] = $arPrice["PRICE"]["VAT_RATE"]; $arParams["priceType"] = $arPrice["PRICE"]["CATALOG_GROUP_NAME"]; $arParams["balance"] = $balance; $arParams["notes"] = (is_array($arPrice["PRICE"]) && array_key_exists("CATALOG_GROUP_NAME", $arPrice["PRICE"])) ? $arPrice["PRICE"]["CATALOG_GROUP_NAME"] : ""; $arParams["catalogXmlID"] = $arElementInfo["~IBLOCK_XML_ID"]; $arParams["productXmlID"] = $arElementInfo["~XML_ID"]; $arParams["callback"] = ""; $arParams["orderCallback"] = ""; $arParams["cancelCallback"] = ""; $arParams["payCallback"] = ""; $arParams["productProviderClass"] = $arElementInfo["PRODUCT_PROVIDER_CLASS"]; $arParams["skuProps"] = $arSkuData; $arParams["measureText"] = $arElementInfo["MEASURE_TEXT"]; $arParams["ratio"] = $arElementInfo["RATIO"]; $arParams["barcodeMulti"] = $arProduct["BARCODE_MULTI"]; $arParams["productType"] = empty($arSetInfo) ? "" : CSaleBasket::TYPE_SET; $arParams["setParentId"] = empty($arSetInfo) ? "" : $productId."_tmp".$tmpId; $arParams["setItems"] = $arSetInfo; $arParams["isSetItem"] = "N"; $arParams["isSetParent"] = empty($arSetInfo) ? "N" : "Y"; $arParams["stores"] = empty($arSetInfo) ? $arStores : array(); $arParams["productPropsValues"] = $arElementInfo; // along with other information also contains values of properties with correct keys (after getProductProps) } return $arParams; }
public static function OnIBlockElementDelete($ProductID) { global $DB; $ProductID = intval($ProductID); return CCatalogProduct::Delete($ProductID); }
} else { $val = $res ? "Y" : "N"; } $arBasket["STORES"][$storeId]["BARCODE"][] = $arRes["BARCODE"]; $arBasket["STORES"][$storeId]["BARCODE_FOUND"][] = $val; } else { $arBasket["STORES"][$storeId]["QUANTITY"] = $arRes["QUANTITY"]; $arBasket["STORES"][$storeId]["QUANTITY_DEDUCTED"] = $arRes["DEDUCTED"] == "Y" ? "Y" : "N"; } } } } $arBasket["HAS_SAVED_QUANTITY"] = "Y"; $arBasket["HAS_SAVED_BARCODES"] = true; $ind++; } } } } $arResult["BASKET"][$arBasket["ID"]] = $arBasket; } if (CModule::IncludeModule('catalog')) { $rsCatProd = CCatalogProduct::GetList(array(), array("ID" => $arProdIds), false, false, array("ID", "QUANTITY")); while ($arCatProd = $rsCatProd->Fetch()) { if ($arResult["BASKET"][$arProdIdsPrIds[$arCatProd["ID"]]]["MODULE"] == "catalog") { $arResult["BASKET"][$arProdIdsPrIds[$arCatProd["ID"]]]["BALANCE"] = FloatVal($arCatProd["QUANTITY"]); } } } $arResult["USE_STORES"] = $useStores; $this->IncludeComponentTemplate($templatePage);
?> <td class="COLUMN_QUANTITY"> <?echo $arItem["QUANTITY"]." ".$measure?> </td> <? } if ($columnCode == "COLUMN_REMAINING_QUANTITY") { ?> <td class="COLUMN_REMAINING_QUANTITY"> <? $balance = 0; if ($arItem["MODULE"] == "catalog" && $bUseCatalog) { $ar_res = CCatalogProduct::GetByID($arItem["PRODUCT_ID"]); $balance = FloatVal($ar_res["QUANTITY"]); } ?> <?echo $balance?> </td> <? } if ($columnCode == "COLUMN_PROPS") { ?> <td class="COLUMN_PROPS"> <? if (!empty($arBasketProps[$arItem["ID"]]) && is_array($arBasketProps[$arItem["ID"]])) {
protected function getProductIds() { $ids = array(); if (!empty($this->ajaxItemsIds)) { $recommendationId = Main\Context::getCurrent()->getRequest()->get('RID'); $ids = $this->ajaxItemsIds; } else { $bestsellers = parent::getProductIds(); if (!empty($bestsellers)) { $recommendationId = 'bestsellers'; $ids = Main\Analytics\Catalog::getProductIdsByOfferIds($bestsellers); } if (empty($ids)) { $recommendationId = 'mostviewed'; $dublicate = array(); // top viewed $result = CatalogViewedProductTable::getList(array('select' => array('ELEMENT_ID', new Main\Entity\ExpressionField('SUM_HITS', 'SUM(%s)', 'VIEW_COUNT')), 'filter' => array('=SITE_ID' => $this->getSiteId(), '>ELEMENT_ID' => 0), 'order' => array('SUM_HITS' => 'DESC'), 'limit' => $this->arParams['PAGE_ELEMENT_COUNT'])); while ($row = $result->fetch()) { if (!isset($dublicate[$row['ELEMENT_ID']])) { $ids[] = $row['ELEMENT_ID']; } $dublicate[$row['ELEMENT_ID']] = true; } unset($row, $result, $dublicate); } } if (!empty($ids) && $this->arParams['HIDE_NOT_AVAILABLE'] == 'Y') { $filter = count($ids) > 1000 ? array('ID' => $ids) : array('@ID' => $ids); $ids = array_fill_keys($ids, true); $productIterator = CCatalogProduct::GetList(array(), $filter, false, false, array('ID', 'QUANTITY', 'QUANTITY_TRACE', 'CAN_BUY_ZERO')); while ($product = $productIterator->Fetch()) { if (isset($ids[$product['ID']]) && !CCatalogProduct::isAvailable($product)) { unset($ids[$product['ID']]); } } unset($product, $productIterator, $filter); $ids = array_keys($ids); } $ids = array_slice($ids, 0, $this->arParams['PAGE_ELEMENT_COUNT']); // remember recommendation id $this->arResult['RID'] = $recommendationId; return $ids; }
if (!($bAllLinesLoaded = CSVCheckTimeout($max_execution_time))) { break; } } } // update or delete 'not-in-file' elements if ($bAllLinesLoaded && $outFileAction != "F") { $arProductArray = array('QUANTITY' => 0, 'QUANTITY_TRACE' => 'Y', 'CAN_BUY_ZERO' => 'N', 'NEGATIVE_AMOUNT_TRACE' => 'N'); $res = CIBlockElement::GetList(array(), array("IBLOCK_ID" => $IBLOCK_ID, "!TMP_ID" => $tmpid), false, false, array('ID')); while ($arr = $res->Fetch()) { if ($outFileAction == "D") { CIBlockElement::Delete($arr["ID"], "Y", "N"); $killed_lines++; } elseif ($outFileAction == "F") { } elseif ($bIBlockIsCatalog && $outFileAction == "M") { CCatalogProduct::Update($arr['ID'], $arProductArray); $killed_lines++; } else { $bDeactivationStarted = true; $el->Update($arr["ID"], array("ACTIVE" => "N", "TMP_ID" => $tmpid)); $killed_lines++; } if (!($bAllLinesLoaded = CSVCheckTimeout($max_execution_time))) { break; } } } // delete 'not-in-file' element prices if ($bAllLinesLoaded && $bIBlockIsCatalog && 'Y' == $bUpdatePrice && $outFileAction == "D") { $res = CPrice::GetList(array(), array("ELEMENT_IBLOCK_ID" => $IBLOCK_ID, "!TMP_ID" => $tmpid), false, false, array("ID")); while ($arr = $res->Fetch()) {
$sum += $store['AMOUNT']; } else { $amount[$store['STORE_ID']] = 0; $amount[$store['STORE_ID']] += $store['AMOUNT']; } } unset($store, $storeIterator, $filter); if ($arParams["SHOW_GENERAL_STORE_INFORMATION"] == "Y") { $productSku[$sku['ID']][] = $sum; } else { $productSku[$sku['ID']] = $amount; } $arParams["ELEMENT_ID"] = $sku['ID']; } } $res = CCatalogProduct::GetList(array(), array("ID" => $arParams["ELEMENT_ID"]), false, false, array("TYPE", "QUANTITY", "ID")); $data = $res->Fetch(); if ($data["TYPE"] == CCatalogProduct::TYPE_SET) { $arParams["SHOW_GENERAL_STORE_INFORMATION"] = "Y"; $arParams["~SHOW_GENERAL_STORE_INFORMATION"] = "Y"; $quantity = $data["QUANTITY"]; $arResult["IS_SKU"] = false; } else { if (in_array('COORDINATES', $arParams['FIELDS'])) { $arParams['FIELDS'] = array_merge($arParams['FIELDS'], array('GPS_N', 'GPS_S')); } $select = array_merge(array("ID", "ACTIVE", "PRODUCT_AMOUNT", "TITLE", "TYPE"), $arParams["FIELDS"], $arParams["USER_FIELDS"]); foreach ($select as $key => $value) { if (empty($value) || $value == 'COORDINATES') { unset($select[$key]); }
$arBaseProduct = false; $periodTimeTypes = array(); if ($arMainCatalog['SUBSCRIPTION'] == 'Y') { $arDefProduct = array('QUANTITY' => '', 'QUANTITY_RESERVED' => '', 'VAT_ID' => 0, 'VAT_INCLUDED' => 'N', 'QUANTITY_TRACE_ORIG' => 'D', 'CAN_BUY_ZERO_ORIG' => 'D', 'PRICE_TYPE' => '', 'RECUR_SCHEME_TYPE' => '', 'RECUR_SCHEME_LENGTH' => '', 'TRIAL_PRICE_ID' => '', 'WITHOUT_ORDER' => '', 'PURCHASING_PRICE' => '', 'PURCHASING_CURRENCY' => '', 'BARCODE_MULTI' => '', 'SUBSCRIBE_ORIG' => 'D'); $periodTimeTypes = CCatalogProduct::GetTimePeriodTypes(true); } else { $arDefProduct = array('QUANTITY' => '', 'QUANTITY_RESERVED' => '', 'WEIGHT' => '', 'WIDTH' => '', 'LENGTH' => '', 'HEIGHT' => '', 'MEASURE' => '', 'VAT_ID' => 0, 'VAT_INCLUDED' => 'N', 'QUANTITY_TRACE_ORIG' => 'D', 'CAN_BUY_ZERO_ORIG' => 'D', 'PURCHASING_PRICE' => '', 'PURCHASING_CURRENCY' => '', 'BARCODE_MULTI' => '', 'SUBSCRIBE_ORIG' => 'D'); } if ($PRODUCT_ID > 0) { $bReadOnly = !($USER->CanDoOperation('catalog_price') && CIBlockElementRights::UserHasRightTo($IBLOCK_ID, $PRODUCT_ID, "element_edit_price")); if ($arMainCatalog['SUBSCRIPTION'] == 'Y') { $arProductSelect = array('ID', 'QUANTITY', 'QUANTITY_RESERVED', 'QUANTITY_TRACE_ORIG', 'VAT_ID', 'VAT_INCLUDED', 'CAN_BUY_ZERO_ORIG', 'PRICE_TYPE', 'RECUR_SCHEME_TYPE', 'RECUR_SCHEME_LENGTH', 'TRIAL_PRICE_ID', 'WITHOUT_ORDER', 'PURCHASING_PRICE', 'PURCHASING_CURRENCY', 'BARCODE_MULTI', 'SUBSCRIBE_ORIG', 'TYPE'); } else { $arProductSelect = array('ID', 'QUANTITY', 'QUANTITY_RESERVED', 'QUANTITY_TRACE_ORIG', 'WEIGHT', 'WIDTH', 'LENGTH', 'HEIGHT', 'MEASURE', 'VAT_ID', 'VAT_INCLUDED', 'CAN_BUY_ZERO_ORIG', 'PURCHASING_PRICE', 'PURCHASING_CURRENCY', 'BARCODE_MULTI', 'SUBSCRIBE_ORIG', 'TYPE'); } $rsProducts = CCatalogProduct::GetList(array(), array('ID' => $PRODUCT_ID), false, false, $arProductSelect); $arBaseProduct = $rsProducts->Fetch(); if ($bCopy) { $arBaseProduct['QUANTITY'] = ''; $arBaseProduct['QUANTITY_RESERVED'] = ''; } } else { $bReadOnly = !($USER->CanDoOperation('catalog_price') && CIBlockSectionRights::UserHasRightTo($IBLOCK_ID, $MENU_SECTION_ID, "element_edit_price")); } if (empty($arBaseProduct)) { $arBaseProduct = $arDefProduct; } $productIsSet = CBXFeatures::IsFeatureEnabled('CatCompleteSet') && ($arBaseProduct['TYPE'] == CCatalogProduct::TYPE_SET || $arShowTabs['product_set']); $bDiscount = $USER->CanDoOperation('catalog_discount'); $bStore = $USER->CanDoOperation('catalog_store'); $bUseStoreControl = COption::GetOptionString('catalog', 'default_use_store_control') == 'Y';
} if (($columnCode == "COLUMN_REMAINING_QUANTITY") || (!array_key_exists("COLUMN_REMAINING_QUANTITY", $arUserColumns) && !in_array("COLUMN_REMAINING_QUANTITY", $arShownColumns))) { $hidden = (!(array_key_exists("COLUMN_REMAINING_QUANTITY", $arUserColumns))) ? "style=\"display:none\"" : ""; $arShownColumns[] = "COLUMN_REMAINING_QUANTITY"; ?> <td class="COLUMN_REMAINING_QUANTITY" <?php echo $hidden; ?> > <? $balance = "0"; if ($val["MODULE"] == "catalog" && $bUseCatalog) { $ar_res = CCatalogProduct::GetByID($val["PRODUCT_ID"]); $balance = floatval($ar_res["QUANTITY"]); } ?> <div id="DIV_BALANCE_<?php echo $val["ID"]; ?> "><?php echo $balance; ?> </div> </td> <? } if (($columnCode == "COLUMN_PROPS") || (!array_key_exists("COLUMN_PROPS", $arUserColumns) && !in_array("COLUMN_PROPS", $arShownColumns)))
"TEXT" => GetMessage('MAIN_DELETE'), "TITLE" => GetMessage("IBLOCK_DELETE_ALT"), "ACTION" => "if(confirm('".GetMessageJS('IBLOCK_CONFIRM_DEL_MESSAGE')."')) ".$lAdmin->ActionDoGroup($f_TYPE.$arRes_orig['ID'], "delete", $sThisSectionUrl), ); } } $row->AddActions($arActions); } if ($bCatalog) { if ($strUseStoreControl == "Y" && in_array("CATALOG_BAR_CODE", $arSelectedFields) && !empty($arElemID)) { $rsProducts = CCatalogProduct::GetList( array(), array("ID" => $arElemID), false, false, array('ID', 'BARCODE_MULTI') ); $productsWithBarCode = array(); while ($product = $rsProducts->Fetch()) { if (isset($arRows['E'.$product["ID"]])) { if ($product["BARCODE_MULTI"] == "Y") $arRows['E'.$product["ID"]]->arRes["CATALOG_BAR_CODE"] = GetMessage("IBLIST_A_CATALOG_BAR_CODE_MULTI"); else $productsWithBarCode[] = $product["ID"]; } } if (!empty($productsWithBarCode))
if (array_key_exists("QUANTITY_" . $val["ID"], $_POST)) { $_POST["QUANTITY_" . $val["ID"]] = str_replace(",", ".", $_POST["QUANTITY_" . $val["ID"]]); $dblQuantity = $arParams['QUANTITY_FLOAT'] == 'Y' ? DoubleVal($_POST["QUANTITY_" . $val["ID"]]) : intval($_POST["QUANTITY_" . $val["ID"]]); if ($dblQuantity != $val['QUANTITY']) { if ('catalog' == $val['MODULE']) { $arProductIDs[$val["PRODUCT_ID"]] = $key; $arNewQuantity[$val["PRODUCT_ID"]] = $dblQuantity; } else { $arFields = array("QUANTITY" => $dblQuantity); CSaleBasket::Update($val["ID"], $arFields); } } } } if (!empty($arProductIDs) && Loader::includeModule('catalog')) { $rsProducts = CCatalogProduct::GetList(array(), array('ID' => array_keys($arProductIDs)), false, false, $arSelect); while ($arProduct = $rsProducts->Fetch()) { if (array_key_exists($arProduct['ID'], $arProductIDs)) { $key = $arProductIDs[$arProduct['ID']]; if ($arNewQuantity[$arProduct['ID']] > $arProduct['QUANTITY'] && 'Y' == $arProduct['QUANTITY_TRACE'] && 'N' == $arProduct['CAN_BUY_ZERO']) { $arNewQuantity[$arProduct['ID']] = $arProduct['QUANTITY']; $productLimit .= GetMessage("STOF_WARNING_LIMIT_PRODUCT") . " " . $arShoppingCart[$key]["NAME"] . "<br>"; } if ($arNewQuantity[$arProduct['ID']] != $arShoppingCart[$key]['QUANTITY']) { $arShoppingCart[$key]['QUANTITY'] = $arNewQuantity[$arProduct['ID']]; $arFields = array("QUANTITY" => $arNewQuantity[$arProduct['ID']], 'TYPE' => $arShoppingCart[$key]['TYPE'], 'SET_PARENT_ID' => $arShoppingCart[$key]['SET_PARENT_ID']); CSaleBasket::Update($arShoppingCart[$key]["ID"], $arFields); } } } }
function GetList($arOrder = array("SORT" => "ASC"), $arFilter = array(), $arGroupBy = false, $arNavStartParams = false, $arSelectFields = array()) { /* Filter combinations: CHECK_PERMISSIONS="N" - check permissions of the current user to the infoblock MIN_PERMISSION="R" - when permissions check, then minimal access level SHOW_HISTORY="N" - add history items to list SHOW_NEW="N" - if not add history items, then add new, but not published elements */ global $DB, $USER, $APPLICATION; $MAX_LOCK = intval(COption::GetOptionString("workflow", "MAX_LOCK_TIME", "60")); $uid = is_object($USER) ? intval($USER->GetID()) : 0; $arIblockElementFields = array("ID" => "BE.ID", "TIMESTAMP_X" => $DB->DateToCharFunction("BE.TIMESTAMP_X"), "TIMESTAMP_X_UNIX" => 'UNIX_TIMESTAMP(BE.TIMESTAMP_X)', "MODIFIED_BY" => "BE.MODIFIED_BY", "DATE_CREATE" => $DB->DateToCharFunction("BE.DATE_CREATE"), "DATE_CREATE_UNIX" => 'UNIX_TIMESTAMP(BE.DATE_CREATE)', "CREATED_BY" => "BE.CREATED_BY", "IBLOCK_ID" => "BE.IBLOCK_ID", "IBLOCK_SECTION_ID" => "BE.IBLOCK_SECTION_ID", "ACTIVE" => "BE.ACTIVE", "ACTIVE_FROM" => CPageOption::GetOptionString("iblock", "FORMAT_ACTIVE_DATES", "-") != "-" ? $DB->DateToCharFunction("BE.ACTIVE_FROM", CPageOption::GetOptionString("iblock", "FORMAT_ACTIVE_DATES", "SHORT")) : "IF(EXTRACT(HOUR_SECOND FROM BE.ACTIVE_FROM)>0, " . $DB->DateToCharFunction("BE.ACTIVE_FROM", "FULL") . ", " . $DB->DateToCharFunction("BE.ACTIVE_FROM", "SHORT") . ")", "ACTIVE_TO" => CPageOption::GetOptionString("iblock", "FORMAT_ACTIVE_DATES", "-") != "-" ? $DB->DateToCharFunction("BE.ACTIVE_TO", CPageOption::GetOptionString("iblock", "FORMAT_ACTIVE_DATES", "SHORT")) : "IF(EXTRACT(HOUR_SECOND FROM BE.ACTIVE_TO)>0, " . $DB->DateToCharFunction("BE.ACTIVE_TO", "FULL") . ", " . $DB->DateToCharFunction("BE.ACTIVE_TO", "SHORT") . ")", "DATE_ACTIVE_FROM" => CPageOption::GetOptionString("iblock", "FORMAT_ACTIVE_DATES", "-") != "-" ? $DB->DateToCharFunction("BE.ACTIVE_FROM", CPageOption::GetOptionString("iblock", "FORMAT_ACTIVE_DATES", "SHORT")) : "IF(EXTRACT(HOUR_SECOND FROM BE.ACTIVE_FROM)>0, " . $DB->DateToCharFunction("BE.ACTIVE_FROM", "FULL") . ", " . $DB->DateToCharFunction("BE.ACTIVE_FROM", "SHORT") . ")", "DATE_ACTIVE_TO" => CPageOption::GetOptionString("iblock", "FORMAT_ACTIVE_DATES", "-") != "-" ? $DB->DateToCharFunction("BE.ACTIVE_TO", CPageOption::GetOptionString("iblock", "FORMAT_ACTIVE_DATES", "SHORT")) : "IF(EXTRACT(HOUR_SECOND FROM BE.ACTIVE_TO)>0, " . $DB->DateToCharFunction("BE.ACTIVE_TO", "FULL") . ", " . $DB->DateToCharFunction("BE.ACTIVE_TO", "SHORT") . ")", "SORT" => "BE.SORT", "NAME" => "BE.NAME", "PREVIEW_PICTURE" => "BE.PREVIEW_PICTURE", "PREVIEW_TEXT" => "BE.PREVIEW_TEXT", "PREVIEW_TEXT_TYPE" => "BE.PREVIEW_TEXT_TYPE", "DETAIL_PICTURE" => "BE.DETAIL_PICTURE", "DETAIL_TEXT" => "BE.DETAIL_TEXT", "DETAIL_TEXT_TYPE" => "BE.DETAIL_TEXT_TYPE", "SEARCHABLE_CONTENT" => "BE.SEARCHABLE_CONTENT", "WF_STATUS_ID" => "BE.WF_STATUS_ID", "WF_PARENT_ELEMENT_ID" => "BE.WF_PARENT_ELEMENT_ID", "WF_LAST_HISTORY_ID" => "BE.WF_LAST_HISTORY_ID", "WF_NEW" => "BE.WF_NEW", "LOCK_STATUS" => "if (BE.WF_DATE_LOCK is null, 'green', if(DATE_ADD(BE.WF_DATE_LOCK, interval " . $MAX_LOCK . " MINUTE)<now(), 'green', if(BE.WF_LOCKED_BY=" . $uid . ", 'yellow', 'red')))", "WF_LOCKED_BY" => "BE.WF_LOCKED_BY", "WF_DATE_LOCK" => $DB->DateToCharFunction("BE.WF_DATE_LOCK"), "WF_COMMENTS" => "BE.WF_COMMENTS", "IN_SECTIONS" => "BE.IN_SECTIONS", "SHOW_COUNTER" => "BE.SHOW_COUNTER", "SHOW_COUNTER_START" => "BE.SHOW_COUNTER_START", "CODE" => "BE.CODE", "TAGS" => "BE.TAGS", "XML_ID" => "BE.XML_ID", "EXTERNAL_ID" => "BE.XML_ID", "TMP_ID" => "BE.TMP_ID", "USER_NAME" => "concat('(',U.LOGIN,') ',ifnull(U.NAME,''),' ',ifnull(U.LAST_NAME,''))", "LOCKED_USER_NAME" => "concat('(',UL.LOGIN,') ',ifnull(UL.NAME,''),' ',ifnull(UL.LAST_NAME,''))", "CREATED_USER_NAME" => "concat('(',UC.LOGIN,') ',ifnull(UC.NAME,''),' ',ifnull(UC.LAST_NAME,''))", "LANG_DIR" => "L.DIR", "LID" => "B.LID", "IBLOCK_TYPE_ID" => "B.IBLOCK_TYPE_ID", "IBLOCK_CODE" => "B.CODE", "IBLOCK_NAME" => "B.NAME", "IBLOCK_EXTERNAL_ID" => "B.XML_ID", "DETAIL_PAGE_URL" => "B.DETAIL_PAGE_URL", "LIST_PAGE_URL" => "B.LIST_PAGE_URL", "CREATED_DATE" => $DB->DateFormatToDB("YYYY.MM.DD", "BE.DATE_CREATE"), "BP_PUBLISHED" => "if(BE.WF_STATUS_ID = 1, 'Y', 'N')"); $bDistinct = false; CIBlockElement::PrepareGetList($arIblockElementFields, $arJoinProps, $bOnlyCount, $bDistinct, $arSelectFields, $sSelect, $arAddSelectFields, $arFilter, $sWhere, $sSectionWhere, $arAddWhereFields, $arGroupBy, $sGroupBy, $arOrder, $arSqlOrder, $arAddOrderByFields, $arIBlockFilter, $arIBlockMultProps, $arIBlockConvProps, $arIBlockAllProps, $arIBlockNumProps, $arIBlockLongProps); $arFilterIBlocks = isset($arFilter["IBLOCK_ID"]) ? array($arFilter["IBLOCK_ID"]) : array(); //******************FROM PART******************************************** $sFrom = ""; foreach ($arJoinProps["FPS"] as $iblock_id => $iPropCnt) { $sFrom .= "\t\t\tINNER JOIN b_iblock_element_prop_s" . $iblock_id . " FPS" . $iPropCnt . " ON FPS" . $iPropCnt . ".IBLOCK_ELEMENT_ID = BE.ID\n"; $arFilterIBlocks[$iblock_id] = $iblock_id; } foreach ($arJoinProps["FP"] as $propID => $db_prop) { $i = $db_prop["CNT"]; if ($db_prop["bFullJoin"]) { $sFrom .= "\t\t\tINNER JOIN b_iblock_property FP" . $i . " ON FP" . $i . ".IBLOCK_ID = B.ID AND " . (IntVal($propID) > 0 ? " FP" . $i . ".ID=" . IntVal($propID) . "\n" : " FP" . $i . ".CODE='" . $DB->ForSQL($propID, 200) . "'\n"); } else { $sFrom .= "\t\t\tLEFT JOIN b_iblock_property FP" . $i . " ON FP" . $i . ".IBLOCK_ID = B.ID AND " . (IntVal($propID) > 0 ? " FP" . $i . ".ID=" . IntVal($propID) . "\n" : " FP" . $i . ".CODE='" . $DB->ForSQL($propID, 200) . "'\n"); } if ($db_prop["IBLOCK_ID"]) { $arFilterIBlocks[$db_prop["IBLOCK_ID"]] = $db_prop["IBLOCK_ID"]; } } foreach ($arJoinProps["FPV"] as $propID => $db_prop) { $i = $db_prop["CNT"]; if ($db_prop["MULTIPLE"] == "Y") { $bDistinct = true; } if ($db_prop["VERSION"] == 2) { $strTable = "b_iblock_element_prop_m" . $db_prop["IBLOCK_ID"]; } else { $strTable = "b_iblock_element_property"; } if ($db_prop["bFullJoin"]) { $sFrom .= "\t\t\tINNER JOIN " . $strTable . " FPV" . $i . " ON FPV" . $i . ".IBLOCK_PROPERTY_ID = FP" . $db_prop["JOIN"] . ".ID AND FPV" . $i . ".IBLOCK_ELEMENT_ID = BE.ID\n"; } else { $sFrom .= "\t\t\tLEFT JOIN " . $strTable . " FPV" . $i . " ON FPV" . $i . ".IBLOCK_PROPERTY_ID = FP" . $db_prop["JOIN"] . ".ID AND FPV" . $i . ".IBLOCK_ELEMENT_ID = BE.ID\n"; } if ($db_prop["IBLOCK_ID"]) { $arFilterIBlocks[$db_prop["IBLOCK_ID"]] = $db_prop["IBLOCK_ID"]; } } foreach ($arJoinProps["FPEN"] as $propID => $db_prop) { $i = $db_prop["CNT"]; if ($db_prop["VERSION"] == 2 && $db_prop["MULTIPLE"] == "N") { if ($db_prop["bFullJoin"]) { $sFrom .= "\t\t\tINNER JOIN b_iblock_property_enum FPEN" . $i . " ON FPEN" . $i . ".PROPERTY_ID = " . $db_prop["ORIG_ID"] . " AND FPS" . $db_prop["JOIN"] . ".PROPERTY_" . $db_prop["ORIG_ID"] . " = FPEN" . $i . ".ID\n"; } else { $sFrom .= "\t\t\tLEFT JOIN b_iblock_property_enum FPEN" . $i . " ON FPEN" . $i . ".PROPERTY_ID = " . $db_prop["ORIG_ID"] . " AND FPS" . $db_prop["JOIN"] . ".PROPERTY_" . $db_prop["ORIG_ID"] . " = FPEN" . $i . ".ID\n"; } } else { if ($db_prop["bFullJoin"]) { $sFrom .= "\t\t\tINNER JOIN b_iblock_property_enum FPEN" . $i . " ON FPEN" . $i . ".PROPERTY_ID = FPV" . $db_prop["JOIN"] . ".IBLOCK_PROPERTY_ID AND FPV" . $db_prop["JOIN"] . ".VALUE_ENUM = FPEN" . $i . ".ID\n"; } else { $sFrom .= "\t\t\tLEFT JOIN b_iblock_property_enum FPEN" . $i . " ON FPEN" . $i . ".PROPERTY_ID = FPV" . $db_prop["JOIN"] . ".IBLOCK_PROPERTY_ID AND FPV" . $db_prop["JOIN"] . ".VALUE_ENUM = FPEN" . $i . ".ID\n"; } } if ($db_prop["IBLOCK_ID"]) { $arFilterIBlocks[$db_prop["IBLOCK_ID"]] = $db_prop["IBLOCK_ID"]; } } foreach ($arJoinProps["BE"] as $propID => $db_prop) { $i = $db_prop["CNT"]; $sFrom .= "\t\t\tLEFT JOIN b_iblock_element BE" . $i . " ON BE" . $i . ".ID = " . ($db_prop["VERSION"] == 2 && $db_prop["MULTIPLE"] == "N" ? "FPS" . $db_prop["JOIN"] . ".PROPERTY_" . $db_prop["ORIG_ID"] : "FPV" . $db_prop["JOIN"] . ".VALUE_NUM") . ($arFilter["SHOW_HISTORY"] != "Y" ? " AND ((BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL)" . ($arFilter["SHOW_NEW"] == "Y" ? " OR BE.WF_NEW='Y'" : "") . ")" : "") . "\n"; if ($db_prop["bJoinIBlock"]) { $sFrom .= "\t\t\tLEFT JOIN b_iblock B" . $i . " ON B" . $i . ".ID = BE" . $i . ".IBLOCK_ID\n"; } if ($db_prop["bJoinSection"]) { $sFrom .= "\t\t\tLEFT JOIN b_iblock_section BS" . $i . " ON BS" . $i . ".ID = BE" . $i . ".IBLOCK_SECTION_ID\n"; } if ($db_prop["IBLOCK_ID"]) { $arFilterIBlocks[$db_prop["IBLOCK_ID"]] = $db_prop["IBLOCK_ID"]; } } foreach ($arJoinProps["BE_FPS"] as $iblock_id => $db_prop) { $sFrom .= "\t\t\tLEFT JOIN b_iblock_element_prop_s" . $iblock_id . " JFPS" . $db_prop["CNT"] . " ON JFPS" . $db_prop["CNT"] . ".IBLOCK_ELEMENT_ID = BE" . $db_prop["JOIN"] . ".ID\n"; if ($db_prop["IBLOCK_ID"]) { $arFilterIBlocks[$db_prop["IBLOCK_ID"]] = $db_prop["IBLOCK_ID"]; } } foreach ($arJoinProps["BE_FP"] as $propID => $db_prop) { $i = $db_prop["CNT"]; list($propID, $link) = explode("~", $propID, 2); if ($db_prop["bFullJoin"]) { $sFrom .= "\t\t\tINNER JOIN b_iblock_property JFP" . $i . " ON JFP" . $i . ".IBLOCK_ID = BE" . $db_prop["JOIN"] . ".IBLOCK_ID AND " . (IntVal($propID) > 0 ? " JFP" . $i . ".ID=" . IntVal($propID) . "\n" : " JFP" . $i . ".CODE='" . $DB->ForSQL($propID, 200) . "'\n"); } else { $sFrom .= "\t\t\tLEFT JOIN b_iblock_property JFP" . $i . " ON JFP" . $i . ".IBLOCK_ID = BE" . $db_prop["JOIN"] . ".IBLOCK_ID AND " . (IntVal($propID) > 0 ? " JFP" . $i . ".ID=" . IntVal($propID) . "\n" : " JFP" . $i . ".CODE='" . $DB->ForSQL($propID, 200) . "'\n"); } if ($db_prop["IBLOCK_ID"]) { $arFilterIBlocks[$db_prop["IBLOCK_ID"]] = $db_prop["IBLOCK_ID"]; } } foreach ($arJoinProps["BE_FPV"] as $propID => $db_prop) { $i = $db_prop["CNT"]; list($propID, $link) = explode("~", $propID, 2); if ($db_prop["MULTIPLE"] == "Y") { $bDistinct = true; } if ($db_prop["VERSION"] == 2) { $strTable = "b_iblock_element_prop_m" . $db_prop["IBLOCK_ID"]; } else { $strTable = "b_iblock_element_property"; } if ($db_prop["bFullJoin"]) { $sFrom .= "\t\t\tINNER JOIN " . $strTable . " JFPV" . $i . " ON JFPV" . $i . ".IBLOCK_PROPERTY_ID = JFP" . $db_prop["JOIN"] . ".ID AND JFPV" . $i . ".IBLOCK_ELEMENT_ID = BE" . $db_prop["BE_JOIN"] . ".ID\n"; } else { $sFrom .= "\t\t\tLEFT JOIN " . $strTable . " JFPV" . $i . " ON JFPV" . $i . ".IBLOCK_PROPERTY_ID = JFP" . $db_prop["JOIN"] . ".ID AND JFPV" . $i . ".IBLOCK_ELEMENT_ID = BE" . $db_prop["BE_JOIN"] . ".ID\n"; } if ($db_prop["IBLOCK_ID"]) { $arFilterIBlocks[$db_prop["IBLOCK_ID"]] = $db_prop["IBLOCK_ID"]; } } foreach ($arJoinProps["BE_FPEN"] as $propID => $db_prop) { $i = $db_prop["CNT"]; list($propID, $link) = explode("~", $propID, 2); if ($db_prop["VERSION"] == 2 && $db_prop["MULTIPLE"] == "N") { if ($db_prop["bFullJoin"]) { $sFrom .= "\t\t\tINNER JOIN b_iblock_property_enum JFPEN" . $i . " ON JFPEN" . $i . ".PROPERTY_ID = " . $db_prop["ORIG_ID"] . " AND JFPS" . $db_prop["JOIN"] . ".PROPERTY_" . $db_prop["ORIG_ID"] . " = JFPEN" . $i . ".ID\n"; } else { $sFrom .= "\t\t\tLEFT JOIN b_iblock_property_enum JFPEN" . $i . " ON JFPEN" . $i . ".PROPERTY_ID = " . $db_prop["ORIG_ID"] . " AND JFPS" . $db_prop["JOIN"] . ".PROPERTY_" . $db_prop["ORIG_ID"] . " = JFPEN" . $i . ".ID\n"; } } else { if ($db_prop["bFullJoin"]) { $sFrom .= "\t\t\tINNER JOIN b_iblock_property_enum JFPEN" . $i . " ON JFPEN" . $i . ".PROPERTY_ID = JFPV" . $db_prop["JOIN"] . ".IBLOCK_PROPERTY_ID AND JFPV" . $db_prop["JOIN"] . ".VALUE_ENUM = JFPEN" . $i . ".ID\n"; } else { $sFrom .= "\t\t\tLEFT JOIN b_iblock_property_enum JFPEN" . $i . " ON JFPEN" . $i . ".PROPERTY_ID = JFPV" . $db_prop["JOIN"] . ".IBLOCK_PROPERTY_ID AND JFPV" . $db_prop["JOIN"] . ".VALUE_ENUM = JFPEN" . $i . ".ID\n"; } } if ($db_prop["IBLOCK_ID"]) { $arFilterIBlocks[$db_prop["IBLOCK_ID"]] = $db_prop["IBLOCK_ID"]; } } if (strlen($arJoinProps["BES"])) { $sFrom .= "\t\t\t" . $arJoinProps["BES"] . "\n"; } if ($arJoinProps["RV"]) { $sFrom .= "\t\t\tLEFT JOIN b_rating_voting RV ON RV.ENTITY_TYPE_ID = 'IBLOCK_ELEMENT' AND RV.ENTITY_ID = BE.ID\n"; } if ($arJoinProps["RVU"]) { $sFrom .= "\t\t\tLEFT JOIN b_rating_vote RVU ON RVU.ENTITY_TYPE_ID = 'IBLOCK_ELEMENT' AND RVU.ENTITY_ID = BE.ID AND RVU.USER_ID = " . $uid . "\n"; } if ($arJoinProps["RVV"]) { $sFrom .= "\t\t\t" . ($arJoinProps["RVV"]["bFullJoin"] ? "INNER" : "LEFT") . " JOIN b_rating_vote RVV ON RVV.ENTITY_TYPE_ID = 'IBLOCK_ELEMENT' AND RVV.ENTITY_ID = BE.ID\n"; } //******************END OF FROM PART******************************************** $bCatalogSort = false; if (count($arAddSelectFields) > 0 || count($arAddWhereFields) > 0 || count($arAddOrderByFields) > 0) { if (CModule::IncludeModule("catalog")) { $res_catalog = CCatalogProduct::GetQueryBuildArrays($arAddOrderByFields, $arAddWhereFields, $arAddSelectFields); if ($sGroupBy == "" && !$bOnlyCount && !(is_object($this) && isset($this->strField))) { $sSelect .= $res_catalog["SELECT"] . " "; } $sFrom .= str_replace("LEFT JOIN", "\n\t\t\tLEFT JOIN", $res_catalog["FROM"]) . "\n"; //$sWhere .= $res_catalog["WHERE"]." "; moved to MkFilter if (is_array($res_catalog["ORDER"]) && count($res_catalog["ORDER"])) { $bCatalogSort = true; foreach ($res_catalog["ORDER"] as $i => $val) { $arSqlOrder[$i] = $val; } } } } $i = array_search("CREATED_BY_FORMATTED", $arSelectFields); if ($i !== false) { if ($sSelect && $sGroupBy == "" && !$bOnlyCount && !(is_object($this) && isset($this->strField))) { $sSelect .= ",UC.NAME UC_NAME, UC.LAST_NAME UC_LAST_NAME, UC.SECOND_NAME UC_SECOND_NAME, UC.EMAIL UC_EMAIL, UC.ID UC_ID, UC.LOGIN UC_LOGIN"; } else { unset($arSelectFields[$i]); } } $sOrderBy = ""; foreach ($arSqlOrder as $i => $val) { if (strlen($val)) { if ($sOrderBy == "") { $sOrderBy = " ORDER BY "; } else { $sOrderBy .= ","; } $sOrderBy .= $val . " "; } } if (strlen(trim($sSelect)) <= 0) { $sSelect = "0 as NOP "; } $bDistinct = $bDistinct || isset($arFilter["INCLUDE_SUBSECTIONS"]) && $arFilter["INCLUDE_SUBSECTIONS"] == "Y"; if ($bDistinct) { $sSelect = str_replace("%%_DISTINCT_%%", "DISTINCT", $sSelect); } else { $sSelect = str_replace("%%_DISTINCT_%%", "", $sSelect); } $sFrom = "\n\t\t\tb_iblock B\n\t\t\tINNER JOIN b_lang L ON B.LID=L.LID\n\t\t\tINNER JOIN b_iblock_element BE ON BE.IBLOCK_ID = B.ID\n\t\t\t" . ltrim($sFrom, "\t\n") . (in_array("USER_NAME", $arSelectFields) ? "\t\t\tLEFT JOIN b_user U ON U.ID=BE.MODIFIED_BY\n" : "") . (in_array("LOCKED_USER_NAME", $arSelectFields) ? "\t\t\tLEFT JOIN b_user UL ON UL.ID=BE.WF_LOCKED_BY\n" : "") . (in_array("CREATED_USER_NAME", $arSelectFields) || in_array("CREATED_BY_FORMATTED", $arSelectFields) ? "\t\t\tLEFT JOIN b_user UC ON UC.ID=BE.CREATED_BY\n" : "") . "\n\t\t"; $strSql = "\n\t\t\tFROM " . $sFrom . "\n\t\t\tWHERE 1=1 " . $sWhere . "\n\t\t\t" . $sGroupBy . "\n\t\t"; if (isset($this) && is_object($this) && isset($this->strField)) { $this->sFrom = $sFrom; $this->sWhere = $sWhere; return "SELECT " . $sSelect . $strSql; } if ($bOnlyCount) { $res = $DB->Query("SELECT " . $sSelect . $strSql, false, "FILE: " . __FILE__ . "<br> LINE: " . __LINE__); $res = $res->Fetch(); return $res["CNT"]; } if (is_array($arNavStartParams)) { $nTopCount = intval($arNavStartParams["nTopCount"]); $nElementID = intval($arNavStartParams["nElementID"]); if ($nTopCount > 0) { $strSql = "SELECT " . $sSelect . $strSql . $sOrderBy . " LIMIT " . $nTopCount; $res = $DB->Query($strSql); } elseif ($nElementID > 0 && $sGroupBy == "" && $sOrderBy != "" && strpos($sSelect, "BE.ID") !== false && !$bCatalogSort) { $nPageSize = intval($arNavStartParams["nPageSize"]); if ($nPageSize > 0) { $DB->Query("SET @rank=0"); $DB->Query("\n\t\t\t\t\t\tSELECT @rank:=el1.rank\n\t\t\t\t\t\tFROM (\n\t\t\t\t\t\t\tSELECT @rank:=@rank+1 AS rank, el0.*\n\t\t\t\t\t\t\tFROM (\n\t\t\t\t\t\t\t\tSELECT " . $sSelect . $strSql . $sOrderBy . "\n\t\t\t\t\t\t\t) el0\n\t\t\t\t\t\t) el1\n\t\t\t\t\t\tWHERE el1.ID = " . $nElementID . "\n\t\t\t\t\t"); $DB->Query("SET @rank2=0"); $res = $DB->Query("\n\t\t\t\t\t\tSELECT *\n\t\t\t\t\t\tFROM (\n\t\t\t\t\t\t\tSELECT @rank2:=@rank2+1 AS RANK, el0.*\n\t\t\t\t\t\t\tFROM (\n\t\t\t\t\t\t\t\tSELECT " . $sSelect . $strSql . $sOrderBy . "\n\t\t\t\t\t\t\t) el0\n\t\t\t\t\t\t) el1\n\t\t\t\t\t\tWHERE el1.RANK between @rank-{$nPageSize} and @rank+{$nPageSize}\n\t\t\t\t\t"); } else { $DB->Query("SET @rank=0"); $res = $DB->Query("\n\t\t\t\t\t\tSELECT el1.*\n\t\t\t\t\t\tFROM (\n\t\t\t\t\t\t\tSELECT @rank:=@rank+1 AS RANK, el0.*\n\t\t\t\t\t\t\tFROM (\n\t\t\t\t\t\t\t\tSELECT " . $sSelect . $strSql . $sOrderBy . "\n\t\t\t\t\t\t\t) el0\n\t\t\t\t\t\t) el1\n\t\t\t\t\t\tWHERE el1.ID = " . $nElementID . "\n\t\t\t\t\t"); } } else { if ($sGroupBy == "") { $res_cnt = $DB->Query("SELECT COUNT(" . ($bDistinct ? "DISTINCT BE.ID" : "'x'") . ") as C " . $strSql); $res_cnt = $res_cnt->Fetch(); $cnt = $res_cnt["C"]; } else { $res_cnt = $DB->Query("SELECT 'x' " . $strSql); $cnt = $res_cnt->SelectedRowsCount(); } $strSql = "SELECT " . $sSelect . $strSql . $sOrderBy; $res = new CDBResult(); $res->NavQuery($strSql, $cnt, $arNavStartParams); } } else { $strSql = "SELECT " . $sSelect . $strSql . $sOrderBy; $res = $DB->Query($strSql, false, "FILE: " . __FILE__ . "<br> LINE: " . __LINE__); } $res = new CIBlockResult($res); $res->SetIBlockTag($arFilterIBlocks); $res->arIBlockMultProps = $arIBlockMultProps; $res->arIBlockConvProps = $arIBlockConvProps; $res->arIBlockAllProps = $arIBlockAllProps; $res->arIBlockNumProps = $arIBlockNumProps; $res->arIBlockLongProps = $arIBlockLongProps; return $res; }
public static function GetQueryBuildArrays($arOrder, $arFilter, $arSelect) { global $DB, $USER; global $stackCacheManager; $strDefQuantityTrace = COption::GetOptionString('catalog','default_quantity_trace','N'); if ('Y' != $strDefQuantityTrace) $strDefQuantityTrace = 'N'; $strDefCanBuyZero = COption::GetOptionString('catalog','default_can_buy_zero','N'); if ('Y' != $strDefCanBuyZero) $strDefCanBuyZero = 'N'; $strDefNegAmount = COption::GetOptionString('catalog','allow_negative_amount','N'); if ('Y' != $strDefNegAmount) $strDefNegAmount = 'N'; $sResSelect = ""; $sResFrom = ""; $sResWhere = ""; $arResOrder = array(); $arJoinGroup = array(); $arSensID = array( 'PRODUCT_ID' => true, 'CATALOG_GROUP_ID' => true, 'CURRENCY' => true, 'SHOP_QUANTITY' => true, 'PRICE' => true ); $arOrderTmp = array(); foreach ($arOrder as $key => $val) { foreach ($val as $by => $order) { if ($arField = CCatalogProduct::ParseQueryBuildField($by)) { $inum = $arField["NUM"]; $by = $arField["FIELD"]; $res = ''; if (0 >= $inum && array_key_exists($by, $arSensID)) continue; if ($by == "PRICE") { $res = " ".CIBlock::_Order("CAT_P".$inum.".PRICE", $order, "asc")." "; } elseif ($by == "CURRENCY") { $res = " ".CIBlock::_Order("CAT_P".$inum.".CURRENCY", $order, "asc")." "; } elseif ($by == "QUANTITY") { $arResOrder[$key] = " ".CIBlock::_Order("CAT_PR.QUANTITY", $order, "asc", false)." "; continue; } elseif ($by == 'WEIGHT') { $arResOrder[$key] = " ".CIBlock::_Order("CAT_PR.WEIGHT", $order, "asc", false)." "; continue; } elseif ($by == 'AVAILABLE') { $arResOrder[$key] = " ".CIBlock::_Order("CATALOG_AVAILABLE", $order, "desc", false)." "; continue; } else { $res = " ".CIBlock::_Order("CAT_P".$inum.".ID", $order, "asc", false)." "; } if (!array_key_exists($inum, $arOrderTmp)) $arOrderTmp[$inum] = array(); $arOrderTmp[$inum][$key] = $res; $arJoinGroup[$inum] = true; } } } $arWhereTmp = array(); $arAddJoinOn = array(); $filter_keys = (!is_array($arFilter) ? array() : array_keys($arFilter)); for ($i=0, $cnt = count($filter_keys); $i < $cnt; $i++) { $key = strtoupper($filter_keys[$i]); $val = $arFilter[$filter_keys[$i]]; $res = CIBlock::MkOperationFilter($key); $key = $res["FIELD"]; $cOperationType = $res["OPERATION"]; if ($arField = CCatalogProduct::ParseQueryBuildField($key)) { $key = $arField["FIELD"]; $inum = $arField["NUM"]; if (0 >= $inum && array_key_exists($key, $arSensID)) continue; $res = ""; switch($key) { case "PRODUCT_ID": $res = CIBlock::FilterCreate("CAT_P".$inum.".PRODUCT_ID", $val, "number", $cOperationType); break; case "CATALOG_GROUP_ID": $res = CIBlock::FilterCreate("CAT_P".$inum.".CATALOG_GROUP_ID", $val, "number", $cOperationType); break; case "CURRENCY": $res = CIBlock::FilterCreate("CAT_P".$inum.".CURRENCY", $val, "string", $cOperationType); break; case "SHOP_QUANTITY": $res = ' 1=1 '; $arAddJoinOn[$inum] = (($cOperationType=="N") ? " NOT " : " "). " ((CAT_P".$inum.".QUANTITY_FROM <= ".intval($val)." OR CAT_P".$inum.".QUANTITY_FROM IS NULL) AND (CAT_P".$inum.".QUANTITY_TO >= ".intval($val)." OR CAT_P".$inum.".QUANTITY_TO IS NULL)) "; break; case "PRICE": $res = CIBlock::FilterCreate("CAT_P".$inum.".PRICE", $val, "number", $cOperationType); break; case "QUANTITY": $res = CIBlock::FilterCreate("CAT_PR.QUANTITY", $val, "number", $cOperationType); break; case "AVAILABLE": if ('N' !== $val) $val = 'Y'; $res = " (IF ( CAT_PR.QUANTITY > 0 OR IF (CAT_PR.QUANTITY_TRACE = 'D', '".$strDefQuantityTrace."', CAT_PR.QUANTITY_TRACE) = 'N' OR IF (CAT_PR.CAN_BUY_ZERO = 'D', '".$strDefCanBuyZero."', CAT_PR.CAN_BUY_ZERO) = 'Y', 'Y', 'N' ) ".(($cOperationType=="N") ? "<>" : "=")." '".$val."') "; break; case "WEIGHT": $res = CIBlock::FilterCreate("CAT_PR.WEIGHT", $val, "number", $cOperationType); break; } if ('' == $res) continue; if (!array_key_exists($inum, $arWhereTmp)) $arWhereTmp[$inum] = array(); $arWhereTmp[$inum][] = $res; $arJoinGroup[$inum] = true; } } $strSubWhere = ""; if (!empty($arSelect)) { foreach ($arSelect as &$strOneSelect) { $val = strtoupper($strOneSelect); if (0 != strncmp($val, 'CATALOG_GROUP_', 14)) continue; $num = intval(substr($val, 14)); if (0 < $num) $arJoinGroup[$num] = true; } if (isset($strOneSelect)) unset($strOneSelect); } if (!empty($arJoinGroup)) { $strSubWhere = implode(',', array_keys($arJoinGroup)); $strUserGroups = $USER->GetGroups(); $strCacheKey = "P_".$strUserGroups; $strCacheKey .= "_".$strSubWhere; $strCacheKey .= "_".LANGUAGE_ID; $cacheTime = CATALOG_CACHE_DEFAULT_TIME; if (defined("CATALOG_CACHE_TIME")) $cacheTime = intval(CATALOG_CACHE_TIME); $stackCacheManager->SetLength("catalog_GetQueryBuildArrays", 50); $stackCacheManager->SetTTL("catalog_GetQueryBuildArrays", $cacheTime); if ($stackCacheManager->Exist("catalog_GetQueryBuildArrays", $strCacheKey)) { $arResult = $stackCacheManager->Get("catalog_GetQueryBuildArrays", $strCacheKey); } else { $strSql = "SELECT CAT_CG.ID, CAT_CGL.NAME as CATALOG_GROUP_NAME, ". " IF(CAT_CGG.ID IS NULL, 'N', 'Y') as CATALOG_CAN_ACCESS, ". " IF(CAT_CGG1.ID IS NULL, 'N', 'Y') as CATALOG_CAN_BUY ". "FROM b_catalog_group CAT_CG ". " LEFT JOIN b_catalog_group2group CAT_CGG ON (CAT_CG.ID = CAT_CGG.CATALOG_GROUP_ID AND CAT_CGG.GROUP_ID IN (".$strUserGroups.") AND CAT_CGG.BUY <> 'Y') ". " LEFT JOIN b_catalog_group2group CAT_CGG1 ON (CAT_CG.ID = CAT_CGG1.CATALOG_GROUP_ID AND CAT_CGG1.GROUP_ID IN (".$strUserGroups.") AND CAT_CGG1.BUY = 'Y') ". " LEFT JOIN b_catalog_group_lang CAT_CGL ON (CAT_CG.ID = CAT_CGL.CATALOG_GROUP_ID AND CAT_CGL.LID = '".LANGUAGE_ID."') ". " WHERE CAT_CG.ID IN (".$strSubWhere.") ". " GROUP BY CAT_CG.ID "; $dbRes = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); $arResult = array(); while ($arRes = $dbRes->Fetch()) $arResult[] = $arRes; $stackCacheManager->Set("catalog_GetQueryBuildArrays", $strCacheKey, $arResult); } $arCatGroups = array(); foreach ($arResult as &$row) { $i = intval($row["ID"]); if (!empty($arWhereTmp[$i]) && is_array($arWhereTmp[$i])) { $sResWhere .= ' AND '.implode(' AND ',$arWhereTmp[$i]); } if (!empty($arOrderTmp[$i]) && is_array($arOrderTmp[$i])) { foreach($arOrderTmp[$i] as $k=>$v) $arResOrder[$k] = $v; } $sResSelect .= ", CAT_P".$i.".ID as CATALOG_PRICE_ID_".$i.", ". " CAT_P".$i.".CATALOG_GROUP_ID as CATALOG_GROUP_ID_".$i.", ". " CAT_P".$i.".PRICE as CATALOG_PRICE_".$i.", ". " CAT_P".$i.".CURRENCY as CATALOG_CURRENCY_".$i.", ". " CAT_P".$i.".QUANTITY_FROM as CATALOG_QUANTITY_FROM_".$i.", ". " CAT_P".$i.".QUANTITY_TO as CATALOG_QUANTITY_TO_".$i.", ". " '".$DB->ForSql($row["CATALOG_GROUP_NAME"])."' as CATALOG_GROUP_NAME_".$i.", ". " '".$DB->ForSql($row["CATALOG_CAN_ACCESS"])."' as CATALOG_CAN_ACCESS_".$i.", ". " '".$DB->ForSql($row["CATALOG_CAN_BUY"])."' as CATALOG_CAN_BUY_".$i.", ". " CAT_P".$i.".EXTRA_ID as CATALOG_EXTRA_ID_".$i; $sResFrom .= " LEFT JOIN b_catalog_price CAT_P".$i." ON (CAT_P".$i.".PRODUCT_ID = BE.ID AND CAT_P".$i.".CATALOG_GROUP_ID = ".$row["ID"].") "; if (isset($arAddJoinOn[$i])) $sResFrom .= ' AND '.$arAddJoinOn[$i]; } if (isset($row)) unset($row); } $sResSelect .= ", CAT_PR.QUANTITY as CATALOG_QUANTITY, ". " IF (CAT_PR.QUANTITY_TRACE = 'D', '".$strDefQuantityTrace."', CAT_PR.QUANTITY_TRACE) as CATALOG_QUANTITY_TRACE, ". " CAT_PR.QUANTITY_TRACE as CATALOG_QUANTITY_TRACE_ORIG, ". " IF (CAT_PR.CAN_BUY_ZERO = 'D', '".$strDefCanBuyZero."', CAT_PR.CAN_BUY_ZERO) as CATALOG_CAN_BUY_ZERO, ". " IF (CAT_PR.NEGATIVE_AMOUNT_TRACE = 'D', '".$strDefNegAmount."', CAT_PR.NEGATIVE_AMOUNT_TRACE) as CATALOG_NEGATIVE_AMOUNT_TRACE, ". " IF ( CAT_PR.QUANTITY > 0 OR IF (CAT_PR.QUANTITY_TRACE = 'D', '".$strDefQuantityTrace."', CAT_PR.QUANTITY_TRACE) = 'N' OR IF (CAT_PR.CAN_BUY_ZERO = 'D', '".$strDefCanBuyZero."', CAT_PR.CAN_BUY_ZERO) = 'Y', 'Y', 'N' ) as CATALOG_AVAILABLE, ". " CAT_PR.WEIGHT as CATALOG_WEIGHT, ". " CAT_VAT.RATE as CATALOG_VAT, ". " CAT_PR.VAT_INCLUDED as CATALOG_VAT_INCLUDED, ". " CAT_PR.PRICE_TYPE as CATALOG_PRICE_TYPE, ". " CAT_PR.RECUR_SCHEME_TYPE as CATALOG_RECUR_SCHEME_TYPE, ". " CAT_PR.RECUR_SCHEME_LENGTH as CATALOG_RECUR_SCHEME_LENGTH, ". " CAT_PR.TRIAL_PRICE_ID as CATALOG_TRIAL_PRICE_ID, ". " CAT_PR.WITHOUT_ORDER as CATALOG_WITHOUT_ORDER, ". " CAT_PR.SELECT_BEST_PRICE as CATALOG_SELECT_BEST_PRICE, ". " CAT_PR.PURCHASING_PRICE as CATALOG_PURCHASING_PRICE, CAT_PR.PURCHASING_CURRENCY as CATALOG_PURCHASING_CURRENCY "; $sResFrom .= " LEFT JOIN b_catalog_product CAT_PR ON (CAT_PR.ID = BE.ID) "; $sResFrom .= " LEFT JOIN b_catalog_iblock CAT_IB ON ((CAT_PR.VAT_ID IS NULL OR CAT_PR.VAT_ID = 0) AND CAT_IB.IBLOCK_ID = BE.IBLOCK_ID) "; $sResFrom .= " LEFT JOIN b_catalog_vat CAT_VAT ON (CAT_VAT.ID = IF((CAT_PR.VAT_ID IS NULL OR CAT_PR.VAT_ID = 0), CAT_IB.VAT_ID, CAT_PR.VAT_ID)) "; if (!empty($arWhereTmp[0]) && is_array($arWhereTmp[0])) { $sResWhere .= ' AND '.implode(' AND ', $arWhereTmp[0]); } return array( "SELECT" => $sResSelect, "FROM" => $sResFrom, "WHERE" => $sResWhere, "ORDER" => $arResOrder ); }
/** * @param \CDBResult $dbResultList * @return array */ protected function makeItemsFromDbResult(\CDBResult $dbResultList) { $arItemsResult = $arProductIds = array(); while ($arItem = $dbResultList->Fetch()) { if ($arItem['TYPE'] != 'S') { $arProductIds[] = $arItem['ID']; $arItem['PROPERTIES'] = $this->getItemProperies($arItem['ID']); } $arItemsResult[$arItem['ID']] = $arItem; } if (!empty($arProductIds)) { $dbCatalogProduct = \CCatalogProduct::GetList(array(), array("ID" => $arProductIds)); while ($arCatalogProduct = $dbCatalogProduct->fetch()) { $arItemsResult[$arCatalogProduct["ID"]]['PRODUCT'] = $arCatalogProduct; } $offersExistsIds = \CCatalogSKU::getExistOffers($arProductIds, $this->getIblockId()); $noOffersIds = array(); if ($offersExistsIds === false) { $noOffersIds = $arProductIds; } else { $this->loadAllSku(array_keys(array_filter($offersExistsIds))); foreach ($offersExistsIds as $id => $bExists) { $arItem =& $arItemsResult[$id]; if ($bExists) { $arItem['SKU_ITEMS'] = $this->getProductSku($arItem); } else { $noOffersIds[] = $id; } } } if (!empty($noOffersIds)) { $priceIds = $this->getVisiblePrices(); foreach ($priceIds as $priceId) { $dbPrice = \CPrice::GetList(array(), array('PRODUCT_ID' => $noOffersIds, 'CATALOG_GROUP_ID' => $priceId), false, false, array('PRODUCT_ID', 'PRICE', 'CURRENCY')); while ($arPrice = $dbPrice->fetch()) { $arItemsResult[$arPrice["PRODUCT_ID"]]['PRICES'][$priceId] = array('PRICE' => $arPrice['PRICE'], 'CURRENCY' => $arPrice['CURRENCY']); } } if ($this->getStoreId()) { $dbStoreProduct = \CCatalogStoreProduct::GetList(array(), array("PRODUCT_ID" => $noOffersIds, "STORE_ID" => $this->getStoreId())); while ($arStoreProduct = $dbStoreProduct->Fetch()) { $arItemsResult[$arStoreProduct["PRODUCT_ID"]]['PRODUCT']['STORE_AMOUNT'] = $arStoreProduct["AMOUNT"]; } } $groupsIterator = CCatalogProductSet::getList(array(), array('OWNER_ID' => $noOffersIds, 'SET_ID' => 0, 'TYPE' => \CCatalogProductSet::TYPE_GROUP), false, false, array('ID', 'OWNER_ID', 'ITEM_ID', 'SET_ID', 'TYPE')); while ($group = $groupsIterator->Fetch()) { if ($group['OWNER_ID'] == $group['ITEM_ID']) { $arItemsResult[$group['OWNER_ID']]['PRODUCT']['IS_GROUP'] = true; } } } } return $arItemsResult; }