1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
currencymanager.php
См. документацию.
1<?php
2
3namespace Bitrix\Currency;
4
5use Bitrix\Main;
6use Bitrix\Main\Application;
7use Bitrix\Main\Config\Option;
8use Bitrix\Main\Localization\LanguageTable;
9
16{
17 public const CACHE_BASE_CURRENCY_ID = 'currency_base_currency';
18 public const CACHE_CURRENCY_LIST_ID = 'currency_currency_list';
19 public const CACHE_CURRENCY_SHORT_LIST_ID = 'currency_short_list_';
20 public const CACHE_CURRENCY_SYMBOL_LIST_ID = 'currency_symbol_list_';
21 public const CACHE_CURRENCY_NAME_LIST_ID = 'currency_name_list_';
22
23 public const EVENT_ON_AFTER_UPDATE_BASE_RATE = 'onAfterUpdateCurrencyBaseRate';
24 public const EVENT_ON_UPDATE_BASE_CURRENCY = 'onUpdateBaseCurrency';
25 public const EVENT_ON_AFTER_UPDATE_BASE_CURRENCY = 'onAfterUpdateBaseCurrency';
26
27 protected static ?string $baseCurrency = null;
28
35 public static function checkCurrencyID($currency)
36 {
37 $currency = (string)$currency;
38 return ($currency === '' || mb_strlen($currency) > 3 ? false : $currency);
39 }
40
47 public static function checkLanguage($language)
48 {
49 $language = (string)$language;
50 return ($language === '' || mb_strlen($language) > 2 ? false : $language);
51 }
52
58 public static function getBaseCurrency(): ?string
59 {
60 if (self::$baseCurrency === null)
61 {
63 $skipCache = (defined('CURRENCY_SKIP_CACHE') && CURRENCY_SKIP_CACHE);
64 $currencyFound = false;
65 $currencyFromCache = false;
66 if (!$skipCache)
67 {
68 $cacheTime = (int)(defined('CURRENCY_CACHE_TIME') ? CURRENCY_CACHE_TIME : CURRENCY_CACHE_DEFAULT_TIME);
69 $managedCache = Application::getInstance()->getManagedCache();
70 $currencyFromCache = $managedCache->read($cacheTime, self::CACHE_BASE_CURRENCY_ID, CurrencyTable::getTableName());
71 if ($currencyFromCache)
72 {
73 $currencyFound = true;
74 self::$baseCurrency = (string)$managedCache->get(self::CACHE_BASE_CURRENCY_ID);
75 }
76 }
77 if ($skipCache || !$currencyFound)
78 {
79 $currencyIterator = CurrencyTable::getList([
80 'select' => [
81 'CURRENCY',
82 ],
83 'filter' => [
84 '=BASE' => 'Y',
85 '=AMOUNT' => 1,
86 ],
87 ]);
88 if ($currency = $currencyIterator->fetch())
89 {
90 $currencyFound = true;
91 self::$baseCurrency = $currency['CURRENCY'];
92 }
93 unset($currency, $currencyIterator);
94 }
95 if (!$skipCache && $currencyFound && !$currencyFromCache)
96 {
97 $managedCache->set(self::CACHE_BASE_CURRENCY_ID, self::$baseCurrency);
98 }
99 }
100
101 return self::$baseCurrency;
102 }
103
109 public static function getCurrencyList(): array
110 {
111 $currencyTableName = CurrencyTable::getTableName();
112 $managedCache = Application::getInstance()->getManagedCache();
113
114 $cacheTime = (int)(defined('CURRENCY_CACHE_TIME') ? CURRENCY_CACHE_TIME : CURRENCY_CACHE_DEFAULT_TIME);
115 $cacheId = self::CACHE_CURRENCY_SHORT_LIST_ID.LANGUAGE_ID;
116
117 if ($managedCache->read($cacheTime, $cacheId, $currencyTableName))
118 {
119 $currencyList = $managedCache->get($cacheId);
120 }
121 else
122 {
123 $currencyList = [];
124 $currencyIterator = CurrencyTable::getList([
125 'select' => [
126 'CURRENCY',
127 'FULL_NAME' => 'CURRENT_LANG_FORMAT.FULL_NAME',
128 'SORT',
129 ],
130 'order' => [
131 'SORT' => 'ASC',
132 'CURRENCY' => 'ASC',
133 ],
134 ]);
135 while ($currency = $currencyIterator->fetch())
136 {
137 $currency['FULL_NAME'] = (string)$currency['FULL_NAME'];
138 $currencyList[$currency['CURRENCY']] = $currency['CURRENCY']
139 . ($currency['FULL_NAME'] !== '' ? ' (' . $currency['FULL_NAME'] . ')' : '')
140 ;
141 }
142 unset($currency, $currencyIterator);
143 $managedCache->set($cacheId, $currencyList);
144 }
145
146 return $currencyList;
147 }
148
154 public static function getSymbolList(): array
155 {
156 $currencyTableName = CurrencyTable::getTableName();
157 $managedCache = Application::getInstance()->getManagedCache();
158
159 $cacheTime = defined('CURRENCY_CACHE_TIME') ? (int)CURRENCY_CACHE_TIME : CURRENCY_CACHE_DEFAULT_TIME;
160 $cacheId = self::CACHE_CURRENCY_SYMBOL_LIST_ID.LANGUAGE_ID;
161
162 if ($managedCache->read($cacheTime, $cacheId, $currencyTableName))
163 {
164 $currencyList = $managedCache->get($cacheId);
165 }
166 else
167 {
168 $sanitizer = new \CBXSanitizer();
169 $sanitizer->setLevel(\CBXSanitizer::SECURE_LEVEL_LOW);
170 $sanitizer->ApplyDoubleEncode(false);
171
172 $currencyList = [];
173 $currencyIterator = CurrencyTable::getList([
174 'select' => [
175 'CURRENCY',
176 'FORMAT_STRING' => 'CURRENT_LANG_FORMAT.FORMAT_STRING',
177 'SORT',
178 ],
179 'order' => [
180 'SORT' => 'ASC',
181 'CURRENCY' => 'ASC',
182 ],
183 ]);
184 while ($currency = $currencyIterator->fetch())
185 {
186 $showValue = $currency['CURRENCY'];
187 $currencyFormat = (string)$currency['FORMAT_STRING'];
188 if ($currencyFormat !== '')
189 {
190 $symbol = \CCurrencyLang::applyTemplate('', $currencyFormat);
191 if (is_string($symbol))
192 {
193 $symbol = trim($symbol);
194 if ($symbol !== '')
195 {
196 $showValue = $symbol;
197 }
198 }
199 }
200 $currencyList[$currency['CURRENCY']] = $sanitizer->SanitizeHtml($showValue);
201 }
202
203 $managedCache->set($cacheId, $currencyList);
204 }
205
206 return $currencyList;
207 }
208
214 public static function getNameList(): array
215 {
216 $currencyTableName = CurrencyTable::getTableName();
217 $managedCache = Application::getInstance()->getManagedCache();
218
219 $cacheTime = defined('CURRENCY_CACHE_TIME') ? (int)CURRENCY_CACHE_TIME : CURRENCY_CACHE_DEFAULT_TIME;
220 $cacheId = self::CACHE_CURRENCY_NAME_LIST_ID.LANGUAGE_ID;
221
222 if ($managedCache->read($cacheTime, $cacheId, $currencyTableName))
223 {
224 $currencyList = $managedCache->get($cacheId);
225 }
226 else
227 {
228 $currencyList = [];
229 $currencyIterator = CurrencyTable::getList([
230 'select' => [
231 'CURRENCY',
232 'FULL_NAME' => 'CURRENT_LANG_FORMAT.FULL_NAME',
233 'SORT',
234 ],
235 'order' => [
236 'SORT' => 'ASC',
237 'CURRENCY' => 'ASC',
238 ],
239 ]);
240 while ($currency = $currencyIterator->fetch())
241 {
242 $fullName = (string)$currency['FULL_NAME'];
243 if ($fullName === '')
244 {
245 $fullName = $currency['CURRENCY'];
246 }
247
248 $currencyList[$currency['CURRENCY']] = $fullName;
249 }
250
251 $managedCache->set($cacheId, $currencyList);
252 }
253
254 return $currencyList;
255 }
256
263 public static function isCurrencyExist($currency): bool
264 {
265 $currency = static::checkCurrencyID($currency);
266 if ($currency === false)
267 {
268 return false;
269 }
270 $currencyList = static::getCurrencyList();
271
272 return isset($currencyList[$currency]);
273 }
274
280 public static function getInstalledCurrencies(): array
281 {
282 $installedCurrencies = Option::get('currency', 'installed_currencies');
283 if ($installedCurrencies === '')
284 {
285 $bitrix24 = Main\ModuleManager::isModuleInstalled('bitrix24');
286
288 $languageID = '';
290 'select' => [
291 'LID',
292 'LANGUAGE_ID',
293 ],
294 'filter' => [
295 '=DEF' => 'Y',
296 '=ACTIVE' => 'Y',
297 ],
298 'cache' => ['ttl' => 86400],
299 ]);
300 $site = $siteIterator->fetch();
301 if (!empty($site))
302 {
303 $languageID = (string)$site['LANGUAGE_ID'];
304 }
305 unset($site, $siteIterator);
306
307 if ($languageID === '')
308 {
309 $languageID = 'en';
310 }
311
312 if (!$bitrix24 && $languageID === 'ru')
313 {
314 $languageList = [];
315 $languageIterator = LanguageTable::getList([
316 'select' => [
317 'ID',
318 ],
319 'filter' => [
320 '@ID' => [
321 'kz',
322 'by',
323 'ua'
324 ],
325 '=ACTIVE' => 'Y',
326 ],
327 ]);
328 while ($language = $languageIterator->fetch())
329 {
330 $languageList[$language['ID']] = $language['ID'];
331 }
332 unset($language, $languageIterator);
333 if (isset($languageList['kz']))
334 {
335 $languageID = 'kz';
336 }
337 elseif (isset($languageList['by']))
338 {
339 $languageID = 'by';
340 }
341 elseif (isset($languageList['ua']))
342 {
343 $languageID = 'ua';
344 }
345 unset($languageList);
346 }
347 unset($bitrix24);
348
349 switch ($languageID)
350 {
351 case 'br':
352 $currencyList = [
353 'BYN',
354 'RUB',
355 'USD',
356 'EUR',
357 ];
358 break;
359 case 'ua':
360 $currencyList = [
361 'UAH',
362 'RUB',
363 'USD',
364 'EUR',
365 ];
366 break;
367 case 'kz':
368 $currencyList = [
369 'KZT',
370 'RUB',
371 'USD',
372 'EUR',
373 ];
374 break;
375 case 'ru':
376 $currencyList = [
377 'RUB',
378 'USD',
379 'EUR',
380 'UAH',
381 'BYN',
382 ];
383 break;
384 case 'de':
385 case 'en':
386 case 'tc':
387 case 'sc':
388 case 'la':
389 default:
390 $currencyList = [
391 'USD',
392 'EUR',
393 'CNY',
394 'BRL',
395 'INR',
396 ];
397 break;
398 }
399
400 Option::set('currency', 'installed_currencies', implode(',', $currencyList), '');
401
402 return $currencyList;
403 }
404 else
405 {
406 return explode(',', $installedCurrencies);
407 }
408 }
409
416 public static function clearCurrencyCache($language = '')
417 {
418 $language = static::checkLanguage($language);
419 $currencyTableName = CurrencyTable::getTableName();
420
421 $managedCache = Application::getInstance()->getManagedCache();
422 $managedCache->clean(self::CACHE_CURRENCY_LIST_ID, $currencyTableName);
423 if (empty($language))
424 {
425 $languageIterator = LanguageTable::getList([
426 'select' => ['ID']
427 ]);
428 while ($oneLanguage = $languageIterator->fetch())
429 {
430 $managedCache->clean(self::CACHE_CURRENCY_LIST_ID.'_'.$oneLanguage['ID'], $currencyTableName);
431 $managedCache->clean(self::CACHE_CURRENCY_SHORT_LIST_ID.$oneLanguage['ID'], $currencyTableName);
432 $managedCache->clean(self::CACHE_CURRENCY_SYMBOL_LIST_ID.$oneLanguage['ID'], $currencyTableName);
433 $managedCache->clean(self::CACHE_CURRENCY_NAME_LIST_ID.$oneLanguage['ID'], $currencyTableName);
434 }
435 unset($oneLanguage, $languageIterator);
436 }
437 else
438 {
439 $managedCache->clean(self::CACHE_CURRENCY_LIST_ID.'_'.$language, $currencyTableName);
440 $managedCache->clean(self::CACHE_CURRENCY_SHORT_LIST_ID.$language, $currencyTableName);
441 $managedCache->clean(self::CACHE_CURRENCY_SYMBOL_LIST_ID.$language, $currencyTableName);
442 $managedCache->clean(self::CACHE_CURRENCY_NAME_LIST_ID.$language, $currencyTableName);
443 }
444 $managedCache->clean(self::CACHE_BASE_CURRENCY_ID, $currencyTableName);
445
447 global $stackCacheManager;
448 $stackCacheManager->clear('currency_rate');
449 $stackCacheManager->clear('currency_currency_lang');
450 }
451
458 public static function clearTagCache($currency)
459 {
460 if (!defined('BX_COMP_MANAGED_CACHE'))
461 return;
462 $currency = static::checkCurrencyID($currency);
463 if ($currency === false)
464 return;
465 Application::getInstance()->getTaggedCache()->clearByTag('currency_id_'.$currency);
466 }
467
473 public static function currencyBaseRateAgent(): string
474 {
475 static::updateBaseRates();
476
477 return '\Bitrix\Currency\CurrencyManager::currencyBaseRateAgent();';
478 }
479
488 public static function updateBaseRates($updateCurrency = '')
489 {
490 $currency = static::getBaseCurrency();
491 if ($currency === '')
492 return;
493
494 $currencyIterator = CurrencyTable::getList([
495 'select' => [
496 'CURRENCY',
497 'CURRENT_BASE_RATE',
498 ],
499 'filter' => ($updateCurrency == '' ? [] : ['=CURRENCY' => $updateCurrency])
500 ]);
501 while ($existCurrency = $currencyIterator->fetch())
502 {
503 $baseRate = ($existCurrency['CURRENCY'] != $currency
504 ? \CCurrencyRates::getConvertFactorEx($existCurrency['CURRENCY'], $currency)
505 : 1
506 );
507 $updateResult = CurrencyTable::update($existCurrency['CURRENCY'], array('CURRENT_BASE_RATE' => $baseRate));
508 if ($updateResult->isSuccess())
509 {
510 $event = new Main\Event(
511 'currency',
512 self::EVENT_ON_AFTER_UPDATE_BASE_RATE,
513 [
514 'OLD_BASE_RATE' => (float)$existCurrency['CURRENT_BASE_RATE'],
515 'CURRENT_BASE_RATE' => $baseRate,
516 'BASE_CURRENCY' => $currency,
517 'CURRENCY' => $existCurrency['CURRENCY'],
518 ]
519 );
520 $event->send();
521 }
522 unset($updateResult);
523 unset($baseRate);
524 }
525 unset($existCurrency, $currencyIterator);
526 }
527
534 public static function updateBaseCurrency($currency): bool
535 {
537 global $USER;
539 if ($currency === false)
540 return false;
541
542 $event = new Main\Event(
543 'currency',
544 self::EVENT_ON_UPDATE_BASE_CURRENCY,
545 [
546 'NEW_BASE_CURRENCY' => $currency,
547 ]
548 );
549 $event->send();
550 unset($event);
551
553 $helper = $conn->getSqlHelper();
554
555 $userID = (isset($USER) && $USER instanceof \CUser ? (int)$USER->getID() : 0);
556
557 $tableName = $helper->quote(CurrencyTable::getTableName());
558 $baseField = $helper->quote('BASE');
559 $dateUpdateField = $helper->quote('DATE_UPDATE');
560 $modifiedByField = $helper->quote('MODIFIED_BY');
561 $amountField = $helper->quote('AMOUNT');
562 $amountCntField = $helper->quote('AMOUNT_CNT');
563 $currencyField = $helper->quote('CURRENCY');
564 $query = 'update '.$tableName.' set '.$baseField.' = \'N\', '.
565 $dateUpdateField.' = '.$helper->getCurrentDateTimeFunction().', '.
566 $modifiedByField.' = '.($userID == 0 ? 'NULL' : $userID).
567 ' where '.$currencyField.' <> \''.$helper->forSql($currency).'\' and '.$baseField.' = \'Y\'';
568 $conn->queryExecute($query);
569 $query = 'update '.$tableName.' set '.$baseField.' = \'Y\', '.
570 $dateUpdateField.' = '.$helper->getCurrentDateTimeFunction().', '.
571 $modifiedByField.' = '.($userID == 0 ? 'NULL' : $userID).', '.
572 $amountField.' = 1, '.$amountCntField.' = 1 where '.$currencyField.' = \''.$helper->forSql($currency).'\'';
573 $conn->queryExecute($query);
574
575 static::updateBaseRates();
576
577 $event = new Main\Event(
578 'currency',
579 self::EVENT_ON_AFTER_UPDATE_BASE_CURRENCY,
580 [
581 'NEW_BASE_CURRENCY' => $currency,
582 ]
583 );
584 $event->send();
585 unset($event);
586 self::$baseCurrency = null;
587
588 return true;
589 }
590}
const EVENT_ON_UPDATE_BASE_CURRENCY
Определения currencymanager.php:24
static clearTagCache($currency)
Определения currencymanager.php:458
static clearCurrencyCache($language='')
Определения currencymanager.php:416
const EVENT_ON_AFTER_UPDATE_BASE_CURRENCY
Определения currencymanager.php:25
static getCurrencyList()
Определения currencymanager.php:109
static currencyBaseRateAgent()
Определения currencymanager.php:473
static updateBaseRates($updateCurrency='')
Определения currencymanager.php:488
static isCurrencyExist($currency)
Определения currencymanager.php:263
static updateBaseCurrency($currency)
Определения currencymanager.php:534
const EVENT_ON_AFTER_UPDATE_BASE_RATE
Определения currencymanager.php:23
const CACHE_CURRENCY_SHORT_LIST_ID
Определения currencymanager.php:19
const CACHE_CURRENCY_LIST_ID
Определения currencymanager.php:18
const CACHE_CURRENCY_NAME_LIST_ID
Определения currencymanager.php:21
const CACHE_BASE_CURRENCY_ID
Определения currencymanager.php:17
static checkLanguage($language)
Определения currencymanager.php:47
static string $baseCurrency
Определения currencymanager.php:27
static getInstalledCurrencies()
Определения currencymanager.php:280
const CACHE_CURRENCY_SYMBOL_LIST_ID
Определения currencymanager.php:20
static checkCurrencyID($currency)
Определения currencymanager.php:35
static getTableName()
Определения currency.php:54
static getConnection($name="")
Определения application.php:638
Определения event.php:5
static isModuleInstalled($moduleName)
Определения modulemanager.php:125
static getList(array $parameters=array())
Определения datamanager.php:431
static update($primary, array $data)
Определения datamanager.php:1256
const SECURE_LEVEL_LOW
Определения sanitizer.php:30
const CURRENCY_CACHE_DEFAULT_TIME
Определения include.php:47
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$query
Определения get_search.php:11
global $USER
Определения csv_new_run.php:40
$event
Определения prolog_after.php:141
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$currency
Определения template.php:266
if($params["BILLBY_ORDER_SUBJECT"]) if( $params["PAYMENT_DATE_PAY_BEFORE"]) if($params['BILLBY_PAYER_SHOW']=='Y') $currencyFormat
Определения template.php:393
$siteIterator
Определения options.php:48
$site
Определения yandex_run.php:614