1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
option.php
См. документацию.
1<?php
2
9
10namespace Bitrix\Main\Config;
11
12use Bitrix\Main;
13
14class Option
15{
16 protected const CACHE_DIR = "b_option";
17
18 protected static $options = [];
19 protected static $loading = [];
20
30 public static function get($moduleId, $name, $default = "", $siteId = false)
31 {
32 $value = static::getRealValue($moduleId, $name, $siteId);
33
34 if ($value !== null)
35 {
36 return $value;
37 }
38
39 if (isset(self::$options[$moduleId]["-"][$name]))
40 {
41 return self::$options[$moduleId]["-"][$name];
42 }
43
44 if ($default == "")
45 {
46 $moduleDefaults = static::getDefaults($moduleId);
47 if (isset($moduleDefaults[$name]))
48 {
49 return $moduleDefaults[$name];
50 }
51 }
52
53 return $default;
54 }
55
65 public static function getRealValue($moduleId, $name, $siteId = false)
66 {
67 if ($moduleId == '')
68 {
69 throw new Main\ArgumentNullException("moduleId");
70 }
71 if ($name == '')
72 {
73 throw new Main\ArgumentNullException("name");
74 }
75
76 if (isset(self::$loading[$moduleId]))
77 {
78 trigger_error("Options are already in the process of loading for the module {$moduleId}. Default value will be used for the option {$name}.", E_USER_WARNING);
79 }
80
81 if (!isset(self::$options[$moduleId]))
82 {
83 static::load($moduleId);
84 }
85
86 if ($siteId === false)
87 {
88 $siteId = static::getDefaultSite();
89 }
90
91 $siteKey = ($siteId == ""? "-" : $siteId);
92
93 if (isset(self::$options[$moduleId][$siteKey][$name]))
94 {
95 return self::$options[$moduleId][$siteKey][$name];
96 }
97
98 return null;
99 }
100
108 public static function getDefaults($moduleId)
109 {
110 static $defaultsCache = [];
111
112 if (isset($defaultsCache[$moduleId]))
113 {
114 return $defaultsCache[$moduleId];
115 }
116
117 if (preg_match("#[^a-zA-Z0-9._]#", $moduleId))
118 {
119 throw new Main\ArgumentOutOfRangeException("moduleId");
120 }
121
122 $path = Main\Loader::getLocal("modules/".$moduleId."/default_option.php");
123 if ($path === false)
124 {
125 $defaultsCache[$moduleId] = [];
126 return $defaultsCache[$moduleId];
127 }
128
129 include($path);
130
131 $varName = str_replace(".", "_", $moduleId)."_default_option";
132 if (isset(${$varName}) && is_array(${$varName}))
133 {
134 $defaultsCache[$moduleId] = ${$varName};
135 return $defaultsCache[$moduleId];
136 }
137
138 $defaultsCache[$moduleId] = [];
139 return $defaultsCache[$moduleId];
140 }
141
150 public static function getForModule($moduleId, $siteId = false)
151 {
152 if ($moduleId == '')
153 {
154 throw new Main\ArgumentNullException("moduleId");
155 }
156
157 if (!isset(self::$options[$moduleId]))
158 {
159 static::load($moduleId);
160 }
161
162 if ($siteId === false)
163 {
164 $siteId = static::getDefaultSite();
165 }
166
167 $result = self::$options[$moduleId]["-"];
168
169 if($siteId <> "" && !empty(self::$options[$moduleId][$siteId]))
170 {
171 //options for the site override general ones
172 $result = array_replace($result, self::$options[$moduleId][$siteId]);
173 }
174
175 return $result;
176 }
177
178 protected static function load($moduleId)
179 {
180 $cache = Main\Application::getInstance()->getManagedCache();
181 $cacheTtl = static::getCacheTtl();
182 $loadFromDb = true;
183
184 if ($cacheTtl !== false)
185 {
186 if($cache->read($cacheTtl, "b_option:{$moduleId}", self::CACHE_DIR))
187 {
188 self::$options[$moduleId] = $cache->get("b_option:{$moduleId}");
189 $loadFromDb = false;
190 }
191 }
192
193 if($loadFromDb)
194 {
195 self::$loading[$moduleId] = true;
196
198 $sqlHelper = $con->getSqlHelper();
199
200 // prevents recursion and cache miss
201 self::$options[$moduleId] = ["-" => []];
202
203 // prevents recursion on early stages with cluster module installed
204 $pool = Main\Application::getInstance()->getConnectionPool();
205 $pool->useMasterOnly(true);
206
207 $query = "
208 SELECT NAME, VALUE
209 FROM b_option
210 WHERE MODULE_ID = '{$sqlHelper->forSql($moduleId)}'
211 ";
212
213 $res = $con->query($query);
214 while ($ar = $res->fetch())
215 {
216 self::$options[$moduleId]["-"][$ar["NAME"]] = $ar["VALUE"];
217 }
218
219 try
220 {
221 //b_option_site possibly doesn't exist
222
223 $query = "
224 SELECT SITE_ID, NAME, VALUE
225 FROM b_option_site
226 WHERE MODULE_ID = '{$sqlHelper->forSql($moduleId)}'
227 ";
228
229 $res = $con->query($query);
230 while ($ar = $res->fetch())
231 {
232 self::$options[$moduleId][$ar["SITE_ID"]][$ar["NAME"]] = $ar["VALUE"];
233 }
234 }
235 catch(Main\DB\SqlQueryException)
236 {
237 }
238
239 $pool->useMasterOnly(false);
240
241 if($cacheTtl !== false)
242 {
243 $cache->setImmediate("b_option:{$moduleId}", self::$options[$moduleId]);
244 }
245
246 unset(self::$loading[$moduleId]);
247 }
248
249 /*patchvalidationoptions4*/
250 }
251
261 public static function set($moduleId, $name, $value = "", $siteId = "")
262 {
263 if ($moduleId == '')
264 {
265 throw new Main\ArgumentNullException("moduleId");
266 }
267 if ($name == '')
268 {
269 throw new Main\ArgumentNullException("name");
270 }
271
272 if (mb_strlen($name) > 100)
273 {
274 trigger_error("Option name {$name} will be truncated on saving.", E_USER_WARNING);
275 }
276
277 if ($siteId === false)
278 {
279 $siteId = static::getDefaultSite();
280 }
281
283 $sqlHelper = $con->getSqlHelper();
284
285 $updateFields = [
286 "VALUE" => $value,
287 ];
288
289 if($siteId == "")
290 {
291 $insertFields = [
292 "MODULE_ID" => $moduleId,
293 "NAME" => $name,
294 "VALUE" => $value,
295 ];
296
297 $keyFields = ["MODULE_ID", "NAME"];
298
299 $sql = $sqlHelper->prepareMerge("b_option", $keyFields, $insertFields, $updateFields);
300 }
301 else
302 {
303 $insertFields = [
304 "MODULE_ID" => $moduleId,
305 "NAME" => $name,
306 "SITE_ID" => $siteId,
307 "VALUE" => $value,
308 ];
309
310 $keyFields = ["MODULE_ID", "NAME", "SITE_ID"];
311
312 $sql = $sqlHelper->prepareMerge("b_option_site", $keyFields, $insertFields, $updateFields);
313 }
314
315 $con->queryExecute(current($sql));
316
317 static::clearCache($moduleId);
318
319 static::loadTriggers($moduleId);
320
321 $event = new Main\Event(
322 "main",
323 "OnAfterSetOption_".$name,
324 array("value" => $value)
325 );
326 $event->send();
327
328 $event = new Main\Event(
329 "main",
330 "OnAfterSetOption",
331 array(
332 "moduleId" => $moduleId,
333 "name" => $name,
334 "value" => $value,
335 "siteId" => $siteId,
336 )
337 );
338 $event->send();
339 }
340
341 protected static function loadTriggers($moduleId)
342 {
343 static $triggersCache = [];
344
345 if (isset($triggersCache[$moduleId]))
346 {
347 return;
348 }
349
350 if (preg_match("#[^a-zA-Z0-9._]#", $moduleId))
351 {
352 throw new Main\ArgumentOutOfRangeException("moduleId");
353 }
354
355 $triggersCache[$moduleId] = true;
356
357 $path = Main\Loader::getLocal("modules/".$moduleId."/option_triggers.php");
358 if ($path === false)
359 {
360 return;
361 }
362
363 include($path);
364 }
365
366 protected static function getCacheTtl()
367 {
368 static $cacheTtl = null;
369
370 if($cacheTtl === null)
371 {
372 $cacheFlags = Configuration::getValue("cache_flags");
373 $cacheTtl = $cacheFlags["config_options"] ?? 3600;
374 }
375 return $cacheTtl;
376 }
377
388 public static function delete($moduleId, array $filter = array())
389 {
390 if ($moduleId == '')
391 {
392 throw new Main\ArgumentNullException("moduleId");
393 }
394
396 $sqlHelper = $con->getSqlHelper();
397
398 $deleteForSites = true;
399 $sqlWhere = '';
400 $sqlWhereSite = '';
401
402 foreach ($filter as $field => $value)
403 {
404 switch ($field)
405 {
406 case "name":
407 if ($value == '')
408 {
409 throw new Main\ArgumentNullException("filter[name]");
410 }
411 $sqlWhere .= " AND NAME = '{$sqlHelper->forSql($value)}'";
412 break;
413
414 case "site_id":
415 if ($value != '')
416 {
417 $sqlWhereSite = " AND SITE_ID = '{$sqlHelper->forSql($value, 2)}'";
418 }
419 else
420 {
421 $deleteForSites = false;
422 }
423 break;
424
425 default:
426 throw new Main\ArgumentException("filter[{$field}]");
427 }
428 }
429
430 if($moduleId == 'main')
431 {
432 $sqlWhere .= "
433 AND NAME NOT LIKE '~%'
434 AND NAME NOT IN ('crc_code', 'admin_passwordh', 'server_uniq_id','PARAM_MAX_SITES', 'PARAM_MAX_USERS')
435 ";
436 }
437 else
438 {
439 $sqlWhere .= " AND NAME <> '~bsm_stop_date'";
440 }
441
442 if($sqlWhereSite == '')
443 {
444 $con->queryExecute("
445 DELETE FROM b_option
446 WHERE MODULE_ID = '{$sqlHelper->forSql($moduleId)}'
447 {$sqlWhere}
448 ");
449 }
450
451 if($deleteForSites)
452 {
453 $con->queryExecute("
454 DELETE FROM b_option_site
455 WHERE MODULE_ID = '{$sqlHelper->forSql($moduleId)}'
456 {$sqlWhere}
457 {$sqlWhereSite}
458 ");
459 }
460
461 static::clearCache($moduleId);
462 }
463
464 protected static function clearCache($moduleId)
465 {
466 unset(self::$options[$moduleId]);
467
468 if (static::getCacheTtl() !== false)
469 {
470 $cache = Main\Application::getInstance()->getManagedCache();
471 $cache->clean("b_option:{$moduleId}", self::CACHE_DIR);
472 }
473 }
474
475 protected static function getDefaultSite()
476 {
477 static $defaultSite;
478
479 if ($defaultSite === null)
480 {
481 $context = Main\Application::getInstance()->getContext();
482 if ($context != null)
483 {
484 $defaultSite = $context->getSite();
485 }
486 }
487 return $defaultSite;
488 }
489}
$path
Определения access_edit.php:21
$con
Определения admin_tab.php:7
static getInstance()
Определения application.php:98
static getConnection($name="")
Определения application.php:638
static getValue($name)
Определения configuration.php:24
static $options
Определения option.php:18
static $loading
Определения option.php:19
static loadTriggers($moduleId)
Определения option.php:341
static getForModule($moduleId, $siteId=false)
Определения option.php:150
static getDefaultSite()
Определения option.php:475
static getDefaults($moduleId)
Определения option.php:108
const CACHE_DIR
Определения option.php:16
static clearCache($moduleId)
Определения option.php:464
static getCacheTtl()
Определения option.php:366
static load($moduleId)
Определения option.php:178
static getRealValue($moduleId, $name, $siteId=false)
Определения option.php:65
Определения event.php:5
static getLocal($path, $root=null)
Определения loader.php:572
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$res
Определения filter_act.php:7
$result
Определения get_property_values.php:14
$query
Определения get_search.php:11
$moduleId
$filter
Определения iblock_catalog_list.php:54
$context
Определения csv_new_setup.php:223
$siteId
Определения ajax.php:8
$name
Определения menu_edit.php:35
Определения arrayresult.php:2
$event
Определения prolog_after.php:141
$ar
Определения options.php:199