1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
section_property.php
См. документацию.
1<?php
3
5
7{
8 public static function Set($SECTION_ID, $PROPERTY_ID, $arLink = array())
9 {
10 global $DB;
11 $SECTION_ID = (int)$SECTION_ID;
12 $PROPERTY_ID = (int)$PROPERTY_ID;
13 $rs = $DB->Query("
14 SELECT *
15 FROM b_iblock_section_property
16 WHERE SECTION_ID = ".$SECTION_ID." AND PROPERTY_ID = ".$PROPERTY_ID."
17 ");
18
19 $sectionProperty = $rs->Fetch();
20 if ($sectionProperty)
21 {
22 $ar = self::CheckProperty($SECTION_ID, $PROPERTY_ID);
23 if (is_array($ar))
24 {
25 $arUpdate = array();
26
27 if (
28 array_key_exists("SMART_FILTER", $arLink)
29 && $arLink["SMART_FILTER"] !== $sectionProperty["SMART_FILTER"]
30 )
31 {
32 $arUpdate["SMART_FILTER"] = $arLink["SMART_FILTER"] === "Y"? "Y": false;
33 }
34
35 if (
36 array_key_exists("DISPLAY_TYPE", $arLink)
37 && $arLink["DISPLAY_TYPE"] !== $sectionProperty["DISPLAY_TYPE"]
38 )
39 {
40 $arUpdate["DISPLAY_TYPE"] = $arLink["DISPLAY_TYPE"];
41 }
42
43 if (
44 array_key_exists("DISPLAY_EXPANDED", $arLink)
45 && $arLink["DISPLAY_EXPANDED"] !== $sectionProperty["DISPLAY_EXPANDED"]
46 )
47 {
48 $arUpdate["DISPLAY_EXPANDED"] = $arLink["DISPLAY_EXPANDED"] === "Y"? "Y": false;
49 }
50
51 if (array_key_exists("FILTER_HINT", $arLink))
52 {
53 $filterHint = self::cleanFilterHint($arLink["FILTER_HINT"]);
54 if ($filterHint !== $sectionProperty["FILTER_HINT"])
55 {
56 $arUpdate["FILTER_HINT"] = $filterHint;
57 }
58 }
59
60 if (
61 array_key_exists("IBLOCK_ID", $arLink)
62 && $arLink["IBLOCK_ID"] !== $sectionProperty["IBLOCK_ID"]
63 )
64 {
65 $arUpdate["IBLOCK_ID"] = $arLink["IBLOCK_ID"];
66 }
67
68 if (!empty($arUpdate))
69 $strUpdate = $DB->PrepareUpdate("b_iblock_section_property", $arUpdate);
70 else
71 $strUpdate = "";
72
73 if ($strUpdate <> '')
74 {
75 $DB->Query("
76 UPDATE b_iblock_section_property
77 SET ".$strUpdate."
78 WHERE SECTION_ID = ".$ar["SECTION_ID"]."
79 AND PROPERTY_ID = ".$ar["PROPERTY_ID"]."
80 ");
81
82 if (
83 isset($arUpdate["SMART_FILTER"])
84 && $arUpdate["SMART_FILTER"] === "Y"
85 )
86 {
88 isset($arUpdate["IBLOCK_ID"]) && $arUpdate["IBLOCK_ID"]
89 ? $arUpdate["IBLOCK_ID"]
90 : $ar["IBLOCK_ID"]
91 );
92 }
93 }
94 }
95 }
96 else
97 {
98 self::Add($SECTION_ID, $PROPERTY_ID, $arLink);
99 }
100 }
101
102 public static function Add($SECTION_ID, $PROPERTY_ID, $arLink = array())
103 {
104 global $DB;
105 $SECTION_ID = (int)$SECTION_ID;
106 $PROPERTY_ID = (int)$PROPERTY_ID;
107 $rs = $DB->Query("
108 SELECT *
109 FROM b_iblock_section_property
110 WHERE SECTION_ID = ".$SECTION_ID." AND PROPERTY_ID = ".$PROPERTY_ID."
111 ");
112
113 if (!$rs->Fetch())
114 {
115 $ar = self::CheckProperty($SECTION_ID, $PROPERTY_ID);
116 if (is_array($ar))
117 {
118 $ar["ID"] = 1;
119 $DB->Add("b_iblock_section_property", $ar);
120
121 $arUpdate = array();
122 if (array_key_exists("SMART_FILTER", $arLink))
123 $arUpdate["SMART_FILTER"] = $arLink["SMART_FILTER"];
124 if (array_key_exists("DISPLAY_TYPE", $arLink))
125 $arUpdate["DISPLAY_TYPE"] = $arLink["DISPLAY_TYPE"];
126 if (array_key_exists("DISPLAY_EXPANDED", $arLink))
127 $arUpdate["DISPLAY_EXPANDED"] = $arLink["DISPLAY_EXPANDED"];
128 if (array_key_exists("FILTER_HINT", $arLink))
129 $arUpdate["FILTER_HINT"] = self::cleanFilterHint($arLink["FILTER_HINT"]);
130 if (array_key_exists("IBLOCK_ID", $arLink))
131 $arUpdate["IBLOCK_ID"] = $arLink["IBLOCK_ID"];
132
133 if (!empty($arUpdate))
134 $strUpdate = $DB->PrepareUpdate("b_iblock_section_property", $arUpdate);
135 else
136 $strUpdate = "";
137
138 if ($strUpdate <> '')
139 {
140 $DB->Query("
141 UPDATE b_iblock_section_property
142 SET ".$strUpdate."
143 WHERE IBLOCK_ID = ".$ar["IBLOCK_ID"]."
144 AND SECTION_ID = ".$ar["SECTION_ID"]."
145 AND PROPERTY_ID = ".$ar["PROPERTY_ID"]."
146 ");
147
148 if (
149 isset($arUpdate["SMART_FILTER"])
150 && $arUpdate["SMART_FILTER"] === "Y"
151 && (!isset($arLink["INVALIDATE"]) || $arLink["INVALIDATE"] !== "N")
152 )
153 {
155 isset($arUpdate["IBLOCK_ID"]) && $arUpdate["IBLOCK_ID"]
156 ? $arUpdate["IBLOCK_ID"]
157 : $ar["IBLOCK_ID"]
158 );
159 }
160 }
161 }
162 }
163 }
164
165 public static function CheckProperty($SECTION_ID, $PROPERTY_ID)
166 {
167 global $DB;
168 $SECTION_ID = (int)$SECTION_ID;
169 $PROPERTY_ID = (int)$PROPERTY_ID;
170
171 if ($SECTION_ID == 0)
172 {
173 $rs = $DB->Query("
174 SELECT bp.IBLOCK_ID, 0 SECTION_ID, bp.ID PROPERTY_ID
175 FROM b_iblock_property bp
176 WHERE bp.ID = ".$PROPERTY_ID."
177 ");
178 return $rs->Fetch();
179 }
180 elseif ($SECTION_ID > 0)
181 {
182 $rs = $DB->Query("
183 SELECT bs.IBLOCK_ID, bs.ID SECTION_ID, bp.ID PROPERTY_ID
184 FROM b_iblock_property bp
185 ,b_iblock_section bs
186 WHERE bp.ID = ".$PROPERTY_ID."
187 AND bs.ID = ".$SECTION_ID."
188 ");
189 return $rs->Fetch();
190 }
191 else
192 {
193 return false;
194 }
195 }
196
197 public static function Delete($SECTION_ID, $PROPERTY_ID)
198 {
199 global $DB;
200 $SECTION_ID = intval($SECTION_ID);
201 $PROPERTY_ID = intval($PROPERTY_ID);
202 $DB->Query("DELETE FROM b_iblock_section_property WHERE SECTION_ID = ".$SECTION_ID." AND PROPERTY_ID = ".$PROPERTY_ID);
203 }
204
205 public static function DeleteByIBlock($IBLOCK_ID)
206 {
207 global $DB;
208 $IBLOCK_ID = (int)$IBLOCK_ID;
209 $DB->Query("DELETE FROM b_iblock_section_property WHERE IBLOCK_ID = ".$IBLOCK_ID);
210 $DB->Query("UPDATE b_iblock SET SECTION_PROPERTY = 'N' WHERE ID = ".$IBLOCK_ID);
212 CIBlock::CleanCache($IBLOCK_ID);
213 }
214
215 public static function DeleteBySection($SECTION_ID, $PROPERTY_ID = null)
216 {
217 global $DB;
218 $SECTION_ID = intval($SECTION_ID);
219 if (is_array($PROPERTY_ID))
220 $PROPERTY_ID = array_map("intval", $PROPERTY_ID);
221 elseif ($PROPERTY_ID !== null)
222 $PROPERTY_ID = array(intval($PROPERTY_ID));
223
224 $DB->Query("
225 DELETE FROM b_iblock_section_property
226 WHERE SECTION_ID = ".$SECTION_ID."
227 ".($PROPERTY_ID? "AND PROPERTY_ID NOT IN (".implode(", ", $PROPERTY_ID).")": "")."
228 ");
229 }
230
231 public static function DeleteByProperty($PROPERTY_ID)
232 {
233 global $DB;
234 $PROPERTY_ID = intval($PROPERTY_ID);
235 $DB->Query("DELETE FROM b_iblock_section_property WHERE PROPERTY_ID = ".$PROPERTY_ID);
236 }
237
242 public static function HasIBlockLinks($IBLOCK_ID)
243 {
244 global $DB;
245
246 $result = false;
247
248 $IBLOCK_ID = (int)$IBLOCK_ID;
249 if ($IBLOCK_ID <= 0)
250 return $result;
251
252 $rs = $DB->Query($DB->TopSQL("
253 SELECT
254 1
255 FROM
256 b_iblock B
257 INNER JOIN b_iblock_property BP ON BP.IBLOCK_ID = B.ID
258 LEFT JOIN b_iblock_section_property BSP ON BSP.IBLOCK_ID = B.ID AND BSP.PROPERTY_ID = BP.ID
259 WHERE
260 B.ID = ".$IBLOCK_ID."
261 AND (
262 BSP.SECTION_ID IS NOT NULL
263 OR BSP.SMART_FILTER = 'Y'
264 )
265 ", 1));
266 $row = $rs->Fetch();
267 unset($rs);
268 if (!empty($row))
269 $result = true;
270 unset($row);
271
272 if (!$result)
273 {
274 if (Loader::includeModule('catalog'))
275 {
276 $catalog = CCatalogSku::GetInfoByProductIBlock($IBLOCK_ID);
277 if (!empty($catalog))
278 {
279 $rs = $DB->Query($DB->TopSQL("
280 SELECT
281 1
282 FROM
283 b_iblock B
284 INNER JOIN b_iblock_property BP ON BP.IBLOCK_ID = B.ID
285 LEFT JOIN b_iblock_section_property BSP ON BSP.IBLOCK_ID = ".$IBLOCK_ID." AND BSP.PROPERTY_ID = BP.ID
286 WHERE
287 B.ID = ".$catalog['IBLOCK_ID']."
288 AND (
289 BSP.SECTION_ID IS NOT NULL
290 OR BSP.SMART_FILTER = 'Y'
291 )
292 ", 1));
293 $row = $rs->Fetch();
294 unset($rs);
295 if (!empty($row))
296 $result = true;
297 unset($row);
298 }
299 unset($catalog);
300 }
301 }
302
303 return $result;
304 }
305
310 public static function CleanIBlockLinks(int $iblockId)
311 {
312 if ($iblockId <= 0)
313 return;
314
315 if (!static::HasIBlockLinks($iblockId))
316 static::DeleteByIBlock($iblockId);
317 }
318
319 public static function GetArray($IBLOCK_ID, $SECTION_ID = 0, $bNewSection = false)
320 {
321 global $DB;
322 $IBLOCK_ID = intval($IBLOCK_ID);
323 $SECTION_ID = intval($SECTION_ID);
324 $result = array();
325 $rs = $DB->Query("
326 SELECT
327 B.SECTION_PROPERTY,
328 BP.ID PROPERTY_ID,
329 BSP.SECTION_ID LINK_ID,
330 BSP.SMART_FILTER,
331 BSP.DISPLAY_TYPE,
332 BSP.DISPLAY_EXPANDED,
333 BSP.FILTER_HINT,
334 BP.SORT,
335 0 LEFT_MARGIN,
336 B.NAME LINK_TITLE,
337 BP.PROPERTY_TYPE,
338 BP.USER_TYPE,
339 BP.ACTIVE
340 FROM
341 b_iblock B
342 INNER JOIN b_iblock_property BP ON BP.IBLOCK_ID = B.ID
343 LEFT JOIN b_iblock_section_property BSP ON BSP.SECTION_ID = 0 AND BSP.PROPERTY_ID = BP.ID
344 WHERE
345 B.ID = ".$IBLOCK_ID."
346 ORDER BY
347 BP.SORT ASC, BP.ID ASC
348 ");
349 while ($ar = $rs->Fetch())
350 {
351 $displayTypesAvailable = self::getDisplayTypes($ar["PROPERTY_TYPE"], $ar["USER_TYPE"]);
352 if (isset($displayTypesAvailable[$ar["DISPLAY_TYPE"]]))
353 $DISPLAY_TYPE = $ar["DISPLAY_TYPE"];
354 else
355 $DISPLAY_TYPE = key($displayTypesAvailable);
356
357 if ($ar["SECTION_PROPERTY"] === "Y")
358 {
359 if($ar["LINK_ID"] <> '')
360 {
361 $result[$ar["PROPERTY_ID"]] = array(
362 "PROPERTY_ID" => $ar["PROPERTY_ID"],
363 "SMART_FILTER" => $ar["SMART_FILTER"],
364 "DISPLAY_TYPE" => $DISPLAY_TYPE,
365 "DISPLAY_EXPANDED" => $ar["DISPLAY_EXPANDED"],
366 "FILTER_HINT" => $ar["FILTER_HINT"],
367 "INHERITED" => $SECTION_ID == 0 && !$bNewSection? "N" : "Y",
368 "INHERITED_FROM" => 0,
369 "SORT" => $ar["SORT"],
370 "LEFT_MARGIN" => $ar["LEFT_MARGIN"],
371 "LINK_TITLE" => $ar["LINK_TITLE"],
372 "PROPERTY_TYPE" => $ar["PROPERTY_TYPE"],
373 "USER_TYPE" => $ar["USER_TYPE"],
374 "ACTIVE" => $ar["ACTIVE"],
375 );
376 }
377 }
378 else
379 {
380 $result[$ar["PROPERTY_ID"]] = array(
381 "PROPERTY_ID" => $ar["PROPERTY_ID"],
382 "SMART_FILTER" => "N",
383 "DISPLAY_TYPE" => $DISPLAY_TYPE,
384 "DISPLAY_EXPANDED" => $ar["DISPLAY_EXPANDED"],
385 "FILTER_HINT" => $ar["FILTER_HINT"],
386 "INHERITED" => $SECTION_ID == 0 && !$bNewSection? "N" : "Y",
387 "INHERITED_FROM" => 0,
388 "SORT" => $ar["SORT"],
389 "LEFT_MARGIN" => $ar["LEFT_MARGIN"],
390 "LINK_TITLE" => $ar["LINK_TITLE"],
391 "PROPERTY_TYPE" => $ar["PROPERTY_TYPE"],
392 "USER_TYPE" => $ar["USER_TYPE"],
393 "ACTIVE" => $ar["ACTIVE"],
394 );
395 }
396 }
397
398 if ($SECTION_ID > 0)
399 {
400 $rs = $DB->Query($s = "
401 SELECT
402 B.SECTION_PROPERTY,
403 BP.ID PROPERTY_ID,
404 BSP.SECTION_ID LINK_ID,
405 BSP.SMART_FILTER,
406 BSP.DISPLAY_TYPE,
407 BSP.DISPLAY_EXPANDED,
408 BSP.FILTER_HINT,
409 BP.SORT,
410 BS.LEFT_MARGIN,
411 BS.NAME LINK_TITLE,
412 BP.PROPERTY_TYPE,
413 BP.USER_TYPE,
414 BP.ACTIVE
415 FROM
416 b_iblock B
417 INNER JOIN b_iblock_property BP ON BP.IBLOCK_ID = B.ID
418 INNER JOIN b_iblock_section M ON M.ID = ".$SECTION_ID."
419 INNER JOIN b_iblock_section BS ON BS.IBLOCK_ID = M.IBLOCK_ID
420 AND M.LEFT_MARGIN >= BS.LEFT_MARGIN
421 AND M.RIGHT_MARGIN <= BS.RIGHT_MARGIN
422 INNER JOIN b_iblock_section_property BSP ON BSP.IBLOCK_ID = BS.IBLOCK_ID AND BSP.SECTION_ID = BS.ID AND BSP.PROPERTY_ID = BP.ID
423 WHERE
424 B.ID = ".$IBLOCK_ID."
425 ORDER BY
426 BP.SORT ASC, BP.ID ASC, BS.LEFT_MARGIN ASC
427 ");
428 while ($ar = $rs->Fetch())
429 {
430 $displayTypesAvailable = self::getDisplayTypes($ar["PROPERTY_TYPE"], $ar["USER_TYPE"]);
431 if (isset($displayTypesAvailable[$ar["DISPLAY_TYPE"]]))
432 $DISPLAY_TYPE = $ar["DISPLAY_TYPE"];
433 else
434 $DISPLAY_TYPE = key($displayTypesAvailable);
435
436 $result[$ar["PROPERTY_ID"]] = array(
437 "PROPERTY_ID" => $ar["PROPERTY_ID"],
438 "SMART_FILTER" => $ar["SMART_FILTER"],
439 "DISPLAY_TYPE" => $DISPLAY_TYPE,
440 "DISPLAY_EXPANDED" => $ar["DISPLAY_EXPANDED"],
441 "FILTER_HINT" => $ar["FILTER_HINT"],
442 "INHERITED" => $SECTION_ID == $ar["LINK_ID"] ? "N" : "Y",
443 "INHERITED_FROM" => $ar["LINK_ID"],
444 "SORT" => $ar["SORT"],
445 "LEFT_MARGIN" => $ar["LEFT_MARGIN"],
446 "LINK_TITLE" => $ar["LINK_TITLE"],
447 "PROPERTY_TYPE" => $ar["PROPERTY_TYPE"],
448 "USER_TYPE" => $ar["USER_TYPE"],
449 "ACTIVE" => $ar["ACTIVE"],
450 );
451 }
452 }
453
454 if ($result)
455 {
457 $result,
458 array(
459 "SORT" => SORT_ASC,
460 "PROPERTY_ID" => SORT_ASC,
461 ),
462 '',
463 null,
464 true
465 );
466 }
467 return $result;
468 }
469
470 public static function getDisplayTypes($property_type, $user_type)
471 {
472 //ABCDE - for numbers
473 //FGHIJ - for checkboxes
474 //KLMNO - for radio buttons
475 //PQRST - for drop down
476 //UWXYZ - reserved
477 if (
478 $property_type == "S"
479 && $user_type == "directory"
480 )
481 {
482 $result = array(
483 "F" => GetMessage("SP_DISPLAY_TYPE_F"),
484 "G" => GetMessage("SP_DISPLAY_TYPE_G"),
485 "H" => GetMessage("SP_DISPLAY_TYPE_H"),
486 "K" => GetMessage("SP_DISPLAY_TYPE_K"),
487 "P" => GetMessage("SP_DISPLAY_TYPE_P"),
488 "R" => GetMessage("SP_DISPLAY_TYPE_R"),
489 );
490 }
491 elseif (
492 $property_type == "S"
493 && $user_type == "DateTime"
494 )
495 {
496 $result = array(
497 "U" => GetMessage("SP_DISPLAY_TYPE_U"),
498 "F" => GetMessage("SP_DISPLAY_TYPE_F"),
499 "K" => GetMessage("SP_DISPLAY_TYPE_K"),
500 "P" => GetMessage("SP_DISPLAY_TYPE_P"),
501 );
502 }
503 elseif (
504 $property_type == "S"
505 || $property_type == "L"
506 || $property_type == "E"
507 || $property_type == "G"
508 )
509 {
510 $result = array(
511 "F" => GetMessage("SP_DISPLAY_TYPE_F"),
512 "K" => GetMessage("SP_DISPLAY_TYPE_K"),
513 "P" => GetMessage("SP_DISPLAY_TYPE_P"),
514 );
515 }
516 elseif (
517 $property_type == "N"
518 )
519 {
520 $result = array(
521 "A" => GetMessage("SP_DISPLAY_TYPE_A"),
522 "B" => GetMessage("SP_DISPLAY_TYPE_B"),
523 );
524 }
525 else
526 {
527 $result = array();
528 }
529 return $result;
530 }
531
532 public static function getDisplayTypesJsFunction()
533 {
534 //ABCDE - for numbers
535 //FGHIJ - for checkboxes
536 //KLMNO - for radio buttons
537 //PQRST - for drop down
538 //UWXYZ - reserved
539 return '
540 function getDisplayTypes(property_type, user_type)
541 {
542 if (
543 property_type == "S"
544 && user_type == "directory"
545 )
546 {
547 result = {
548 "F": "'.GetMessageJS("SP_DISPLAY_TYPE_F").'",
549 "G": "'.GetMessageJS("SP_DISPLAY_TYPE_G").'",
550 "H": "'.GetMessageJS("SP_DISPLAY_TYPE_H").'",
551 "K": "'.GetMessageJS("SP_DISPLAY_TYPE_K").'",
552 "P": "'.GetMessageJS("SP_DISPLAY_TYPE_P").'",
553 "R": "'.GetMessageJS("SP_DISPLAY_TYPE_R").'"
554 };
555 }
556 else if (
557 property_type == "S"
558 || property_type == "L"
559 || property_type == "E"
560 || property_type == "G"
561 )
562 {
563 result = {
564 "F": "'.GetMessageJS("SP_DISPLAY_TYPE_F").'",
565 "K": "'.GetMessageJS("SP_DISPLAY_TYPE_K").'",
566 "P": "'.GetMessageJS("SP_DISPLAY_TYPE_P").'"
567 };
568 }
569 else if (
570 property_type == "N"
571 )
572 {
573 result = {
574 "A": "'.GetMessageJS("SP_DISPLAY_TYPE_A").'",
575 "B": "'.GetMessageJS("SP_DISPLAY_TYPE_B").'"
576 };
577 }
578 else
579 {
580 result = false;
581 }
582 return result;
583 }
584 ';
585 }
586
587 public static function _sort($a, $b): int
588 {
589 if($a["SORT"] > $b["SORT"])
590 return 1;
591 elseif($a["SORT"] < $b["SORT"])
592 return -1;
593 else
594 return 0;
595 }
596
597 public static function cleanFilterHint(?string $filterHint): ?string
598 {
599 if ($filterHint === null)
600 {
601 return null;
602 }
603 $cleanHint = trim($filterHint);
604 if ($cleanHint === '')
605 {
606 return '';
607 }
608 $TextParser = null;
609 if (!$TextParser)
610 {
611 $TextParser = new CBXSanitizer();
612 $TextParser->SetLevel(CBXSanitizer::SECURE_LEVEL_LOW);
613 $TextParser->ApplyDoubleEncode(false);
614 }
615
616 $cleanHint = $TextParser->SanitizeHtml($cleanHint);
617 if (preg_match('/^(<br>)+$/', $cleanHint))
618 {
619 $cleanHint = '';
620 }
621
622 return $cleanHint;
623 }
624}
static markAsInvalid($iblockId)
Определения manager.php:125
static deleteIndex($iblockId)
Определения manager.php:221
Определения loader.php:13
static sortByColumn(array &$array, $columns, $callbacks='', $defaultValueIfNotSetValue=null, $preserveKeys=false)
Определения collection.php:24
Определения sanitizer.php:23
const SECURE_LEVEL_LOW
Определения sanitizer.php:30
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
$iblockId
Определения iblock_catalog_edit.php:30
$catalog
Определения iblock_catalog_edit.php:135
global $DB
Определения cron_frame.php:29
$IBLOCK_ID
Определения csv_new_run.php:168
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
GetMessage($name, $aReplace=null)
Определения tools.php:3397
GetMessageJS($name, $aReplace=false)
Определения tools.php:3392
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$ar
Определения options.php:199
else $a
Определения template.php:137
$rs
Определения action.php:82