if (!empty($arResult)) { $arIblockId = array(); $strImageStorePath = COption::GetOptionString("main", "upload_dir", "upload"); $arSelect = array("ID", "NAME", "IBLOCK_SECTION_ID", "IBLOCK_TYPE_ID", "IBLOCK_ID", "DETAIL_PAGE_URL", "CATALOG_GROUP_RETAIL", "PREVIEW_PICTURE", "DETAIL_PICTURE"); $elementIterator = CIBlockElement::GetList(array(), array("ID" => array_keys($arResult), "IBLOCK_TYPE_ID" => $arParams["IBLOCK_TYPE_ID"]), false, array(), $arSelect); unset($arSelect); while ($el = $elementIterator->GetNext()) { $iProductId = $arResult[$el["ID"]]; //Если запрос не вернул цену товара, то возможно это товар с торговым предложением, поэтому получаем его базовую цену этого товара if ($el["CATALOG_PURCHASING_PRICE"] == "") { $arPrice = CPrice::GetBasePrice($iProductId); $el["CATALOG_PURCHASING_PRICE"] = $arPrice["PRICE"]; $el["CATALOG_PURCHASING_CURRENCY"] = $arPrice["CURRENCY"]; } //получаем скидку для товара $arDiscounts = CCatalogDiscount::GetDiscountByProduct($iProductId, $USER->GetUserGroupArray(), "N", 1, SITE_ID); //получаем цену в зависимости от скидки $discountPrice = false; if ($arDiscounts) { $discountPrice = CCatalogProduct::CountPriceWithDiscount($el["CATALOG_PURCHASING_PRICE"], $el["CATALOG_PURCHASING_CURRENCY"], $arDiscounts); } // путь к директории, где хранятся изображения $imageId = empty($el["DETAIL_PICTURE"]) ? $el["PREVIEW_PICTURE"] : $el["DETAIL_PICTURE"]; if (!empty($imageId)) { /*Неэффективный кусок кода*/ $sPath = CFile::GetByID($imageId)->GetNext(); /**********************************/ $sPath = "/" . $strImageStorePath . "/" . $sPath["SUBDIR"] . "/" . $sPath["FILE_NAME"]; } else { $sPath = ""; }
public function getBitrixDiscounts() { return \CCatalogDiscount::GetDiscountByProduct($this->getProduct()->id); }
function GetPriceWithDiscount($productID, $price = 0, $arNoDis = array()) { $arDiscounts = CCatalogDiscount::GetDiscountByProduct( $productID, array(1,2,3,4,5,6,7,8,10,11,12,13), "N", 1, SITE_ID ); $max = 0; $PRIORITY = 0; $discompl = false; // PR($arDiscounts); foreach($arDiscounts as $key => $val){ if(!in_array($val["ID"], $arNoDis)) { if($val["PRIORITY"] > $max ){ $PRIORITY = $key; $max = $val["PRIORITY"]; $discompl = true; } } } if($discompl){ if( $arDiscounts[$PRIORITY]["VALUE_TYPE"] == "P" ) return $price - ( $price * ( $arDiscounts[$PRIORITY]["VALUE"] / 100) ); elseif( $arDiscounts[$PRIORITY]["VALUE_TYPE"] == "F" ) return $price - $arDiscounts[$PRIORITY]["VALUE"]; else return $arDiscounts[$PRIORITY]["VALUE"]; }else{ return $price; } }
public function GetXMLData($product) { $arProp = array("ID" => GetMessage("ACRIT_PROP_ID"), "CODE" => GetMessage("ACRIT_PROP_CODE"), "NAME" => GetMessage("ACRIT_PROP_NAME"), "ACTIVE" => GetMessage("ACRIT_PROP_ACTIVE"), "DATE_CREATE" => GetMessage("ACRIT_PROP_DATE_CREATE"), "CREATED_BY" => GetMessage("ACRIT_PROP_CREATED_BY"), "DETAIL_PAGE_URL" => GetMessage("ACRIT_PROP_DETAIL_PAGE_URL"), "SHOW_COUNTER" => GetMessage("ACRIT_PROP_SHOW_COUNTER"), "QUANTITY" => GetMessage("ACRIT_PROP_QUANTITY")); $params = array(); if (is_array($this->XML_DATA) && sizeof($this->XML_DATA) > 0) { foreach ($this->XML_DATA as $xml) { $tmp1 = explode("-", $xml['ID']); $tmp = explode("_", $tmp1[1]); if ($tmp[0] == "SKU") { $ibl = $this->sku_IBLOCK_ID[$tmp1[0]]; $prop_id = $tmp[1]; $ph = CIBlockElement::GetProperty($ibl, $product["ID"], array("sort" => "asc"), array("ID" => $prop_id)); } elseif ($tmp[0] == "QUANTITY") { if ($this->isCat) { $tr = CCatalogProduct::GetByID($product["ID"]); $params[] = array("PARAM" => $xml["UNIT"], "NAME" => text2xml($arProp[$xml["ID"]], true, true, $this->ENCODING), "CODE" => $xml["ID"], "VALUE" => $tr["QUANTITY"]); } $ph = false; continue; } elseif ($tmp[0] == "PRICE") { $dbProductPrices = CPrice::GetList(array(), array("PRODUCT_ID" => $product["ID"], "CATALOG_GROUP_ID" => $tmp[1])); $price = 0; $names = ''; while ($arProductPrice = $dbProductPrices->Fetch()) { if ($arProductPrice["PRICE"] && ($arProductPrice["PRICE"] < $price || !$price)) { $price = $arProductPrice["PRICE"]; } $arDissizeofs = CCatalogDiscount::GetDiscountByProduct($arProductPrice["PRODUCT_ID"], array(), "N", $arProductPrice["CATALOG_GROUP_ID"], $this->LID); foreach ($arDissizeofs as $arDissizeof) { if ($arDissizeof["VALUE_TYPE"] == "P") { $price_buf = $arProductPrice["PRICE"] - $arDissizeof["VALUE"] * $arProductPrice["PRICE"] / 100; } else { $price_buf = $arProductPrice["PRICE"] - $arDissizeof["VALUE"]; } if ($price_buf && ($price_buf < $price || !$price)) { $price = $price_buf; } } $names = $arProductPrice["CATALOG_GROUP_NAME"]; } $params[] = array("PARAM" => $xml["UNIT"], "NAME" => text2xml($names, true, true, $this->ENCODING), "CODE" => $xml["ID"], "VALUE" => $price); $ph = false; continue; } else { $ibl = $tmp1[0]; $prop_id = $tmp1[1]; $mxResult = CCatalogSku::GetProductInfo($product["ID"]); if (is_array($mxResult)) { $ph = CIBlockElement::GetProperty($ibl, $mxResult["ID"], array("sort" => "asc"), array("ID" => $prop_id)); } else { $ph = CIBlockElement::GetProperty($ibl, $product["ID"], array("sort" => "asc"), array("ID" => $prop_id)); } } if (is_object($ph)) { while ($ob = $ph->GetNext()) { switch ($ob["PROPERTY_TYPE"]) { case "S": if ($ob["USER_TYPE"] == "UserID") { $rsUser = CUser::GetByID($ob["VALUE"]); $arUser = $rsUser->Fetch(); $params[] = array("PARAM" => $xml["UNIT"], "NAME" => text2xml($ob["NAME"], true, true, $this->ENCODING), "CODE" => $ob["CODE"], "VALUE" => text2xml($arUser["LAST_NAME"] . " " . $arUser["FIRST_NAME"], true, true, $this->ENCODING)); } else { $params[] = array("PARAM" => $xml["UNIT"], "NAME" => text2xml($ob["NAME"], true, true, $this->ENCODING), "CODE" => $ob["CODE"], "VALUE" => text2xml($ob["VALUE"], true, true, $this->ENCODING)); } break; case "L": $params[] = array("PARAM" => $xml["UNIT"], "NAME" => text2xml($ob["NAME"], true, true, $this->ENCODING), "CODE" => $ob["CODE"], "VALUE" => text2xml($ob["VALUE_ENUM"], true, true, $this->ENCODING)); break; case "E": $res = CIBlockElement::GetByID($ob["VALUE"]); while ($ar_res = $res->GetNext()) { $params[] = array("PARAM" => $xml["UNIT"], "NAME" => text2xml($ob["NAME"], true, true, $this->ENCODING), "CODE" => $ob["CODE"], "VALUE" => text2xml($ar_res["NAME"], true, true, $this->ENCODING)); } break; case "G": if ($xml['UNIT'] != "product_type") { $res = CIBlockSection::GetByID($ob["VALUE"]); while ($ar_res = $res->GetNext()) { $params[] = array("PARAM" => $xml["UNIT"], "NAME" => text2xml($ob["NAME"], true, true, $this->ENCODING), "CODE" => $ob["CODE"], "VALUE" => text2xml($ar_res["NAME"], true, true, $this->ENCODING)); } break; } else { $params[] = array("PARAM" => $xml["UNIT"], "NAME" => text2xml($ob["NAME"], true, true, $this->ENCODING), "CODE" => $ob["CODE"], "VALUE" => text2xml($ob["VALUE"], true, true, $this->ENCODING)); break; } case "F": $db_file = CFile::GetByID($ob["VALUE"]); while ($ar_file = $db_file->Fetch()) { $params[] = array("PARAM" => $xml["UNIT"], "NAME" => text2xml($ob["NAME"], true, true, $this->ENCODING), "CODE" => $ob["CODE"], "VALUE" => "http://" . $this->DOMAIN_NAME . "/" . COption::GetOptionString("main", "upload_dir", "upload") . "/" . $ar_file["SUBDIR"] . "/" . implode("/", array_map("rawurlencode", explode("/", $ar_file["FILE_NAME"])))); } break; case "N": $params[] = array("PARAM" => $xml["UNIT"], "NAME" => text2xml($ob["NAME"], true, true, $this->ENCODING), "CODE" => $ob["CODE"], "VALUE" => text2xml($ob["VALUE"], true, true, $this->ENCODING)); break; default: break; } } } } } return $params; }
function getFinalPriceInCurrency($item_id, $sale_currency = 'UAH') { global $USER; // Do item have offers? if (CCatalogSku::IsExistOffers($item_id)) { // Find price in offers $res = CIBlockElement::GetByID($item_id); if ($ar_res = $res->GetNext()) { if (isset($ar_res['IBLOCK_ID']) && $ar_res['IBLOCK_ID']) { // Find all offers $offers = CIBlockPriceTools::GetOffersArray(array('IBLOCK_ID' => $ar_res['IBLOCK_ID'], 'HIDE_NOT_AVAILABLE' => 'Y', 'CHECK_PERMISSIONS' => 'Y'), array($item_id), null, null, null, null, null, null, array('CURRENCY_ID' => $sale_currency), $USER->getId(), null); foreach ($offers as $offer) { $price = CCatalogProduct::GetOptimalPrice($offer['ID'], 1, $USER->GetUserGroupArray(), 'N'); if (isset($price['PRICE'])) { if ($price['PRICE']['CURRENCY'] != $sale_currency) { $price['PRICE']['PRICE'] = CCurrencyRates::ConvertCurrency($price['PRICE']['PRICE'], $price['PRICE']['CURRENCY'], $sale_currency); $price['PRICE']['CURRENCY'] = $sale_currency; } $price['PRICE']['PRICE_WITH_DISCOUNT'] = $price['PRICE']['PRICE']; $currency_code = $price['PRICE']['CURRENCY']; // Find discounts and calculate price with discounts $arDiscounts = CCatalogDiscount::GetDiscountByProduct($item_id, $USER->GetUserGroupArray(), "N"); if (is_array($arDiscounts) && sizeof($arDiscounts) > 0) { $price['PRICE']['PRICE_WITH_DISCOUNT'] = CCatalogProduct::CountPriceWithDiscount($price['PRICE']['PRICE_WITH_DISCOUNT'], $sale_currency, $arDiscounts); } // Stop cycle, use found value break; } } } } } else { // Simple product, not trade offers $price = CCatalogProduct::GetOptimalPrice($item_id, 1, $USER->GetUserGroupArray(), 'N'); // Got price? if (!$price || !isset($price['PRICE'])) { return false; } if ($price['PRICE']['CURRENCY'] != $sale_currency) { $price['PRICE']['PRICE'] = CCurrencyRates::ConvertCurrency($price['PRICE']['PRICE'], $price['PRICE']['CURRENCY'], $sale_currency); $price['DISCOUNT_PRICE'] = CCurrencyRates::ConvertCurrency($price['DISCOUNT_PRICE'], $price['PRICE']['CURRENCY'], $sale_currency); $price['PRICE']['CURRENCY'] = $sale_currency; } // Change currency code if found if (isset($price['CURRENCY'])) { $currency_code = $price['CURRENCY']; } if (isset($price['PRICE']['CURRENCY'])) { $currency_code = $price['PRICE']['CURRENCY']; } // Get final price $price['PRICE']['PRICE_WITH_DISCOUNT'] = $price['DISCOUNT_PRICE']; // Find discounts and calculate price with discounts $arDiscounts = CCatalogDiscount::GetDiscountByProduct($item_id, $USER->GetUserGroupArray(), "N", 2); if (is_array($arDiscounts) && sizeof($arDiscounts) > 0) { $price['PRICE']['PRICE_WITH_DISCOUNT'] = CCatalogProduct::CountPriceWithDiscount($price['PRICE']['PRICE_WITH_DISCOUNT'], $sale_currency, $arDiscounts); } } // Convert to sale currency if needed if ($currency_code != $sale_currency) { $price['PRICE']['PRICE_WITH_DISCOUNT'] = CCurrencyRates::ConvertCurrency($price['PRICE']['PRICE_WITH_DISCOUNT'], $sale_currency, $sale_currency); } return $price; }