Сначала я поменял валюту, сохранил скриптом все цены в доллары. Дело подходило к концу, когда увидел что в фильтре цены тоже отображаются в долларах - что , разумеется, логично. Но клиент хотел чтоб было в рублях - что , разумеется, тоже логично. Плюс ко всему, в карточке товара цены были в трех валютах, и когда открыл шаблон детальной страницы, ахнул. Кто видел шаблоны аспро, тот поймет. Я понимал, что простая задача становится сложной. Каждая правка приводила к другой правке, что увеличивала стоимость работы. Нужно было срочно что то решить. И тут, как гром среди ясного неба, меня осенило. Тысяча чертей - воскликнул я и немедленно начал писать код.
Решение простое, но весьма изящное:
1. Создать поле Цена в USD
2. Текущую цену в рублях сконвертировать в доллары и сохранить в свойство "Цена в USD"
3. Раз в сутки брать цену в USD и сохранить в рублях. (В моем случае было 4 типа цен, 1- базовая, остальные со скидками)
Ниже приведен скрипт, до ума доводите сами.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | <? require ($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php"); session_start(); //ID Каталога define('IBLOCK_ID', 14); $dollarCourse = 75; echo '$dollarCourse = ' . $dollarCourse; $start = microtime(true); $arData = []; $file = $_SERVER["DOCUMENT_ROOT"] . '/test/price_data_' . IBLOCK_ID . '.json'; /* Получает данные из свойства "Цена в USD" Конвертирует и сохраняет как базовую! */ if ($_GET['act'] == "prop_price_to_base_price") { $arFilter = ['IBLOCK_ID' => IBLOCK_ID]; $res = CIBlockElement::GetList([], $arFilter, false, false, ['ID', 'NAME', 'CODE', 'IBLOCK_ID', 'PROPERTY_PRICE_USD']); $arR = []; while ($arFields = $res->GetNext()) { // Получаем цену в долларах $priceUSD = $arFields['PROPERTY_PRICE_USD_VALUE']; if ($priceUSD > 0) { $newBaePrice = $priceUSD * $dollarCourse; $rsPrices = CPrice::GetList([], ['PRODUCT_ID' => $arFields['ID']], ['CATALOG_GROUP_ID' => [16, 17, 18, 19]]); //Получаем массив свойств товара $arPrices = []; //echo $priceUSD.' | '.$newBaePrice.'<br>'; while ($arPrice = $rsPrices->Fetch()) { //(Базовая RUB) if ($arPrice['CATALOG_GROUP_ID'] == 16) { CPrice::Update($arPrice["ID"], ['PRICE' => $newBaePrice]); } //Партнер -10 if ($arPrice['CATALOG_GROUP_ID'] == 17) { $newBaePrice1 = $newBaePrice - $newBaePrice * 0.1; CPrice::Update($arPrice["ID"], ['PRICE' => $newBaePrice1]); } //Официальный партнёр -15 if ($arPrice['CATALOG_GROUP_ID'] == 18) { $newBaePrice1 = $newBaePrice - $newBaePrice * 0.15; CPrice::Update($arPrice["ID"], ['PRICE' => $newBaePrice1]); } // Золотой партнёр -20 if ($arPrice['CATALOG_GROUP_ID'] == 19) { $newBaePrice1 = $newBaePrice - $newBaePrice * 0.20; CPrice::Update($arPrice["ID"], ['PRICE' => $newBaePrice1]); } } } else { echo '<br> ' . $arFields['ID'] . ' нет цены в USD '; } } } /* ПОлучает цены и сохраняет в массив */ if ($_GET['act'] == "get_price") { $arFilter = ['IBLOCK_ID' => IBLOCK_ID]; $res = CIBlockElement::GetList([], $arFilter, false, false, ['ID', 'NAME', 'CODE', 'IBLOCK_ID']); $arR = []; $N = 0; while ($arFields = $res->GetNext()) { $rsPrices = CPrice::GetList([], ['PRODUCT_ID' => $arFields['ID']], ['CATALOG_GROUP_ID' => [16, 17, 18, 19]]); //Получаем массив свойств товара $arPrices = []; while ($arPrice = $rsPrices->Fetch()) { $arPrices[] = $arPrice; } $arData[] = ["PRODUCT_ID" => $arFields['ID'], "PRICEES" => $arPrices, ]; $N++; } file_put_contents($file, serialize($arData)); echo '<br>N = ' . $N; } /* Рублевые цены конвертирует в Доллары с округлением до целого и сохраняет в свойство PRICE_USD */ if ($_GET['act'] == "price_to_props") { $N = 0; $arData = unserialize(file_get_contents($file)); foreach ($arData as $arr) { $N++; $PRODUCT_ID = $arr['PRODUCT_ID']; $NEW_PRICE = 0; foreach ($arr['PRICEES'] as $priceArr) { if ($priceArr['CATALOG_GROUP_ID'] == 16) { $PRICE = $priceArr['PRICE']; $NEW_PRICE = round($PRICE / $dollarCourse); } } CIBlockElement::SetPropertyValuesEx($PRODUCT_ID, false, ['PRICE_USD' => $NEW_PRICE]); } echo '<br>N = ' . $N; } echo 'Время выполнения скрипта: ' . round(microtime(true) - $start, 4) . ' сек.'; echo '<br>'; |
Комментариев нет:
Отправить комментарий