1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
iblockelement.php
См. документацию.
1<?php
2
7
9{
10 public function prepareSql($arSelectFields=array(), $arFilter=array(), $arGroupBy=false, $arOrder=array("SORT"=>"ASC"))
11 {
12 global $DB;
14 $helper = $connection->getSqlHelper();
15 $MAX_LOCK = (int)COption::GetOptionString("workflow","MAX_LOCK_TIME","60");
17
18 $formatActiveDates = CPageOption::GetOptionString("iblock", "FORMAT_ACTIVE_DATES", "-") != "-";
19 $shortFormatActiveDates = CPageOption::GetOptionString("iblock", "FORMAT_ACTIVE_DATES", "SHORT");
20
21 $arIblockElementFields = array(
22 "ID"=>"BE.ID",
23 "TIMESTAMP_X"=>$DB->DateToCharFunction("BE.TIMESTAMP_X"),
24 "TIMESTAMP_X_UNIX"=>'UNIX_TIMESTAMP(BE.TIMESTAMP_X)',
25 "MODIFIED_BY"=>"BE.MODIFIED_BY",
26 "DATE_CREATE"=>$DB->DateToCharFunction("BE.DATE_CREATE"),
27 "DATE_CREATE_UNIX"=>'UNIX_TIMESTAMP(BE.DATE_CREATE)',
28 "CREATED_BY"=>"BE.CREATED_BY",
29 "IBLOCK_ID"=>"BE.IBLOCK_ID",
30 "IBLOCK_SECTION_ID"=>"BE.IBLOCK_SECTION_ID",
31 "ACTIVE"=>"BE.ACTIVE",
32 "ACTIVE_FROM"=>(
33 $formatActiveDates
34 ?
35 $DB->DateToCharFunction("BE.ACTIVE_FROM", $shortFormatActiveDates)
36 :
37 "BE.ACTIVE_FROM as ACTIVE_FROM_X, case when EXTRACT(HOUR FROM BE.ACTIVE_FROM) > 0 OR EXTRACT(MINUTE FROM BE.ACTIVE_FROM) > 0 OR EXTRACT(SECOND FROM BE.ACTIVE_FROM) > 0 then ".$DB->DateToCharFunction("BE.ACTIVE_FROM", "FULL")." else ".$DB->DateToCharFunction("BE.ACTIVE_FROM", "SHORT")." end"
38 ),
39 "ACTIVE_TO"=>(
40 $formatActiveDates
41 ?
42 $DB->DateToCharFunction("BE.ACTIVE_TO", $shortFormatActiveDates)
43 :
44 "case when EXTRACT(HOUR FROM BE.ACTIVE_TO) > 0 OR EXTRACT(MINUTE FROM BE.ACTIVE_TO) > 0 OR EXTRACT(SECOND FROM BE.ACTIVE_TO) > 0 then ".$DB->DateToCharFunction("BE.ACTIVE_TO", "FULL")." else ".$DB->DateToCharFunction("BE.ACTIVE_TO", "SHORT")." end"
45 ),
46 "DATE_ACTIVE_FROM"=>(
47 $formatActiveDates
48 ?
49 $DB->DateToCharFunction("BE.ACTIVE_FROM", $shortFormatActiveDates)
50 :
51 "case when EXTRACT(HOUR FROM BE.ACTIVE_FROM) > 0 OR EXTRACT(MINUTE FROM BE.ACTIVE_FROM) > 0 OR EXTRACT(SECOND FROM BE.ACTIVE_FROM) > 0 then ".$DB->DateToCharFunction("BE.ACTIVE_FROM", "FULL")." else ".$DB->DateToCharFunction("BE.ACTIVE_FROM", "SHORT")." end"
52 ),
53 "DATE_ACTIVE_TO"=>(
54 $formatActiveDates
55 ?
56 $DB->DateToCharFunction("BE.ACTIVE_TO", $shortFormatActiveDates)
57 :
58 "case when EXTRACT(HOUR FROM BE.ACTIVE_TO) > 0 OR EXTRACT(MINUTE FROM BE.ACTIVE_TO) > 0 OR EXTRACT(SECOND FROM BE.ACTIVE_TO) > 0 then ".$DB->DateToCharFunction("BE.ACTIVE_TO", "FULL")." else ".$DB->DateToCharFunction("BE.ACTIVE_TO", "SHORT")." end"
59 ),
60 "SORT"=>"BE.SORT",
61 "NAME"=>"BE.NAME",
62 "PREVIEW_PICTURE"=>"BE.PREVIEW_PICTURE",
63 "PREVIEW_TEXT"=>"BE.PREVIEW_TEXT",
64 "PREVIEW_TEXT_TYPE"=>"BE.PREVIEW_TEXT_TYPE",
65 "DETAIL_PICTURE"=>"BE.DETAIL_PICTURE",
66 "DETAIL_TEXT"=>"BE.DETAIL_TEXT",
67 "DETAIL_TEXT_TYPE"=>"BE.DETAIL_TEXT_TYPE",
68 "SEARCHABLE_CONTENT"=>"BE.SEARCHABLE_CONTENT",
69 "WF_STATUS_ID"=>"BE.WF_STATUS_ID",
70 "WF_PARENT_ELEMENT_ID"=>"BE.WF_PARENT_ELEMENT_ID",
71 "WF_LAST_HISTORY_ID"=>"BE.WF_LAST_HISTORY_ID",
72 "WF_NEW"=>"BE.WF_NEW",
73 "LOCK_STATUS"=>"case when BE.WF_DATE_LOCK is null then 'green' when " . $helper->addSecondsToDateTime($MAX_LOCK * 60, 'BE.WF_DATE_LOCK') . " < " . $helper->getCurrentDateTimeFunction() . " then 'green' when BE.WF_LOCKED_BY = " . $uid . " then 'yellow' else 'red' end",
74 "WF_LOCKED_BY"=>"BE.WF_LOCKED_BY",
75 "WF_DATE_LOCK"=>$DB->DateToCharFunction("BE.WF_DATE_LOCK"),
76 "WF_COMMENTS"=>"BE.WF_COMMENTS",
77 "IN_SECTIONS"=>"BE.IN_SECTIONS",
78 "SHOW_COUNTER"=>"BE.SHOW_COUNTER",
79 "SHOW_COUNTER_START"=>$DB->DateToCharFunction("BE.SHOW_COUNTER_START"),
80 "SHOW_COUNTER_START_X"=>"BE.SHOW_COUNTER_START",
81 "CODE"=>"BE.CODE",
82 "TAGS"=>"BE.TAGS",
83 "XML_ID"=>"BE.XML_ID",
84 "EXTERNAL_ID"=>"BE.XML_ID",
85 "TMP_ID"=>"BE.TMP_ID",
86 'USER_NAME' => self::getUserNameSql('U'),
87 'LOCKED_USER_NAME' => self::getUserNameSql('UL'),
88 'CREATED_USER_NAME' => self::getUserNameSql('UC'),
89 "LANG_DIR"=>"L.DIR",
90 "LID"=>"B.LID",
91 "IBLOCK_TYPE_ID"=>"B.IBLOCK_TYPE_ID",
92 "IBLOCK_CODE"=>"B.CODE",
93 "IBLOCK_NAME"=>"B.NAME",
94 "IBLOCK_EXTERNAL_ID"=>"B.XML_ID",
95 "DETAIL_PAGE_URL"=>"B.DETAIL_PAGE_URL",
96 "LIST_PAGE_URL"=>"B.LIST_PAGE_URL",
97 "CANONICAL_PAGE_URL"=>"B.CANONICAL_PAGE_URL",
98 "CREATED_DATE"=>$DB->DateFormatToDB("YYYY.MM.DD", "BE.DATE_CREATE"),
99 "BP_PUBLISHED"=>"case when BE.WF_STATUS_ID = 1 then 'Y' else 'N' end",
100 );
101 unset($shortFormatActiveDates);
102 unset($formatActiveDates);
103
104 $this->bDistinct = false;
105
106 $this->PrepareGetList(
107 $arIblockElementFields,
108 $arJoinProps,
109
110 $arSelectFields,
111 $sSelect,
112 $arAddSelectFields,
113
114 $arFilter,
115 $sWhere,
116 $sSectionWhere,
117 $arAddWhereFields,
118
119 $arGroupBy,
120 $sGroupBy,
121
122 $arOrder,
123 $arSqlOrder,
124 $arAddOrderByFields
125 );
126
127 $this->arFilterIBlocks = isset($arFilter["IBLOCK_ID"])? array($arFilter["IBLOCK_ID"]): array();
128 //******************FROM PART********************************************
129 $sFrom = "";
130 $countFrom = '';
131 foreach ($arJoinProps["FPS"] as $iblock_id => $iPropCnt)
132 {
133 /*
134 * 123 - Iblock Identifier
135 * INNER JOIN b_iblock_element_prop_s123 FPS123 ON FPS123.IBLOCK_ELEMENT_ID = BE.ID
136 */
137 $tableAlias = 'FPS' . $iPropCnt;
138 $tableJoin = "\t\t\tINNER JOIN b_iblock_element_prop_s" . $iblock_id . " " . $tableAlias
139 . " ON " . $tableAlias . ".IBLOCK_ELEMENT_ID = BE.ID\n"
140 ;
141 $sFrom .= $tableJoin;
142 $countFrom .= $tableJoin;
143
144 unset($tableJoin);
145 unset($tableAlias);
146 $this->arFilterIBlocks[$iblock_id] = $iblock_id;
147 }
148
149 foreach ($arJoinProps["FP"] as $propID => $db_prop)
150 {
151 /*
152 * 123 - $db_prop['CNT']
153 *
154 * $db_prop['bFullJoin'] === true and
155 * $propID is int (property id)
156 * INNER JOIN b_iblock_property FP123 ON FP123.IBLOCK_ID = D.ID AND FP123.ID = $propID
157 * $propID is string (property code)
158 * INNER JOIN b_iblock_property FP123 ON FP123.IBLOCK_ID = D.ID AND FP123.CODE = '$propID'
159 *
160 * $db_prop['bFullJoin'] === false and
161 * $propID is int (property id)
162 * LEFT JOIN b_iblock_property FP123 ON FP123.IBLOCK_ID = D.ID AND FP123.ID = $propID
163 * $propID is string (property code)
164 * LEFT JOIN b_iblock_property FP123 ON FP123.IBLOCK_ID = D.ID AND FP123.CODE = '$propID'
165 */
166 $tableAlias = 'FP' . $db_prop['CNT'];
167 $joinType = $db_prop['bFullJoin'] ? 'INNER JOIN' : 'LEFT JOIN';
168 $tableJoin = "\t\t\t" . $joinType . " b_iblock_property " . $tableAlias
169 . " ON " . $tableAlias . ".IBLOCK_ID = B.ID AND "
170 . (
171 (int)$propID > 0
172 ? $tableAlias . ".ID=" . (int)$propID . "\n"
173 : $tableAlias . ".CODE='" . $DB->ForSQL($propID, 200) . "'\n"
174 )
175 ;
176 $sFrom .= $tableJoin;
177 if (self::useCountJoin($db_prop))
178 {
179 $countFrom .= $tableJoin;
180 }
181
182 unset($tableJoin);
183 unset($joinType);
184 unset($tableAlias);
185
186 if (isset($db_prop["IBLOCK_ID"]) && $db_prop["IBLOCK_ID"])
187 {
188 $this->arFilterIBlocks[$db_prop["IBLOCK_ID"]] = $db_prop["IBLOCK_ID"];
189 }
190 }
191
192 foreach ($arJoinProps['FPV'] as $db_prop)
193 {
194 if ($db_prop['MULTIPLE'] === 'Y')
195 {
196 $this->bDistinct = true;
197 }
198
199 if ($db_prop['VERSION'] == IblockTable::PROPERTY_STORAGE_SEPARATE) // 'VESRION' is string
200 {
201 $tableName = 'b_iblock_element_prop_m' . $db_prop['IBLOCK_ID'];
202 }
203 else
204 {
205 $tableName = 'b_iblock_element_property';
206 }
207
208 /*
209 * 123 - $db_prop['CNT']
210 * $strTable - b_iblock_element_property or b_iblock_element_prop_m{IBLOCK_ID}
211 *
212 * $db_prop['bFullJoin'] === true
213 * INNER JOIN {$strTable} FPV123 ON FPV123.IBLOCK_PROPERTY_ID = FP{$db_prop['JOIN']}.ID
214 AND FPV123.IBLOCK_ELEMENT_ID = BE.ID
215 * $db_prop['bFullJoin'] === false
216 * LEFT JOIN {$strTable} FPV123 ON FPV123.IBLOCK_PROPERTY_ID = FP{$db_prop['JOIN']}.ID
217 AND FPV123.IBLOCK_ELEMENT_ID = BE.ID
218 */
219 $tableAlias = 'FPV' . $db_prop['CNT'];
220 $joinType = $db_prop['bFullJoin'] ? 'INNER JOIN' : 'LEFT JOIN';
221 $tableJoin = "\t\t\t" . $joinType . " " . $tableName . " " . $tableAlias
222 . " ON " . $tableAlias . ".IBLOCK_PROPERTY_ID = FP" . $db_prop["JOIN"] . ".ID"
223 . " AND " . $tableAlias .".IBLOCK_ELEMENT_ID = BE.ID\n"
224 ;
225 $sFrom .= $tableJoin;
226 if (self::useCountJoin($db_prop))
227 {
228 $countFrom .= $tableJoin;
229 }
230
231 unset($tableJoin);
232 unset($joinType);
233 unset($tableAlias);
234 unset($tableName);
235
236 if (isset($db_prop["IBLOCK_ID"]) && $db_prop["IBLOCK_ID"])
237 {
238 $this->arFilterIBlocks[$db_prop["IBLOCK_ID"]] = $db_prop["IBLOCK_ID"];
239 }
240 }
241
242 foreach ($arJoinProps["FPEN"] as $db_prop)
243 {
244 /*
245 * 123 - $db_prop['CNT']
246 * if commont storage and single property
247 * $db_prop['bFullJoin'] === true
248 * INNER JOIN b_iblock_property_enum FPEN123 ON FPEN123.PROPERTY_ID = {$db_prop['ORIG_ID']}
249 * AND FPS{$db_prop['JOIN']}.PROPERTY_{$db_prop['ORIG_ID']} = FPEN123.ID
250 * $db_prop['bFullJoin'] === false
251 * LEFT JOIN b_iblock_property_enum FPEN123 ON FPEN123.PROPERTY_ID = {$db_prop['ORIG_ID']}
252 * AND FPS{$db_prop['JOIN']}.PROPERTY_{$db_prop['ORIG_ID']} = FPEN123.ID
253 * else
254 * $db_prop['bFullJoin'] === true
255 * INNER JOIN b_iblock_property_enum FPEN123 ON FPEN123.PROPERTY_ID = FPV{$db_prop['JOIN']}.IBLOCK_PROPERTY_ID
256 * AND FPV{$db_prop['JOIN']}.VALUE_ENUM = FPEN123.ID
257 * $db_prop['bFullJoin'] === false
258 * LEFT JOIN b_iblock_property_enum FPEN123 ON FPEN123.PROPERTY_ID = FPV{$db_prop['JOIN']}.IBLOCK_PROPERTY_ID
259 * AND FPV{$db_prop['JOIN']}.VALUE_ENUM = FPEN123.ID
260 */
262 $tableAlias = 'FPEN' . $db_prop['CNT'];
263 $joinType = $db_prop['bFullJoin'] ? 'INNER JOIN' : 'LEFT JOIN';
264 if ($db_prop['VERSION'] == IblockTable::PROPERTY_STORAGE_SEPARATE && $db_prop['MULTIPLE'] === 'N') // 'VESRION' is string
265 {
266 $tableJoin = "\t\t\t" . $joinType . " " . $tableName . " " . $tableAlias
267 . " ON " . $tableAlias . ".PROPERTY_ID = " . $db_prop["ORIG_ID"]
268 . " AND FPS" . $db_prop["JOIN"] . ".PROPERTY_" . $db_prop["ORIG_ID"] . " = " . $tableAlias . ".ID\n"
269 ;
270 }
271 else
272 {
273 $tableJoin = "\t\t\t" . $joinType . " " . $tableName . " " . $tableAlias
274 ." ON " . $tableAlias . ".PROPERTY_ID = FPV" . $db_prop["JOIN"] . ".IBLOCK_PROPERTY_ID"
275 . " AND FPV".$db_prop["JOIN"].".VALUE_ENUM = " . $tableAlias . ".ID\n"
276 ;
277 }
278 $sFrom .= $tableJoin;
279 if (self::useCountJoin($db_prop))
280 {
281 $countFrom .= $tableJoin;
282 }
283
284 unset($tableJoin);
285 unset($joinType);
286 unset($tableAlias);
287
288 if (isset($db_prop["IBLOCK_ID"]) && $db_prop["IBLOCK_ID"])
289 {
290 $this->arFilterIBlocks[$db_prop["IBLOCK_ID"]] = $db_prop["IBLOCK_ID"];
291 }
292 }
293
294 $showHistory = ($arFilter['SHOW_HISTORY'] ?? null) === 'Y';
295 $showNew = ($arFilter['SHOW_NEW'] ?? null) === 'Y';
296 foreach($arJoinProps["BE"] as $db_prop)
297 {
298 $i = $db_prop["CNT"];
299
300 $tableJoin = "\t\t\tLEFT JOIN b_iblock_element BE".$i." ON BE".$i.".ID = ".
301 (
302 $db_prop["VERSION"]==2 && $db_prop["MULTIPLE"]=="N"?
303 "FPS".$db_prop["JOIN"].".PROPERTY_".$db_prop["ORIG_ID"]
304 :"FPV".$db_prop["JOIN"].".VALUE_NUM"
305 ).
306 (
307 !$showHistory ?
308 " AND ((BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL)".($showNew ? " OR BE.WF_NEW='Y'": "").")":
309 ""
310 )."\n";
311
312 if ($db_prop["bJoinIBlock"])
313 {
314 $tableJoin .= "\t\t\tLEFT JOIN b_iblock B".$i." ON B".$i.".ID = BE".$i.".IBLOCK_ID\n";
315 }
316
317 if ($db_prop["bJoinSection"])
318 {
319 $tableJoin .= "\t\t\tLEFT JOIN b_iblock_section BS".$i." ON BS".$i.".ID = BE".$i.".IBLOCK_SECTION_ID\n";
320 }
321
322 $sFrom .= $tableJoin;
323 if (self::useCountJoin($db_prop))
324 {
325 $countFrom .= $tableJoin;
326 }
327
328 unset($tableJoin);
329 unset($joinType);
330 unset($tableAlias);
331
332 if (isset($db_prop["IBLOCK_ID"]) && $db_prop["IBLOCK_ID"])
333 {
334 $this->arFilterIBlocks[$db_prop["IBLOCK_ID"]] = $db_prop["IBLOCK_ID"];
335 }
336 }
337
338 foreach($arJoinProps["BE_FPS"] as $iblock_id => $db_prop)
339 {
340 if (str_contains($iblock_id, '~'))
341 {
342 [$iblock_id, ] = explode("~", $iblock_id, 2);
343 }
344 $tableJoin = "\t\t\tLEFT JOIN b_iblock_element_prop_s" . $iblock_id . " JFPS" . $db_prop["CNT"]
345 . " ON JFPS" . $db_prop["CNT"] . ".IBLOCK_ELEMENT_ID = BE" . $db_prop["JOIN"] . ".ID\n"
346 ;
347
348 $sFrom .= $tableJoin;
349 if (self::useCountJoin($db_prop))
350 {
351 $countFrom .= $tableJoin;
352 }
353
354 unset($tableJoin);
355
356 if (isset($db_prop["IBLOCK_ID"]) && $db_prop["IBLOCK_ID"])
357 {
358 $this->arFilterIBlocks[$db_prop["IBLOCK_ID"]] = $db_prop["IBLOCK_ID"];
359 }
360 }
361
362 foreach($arJoinProps["BE_FP"] as $propID => $db_prop)
363 {
365 $tableAlias = 'JFP' . $db_prop['CNT'];
366 $joinType = $db_prop['bFullJoin'] ? 'INNER JOIN' : 'LEFT JOIN';
367
368 if (str_contains($propID, '~'))
369 {
370 [$propID, ] = explode("~", $propID, 2);
371 }
372
373 $tableJoin = "\t\t\t" . $joinType . " " . $tableName . " " . $tableAlias
374 . " ON " . $tableAlias . ".IBLOCK_ID = BE". $db_prop["JOIN"] . ".IBLOCK_ID AND "
375 . (
376 (int)$propID > 0
377 ? $tableAlias . ".ID=" . (int)$propID . "\n"
378 : $tableAlias . ".CODE='" . $DB->ForSQL($propID, 200) . "'\n"
379 )
380 ;
381
382 $sFrom .= $tableJoin;
383 if (self::useCountJoin($db_prop))
384 {
385 $countFrom .= $tableJoin;
386 }
387
388 unset($tableJoin);
389
390 if (isset($db_prop["IBLOCK_ID"]) && $db_prop["IBLOCK_ID"])
391 {
392 $this->arFilterIBlocks[$db_prop["IBLOCK_ID"]] = $db_prop["IBLOCK_ID"];
393 }
394 }
395
396 foreach($arJoinProps["BE_FPV"] as $propID => $db_prop)
397 {
398 if (str_contains($propID, '~'))
399 {
400 [$propID, ] = explode("~", $propID, 2);
401 }
402
403 if($db_prop["MULTIPLE"]=="Y")
404 $this->bDistinct = true;
405
406 if ($db_prop["VERSION"] == IblockTable::PROPERTY_STORAGE_SEPARATE)
407 {
408 $tableName = 'b_iblock_element_prop_m' . $db_prop['IBLOCK_ID'];
409 }
410 else
411 {
412 $tableName = 'b_iblock_element_property';
413 }
414
415 $tableAlias = 'JFPV' . $db_prop['CNT'];
416 $joinType = $db_prop['bFullJoin'] ? 'INNER JOIN' : 'LEFT JOIN';
417
418 $tableJoin = "\t\t\t" . $joinType . " " . $tableName . " " . $tableAlias
419 . " ON " . $tableAlias .".IBLOCK_PROPERTY_ID = JFP" .$db_prop["JOIN"] . ".ID"
420 . " AND " . $tableAlias . ".IBLOCK_ELEMENT_ID = BE" . $db_prop["BE_JOIN"] . ".ID\n"
421 ;
422
423 $sFrom .= $tableJoin;
424 if (self::useCountJoin($db_prop))
425 {
426 $countFrom .= $tableJoin;
427 }
428
429 unset($tableJoin);
430 unset($joinType);
431 unset($tableAlias);
432 unset($tableName);
433
434 if (isset($db_prop["IBLOCK_ID"]) && $db_prop["IBLOCK_ID"])
435 {
436 $this->arFilterIBlocks[$db_prop["IBLOCK_ID"]] = $db_prop["IBLOCK_ID"];
437 }
438 }
439
440 foreach($arJoinProps["BE_FPEN"] as $propID => $db_prop)
441 {
442 if (str_contains($propID, '~'))
443 {
444 [$propID, ] = explode("~", $propID, 2);
445 }
446
448 $tableAlias = 'JFPEN' . $db_prop['CNT'];
449 $joinType = $db_prop['bFullJoin'] ? 'INNER JOIN' : 'LEFT JOIN';
450 if ($db_prop['VERSION'] == IblockTable::PROPERTY_STORAGE_SEPARATE && $db_prop['MULTIPLE'] === 'N') // VERSION is string
451 {
452 $tableJoin = "\t\t\t" . $joinType . " " . $tableName . " " .$tableAlias
453 . " ON " . $tableAlias . ".PROPERTY_ID = " . $db_prop["ORIG_ID"]
454 . " AND JFPS" . $db_prop["JOIN"] . ".PROPERTY_" . $db_prop["ORIG_ID"] ." = " . $tableAlias.".ID\n"
455 ;
456 }
457 else
458 {
459 $tableJoin = "\t\t\t" . $joinType . " " . $tableName ." " . $tableAlias
460 . " ON " . $tableAlias . ".PROPERTY_ID = JFPV" . $db_prop["JOIN"] . ".IBLOCK_PROPERTY_ID"
461 . " AND JFPV" . $db_prop["JOIN"].".VALUE_ENUM = " . $tableAlias . ".ID\n"
462 ;
463 }
464
465 $sFrom .= $tableJoin;
466 if (self::useCountJoin($db_prop))
467 {
468 $countFrom .= $tableJoin;
469 }
470
471 unset($tableJoin);
472 unset($joinType);
473 unset($tableAlias);
474 unset($tableName);
475
476 if (isset($db_prop["IBLOCK_ID"]) && $db_prop["IBLOCK_ID"])
477 {
478 $this->arFilterIBlocks[$db_prop["IBLOCK_ID"]] = $db_prop["IBLOCK_ID"];
479 }
480 }
481
482 if($arJoinProps["BES"] !== '')
483 {
484 $sFrom .= "\t\t\t".$arJoinProps["BES"]."\n";
485 $countFrom .= "\t\t\t".$arJoinProps["BES"]."\n";
486 }
487
488 if(!empty($arJoinProps["BESI"]))
489 {
490 $sFrom .= "\t\t\t".$arJoinProps["BESI"]."\n";
491 $countFrom .= "\t\t\t".$arJoinProps["BESI"]."\n";
492 }
493
494 if($arJoinProps["FC"] !== '')
495 {
496 $sFrom .= "\t\t\t".$arJoinProps["FC"]."\n";
497 $countFrom .= "\t\t\t".$arJoinProps["FC"]."\n";
498 $this->bDistinct = $this->bDistinct || (isset($arJoinProps["FC_DISTINCT"]) && $arJoinProps["FC_DISTINCT"] == "Y");
499 }
500
501 if($arJoinProps["RV"])
502 {
503 $sFrom .= "\t\t\tLEFT JOIN b_rating_voting RV ON RV.ENTITY_TYPE_ID = 'IBLOCK_ELEMENT' AND RV.ENTITY_ID = BE.ID\n";
504 }
505 if($arJoinProps["RVU"])
506 {
507 $sFrom .= "\t\t\tLEFT JOIN b_rating_vote RVU ON RVU.ENTITY_TYPE_ID = 'IBLOCK_ELEMENT' AND RVU.ENTITY_ID = BE.ID AND RVU.USER_ID = ".$uid."\n";
508 }
509 if (is_array($arJoinProps["RVV"]))
510 {
511 $joinType = $arJoinProps['RVV']['bFullJoin'] ? 'INNER JOIN' : 'LEFT JOIN';
512 $tableJoin = "\t\t\t" . $joinType . " b_rating_vote RVV ON RVV.ENTITY_TYPE_ID = 'IBLOCK_ELEMENT' AND RVV.ENTITY_ID = BE.ID\n";
513 $sFrom .= $tableJoin;
514 if (self::useCountJoin($arJoinProps['RVV']))
515 {
516 $countFrom .= $tableJoin;
517 }
518 unset($tableJoin);
519 unset($joinType);
520 }
521
522 //******************END OF FROM PART********************************************
523
524 $this->bCatalogSort = false;
525 if(!empty($arAddSelectFields) || !empty($arAddWhereFields) || !empty($arAddOrderByFields))
526 {
527 if (Loader::includeModule("catalog"))
528 {
529 $catalogQueryResult = \CProductQueryBuilder::makeQuery(array(
530 'select' => $arAddSelectFields,
531 'filter' => $arAddWhereFields,
532 'order' => $arAddOrderByFields
533 ));
534 if (!empty($catalogQueryResult))
535 {
536 if (
537 !empty($catalogQueryResult['select'])
538 && $sGroupBy==""
539 && !$this->bOnlyCount
540 && !isset($this->strField)
541 )
542 {
543 $sSelect .= ', '.implode(', ', $catalogQueryResult['select']).' ';
544 }
545 // filter set in CIBlockElement::MkFilter
546 if (!empty($catalogQueryResult['order']))
547 {
548 $this->bCatalogSort = true;
549 foreach ($catalogQueryResult['order'] as $index => $field)
550 $arSqlOrder[$index] = $field;
551 unset($field);
552 unset($index);
553 }
554 if (!empty($catalogQueryResult['join']))
555 {
556 $sFrom .= "\n\t\t\t".implode("\n\t\t\t", $catalogQueryResult['join'])."\n";
557 }
558 }
559 unset($catalogQueryResult);
560 if (!empty($arAddWhereFields))
561 {
562 // join for count with product filter
563 $catalogQueryResult = \CProductQueryBuilder::makeFilter($arAddWhereFields);
564 if (
565 !empty($catalogQueryResult['filter'])
566 && !empty($catalogQueryResult['join'])
567 )
568 {
569 $countFrom .= "\n\t\t\t".implode("\n\t\t\t", $catalogQueryResult['join'])."\n";
570 }
571 unset($catalogQueryResult);
572 }
573 }
574 }
575
576 $i = array_search("CREATED_BY_FORMATTED", $arSelectFields);
577 if ($i !== false)
578 {
579 if (
581 && $sGroupBy==""
582 && !$this->bOnlyCount
583 && !isset($this->strField)
584 )
585 {
586 $sSelect .= ",UC.NAME UC_NAME, UC.LAST_NAME UC_LAST_NAME, UC.SECOND_NAME UC_SECOND_NAME, UC.EMAIL UC_EMAIL, UC.ID UC_ID, UC.LOGIN UC_LOGIN";
587 }
588 else
589 {
590 unset($arSelectFields[$i]);
591 }
592 }
593
594 $sOrderBy = "";
595 foreach($arSqlOrder as $i=>$val)
596 {
597 if($val <> '')
598 {
599 if($sOrderBy == "")
600 {
601 $sOrderBy = " ORDER BY ";
602 }
603 else
604 {
605 $sOrderBy .= ",";
606 }
607
608 $sOrderBy .= $val." ";
609 }
610 }
611
612 $sSelect = trim($sSelect, ", \t\n\r");
613 if($sSelect == '')
614 $sSelect = "0 as NOP ";
615
616 $this->bDistinct = $this->bDistinct || (isset($arFilter["INCLUDE_SUBSECTIONS"]) && $arFilter["INCLUDE_SUBSECTIONS"] == "Y");
617
618 if($this->bDistinct)
619 $sSelect = str_replace("%%_DISTINCT_%%", "DISTINCT", $sSelect);
620 else
621 $sSelect = str_replace("%%_DISTINCT_%%", "", $sSelect);
622
623 $sFrom = "
624 b_iblock B
625 INNER JOIN b_lang L ON B.LID=L.LID
626 INNER JOIN b_iblock_element BE ON BE.IBLOCK_ID = B.ID
627 ".ltrim($sFrom, "\t\n")
628 .(in_array("USER_NAME", $arSelectFields)? "\t\t\tLEFT JOIN b_user U ON U.ID=BE.MODIFIED_BY\n": "")
629 .(in_array("LOCKED_USER_NAME", $arSelectFields)? "\t\t\tLEFT JOIN b_user UL ON UL.ID=BE.WF_LOCKED_BY\n": "")
630 .(in_array("CREATED_USER_NAME", $arSelectFields) || in_array("CREATED_BY_FORMATTED", $arSelectFields)? "\t\t\tLEFT JOIN b_user UC ON UC.ID=BE.CREATED_BY\n": "")."
631 ";
632
633 $countFrom = "
634 b_iblock B
635 INNER JOIN b_lang L ON B.LID=L.LID
636 INNER JOIN b_iblock_element BE ON BE.IBLOCK_ID = B.ID
637 ".ltrim($countFrom, "\t\n")
638 ;
639
640 $this->sSelect = $sSelect;
641 $this->sFrom = $sFrom;
642 $this->sWhere = $sWhere;
643 $this->sGroupBy = $sGroupBy;
644 $this->sOrderBy = $sOrderBy;
645 $this->countFrom = $countFrom;
646 }
647
658 public static function GetList($arOrder=array("SORT"=>"ASC"), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
659 {
660 global $DB;
661
662 if (
663 isset($arFilter['CHECK_PERMISSIONS'])
664 && $arFilter['CHECK_PERMISSIONS'] === 'Y'
665 )
666 {
667 $filterIblockId = static::getSingleIblockIdFromFilter($arFilter);
668 if (
669 $filterIblockId !== null
670 && CIBlock::GetArrayByID($filterIblockId, 'RIGHTS_MODE') === Iblock\IblockTable::RIGHTS_SIMPLE)
671 {
672 $minPermission = (string)($arFilter['MIN_PERMISSION'] ?? CIBlockRights::PUBLIC_READ);
673 if (strlen($minPermission) !== 1)
674 {
675 $minPermission = CIBlockRights::PUBLIC_READ;
676 }
677 $currentPermission = CIBlock::GetPermission($filterIblockId, $arFilter['PERMISSIONS_BY'] ?? false);
678 if ($currentPermission < $minPermission)
679 {
680 return new CIBlockResult();
681 }
682 if (
683 !defined('ADMIN_SECTION')
684 && $currentPermission < CIBlockRights::FULL_ACCESS
685 && CIBlock::GetArrayByID($filterIblockId, 'ACTIVE') !== 'Y'
686 )
687 {
688 return new CIBlockResult();
689 }
690
691 unset(
692 $arFilter['CHECK_PERMISSIONS'],
693 $arFilter['MIN_PERMISSION'],
694 );
695 }
696 }
697
698 $el = new CIBlockElement();
699 $el->prepareSql($arSelectFields, $arFilter, $arGroupBy, $arOrder);
700
701 if($el->bOnlyCount)
702 {
703 $res = $DB->Query("
704 SELECT ".$el->sSelect."
705 FROM ".$el->sFrom."
706 WHERE 1=1 ".$el->sWhere."
707 ".$el->sGroupBy."
708 ");
709 $res = $res->Fetch();
710 return $res["CNT"];
711 }
712
713 if (!empty($arNavStartParams) && is_array($arNavStartParams))
714 {
715 $nTopCount = (int)($arNavStartParams['nTopCount'] ?? 0);
716 $nElementID = (int)($arNavStartParams['nElementID'] ?? 0);
717
718 if ($nTopCount > 0)
719 {
720 $offset = (int)($arNavStartParams['nOffset'] ?? 0);
721 $strSql = "
722 SELECT ".$el->sSelect."
723 FROM ".$el->sFrom."
724 WHERE 1=1 ".$el->sWhere."
725 ".$el->sGroupBy."
726 ".$el->sOrderBy."
727 LIMIT ".$nTopCount.
728 ($offset > 0
729 ? ' OFFSET ' . $offset
730 : ''
731 )."
732 ";
733 $res = $DB->Query($strSql);
734 }
735 elseif (
736 $nElementID > 0
737 && $el->sGroupBy == ""
738 && $el->sOrderBy != ""
739 && mb_strpos($el->sSelect, "BE.ID") !== false
740 && !$el->bCatalogSort
741 )
742 {
743 $nPageSize = (int)($arNavStartParams['nPageSize'] ?? 0);
744 if ($nPageSize < 0)
745 {
746 $nPageSize = 0;
747 }
748
750
751 if ($connection instanceof Main\DB\PgsqlConnection)
752 {
753 $res = $connection->query('
754 select * from (
755 select
756 sum(
757 case when be.ID = ' . $nElementID . ' then 1 else 0 end
758 ) OVER (' . $el->sOrderBy . ' rows between ' . $nPageSize . ' preceding and ' . $nPageSize . ' following) as wndrank,
759 row_number() OVER (' . $el->sOrderBy . ') as rank,
760 ' . $el->sSelect . '
761 from ' . $el->sFrom . '
762 where 1=1 ' . $el->sWhere . '
763 ' . $el->sGroupBy . '
764 ' . $el->sOrderBy . '
765 ) t where t.wndrank > 0
766 ');
767 }
768 else
769 {
770 $helper = $connection->getSqlHelper();
771 if ($nPageSize > 0)
772 {
773 $DB->Query("SET @ranx=0");
774 $DB->Query("
775 SELECT /*+ NO_DERIVED_CONDITION_PUSHDOWN() */ @ranx:=el1.ranx
776 FROM (
777 SELECT @ranx:=@ranx+1 AS ranx, el0.*
778 FROM (
779 SELECT ".$el->sSelect."
780 FROM ".$el->sFrom."
781 WHERE 1=1 ".$el->sWhere."
782 ".$el->sGroupBy."
783 ".$el->sOrderBy."
784 LIMIT 18446744073709551615
785 ) el0
786 ) el1
787 WHERE el1.ID = ".$nElementID."
788 ");
789 $DB->Query("SET @ranx2=0");
790
791 $res = $DB->Query("
792 SELECT *
793 FROM (
794 SELECT @ranx2:=@ranx2+1 AS ".$helper->quote('RANK').", el0.*
795 FROM (
796 SELECT ".$el->sSelect."
797 FROM ".$el->sFrom."
798 WHERE 1=1 ".$el->sWhere."
799 ".$el->sGroupBy."
800 ".$el->sOrderBy."
801 LIMIT 18446744073709551615
802 ) el0
803 ) el1
804 WHERE el1.".$helper->quote('RANK')." between @ranx-$nPageSize and @ranx+$nPageSize
805 ");
806 }
807 else
808 {
809 $DB->Query("SET @ranx=0");
810 $res = $DB->Query("
811 SELECT /*+ NO_DERIVED_CONDITION_PUSHDOWN() */ el1.*
812 FROM (
813 SELECT @ranx:=@ranx+1 AS ".$helper->quote('RANK').", el0.*
814 FROM (
815 SELECT ".$el->sSelect."
816 FROM ".$el->sFrom."
817 WHERE 1=1 ".$el->sWhere."
818 ".$el->sGroupBy."
819 ".$el->sOrderBy."
820 LIMIT 18446744073709551615
821 ) el0
822 ) el1
823 WHERE el1.ID = ".$nElementID."
824 ");
825 }
826 }
827 }
828 else
829 {
830 if ($el->sGroupBy == "")
831 {
832 $res_cnt = $DB->Query("
833 SELECT COUNT(".($el->bDistinct? "DISTINCT BE.ID": "'x'").") as C
834 FROM ".$el->countFrom."
835 WHERE 1=1 ".$el->sWhere."
836 ".$el->sGroupBy."
837 ");
838 $res_cnt = $res_cnt->Fetch();
839 $cnt = $res_cnt["C"];
840 }
841 else
842 {
843 $res_cnt = $DB->Query("
844 SELECT 'x'
845 FROM ".$el->countFrom."
846 WHERE 1=1 ".$el->sWhere."
847 ".$el->sGroupBy."
848 ");
849 $cnt = $res_cnt->SelectedRowsCount();
850 }
851
852 $strSql = "
853 SELECT ".$el->sSelect."
854 FROM ".$el->sFrom."
855 WHERE 1=1 ".$el->sWhere."
856 ".$el->sGroupBy."
857 ".$el->sOrderBy."
858 ";
859 $res = new CDBResult();
860 $res->NavQuery($strSql, $cnt, $arNavStartParams);
861 }
862 }
863 else//if(is_array($arNavStartParams))
864 {
865 $strSql = "
866 SELECT ".$el->sSelect."
867 FROM ".$el->sFrom."
868 WHERE 1=1 ".$el->sWhere."
869 ".$el->sGroupBy."
870 ".$el->sOrderBy."
871 ";
872 $res = $DB->Query($strSql);
873 }
874
875 $res = new CIBlockResult($res);
876 $res->SetIBlockTag($el->arFilterIBlocks);
877 $res->arIBlockMultProps = $el->arIBlockMultProps;
878 $res->arIBlockConvProps = $el->arIBlockConvProps;
879 $res->arIBlockAllProps = $el->arIBlockAllProps;
880 $res->arIBlockNumProps = $el->arIBlockNumProps;
881 $res->arIBlockLongProps = $el->arIBlockLongProps;
882
883 return $res;
884 }
885
887 // Update element function
889 public function Update($ID, $arFields, $bWorkFlow=false, $bUpdateSearch=true, $bResizePictures=false, $bCheckDiskQuota=true)
890 {
891 global $DB;
892 $ID = (int)$ID;
893
894 $db_element = CIBlockElement::GetList(array(), array("ID"=>$ID, "SHOW_HISTORY"=>"Y"), false, false,
895 array(
896 "ID",
897 "TIMESTAMP_X",
898 "MODIFIED_BY",
899 "DATE_CREATE",
900 "CREATED_BY",
901 "IBLOCK_ID",
902 "IBLOCK_SECTION_ID",
903 "ACTIVE",
904 "ACTIVE_FROM",
905 "ACTIVE_TO",
906 "SORT",
907 "NAME",
908 "PREVIEW_PICTURE",
909 "PREVIEW_TEXT",
910 "PREVIEW_TEXT_TYPE",
911 "DETAIL_PICTURE",
912 "DETAIL_TEXT",
913 "DETAIL_TEXT_TYPE",
914 "WF_STATUS_ID",
915 "WF_PARENT_ELEMENT_ID",
916 "WF_NEW",
917 "WF_COMMENTS",
918 "IN_SECTIONS",
919 "CODE",
920 "TAGS",
921 "XML_ID",
922 "TMP_ID",
923 )
924 );
925 if(!($ar_element = $db_element->Fetch()))
926 return false;
927
928 if ($this->iblock !== null && $this->iblock['ID'] === (int)$ar_element["IBLOCK_ID"])
929 {
931 }
932 else
933 {
934 $arIBlock = CIBlock::GetArrayByID($ar_element["IBLOCK_ID"]);
935 }
936
937 $bWorkFlow = $bWorkFlow && is_array($arIBlock) && ($arIBlock["WORKFLOW"] != "N") && $this->workflowIncluded;
938
939 $ar_wf_element = $ar_element;
940
941 self::$elementIblock[$ID] = $arIBlock["ID"];
942
943 $LAST_ID = 0;
944 if($bWorkFlow)
945 {
947 if($LAST_ID!=$ID)
948 {
949 $db_element = CIBlockElement::GetByID($LAST_ID);
950 if(!($ar_wf_element = $db_element->Fetch()))
951 return false;
952 }
953
954 $arFields["WF_PARENT_ELEMENT_ID"] = $ID;
955
956 if(!isset($arFields["PROPERTY_VALUES"]) || !is_array($arFields["PROPERTY_VALUES"]))
957 $arFields["PROPERTY_VALUES"] = array();
958
959 $bFieldProps = array();
960 foreach($arFields["PROPERTY_VALUES"] as $k=>$v)
961 $bFieldProps[$k]=true;
962
963 $arFieldProps = &$arFields['PROPERTY_VALUES'];
964 $props = CIBlockElement::GetProperty($ar_element["IBLOCK_ID"], $ar_wf_element["ID"]);
965 while($arProp = $props->Fetch())
966 {
967 $pr_val_id = $arProp['PROPERTY_VALUE_ID'];
968 if($arProp['PROPERTY_TYPE']=='F' && $pr_val_id <> '')
969 {
970 if($arProp["CODE"] <> '' && is_set($arFieldProps, $arProp["CODE"]))
971 $pr_id = $arProp["CODE"];
972 else
973 $pr_id = $arProp['ID'];
974
975 if (
976 isset($arFieldProps[$pr_id][$pr_val_id])
977 && is_array($arFieldProps[$pr_id][$pr_val_id])
978 )
979 {
980 $new_value = $arFieldProps[$pr_id][$pr_val_id];
981 if(
982 $new_value['name'] == ''
983 && $new_value['del'] != "Y"
984 && $new_value['VALUE']['name'] == ''
985 && $new_value['VALUE']['del'] != "Y"
986 )
987 {
988 if(
989 array_key_exists('DESCRIPTION', $new_value)
990 && ($new_value['DESCRIPTION'] != $arProp['DESCRIPTION'])
991 )
992 {
993 $p = Array("VALUE"=>CFile::MakeFileArray($arProp['VALUE']));
994 $p["DESCRIPTION"] = $new_value["DESCRIPTION"];
995 $p["MODULE_ID"] = "iblock";
996 $arFieldProps[$pr_id][$pr_val_id] = $p;
997 }
998 elseif($arProp['VALUE'] > 0)
999 {
1000 $arFieldProps[$pr_id][$pr_val_id] = array("VALUE"=>$arProp['VALUE'],"DESCRIPTION"=>$arProp["DESCRIPTION"]);
1001 }
1002 }
1003 }
1004 else
1005 {
1006 $arFieldProps[$pr_id][$pr_val_id] = array("VALUE"=>$arProp['VALUE'],"DESCRIPTION"=>$arProp["DESCRIPTION"]);
1007 }
1008
1009 continue;
1010 }
1011
1012 if (
1013 $pr_val_id == ''
1014 || array_key_exists($arProp["ID"], $bFieldProps)
1015 || (
1016 $arProp["CODE"] <> ''
1017 && array_key_exists($arProp["CODE"], $bFieldProps)
1018 )
1019 )
1020 continue;
1021
1022 $arFieldProps[$arProp["ID"]][$pr_val_id] = array("VALUE"=>$arProp['VALUE'],"DESCRIPTION"=>$arProp["DESCRIPTION"]);
1023 }
1024
1025 if($ar_wf_element["IN_SECTIONS"] == "Y")
1026 {
1027 $ar_wf_element["IBLOCK_SECTION"] = array();
1028 $rsSections = CIBlockElement::GetElementGroups($ar_element["ID"], true, array('ID', 'IBLOCK_ELEMENT_ID'));
1029 while($arSection = $rsSections->Fetch())
1030 $ar_wf_element["IBLOCK_SECTION"][] = $arSection["ID"];
1031 }
1032
1033 unset($ar_wf_element["DATE_ACTIVE_FROM"],
1034 $ar_wf_element["DATE_ACTIVE_TO"],
1035 $ar_wf_element["EXTERNAL_ID"],
1036 $ar_wf_element["TIMESTAMP_X"],
1037 $ar_wf_element["IBLOCK_SECTION_ID"],
1038 $ar_wf_element["ID"]
1039 );
1040
1041 $arFields = $arFields + $ar_wf_element;
1042 }
1043
1044 $arFields["WF"] = ($bWorkFlow?"Y":"N");
1045
1046 $bBizProc = is_array($arIBlock) && ($arIBlock["BIZPROC"] == "Y") && $this->bizprocInstalled;
1047 if(array_key_exists("BP_PUBLISHED", $arFields))
1048 {
1049 if($bBizProc)
1050 {
1051 if($arFields["BP_PUBLISHED"] == "Y")
1052 {
1053 $arFields["WF_STATUS_ID"] = 1;
1054 $arFields["WF_NEW"] = false;
1055 }
1056 else
1057 {
1058 $arFields["WF_STATUS_ID"] = 2;
1059 $arFields["WF_NEW"] = "Y";
1060 $arFields["BP_PUBLISHED"] = "N";
1061 }
1062 }
1063 else
1064 {
1065 $arFields["WF_NEW"] = false;
1066 unset($arFields["BP_PUBLISHED"]);
1067 }
1068 }
1069 else
1070 {
1071 $arFields["WF_NEW"] = false;
1072 }
1073
1074 if (array_key_exists('NAME', $arFields) && $arFields['NAME'] === null)
1075 {
1076 unset($arFields['NAME']);
1077 }
1078
1079 if (isset($arFields["ACTIVE"]) && $arFields["ACTIVE"] != "Y")
1080 {
1081 $arFields["ACTIVE"] = "N";
1082 }
1083
1084 if (isset($arFields["PREVIEW_TEXT_TYPE"]) && $arFields["PREVIEW_TEXT_TYPE"] != "html")
1085 {
1086 $arFields["PREVIEW_TEXT_TYPE"] = "text";
1087 }
1088
1089 if (isset($arFields["DETAIL_TEXT_TYPE"]) && $arFields["DETAIL_TEXT_TYPE"] != "html")
1090 {
1091 $arFields["DETAIL_TEXT_TYPE"] = "text";
1092 }
1093
1094 $strWarning = "";
1095 if($bResizePictures)
1096 {
1097 $arDef = $arIBlock["FIELDS"]["PREVIEW_PICTURE"]["DEFAULT_VALUE"];
1098
1099 if(
1100 $arDef["DELETE_WITH_DETAIL"] === "Y"
1101 && isset($arFields["DETAIL_PICTURE"])
1102 && is_array($arFields["DETAIL_PICTURE"])
1103 && $arFields["DETAIL_PICTURE"]["del"] === "Y"
1104 )
1105 {
1106 $arFields["PREVIEW_PICTURE"]["del"] = "Y";
1107 }
1108
1109 if(
1110 $arDef["FROM_DETAIL"] === "Y"
1111 && (
1112 !isset($arFields["PREVIEW_PICTURE"])
1113 || (is_array($arFields["PREVIEW_PICTURE"]) && $arFields["PREVIEW_PICTURE"]["size"] <= 0)
1114 || $arDef["UPDATE_WITH_DETAIL"] === "Y"
1115 )
1116 && isset($arFields["DETAIL_PICTURE"])
1117 && is_array($arFields["DETAIL_PICTURE"])
1118 && $arFields["DETAIL_PICTURE"]["size"] > 0
1119 )
1120 {
1121 if(
1122 $arFields["PREVIEW_PICTURE"]["del"] !== "Y"
1123 && $arDef["UPDATE_WITH_DETAIL"] !== "Y"
1124 )
1125 {
1126 $rsElement = CIBlockElement::GetList(Array("ID" => "DESC"), Array("ID" => $ar_wf_element["ID"], "IBLOCK_ID" => $ar_wf_element["IBLOCK_ID"], "SHOW_HISTORY"=>"Y"), false, false, Array("ID", "PREVIEW_PICTURE"));
1127 $arOldElement = $rsElement->Fetch();
1128 }
1129 else
1130 {
1131 $arOldElement = false;
1132 }
1133
1134 if(!$arOldElement || !$arOldElement["PREVIEW_PICTURE"])
1135 {
1136 $arNewPreview = $arFields["DETAIL_PICTURE"];
1137 $arNewPreview["COPY_FILE"] = "Y";
1138 if (
1139 isset($arFields["PREVIEW_PICTURE"])
1140 && is_array($arFields["PREVIEW_PICTURE"])
1141 && isset($arFields["PREVIEW_PICTURE"]["description"])
1142 )
1143 {
1144 $arNewPreview["description"] = $arFields["PREVIEW_PICTURE"]["description"];
1145 }
1146
1147 $arFields["PREVIEW_PICTURE"] = $arNewPreview;
1148 }
1149 }
1150
1151 if(
1152 isset($arFields["PREVIEW_PICTURE"])
1153 && is_array($arFields["PREVIEW_PICTURE"])
1154 && $arFields["PREVIEW_PICTURE"]["size"] > 0
1155 && $arDef["SCALE"] === "Y"
1156 )
1157 {
1158 $arNewPicture = CIBlock::ResizePicture($arFields["PREVIEW_PICTURE"], $arDef);
1159 if(is_array($arNewPicture))
1160 {
1161 $arNewPicture["description"] = $arFields["PREVIEW_PICTURE"]["description"];
1162 $arFields["PREVIEW_PICTURE"] = $arNewPicture;
1163 }
1164 elseif($arDef["IGNORE_ERRORS"] !== "Y")
1165 {
1166 unset($arFields["PREVIEW_PICTURE"]);
1167 $strWarning .= GetMessage("IBLOCK_FIELD_PREVIEW_PICTURE").": ".$arNewPicture."<br>";
1168 }
1169 }
1170
1171 if(
1172 isset($arFields["PREVIEW_PICTURE"])
1173 && is_array($arFields["PREVIEW_PICTURE"])
1174 && $arDef["USE_WATERMARK_FILE"] === "Y"
1175 )
1176 {
1177 $arFields["PREVIEW_PICTURE"]["copy"] ??= null;
1178 if(
1179 $arFields["PREVIEW_PICTURE"]["tmp_name"] <> ''
1180 && (
1181 $arFields["PREVIEW_PICTURE"]["tmp_name"] === $arFields["DETAIL_PICTURE"]["tmp_name"]
1182 || ($arFields["PREVIEW_PICTURE"]["COPY_FILE"] == "Y" && !$arFields["PREVIEW_PICTURE"]["copy"])
1183 )
1184 )
1185 {
1186 $tmp_name = CTempFile::GetFileName(basename($arFields["PREVIEW_PICTURE"]["tmp_name"]));
1187 CheckDirPath($tmp_name);
1188 copy($arFields["PREVIEW_PICTURE"]["tmp_name"], $tmp_name);
1189 $arFields["PREVIEW_PICTURE"]["copy"] = true;
1190 $arFields["PREVIEW_PICTURE"]["tmp_name"] = $tmp_name;
1191 }
1192
1193 CIBlock::FilterPicture($arFields["PREVIEW_PICTURE"]["tmp_name"], array(
1194 "name" => "watermark",
1195 "position" => $arDef["WATERMARK_FILE_POSITION"],
1196 "type" => "file",
1197 "size" => "real",
1198 "alpha_level" => 100 - min(max($arDef["WATERMARK_FILE_ALPHA"], 0), 100),
1199 "file" => $_SERVER["DOCUMENT_ROOT"].Rel2Abs("/", $arDef["WATERMARK_FILE"]),
1200 ));
1201 }
1202
1203 if(
1204 isset($arFields["PREVIEW_PICTURE"])
1205 && is_array($arFields["PREVIEW_PICTURE"])
1206 && $arDef["USE_WATERMARK_TEXT"] === "Y"
1207 )
1208 {
1209 $arFields["PREVIEW_PICTURE"]["copy"] ??= null;
1210 if(
1211 $arFields["PREVIEW_PICTURE"]["tmp_name"] <> ''
1212 && (
1213 $arFields["PREVIEW_PICTURE"]["tmp_name"] === $arFields["DETAIL_PICTURE"]["tmp_name"]
1214 || ($arFields["PREVIEW_PICTURE"]["COPY_FILE"] == "Y" && !$arFields["PREVIEW_PICTURE"]["copy"])
1215 )
1216 )
1217 {
1218 $tmp_name = CTempFile::GetFileName(basename($arFields["PREVIEW_PICTURE"]["tmp_name"]));
1219 CheckDirPath($tmp_name);
1220 copy($arFields["PREVIEW_PICTURE"]["tmp_name"], $tmp_name);
1221 $arFields["PREVIEW_PICTURE"]["copy"] = true;
1222 $arFields["PREVIEW_PICTURE"]["tmp_name"] = $tmp_name;
1223 }
1224
1225 CIBlock::FilterPicture($arFields["PREVIEW_PICTURE"]["tmp_name"], array(
1226 "name" => "watermark",
1227 "position" => $arDef["WATERMARK_TEXT_POSITION"],
1228 "type" => "text",
1229 "coefficient" => $arDef["WATERMARK_TEXT_SIZE"],
1230 "text" => $arDef["WATERMARK_TEXT"],
1231 "font" => $_SERVER["DOCUMENT_ROOT"].Rel2Abs("/", $arDef["WATERMARK_TEXT_FONT"]),
1232 "color" => $arDef["WATERMARK_TEXT_COLOR"],
1233 ));
1234 }
1235
1236 $arDef = $arIBlock["FIELDS"]["DETAIL_PICTURE"]["DEFAULT_VALUE"];
1237
1238 if(
1239 isset($arFields["DETAIL_PICTURE"])
1240 && is_array($arFields["DETAIL_PICTURE"])
1241 && $arDef["SCALE"] === "Y"
1242 )
1243 {
1244 $arNewPicture = CIBlock::ResizePicture($arFields["DETAIL_PICTURE"], $arDef);
1245 if(is_array($arNewPicture))
1246 {
1247 $arNewPicture["description"] = $arFields["DETAIL_PICTURE"]["description"];
1248 $arFields["DETAIL_PICTURE"] = $arNewPicture;
1249 }
1250 elseif($arDef["IGNORE_ERRORS"] !== "Y")
1251 {
1252 unset($arFields["DETAIL_PICTURE"]);
1253 $strWarning .= GetMessage("IBLOCK_FIELD_DETAIL_PICTURE").": ".$arNewPicture."<br>";
1254 }
1255 }
1256
1257 if(
1258 isset($arFields["DETAIL_PICTURE"])
1259 && is_array($arFields["DETAIL_PICTURE"])
1260 && $arDef["USE_WATERMARK_FILE"] === "Y"
1261 )
1262 {
1263 $arFields["DETAIL_PICTURE"]["copy"] ??= null;
1264 if(
1265 $arFields["DETAIL_PICTURE"]["tmp_name"] <> ''
1266 && (
1267 $arFields["DETAIL_PICTURE"]["tmp_name"] === $arFields["PREVIEW_PICTURE"]["tmp_name"]
1268 || ($arFields["DETAIL_PICTURE"]["COPY_FILE"] == "Y" && !$arFields["DETAIL_PICTURE"]["copy"])
1269 )
1270 )
1271 {
1272 $tmp_name = CTempFile::GetFileName(basename($arFields["DETAIL_PICTURE"]["tmp_name"]));
1273 CheckDirPath($tmp_name);
1274 copy($arFields["DETAIL_PICTURE"]["tmp_name"], $tmp_name);
1275 $arFields["DETAIL_PICTURE"]["copy"] = true;
1276 $arFields["DETAIL_PICTURE"]["tmp_name"] = $tmp_name;
1277 }
1278
1279 CIBlock::FilterPicture($arFields["DETAIL_PICTURE"]["tmp_name"], array(
1280 "name" => "watermark",
1281 "position" => $arDef["WATERMARK_FILE_POSITION"],
1282 "type" => "file",
1283 "size" => "real",
1284 "alpha_level" => 100 - min(max($arDef["WATERMARK_FILE_ALPHA"], 0), 100),
1285 "file" => $_SERVER["DOCUMENT_ROOT"].Rel2Abs("/", $arDef["WATERMARK_FILE"]),
1286 ));
1287 }
1288
1289 if(
1290 isset($arFields["DETAIL_PICTURE"])
1291 && is_array($arFields["DETAIL_PICTURE"])
1292 && $arDef["USE_WATERMARK_TEXT"] === "Y"
1293 )
1294 {
1295 $arFields["DETAIL_PICTURE"]["copy"] ??= null;
1296 if(
1297 $arFields["DETAIL_PICTURE"]["tmp_name"] <> ''
1298 && (
1299 $arFields["DETAIL_PICTURE"]["tmp_name"] === $arFields["PREVIEW_PICTURE"]["tmp_name"]
1300 || ($arFields["DETAIL_PICTURE"]["COPY_FILE"] == "Y" && !$arFields["DETAIL_PICTURE"]["copy"])
1301 )
1302 )
1303 {
1304 $tmp_name = CTempFile::GetFileName(basename($arFields["DETAIL_PICTURE"]["tmp_name"]));
1305 CheckDirPath($tmp_name);
1306 copy($arFields["DETAIL_PICTURE"]["tmp_name"], $tmp_name);
1307 $arFields["DETAIL_PICTURE"]["copy"] = true;
1308 $arFields["DETAIL_PICTURE"]["tmp_name"] = $tmp_name;
1309 }
1310
1311 CIBlock::FilterPicture($arFields["DETAIL_PICTURE"]["tmp_name"], array(
1312 "name" => "watermark",
1313 "position" => $arDef["WATERMARK_TEXT_POSITION"],
1314 "type" => "text",
1315 "coefficient" => $arDef["WATERMARK_TEXT_SIZE"],
1316 "text" => $arDef["WATERMARK_TEXT"],
1317 "font" => $_SERVER["DOCUMENT_ROOT"].Rel2Abs("/", $arDef["WATERMARK_TEXT_FONT"]),
1318 "color" => $arDef["WATERMARK_TEXT_COLOR"],
1319 ));
1320 }
1321 }
1322
1323 $ipropTemplates = new \Bitrix\Iblock\InheritedProperty\ElementTemplates($ar_element["IBLOCK_ID"], $ar_element["ID"]);
1324 if (isset($arFields["PREVIEW_PICTURE"]) && is_array($arFields["PREVIEW_PICTURE"]))
1325 {
1326 if(
1327 ($arFields["PREVIEW_PICTURE"]["name"] ?? '') === ''
1328 && ($arFields["PREVIEW_PICTURE"]["del"] ?? '') === ''
1329 && !is_set($arFields["PREVIEW_PICTURE"], "description")
1330 )
1331 {
1332 unset($arFields["PREVIEW_PICTURE"]);
1333 }
1334 else
1335 {
1336 $arFields["PREVIEW_PICTURE"]["MODULE_ID"] = "iblock";
1337 $arFields["PREVIEW_PICTURE"]["old_file"] = $ar_wf_element["PREVIEW_PICTURE"];
1338 $arFields["PREVIEW_PICTURE"]["name"] = \Bitrix\Iblock\Template\Helper::makeFileName(
1339 $ipropTemplates
1340 ,"ELEMENT_PREVIEW_PICTURE_FILE_NAME"
1341 ,array_merge($ar_element, $arFields)
1342 ,$arFields["PREVIEW_PICTURE"]
1343 );
1344 }
1345 }
1346
1347 if(isset($arFields["DETAIL_PICTURE"]) && is_array($arFields["DETAIL_PICTURE"]))
1348 {
1349 if(
1350 ($arFields["DETAIL_PICTURE"]["name"] ?? '') === ''
1351 && ($arFields["DETAIL_PICTURE"]["del"] ?? '') === ''
1352 && !is_set($arFields["DETAIL_PICTURE"], "description")
1353 )
1354 {
1355 unset($arFields["DETAIL_PICTURE"]);
1356 }
1357 else
1358 {
1359 $arFields["DETAIL_PICTURE"]["MODULE_ID"] = "iblock";
1360 $arFields["DETAIL_PICTURE"]["old_file"] = $ar_wf_element["DETAIL_PICTURE"];
1361 $arFields["DETAIL_PICTURE"]["name"] = \Bitrix\Iblock\Template\Helper::makeFileName(
1362 $ipropTemplates
1363 ,"ELEMENT_DETAIL_PICTURE_FILE_NAME"
1364 ,array_merge($ar_element, $arFields)
1365 ,$arFields["DETAIL_PICTURE"]
1366 );
1367 }
1368 }
1369
1370 if(is_set($arFields, "DATE_ACTIVE_FROM"))
1371 $arFields["ACTIVE_FROM"] = $arFields["DATE_ACTIVE_FROM"];
1372 if(is_set($arFields, "DATE_ACTIVE_TO"))
1373 $arFields["ACTIVE_TO"] = $arFields["DATE_ACTIVE_TO"];
1374 if(is_set($arFields, "EXTERNAL_ID"))
1375 $arFields["XML_ID"] = $arFields["EXTERNAL_ID"];
1376
1377 if (isset($arFields['NAME']) && is_array($arFields['NAME']))
1378 {
1379 unset($arFields['NAME']);
1380 }
1381
1382 $existFields = array(
1383 'NAME' => isset($arFields['NAME']),
1384 'PREVIEW_TEXT' => array_key_exists('PREVIEW_TEXT', $arFields),
1385 'DETAIL_TEXT' => array_key_exists('DETAIL_TEXT', $arFields)
1386 );
1387 $searchableFields = [
1388 'NAME' => $existFields['NAME'] ? $arFields["NAME"] : $ar_wf_element["NAME"],
1389 'PREVIEW_TEXT' => $existFields['PREVIEW_TEXT'] ? $arFields["PREVIEW_TEXT"]: $ar_wf_element["PREVIEW_TEXT"],
1390 'PREVIEW_TEXT_TYPE' => $arFields["PREVIEW_TEXT_TYPE"] ?? $ar_wf_element["PREVIEW_TEXT_TYPE"],
1391 'DETAIL_TEXT' => $existFields['DETAIL_TEXT'] ? $arFields["DETAIL_TEXT"]: $ar_wf_element["DETAIL_TEXT"],
1392 'DETAIL_TEXT_TYPE' => $arFields["DETAIL_TEXT_TYPE"] ?? $ar_wf_element["DETAIL_TEXT_TYPE"],
1393 ];
1394
1395 if ($this->searchIncluded)
1396 {
1397 $arFields["SEARCHABLE_CONTENT"] = mb_strtoupper($searchableFields['NAME']."\r\n".
1398 ($searchableFields['PREVIEW_TEXT_TYPE'] == "html" ? HTMLToTxt($searchableFields['PREVIEW_TEXT']) : $searchableFields['PREVIEW_TEXT'])."\r\n".
1399 ($searchableFields['DETAIL_TEXT_TYPE'] == "html" ? HTMLToTxt($searchableFields['DETAIL_TEXT']) : $searchableFields['DETAIL_TEXT']));
1400 }
1401
1402 if(array_key_exists("IBLOCK_SECTION_ID", $arFields))
1403 {
1404 if (!array_key_exists("IBLOCK_SECTION", $arFields))
1405 {
1406 $arFields["IBLOCK_SECTION"] = array($arFields["IBLOCK_SECTION_ID"]);
1407 }
1408 elseif (is_array($arFields["IBLOCK_SECTION"]) && !in_array($arFields["IBLOCK_SECTION_ID"], $arFields["IBLOCK_SECTION"]))
1409 {
1410 unset($arFields["IBLOCK_SECTION_ID"]);
1411
1412 }
1413 }
1414
1415 $arFields["IBLOCK_ID"] = $ar_element["IBLOCK_ID"];
1416
1417 if(!$this->CheckFields($arFields, $ID, $bCheckDiskQuota) || $strWarning != '')
1418 {
1419 $this->LAST_ERROR .= $strWarning;
1420 $Result = false;
1421 $arFields["RESULT_MESSAGE"] = &$this->LAST_ERROR;
1422 }
1423 else
1424 {
1425 unset($arFields["ID"]);
1426
1427 if(array_key_exists("PREVIEW_PICTURE", $arFields))
1428 {
1429 $SAVED_PREVIEW_PICTURE = $arFields["PREVIEW_PICTURE"];
1430 }
1431 else
1432 {
1433 $SAVED_PREVIEW_PICTURE = false;
1434 }
1435
1436 if(array_key_exists("DETAIL_PICTURE", $arFields))
1437 {
1438 $SAVED_DETAIL_PICTURE = $arFields["DETAIL_PICTURE"];
1439 }
1440 else
1441 {
1442 $SAVED_DETAIL_PICTURE = false;
1443 }
1444
1445 // edit was done in workflow mode
1446 if($bWorkFlow)
1447 {
1448 $arFields["WF_PARENT_ELEMENT_ID"] = $ID;
1449
1450 if(array_key_exists("PREVIEW_PICTURE", $arFields))
1451 {
1452 if(is_array($arFields["PREVIEW_PICTURE"]))
1453 {
1454 if(
1455 $arFields["PREVIEW_PICTURE"]["name"] == ''
1456 && ($arFields["PREVIEW_PICTURE"]["del"] ?? null) == ''
1457 )
1458 {
1459 if(array_key_exists("description", $arFields["PREVIEW_PICTURE"]))
1460 {
1461 $arFile = CFile::GetFileArray($ar_wf_element["PREVIEW_PICTURE"]);
1462 if($arFields["PREVIEW_PICTURE"]["description"] != $arFile["DESCRIPTION"])
1463 {//Description updated, so it's new file
1464 $arNewFile = CFile::MakeFileArray($ar_wf_element["PREVIEW_PICTURE"]);
1465 $arNewFile["description"] = $arFields["PREVIEW_PICTURE"]["description"];
1466 $arNewFile["MODULE_ID"] = "iblock";
1467 $arFields["PREVIEW_PICTURE"] = $arNewFile;
1468 }
1469 else
1470 {
1471 $arFields["PREVIEW_PICTURE"] = $ar_wf_element["PREVIEW_PICTURE"];
1472 }
1473 }
1474 else
1475 {
1476 //File was not changed at all
1477 $arFields["PREVIEW_PICTURE"] = $ar_wf_element["PREVIEW_PICTURE"];
1478 }
1479 }
1480 else
1481 {
1482 unset($arFields["PREVIEW_PICTURE"]["old_file"]);
1483 }
1484 }
1485 }
1486 else
1487 {
1488 $arFields["PREVIEW_PICTURE"] = $ar_wf_element["PREVIEW_PICTURE"];
1489 }
1490
1491 if(array_key_exists("DETAIL_PICTURE", $arFields))
1492 {
1493 if(is_array($arFields["DETAIL_PICTURE"]))
1494 {
1495 if(
1496 $arFields["DETAIL_PICTURE"]["name"] == ''
1497 && ($arFields["DETAIL_PICTURE"]["del"] ?? null) == ''
1498 )
1499 {
1500 if(array_key_exists("description", $arFields["DETAIL_PICTURE"]))
1501 {
1502 $arFile = CFile::GetFileArray($ar_wf_element["DETAIL_PICTURE"]);
1503 if($arFields["DETAIL_PICTURE"]["description"] != $arFile["DESCRIPTION"])
1504 {//Description updated, so it's new file
1505 $arNewFile = CFile::MakeFileArray($ar_wf_element["DETAIL_PICTURE"]);
1506 $arNewFile["description"] = $arFields["DETAIL_PICTURE"]["description"];
1507 $arNewFile["MODULE_ID"] = "iblock";
1508 $arFields["DETAIL_PICTURE"] = $arNewFile;
1509 }
1510 else
1511 {
1512 $arFields["DETAIL_PICTURE"] = $ar_wf_element["DETAIL_PICTURE"];
1513 }
1514 }
1515 else
1516 {
1517 //File was not changed at all
1518 $arFields["DETAIL_PICTURE"] = $ar_wf_element["DETAIL_PICTURE"];
1519 }
1520 }
1521 else
1522 {
1523 unset($arFields["DETAIL_PICTURE"]["old_file"]);
1524 }
1525 }
1526 }
1527 else
1528 {
1529 $arFields["DETAIL_PICTURE"] = $ar_wf_element["DETAIL_PICTURE"];
1530 }
1531
1532 $NID = $this->Add($arFields);
1533 if($NID>0)
1534 {
1535 if($arFields["WF_STATUS_ID"]==1)
1536 {
1537 $DB->Query("UPDATE b_iblock_element SET TIMESTAMP_X=TIMESTAMP_X, WF_NEW=null WHERE ID=".$ID);
1538 $DB->Query("UPDATE b_iblock_element SET TIMESTAMP_X=TIMESTAMP_X, WF_NEW=null WHERE WF_PARENT_ELEMENT_ID=".$ID);
1539 $ar_wf_element["WF_NEW"] = false;
1540 }
1541
1542 if($this->bWF_SetMove)
1543 CIBlockElement::WF_SetMove($NID, $LAST_ID);
1544
1545 if($ar_element["WF_STATUS_ID"] != 1
1546 && $ar_wf_element["WF_STATUS_ID"] != $arFields["WF_STATUS_ID"]
1547 && $arFields["WF_STATUS_ID"] != 1
1548 )
1549 {
1550 $DB->Query("UPDATE b_iblock_element SET TIMESTAMP_X=TIMESTAMP_X, WF_STATUS_ID=".(int)$arFields["WF_STATUS_ID"]." WHERE ID=".$ID);
1551 }
1552 }
1553
1554 //element was not published, so keep original
1555 if(
1556 (is_set($arFields, "WF_STATUS_ID") && $arFields["WF_STATUS_ID"]!=1 && $ar_element["WF_STATUS_ID"]==1)
1557 || (!is_set($arFields, "WF_STATUS_ID") && $ar_wf_element["WF_STATUS_ID"]!=1)
1558 )
1559 {
1561 return true;
1562 }
1563
1564 $arFields['WF_PARENT_ELEMENT_ID'] = false;
1565
1566 $rs = $DB->Query("SELECT PREVIEW_PICTURE, DETAIL_PICTURE from b_iblock_element WHERE ID = ".(int)$NID);
1567 $ar_new_element = $rs->Fetch();
1568 }
1569 else
1570 {
1571 $ar_new_element = false;
1572 }
1573
1574 if($ar_new_element)
1575 {
1576 if((int)$ar_new_element["PREVIEW_PICTURE"] <= 0)
1577 $arFields["PREVIEW_PICTURE"] = false;
1578 else
1579 $arFields["PREVIEW_PICTURE"] = $ar_new_element["PREVIEW_PICTURE"];
1580
1581 if((int)$ar_new_element["DETAIL_PICTURE"] <= 0)
1582 $arFields["DETAIL_PICTURE"] = false;
1583 else
1584 $arFields["DETAIL_PICTURE"] = $ar_new_element["DETAIL_PICTURE"];
1585
1586 if(is_array($arFields["PROPERTY_VALUES"]) && !empty($arFields["PROPERTY_VALUES"]))
1587 {
1588 $i = 0;
1589 $db_prop = CIBlockProperty::GetList(array(), array(
1590 "IBLOCK_ID" => $arFields["IBLOCK_ID"],
1591 "CHECK_PERMISSIONS" => "N",
1592 "PROPERTY_TYPE" => "F",
1593 ));
1594 while($arProp = $db_prop->Fetch())
1595 {
1596 $i++;
1597 unset($arFields["PROPERTY_VALUES"][$arProp["CODE"]]);
1598 unset($arFields["PROPERTY_VALUES"][$arProp["ID"]]);
1599 $arFields["PROPERTY_VALUES"][$arProp["ID"]] = array();
1600 }
1601
1602 if($i > 0)
1603 {
1604 //Delete previous files
1605 $props = CIBlockElement::GetProperty($arFields["IBLOCK_ID"], $ID, "sort", "asc", array("PROPERTY_TYPE" => "F", "EMPTY" => "N"));
1606 while($arProp = $props->Fetch())
1607 {
1608 $arFields["PROPERTY_VALUES"][$arProp["ID"]][$arProp['PROPERTY_VALUE_ID']] = array(
1609 "VALUE" => array(
1610 "del" => "Y",
1611 ),
1612 "DESCRIPTION" => false,
1613 );
1614 }
1615 //Add copy from history
1616 $arDup = array();//This is cure for files duplication bug (just save element one more time)
1617 $props = CIBlockElement::GetProperty($arFields["IBLOCK_ID"], $NID, "sort", "asc", array("PROPERTY_TYPE" => "F", "EMPTY" => "N"));
1618 while($arProp = $props->Fetch())
1619 {
1620 if(!array_key_exists($arProp["VALUE"], $arDup))//This is cure for files duplication bug
1621 {
1622 $arFields["PROPERTY_VALUES"][$arProp["ID"]][$arProp['PROPERTY_VALUE_ID']] = array(
1623 "VALUE" => $arProp["VALUE"],
1624 "DESCRIPTION" => $arProp["DESCRIPTION"],
1625 );
1626 $arDup[$arProp["VALUE"]] = true;//This is cure for files duplication bug
1627 }
1628 }
1629 }
1630 }
1631 }
1632 else
1633 {
1634 if(array_key_exists("PREVIEW_PICTURE", $arFields))
1635 CFile::SaveForDB($arFields, "PREVIEW_PICTURE", "iblock");
1636 if(array_key_exists("DETAIL_PICTURE", $arFields))
1637 CFile::SaveForDB($arFields, "DETAIL_PICTURE", "iblock");
1638 }
1639
1640 $newFields = $arFields;
1641 $newFields["ID"] = $ID;
1642 $IBLOCK_SECTION_ID = $arFields["IBLOCK_SECTION_ID"] ?? null;
1643 unset($arFields["IBLOCK_ID"], $arFields["WF_NEW"], $arFields["IBLOCK_SECTION_ID"]);
1644
1645 $bTimeStampNA = false;
1646 if(is_set($arFields, "TIMESTAMP_X") && ($arFields["TIMESTAMP_X"] === NULL || $arFields["TIMESTAMP_X"]===false))
1647 {
1648 $bTimeStampNA = true;
1649 unset($arFields["TIMESTAMP_X"]);
1650 unset($newFields["TIMESTAMP_X"]);
1651 }
1652
1653 foreach (GetModuleEvents("iblock", "OnIBlockElementUpdate", true) as $arEvent)
1654 ExecuteModuleEventEx($arEvent, array($newFields, $ar_wf_element));
1655 unset($newFields);
1656
1657 $strUpdate = $DB->PrepareUpdate("b_iblock_element", $arFields, "iblock");
1658
1659 if(!empty($strUpdate))
1660 $strUpdate .= ", ";
1661
1662 $strSql = "UPDATE b_iblock_element SET ".$strUpdate.($bTimeStampNA?"TIMESTAMP_X=TIMESTAMP_X":"TIMESTAMP_X=now()")." WHERE ID=".$ID;
1663 $DB->Query($strSql);
1664
1665 $existFields['PROPERTY_VALUES'] = (
1666 !empty($arFields['PROPERTY_VALUES'])
1667 && is_array($arFields['PROPERTY_VALUES'])
1668 );
1669
1670 if ($existFields['PROPERTY_VALUES'])
1671 {
1672 CIBlockElement::SetPropertyValues($ID, $ar_element["IBLOCK_ID"], $arFields["PROPERTY_VALUES"]);
1673 }
1674
1675 if (!$this->searchIncluded)
1676 {
1677 if (
1678 !array_key_exists('SEARCHABLE_CONTENT', $arFields)
1679 && (
1680 $existFields['NAME']
1681 || $existFields['PREVIEW_TEXT']
1682 || $existFields['DETAIL_TEXT']
1683 || $existFields['PROPERTY_VALUES']
1684 )
1685 )
1686 {
1687 $elementFields = $arFields;
1688 if (!$existFields['NAME'])
1689 {
1690 $elementFields['NAME'] = $searchableFields['NAME'];
1691 }
1692 if (!$existFields['PREVIEW_TEXT'])
1693 {
1694 $elementFields['PREVIEW_TEXT'] = $searchableFields['PREVIEW_TEXT'];
1695 if (!isset($elementFields['PREVIEW_TEXT_TYPE']))
1696 {
1697 $elementFields['PREVIEW_TEXT_TYPE'] = $searchableFields['PREVIEW_TEXT_TYPE'];
1698 }
1699 }
1700 if (!$existFields['DETAIL_TEXT'])
1701 {
1702 $elementFields['DETAIL_TEXT'] = $searchableFields['DETAIL_TEXT'];
1703 if (!isset($elementFields['DETAIL_TEXT_TYPE']))
1704 {
1705 $elementFields['DETAIL_TEXT_TYPE'] = $searchableFields['DETAIL_TEXT_TYPE'];
1706 }
1707 }
1708 $arFields['SEARCHABLE_CONTENT'] = $this->getSearchableContent($ID, $elementFields, $arIBlock);
1709 unset($elementFields);
1710
1711 if (Iblock\FullIndex\FullText::doesIblockSupportByData($arIBlock))
1712 {
1713 $searchIndexParams = [
1714 "SEARCH_CONTENT" => $arFields['SEARCHABLE_CONTENT'],
1715 ];
1716
1717 Iblock\FullIndex\FullText::update($arIBlock['ID'], $ID, $searchIndexParams);
1718 }
1719
1720 $updateFields = array(
1721 'SEARCHABLE_CONTENT' => $arFields['SEARCHABLE_CONTENT']
1722 );
1723 $updateQuery = $DB->PrepareUpdate("b_iblock_element", $updateFields, "iblock");
1724 if ($updateQuery != "")
1725 {
1726 $updateQuery .= ', TIMESTAMP_X = TIMESTAMP_X';
1727 $DB->Query("UPDATE b_iblock_element SET ".$updateQuery." WHERE ID = ".$ID);
1728 }
1729 unset($updateFields);
1730 }
1731 }
1732
1733 if(is_set($arFields, "IBLOCK_SECTION"))
1734 CIBlockElement::SetElementSection($ID, $arFields["IBLOCK_SECTION"], false, $arIBlock["RIGHTS_MODE"] === "E"? $arIBlock["ID"]: 0, $IBLOCK_SECTION_ID);
1735
1736 if ($arIBlock["RIGHTS_MODE"] === Iblock\IblockTable::RIGHTS_EXTENDED)
1737 {
1738 $obElementRights = new CIBlockElementRights($arIBlock["ID"], $ID);
1739 if(array_key_exists("RIGHTS", $arFields) && is_array($arFields["RIGHTS"]))
1740 $obElementRights->SetRights($arFields["RIGHTS"]);
1741 }
1742
1743 if (array_key_exists("IPROPERTY_TEMPLATES", $arFields))
1744 {
1745 $ipropTemplates = new \Bitrix\Iblock\InheritedProperty\ElementTemplates($arIBlock["ID"], $ID);
1746 $ipropTemplates->set($arFields["IPROPERTY_TEMPLATES"]);
1747 }
1748
1749 if ($bUpdateSearch)
1750 {
1751 if ($this->searchIncluded)
1752 {
1754 }
1755 }
1756
1758
1759 if($bWorkFlow)
1760 {
1762 }
1763
1764 //Restore saved values
1765 if($SAVED_PREVIEW_PICTURE !== false)
1766 {
1767 $arFields["PREVIEW_PICTURE_ID"] = ($arFields["PREVIEW_PICTURE"] ?? null);
1768 $arFields["PREVIEW_PICTURE"] = $SAVED_PREVIEW_PICTURE;
1769 }
1770 else
1771 {
1772 unset($arFields["PREVIEW_PICTURE"]);
1773 }
1774
1775 if($SAVED_DETAIL_PICTURE !== false)
1776 {
1777 $arFields["DETAIL_PICTURE_ID"] = ($arFields["DETAIL_PICTURE"] ?? null);
1778 $arFields["DETAIL_PICTURE"] = $SAVED_DETAIL_PICTURE;
1779 }
1780 else
1781 {
1782 unset($arFields["DETAIL_PICTURE"]);
1783 }
1784
1785 if($arIBlock["FIELDS"]["LOG_ELEMENT_EDIT"]["IS_REQUIRED"] == "Y")
1786 {
1787 $arEvents = GetModuleEvents("main", "OnBeforeEventLog", true);
1788 if(empty($arEvents) || ExecuteModuleEventEx($arEvents[0], array($this->userId))===false)
1789 {
1790 $rsElement = CIBlockElement::GetList(
1791 array(),
1792 array("=ID" => $ID, "CHECK_PERMISSIONS" => "N", "SHOW_NEW" => "Y"),
1793 false, false,
1794 array("ID", "NAME", "LIST_PAGE_URL", "CODE")
1795 );
1796 $arElement = $rsElement->GetNext();
1797 $res = array(
1798 "ID" => $ID,
1799 "CODE" => $arElement["CODE"],
1800 "NAME" => $arElement["NAME"],
1801 "ELEMENT_NAME" => $arIBlock["ELEMENT_NAME"],
1802 "USER_ID" => $this->userId,
1803 "IBLOCK_PAGE_URL" => $arElement["LIST_PAGE_URL"],
1804 );
1806 "IBLOCK",
1807 "IBLOCK_ELEMENT_EDIT",
1808 "iblock",
1809 $arIBlock["ID"],
1810 serialize($res)
1811 );
1812 }
1813 }
1814
1816
1817 $Result = true;
1818
1819 /************* QUOTA *************/
1821 /************* QUOTA *************/
1822 }
1823
1824 $arFields["ID"] = $ID;
1825 $arFields["IBLOCK_ID"] = $ar_element["IBLOCK_ID"];
1826 $arFields["RESULT"] = &$Result;
1827
1828 if(
1829 isset($arFields["PREVIEW_PICTURE"])
1830 && is_array($arFields["PREVIEW_PICTURE"])
1831 && ($arFields["PREVIEW_PICTURE"]["COPY_FILE"] ?? '') === "Y"
1832 && ($arFields["PREVIEW_PICTURE"]["copy"] ?? null)
1833 )
1834 {
1835 @unlink($arFields["PREVIEW_PICTURE"]["tmp_name"]);
1836 @rmdir(dirname($arFields["PREVIEW_PICTURE"]["tmp_name"]));
1837 }
1838
1839 if(
1840 isset($arFields["DETAIL_PICTURE"])
1841 && is_array($arFields["DETAIL_PICTURE"])
1842 && ($arFields["DETAIL_PICTURE"]["COPY_FILE"] ?? '') === "Y"
1843 && ($arFields["DETAIL_PICTURE"]["copy"] ?? null)
1844 )
1845 {
1846 @unlink($arFields["DETAIL_PICTURE"]["tmp_name"]);
1847 @rmdir(dirname($arFields["DETAIL_PICTURE"]["tmp_name"]));
1848 }
1849
1850 foreach (GetModuleEvents("iblock", "OnAfterIBlockElementUpdate", true) as $arEvent)
1852
1853 CIBlock::clearIblockTagCache($arIBlock['ID']);
1854
1855 return $Result;
1856 }
1857
1858 public static function SetPropertyValues($ELEMENT_ID, $IBLOCK_ID, $PROPERTY_VALUES, $PROPERTY_CODE = false)
1859 {
1860 global $BX_IBLOCK_PROP_CACHE;
1861
1862 $ELEMENT_ID = (int)$ELEMENT_ID;
1863 $IBLOCK_ID = (int)$IBLOCK_ID;
1864
1865 if (!is_array($PROPERTY_VALUES))
1866 $PROPERTY_VALUES = array($PROPERTY_VALUES);
1867
1868 $uniq_flt = $IBLOCK_ID;
1869 $arFilter = array(
1870 "IBLOCK_ID" => $IBLOCK_ID,
1871 "CHECK_PERMISSIONS" => "N",
1872 );
1873
1874 if ($PROPERTY_CODE === false)
1875 {
1876 $arFilter["ACTIVE"] = "Y";
1877 $uniq_flt .= "|ACTIVE:".$arFilter["ACTIVE"];
1878 }
1879 elseif((int)$PROPERTY_CODE > 0)
1880 {
1881 $arFilter["ID"] = (int)$PROPERTY_CODE;
1882 $uniq_flt .= "|ID:".$arFilter["ID"];
1883 }
1884 else
1885 {
1886 $arFilter["CODE"] = $PROPERTY_CODE;
1887 $uniq_flt .= "|CODE:".$arFilter["CODE"];
1888 }
1889
1890 if (!isset($BX_IBLOCK_PROP_CACHE[$IBLOCK_ID]))
1892
1893 if (!isset($BX_IBLOCK_PROP_CACHE[$IBLOCK_ID][$uniq_flt]))
1894 {
1895 $BX_IBLOCK_PROP_CACHE[$IBLOCK_ID][$uniq_flt] = array();
1896
1897 $db_prop = CIBlockProperty::GetList(array(), $arFilter);
1898 while($prop = $db_prop->Fetch())
1899 $BX_IBLOCK_PROP_CACHE[$IBLOCK_ID][$uniq_flt][$prop["ID"]] = $prop;
1900 unset($prop);
1901 unset($db_prop);
1902 }
1903
1904 $ar_prop = &$BX_IBLOCK_PROP_CACHE[$IBLOCK_ID][$uniq_flt];
1905 reset($ar_prop);
1906
1907 $bRecalcSections = false;
1908
1910 $helper = $connection->getSqlHelper();
1911
1912 //Read current property values from database
1913 $tableFields = [];
1914 $arDBProps = array();
1915 if ((int)CIBlock::GetArrayByID($IBLOCK_ID, 'VERSION') === IblockTable::PROPERTY_STORAGE_SEPARATE)
1916 {
1917 $tableFields = $connection->getTableFields('b_iblock_element_prop_s' . $IBLOCK_ID);
1918
1919 $rs = $connection->query("
1920 select *
1921 from b_iblock_element_prop_m".$IBLOCK_ID."
1922 where IBLOCK_ELEMENT_ID = ".$ELEMENT_ID."
1923 order by ID asc
1924 ");
1925 while ($ar = $rs->fetch())
1926 {
1927 $propertyId = (int)$ar["IBLOCK_PROPERTY_ID"];
1928 if (!isset($arDBProps[$propertyId]))
1929 {
1930 $arDBProps[$propertyId] = [];
1931 }
1932
1933 $arDBProps[$propertyId][$ar["ID"]] = $ar;
1934 }
1935 unset($ar);
1936 unset($rs);
1937
1938 $rs = $connection->query("
1939 select *
1940 from b_iblock_element_prop_s".$IBLOCK_ID."
1941 where IBLOCK_ELEMENT_ID = ".$ELEMENT_ID."
1942 ");
1943 $ar = $rs->fetch();
1944 if ($ar)
1945 {
1946 foreach ($ar_prop as $property)
1947 {
1948 $propertyId = (int)$property["ID"];
1949 $valueKey = 'PROPERTY_' . $propertyId;
1950 $valueIdKey = $ELEMENT_ID .':' . $propertyId;
1951 if (
1952 $property["MULTIPLE"] === "N"
1953 && isset($ar[$valueKey])
1954 && $ar[$valueKey] !== ''
1955 )
1956 {
1957 if (!isset($arDBProps[$propertyId]))
1958 {
1959 $arDBProps[$propertyId] = [];
1960 }
1961
1962 $arDBProps[$propertyId][$valueIdKey] = [
1963 'ID' => $valueIdKey,
1964 'IBLOCK_PROPERTY_ID' => $propertyId,
1965 'VALUE' => $ar[$valueKey],
1966 'DESCRIPTION' => $ar['DESCRIPTION_' . $propertyId] ?? '',
1967 ];
1968 }
1969 }
1970 unset($property);
1971 }
1972 else
1973 {
1974 $connection->queryExecute("
1975 insert into b_iblock_element_prop_s".$IBLOCK_ID."
1976 (IBLOCK_ELEMENT_ID) values (".$ELEMENT_ID.")
1977 ");
1978 }
1979 unset($ar);
1980 unset($rs);
1981 }
1982 else
1983 {
1984 $rs = $connection->query("
1985 select *
1986 from b_iblock_element_property
1987 where IBLOCK_ELEMENT_ID = ".$ELEMENT_ID."
1988 order by ID asc
1989 ");
1990 while ($ar = $rs->fetch())
1991 {
1992 $propertyId = (int)$ar["IBLOCK_PROPERTY_ID"];
1993 if (!isset($arDBProps[$propertyId]))
1994 {
1995 $arDBProps[$propertyId] = [];
1996 }
1997
1998 $arDBProps[$propertyId][$ar["ID"]] = $ar;
1999 }
2000 unset($ar);
2001 unset($rs);
2002 }
2003
2004 foreach (GetModuleEvents("iblock", "OnIBlockElementSetPropertyValues", true) as $arEvent)
2005 ExecuteModuleEventEx($arEvent, array($ELEMENT_ID, $IBLOCK_ID, $PROPERTY_VALUES, $PROPERTY_CODE, $ar_prop, $arDBProps));
2006 if (isset($arEvent))
2007 unset($arEvent);
2008
2009 $arFilesToDelete = array();
2010 $arV2ClearCache = array();
2011 foreach ($ar_prop as $prop)
2012 {
2013 $propertyId = (int)$prop['ID'];
2014 $isMultiple = $prop['MULTIPLE'] === 'Y';
2015 $isSingle = !$isMultiple;
2016 $separateStorage = (int)$prop['VERSION'] === IblockTable::PROPERTY_STORAGE_SEPARATE;
2017 $separateSingle = $separateStorage && !$isMultiple;
2018 $separateMultiple = $separateStorage && $isMultiple;
2019 $clearSeparateCache = false;
2020 if ($PROPERTY_CODE)
2021 {
2022 $PROP = $PROPERTY_VALUES;
2023 }
2024 else
2025 {
2026 if ($prop["CODE"] <> '' && array_key_exists($prop["CODE"], $PROPERTY_VALUES))
2027 $PROP = $PROPERTY_VALUES[$prop["CODE"]];
2028 else
2029 $PROP = $PROPERTY_VALUES[$prop["ID"]] ?? [];
2030 }
2031
2032 if (
2033 !is_array($PROP)
2034 || (
2035 $prop['PROPERTY_TYPE'] === Iblock\PropertyTable::TYPE_FILE
2036 && (
2037 array_key_exists("tmp_name", $PROP)
2038 || array_key_exists("del", $PROP)
2039 )
2040 )
2041 || (
2042 count($PROP) == 2
2043 && array_key_exists("VALUE", $PROP)
2044 && array_key_exists("DESCRIPTION", $PROP)
2045 )
2046 )
2047 {
2048 $PROP = array($PROP);
2049 }
2050
2051 if ($prop["USER_TYPE"] != "")
2052 {
2053 $arUserType = CIBlockProperty::GetUserType($prop["USER_TYPE"]);
2054 if (isset($arUserType['ConvertToDB']))
2055 {
2056 foreach ($PROP as $key => $value)
2057 {
2058 if(
2059 !is_array($value)
2060 || !array_key_exists("VALUE", $value)
2061 )
2062 {
2063 $value = array("VALUE"=>$value);
2064 }
2065 $prop["ELEMENT_ID"] = $ELEMENT_ID;
2066 $PROP[$key] = call_user_func_array($arUserType["ConvertToDB"], array($prop, $value));
2067 }
2068 }
2069 }
2070
2071 if ($separateStorage)
2072 {
2073 $strTable =
2074 $isMultiple
2075 ? 'b_iblock_element_prop_m' . $prop['IBLOCK_ID']
2076 : 'b_iblock_element_prop_s' . $prop['IBLOCK_ID']
2077 ;
2078 }
2079 else
2080 {
2081 $strTable = 'b_iblock_element_property';
2082 }
2083
2084 if ($prop['PROPERTY_TYPE'] === Iblock\PropertyTable::TYPE_LIST)
2085 {
2086 if (isset($arDBProps[$propertyId]) || $separateSingle)
2087 {
2088 $connection->queryExecute(CIBlockElement::DeletePropertySQL($prop, $ELEMENT_ID));
2089 }
2090 $clearSeparateCache = true;
2091
2092 $ids = [];
2093 foreach ($PROP as $value)
2094 {
2095 if (is_array($value))
2096 $value = (int)$value["VALUE"];
2097 else
2098 $value = (int)$value;
2099
2100 if ($value <= 0)
2101 continue;
2102
2103 $ids[] = $value;
2104
2105 if ($isSingle)
2106 {
2107 break;
2108 }
2109 }
2110
2111 if (!empty($ids))
2112 {
2113 $flatIds = implode(',', $ids);
2114 if ($separateSingle)
2115 {
2116 $connection->queryExecute($helper->prepareCorrelatedUpdate(
2117 'b_iblock_element_prop_s' . $prop['IBLOCK_ID'],
2118 'E',
2119 [
2120 'PROPERTY_' . $prop['ID'] => 'PEN.ID',
2121 ],
2122 'b_iblock_property_enum as PEN',
2123 "
2124 E.IBLOCK_ELEMENT_ID = " . $ELEMENT_ID."
2125 AND PEN.PROPERTY_ID = " . $propertyId . "
2126 AND PEN.ID IN (" . $flatIds . ")
2127 "
2128 ));
2129 }
2130 else
2131 {
2132 $connection->queryExecute("
2133 INSERT INTO " . $strTable . "
2134 (IBLOCK_ELEMENT_ID, IBLOCK_PROPERTY_ID, VALUE, VALUE_ENUM)
2135 SELECT " . $ELEMENT_ID . " as IBLOCK_ELEMENT_ID, " . $propertyId . " as IBLOCK_PROPERTY_ID, PEN.ID as VALUE, PEN.ID as VALUE_ENUM
2136 FROM
2137 b_iblock_property_enum PEN
2138 WHERE
2139 PEN.PROPERTY_ID = " . $propertyId . "
2140 AND PEN.ID IN (" . $flatIds . ")
2141 ");
2142 }
2143 unset($flatIds);
2144 }
2145 unset($ids);
2146 }
2147 elseif ($prop['PROPERTY_TYPE'] === Iblock\PropertyTable::TYPE_SECTION)
2148 {
2149 $bRecalcSections = true;
2150 if (isset($arDBProps[$propertyId]) || $separateSingle)
2151 {
2152 $connection->queryExecute(CIBlockElement::DeletePropertySQL($prop, $ELEMENT_ID));
2153 }
2154 $clearSeparateCache = true;
2155
2156 $connection->queryExecute("
2157 DELETE FROM b_iblock_section_element
2158 WHERE ADDITIONAL_PROPERTY_ID = ".$prop["ID"]."
2159 AND IBLOCK_ELEMENT_ID = ".$ELEMENT_ID."
2160 ");
2161
2162 $ids = [];
2163 foreach ($PROP as $value)
2164 {
2165 if (is_array($value))
2166 $value = (int)$value["VALUE"];
2167 else
2168 $value = (int)$value;
2169
2170 if ($value <= 0)
2171 continue;
2172
2173 $ids[] = $value;
2174
2175 if ($isSingle)
2176 {
2177 break;
2178 }
2179 }
2180
2181 if (!empty($ids))
2182 {
2183 $linkIblockId = (int)$prop['LINK_IBLOCK_ID'];
2184 $flatIds = implode(',', $ids);
2185 if ($separateSingle)
2186 {
2187 $fields = [
2188 'PROPERTY_' . $prop['ID'] => 'S.ID',
2189 ];
2190 $fieldName = 'DESCRIPTION_' . $prop['ID'];
2191 if (isset($tableFields[$fieldName]))
2192 {
2193 $fields[$fieldName] = 'null';
2194 }
2195 unset($fieldName);
2196
2197 $connection->queryExecute($helper->prepareCorrelatedUpdate(
2198 'b_iblock_element_prop_s' . $prop['IBLOCK_ID'],
2199 'E',
2200 $fields,
2201 'b_iblock_section as S',
2202 "
2203 E.IBLOCK_ELEMENT_ID = " . $ELEMENT_ID . "
2204 AND S.ID IN (". $flatIds . ")"
2205 . ($linkIblockId > 0 ? 'AND S.IBLOCK_ID = ' . $linkIblockId : '') . "
2206 "
2207 ));
2208 unset($fields);
2209 }
2210 else
2211 {
2212 $connection->queryExecute("
2213 INSERT INTO " . $strTable . "
2214 (IBLOCK_ELEMENT_ID, IBLOCK_PROPERTY_ID, VALUE, VALUE_NUM)
2215 SELECT " . $ELEMENT_ID .", " . $propertyId . ", S.ID, S.ID
2216 FROM
2217 b_iblock_section S
2218 WHERE
2219 S.ID IN (" . $flatIds . ")"
2220 . ($linkIblockId > 0 ? 'AND S.IBLOCK_ID = ' . $linkIblockId : '') . "
2221 ");
2222 }
2223
2224 $connection->queryExecute("
2225 INSERT INTO b_iblock_section_element
2226 (IBLOCK_ELEMENT_ID, IBLOCK_SECTION_ID, ADDITIONAL_PROPERTY_ID)
2227 SELECT " . $ELEMENT_ID . ", S.ID, " . $propertyId . "
2228 FROM
2229 b_iblock_section S
2230 WHERE
2231 S.ID IN (" . $flatIds . ")"
2232 . ($linkIblockId > 0 ? 'AND S.IBLOCK_ID = ' . $linkIblockId : '') . "
2233 ");
2234 unset(
2235 $flatIds,
2236 $linkIblockId,
2237 );
2238 }
2239 unset($ids);
2240 }
2241 elseif ($prop['PROPERTY_TYPE'] === Iblock\PropertyTable::TYPE_ELEMENT)
2242 {
2243 $arWas = array();
2244 if (isset($arDBProps[$prop["ID"]]))
2245 {
2246 foreach($arDBProps[$prop["ID"]] as $res)
2247 {
2248 $val = $PROP[$res["ID"]] ?? null;
2249 if (is_array($val))
2250 {
2251 $val_desc = $val["DESCRIPTION"] ?? '';
2252 $val = $val["VALUE"];
2253 }
2254 else
2255 {
2256 $val_desc = false;
2257 }
2258
2259 if (isset($arWas[$val]))
2260 $val = "";
2261 else
2262 $arWas[$val] = true;
2263
2264 if ((string)$val === '') //Delete property value
2265 {
2266 if ($separateSingle)
2267 {
2268 $connection->queryExecute("
2269 UPDATE b_iblock_element_prop_s".$prop["IBLOCK_ID"]."
2270 SET PROPERTY_".$prop["ID"]." = null
2271 ".self::__GetDescriptionUpdateSql($prop["IBLOCK_ID"], $prop["ID"])."
2272 WHERE IBLOCK_ELEMENT_ID = ".$ELEMENT_ID."
2273 ");
2274 }
2275 else
2276 {
2277 $connection->queryExecute("
2278 DELETE FROM ".$strTable."
2279 WHERE ID=".$res["ID"]."
2280 ");
2281 }
2282
2283 $clearSeparateCache = true;
2284 }
2285 elseif (
2286 $res["VALUE"] !== $val
2287 || $res["DESCRIPTION"].'' !== $val_desc.''
2288 ) //Update property value
2289 {
2290 if ($separateSingle)
2291 {
2292 $connection->queryExecute("
2293 UPDATE b_iblock_element_prop_s".$prop["IBLOCK_ID"]."
2294 SET PROPERTY_".$prop["ID"]." = '".$helper->forSql($val)."'
2295 ".self::__GetDescriptionUpdateSql($prop["IBLOCK_ID"], $prop["ID"], $val_desc)."
2296 WHERE IBLOCK_ELEMENT_ID = ".$ELEMENT_ID."
2297 ");
2298 }
2299 else
2300 {
2301 $connection->queryExecute("
2302 UPDATE ".$strTable."
2303 SET VALUE = '".$helper->forSql($val)."'
2304 ,VALUE_NUM = ".CIBlock::roundDB($val)."
2305 ".($val_desc!==false ? ",DESCRIPTION = '".$helper->forSql($val_desc, 255)."'" : "")."
2306 WHERE ID=".$res["ID"]."
2307 ");
2308 }
2309
2310 $clearSeparateCache = true;
2311 }
2312
2313 unset($PROP[$res["ID"]]);
2314 } //foreach($arDBProps[$prop["ID"]] as $res)
2315 }
2316
2317 $insertValues = [];
2318 foreach ($PROP as $val)
2319 {
2320 if (is_array($val))
2321 {
2322 $val_desc = $val["DESCRIPTION"] ?? '';
2323 $val = $val["VALUE"];
2324 }
2325 else
2326 {
2327 $val_desc = false;
2328 }
2329
2330 if (isset($arWas[$val]))
2331 $val = "";
2332 else
2333 $arWas[$val] = true;
2334
2335 if ((string)$val === '')
2336 {
2337 continue;
2338 }
2339
2340 if ($separateSingle)
2341 {
2342 $connection->queryExecute("
2343 UPDATE b_iblock_element_prop_s".$prop["IBLOCK_ID"]."
2344 SET
2345 PROPERTY_".$prop["ID"]." = '".$helper->forSql($val)."'
2346 ".self::__GetDescriptionUpdateSql($prop["IBLOCK_ID"], $prop["ID"], $val_desc)."
2347 WHERE IBLOCK_ELEMENT_ID=".$ELEMENT_ID."
2348 ");
2349 }
2350 else
2351 {
2352 $insertValues[] =
2353 '('
2354 . $ELEMENT_ID . ', '
2355 . $propertyId . ', '
2356 . "'" . $helper->forSql((string)$val) . "', "
2357 . CIBlock::roundDB($val) . ', '
2358 . ($val_desc !== false ? "'" . $helper->forSql((string)$val_desc, 255) . "'" : 'NULL')
2359 . ')'
2360 ;
2361 }
2362
2363 $clearSeparateCache = true;
2364
2365 if ($isSingle)
2366 {
2367 break;
2368 }
2369 } //foreach($PROP as $value)
2370 if (!empty($insertValues))
2371 {
2372 $connection->queryExecute("
2373 INSERT INTO " . $strTable . "
2374 (IBLOCK_ELEMENT_ID, IBLOCK_PROPERTY_ID, VALUE, VALUE_NUM, DESCRIPTION)
2375 VALUES
2376 " . implode(', ', $insertValues)
2377 );
2378 }
2379 unset(
2380 $insertValues,
2381 );
2382 }
2383 elseif ($prop['PROPERTY_TYPE'] === Iblock\PropertyTable::TYPE_FILE)
2384 {
2385 //We'll be adding values from the database into the head
2386 //for multiple values and into tje tail for single
2387 //these values were not passed into API call.
2388 $orderedPROP =
2389 $isMultiple
2390 ? array_reverse($PROP, true)
2391 : $PROP
2392 ;
2393
2394 if (isset($arDBProps[$prop["ID"]]))
2395 {
2396 //Go from high ID to low
2397 foreach (array_reverse($arDBProps[$prop["ID"]], true) as $res)
2398 {
2399 //Preserve description from database
2400 if($res["DESCRIPTION"] <> '')
2401 {
2402 $description = $res["DESCRIPTION"];
2403 }
2404 else
2405 {
2406 $description = false;
2407 }
2408
2409 if (!array_key_exists($res["ID"], $orderedPROP))
2410 {
2411 $orderedPROP[$res["ID"]] = array(
2412 "VALUE" => $res["VALUE"],
2413 "DESCRIPTION" => $description,
2414 );
2415 }
2416 else
2417 {
2418 $val = $orderedPROP[$res["ID"]];
2419 if (
2420 is_array($val)
2421 && !array_key_exists("tmp_name", $val)
2422 && !array_key_exists("del", $val)
2423 )
2424 $val = $val["VALUE"];
2425
2426 //Check if no new file and no delete command
2427 if (
2428 (!isset($val["tmp_name"]) || $val["tmp_name"] === '')
2429 && (!isset($val["del"]) || $val["del"] === '')
2430 ) //Overwrite with database value
2431 {
2432 //But save description from incoming value
2433 if (is_array($val) && array_key_exists("description", $val))
2434 {
2435 $description = trim((string)$val["description"]);
2436 }
2437 elseif (
2438 is_array($orderedPROP[$res["ID"]])
2439 && array_key_exists("DESCRIPTION", $orderedPROP[$res["ID"]])
2440 )
2441 {
2442 $description = trim((string)$orderedPROP[$res["ID"]]["DESCRIPTION"]);
2443 }
2444
2445 $orderedPROP[$res["ID"]] = array(
2446 "VALUE" => $res["VALUE"],
2447 "DESCRIPTION" => $description,
2448 );
2449 }
2450 }
2451 }
2452 }
2453
2454 //Restore original order
2455 if ($isMultiple)
2456 {
2457 $orderedPROP = array_reverse($orderedPROP, true);
2458 }
2459
2460 $preserveID = array();
2461 //Now delete from database all marked for deletion records
2462 if (isset($arDBProps[$prop["ID"]]))
2463 {
2464 foreach ($arDBProps[$prop["ID"]] as $res)
2465 {
2466 $val = $orderedPROP[$res["ID"]] ?? null;
2467 if (
2468 is_array($val)
2469 && !array_key_exists("tmp_name", $val)
2470 && !array_key_exists("del", $val)
2471 )
2472 {
2473 $val = $val["VALUE"];
2474 }
2475
2476 if (
2477 is_array($val)
2478 && (string)($val['del'] ?? '') !== ''
2479 )
2480 {
2481 unset($orderedPROP[$res["ID"]]);
2482 $arFilesToDelete[$res["VALUE"]] = array(
2483 "FILE_ID" => $res["VALUE"],
2484 "ELEMENT_ID" => $ELEMENT_ID,
2485 "IBLOCK_ID" => $prop["IBLOCK_ID"],
2486 );
2487 }
2488 elseif (
2489 $isSingle
2490 || (
2491 is_array($val) && isset($val["tmp_name"]) && $val["tmp_name"] != ''
2492 )
2493 )
2494 {
2495 //Delete all stored in database for replacement.
2496 $arFilesToDelete[$res["VALUE"]] = array(
2497 "FILE_ID" => $res["VALUE"],
2498 "ELEMENT_ID" => $ELEMENT_ID,
2499 "IBLOCK_ID" => $prop["IBLOCK_ID"],
2500 );
2501 }
2502
2503 if ($separateSingle)
2504 {
2505 $connection->queryExecute("
2506 UPDATE b_iblock_element_prop_s".$prop["IBLOCK_ID"]."
2507 SET PROPERTY_".$prop["ID"]." = null
2508 ".self::__GetDescriptionUpdateSql($prop["IBLOCK_ID"], $prop["ID"])."
2509 WHERE IBLOCK_ELEMENT_ID = ".$ELEMENT_ID."
2510 ");
2511 }
2512 else
2513 {
2514 $connection->queryExecute("DELETE FROM ".$strTable." WHERE ID = ".$res["ID"]);
2515 $preserveID[$res["ID"]] = $res["ID"];
2516 }
2517
2518 $clearSeparateCache = true;
2519 } //foreach($arDBProps[$prop["ID"]] as $res)
2520 }
2521
2522 //Write new values into database in specified order
2523 foreach ($orderedPROP as $propertyValueId => $val)
2524 {
2525 if(
2526 is_array($val)
2527 && !array_key_exists("tmp_name", $val)
2528 )
2529 {
2530 $val_desc = $val["DESCRIPTION"] ?? '';
2531 $val = $val["VALUE"];
2532 }
2533 else
2534 {
2535 $val_desc = false;
2536 }
2537
2538 if (is_array($val))
2539 {
2540 $val["MODULE_ID"] = "iblock";
2541 if ($val_desc !== false)
2542 $val["description"] = $val_desc;
2543
2544 $val = CFile::SaveFile($val, "iblock");
2545 }
2546 elseif (
2547 $val > 0
2548 && $val_desc !== false
2549 )
2550 {
2551 CFile::UpdateDesc($val, $val_desc);
2552 }
2553
2554 if ((int)$val <= 0)
2555 continue;
2556
2557 if ($separateSingle)
2558 {
2559 $connection->queryExecute("
2560 UPDATE b_iblock_element_prop_s".$prop["IBLOCK_ID"]."
2561 SET
2562 PROPERTY_".$prop["ID"]." = '".$helper->forSql($val)."'
2563 ".self::__GetDescriptionUpdateSql($prop["IBLOCK_ID"], $prop["ID"], $val_desc)."
2564 WHERE IBLOCK_ELEMENT_ID=".$ELEMENT_ID."
2565 ");
2566 }
2567 elseif ($preserveID)
2568 {
2569 $connection->queryExecute("
2570 INSERT INTO " . $strTable . "
2571 (ID, IBLOCK_ELEMENT_ID, IBLOCK_PROPERTY_ID, VALUE, VALUE_NUM" . ($val_desc !== false ? ", DESCRIPTION" : "") . ")
2572 VALUES (
2573 " . array_shift($preserveID) . "
2574 , " . $ELEMENT_ID . "
2575 , " . $propertyId . "
2576 ,'" . $helper->forSql((string)$val) . "'
2577 ," . CIBlock::roundDB($val) . "
2578 " . ($val_desc !== false ? ", '" . $helper->forSql((string)$val_desc, 255) . "'" : "") . "
2579 )
2580 ");
2581 }
2582 else
2583 {
2584 $connection->queryExecute("
2585 INSERT INTO " . $strTable . "
2586 (IBLOCK_ELEMENT_ID, IBLOCK_PROPERTY_ID, VALUE, VALUE_NUM" . ($val_desc !== false ? ", DESCRIPTION" : "") . ")
2587 VALUES (
2588 " . $ELEMENT_ID . "
2589 , " . $propertyId . "
2590 , '" . $helper->forSql((string)$val) . "'
2591 , " . CIBlock::roundDB($val) ."
2592 " . ($val_desc !== false ? ", '" . $helper->forSql((string)$val_desc, 255) . "'" : "") . "
2593 )
2594 ");
2595 }
2596
2597 $clearSeparateCache = true;
2598
2599 if ($isSingle)
2600 {
2601 break;
2602 }
2603 } //foreach($PROP as $value)
2604 }
2605 else //if($prop["PROPERTY_TYPE"] == "S" || $prop["PROPERTY_TYPE"] == "N")
2606 {
2607 $isNumberProperty = $prop['PROPERTY_TYPE'] === Iblock\PropertyTable::TYPE_NUMBER;
2608 if (isset($arDBProps[$prop["ID"]]))
2609 {
2610 foreach ($arDBProps[$prop["ID"]] as $res)
2611 {
2612 $val = $PROP[$res["ID"]] ?? null;
2613 if (is_array($val))
2614 {
2615 $val_desc = $val["DESCRIPTION"] ?? '';
2616 $val = $val["VALUE"];
2617 }
2618 else
2619 {
2620 $val_desc = false;
2621 }
2622
2623 if ((string)$val === '')
2624 {
2625 if ($separateSingle)
2626 {
2627 $connection->queryExecute("
2628 UPDATE b_iblock_element_prop_s".$prop["IBLOCK_ID"]."
2629 SET
2630 PROPERTY_".$prop["ID"]." = null
2631 ".self::__GetDescriptionUpdateSql($prop["IBLOCK_ID"], $prop["ID"])."
2632 WHERE IBLOCK_ELEMENT_ID=".$ELEMENT_ID."
2633 ");
2634 }
2635 else
2636 {
2637 $connection->queryExecute("DELETE FROM ".$strTable." WHERE ID=".$res["ID"]);
2638 }
2639
2640 $clearSeparateCache = true;
2641 }
2642 else
2643 {
2644 if ($separateSingle)
2645 {
2646 if ($isNumberProperty)
2647 {
2648 $val = CIBlock::roundDB($val);
2649 }
2650
2651 $connection->queryExecute("
2652 UPDATE b_iblock_element_prop_s".$prop["IBLOCK_ID"]."
2653 SET PROPERTY_".$prop["ID"]."='".$helper->forSql($val)."'
2654 ".self::__GetDescriptionUpdateSql($prop["IBLOCK_ID"], $prop["ID"], $val_desc)."
2655 WHERE IBLOCK_ELEMENT_ID=".$ELEMENT_ID."
2656 ");
2657 }
2658 else
2659 {
2660 $connection->queryExecute("
2661 UPDATE ".$strTable."
2662 SET
2663 VALUE='".$helper->forSql($val)."'
2664 ,VALUE_NUM=".CIBlock::roundDB($val)."
2665 ".($val_desc!==false ? ",DESCRIPTION='".$helper->forSql($val_desc, 255)."'" : "")."
2666 WHERE ID=".$res["ID"]."
2667 ");
2668 }
2669
2670 $clearSeparateCache = true;
2671 }
2672 unset($PROP[$res["ID"]]);
2673 } //foreach ($arDBProps[$prop["ID"]] as $res)
2674 }
2675
2676 $insertValues = [];
2677 foreach($PROP as $val)
2678 {
2679 if (is_array($val) && !array_key_exists('tmp_name', $val))
2680 {
2681 $val_desc = $val["DESCRIPTION"] ?? '';
2682 $val = $val["VALUE"];
2683 }
2684 else
2685 {
2686 $val_desc = false;
2687 }
2688
2689 if (!is_scalar($val) || (string)$val === '')
2690 {
2691 continue;
2692 }
2693
2694 if ($separateSingle)
2695 {
2696 if ($isNumberProperty)
2697 {
2698 $val = CIBlock::roundDB($val);
2699 }
2700
2701 $connection->queryExecute("
2702 UPDATE b_iblock_element_prop_s".$prop["IBLOCK_ID"]."
2703 SET
2704 PROPERTY_".$prop["ID"]." = '".$helper->forSql($val)."'
2705 ".self::__GetDescriptionUpdateSql($prop["IBLOCK_ID"], $prop["ID"], $val_desc)."
2706 WHERE IBLOCK_ELEMENT_ID=".$ELEMENT_ID."
2707 ");
2708 }
2709 else
2710 {
2711 $insertValues[] =
2712 '('
2713 . $ELEMENT_ID . ', '
2714 . $propertyId . ', '
2715 . "'" . $helper->forSql((string)$val) . "', "
2716 . CIBlock::roundDB($val) . ', '
2717 . ($val_desc !== false ? "'" . $helper->forSql((string)$val_desc, 255) . "'" : 'NULL')
2718 . ')'
2719 ;
2720 }
2721
2722 $clearSeparateCache = true;
2723
2724 if ($isSingle)
2725 {
2726 break;
2727 }
2728 } //foreach($PROP as $value)
2729 if (!empty($insertValues))
2730 {
2731 $connection->queryExecute("
2732 INSERT INTO " . $strTable . "
2733 (IBLOCK_ELEMENT_ID, IBLOCK_PROPERTY_ID, VALUE, VALUE_NUM, DESCRIPTION)
2734 VALUES
2735 " . implode(', ', $insertValues)
2736 );
2737 }
2738 unset(
2739 $insertValues,
2740 );
2741 } //if($prop["PROPERTY_TYPE"] == "S" || $prop["PROPERTY_TYPE"] == "N")
2742
2743 if ($clearSeparateCache && $separateMultiple)
2744 {
2745 $arV2ClearCache[$propertyId] =
2746 'PROPERTY_' . $propertyId . ' = NULL'
2747 . self::__GetDescriptionUpdateSql($prop["IBLOCK_ID"], $propertyId)
2748 ;
2749 }
2750 unset(
2751 $separateMultiple,
2752 $separateSingle,
2753 $separateStorage,
2754 $isMultiple,
2755 $propertyId,
2756 );
2757 }
2758
2759 unset($tableFields);
2760
2761 if ($arV2ClearCache)
2762 {
2763 $connection->queryExecute("
2764 UPDATE b_iblock_element_prop_s".$IBLOCK_ID."
2765 SET ".implode(",", $arV2ClearCache)."
2766 WHERE IBLOCK_ELEMENT_ID = ".$ELEMENT_ID."
2767 ");
2768 }
2769
2770 unset(
2771 $helper,
2773 );
2774
2775 foreach ($arFilesToDelete as $deleteTask)
2776 {
2778 $deleteTask["FILE_ID"],
2779 false,
2780 "PROPERTY", $deleteTask["ELEMENT_ID"],
2781 $deleteTask["IBLOCK_ID"]
2782 );
2783 }
2784
2785 if($bRecalcSections)
2786 CIBlockElement::RecalcSections($ELEMENT_ID);
2787
2788 /****************************** QUOTA ******************************/
2790 /****************************** QUOTA ******************************/
2791
2792 foreach (GetModuleEvents("iblock", "OnAfterIBlockElementSetPropertyValues", true) as $arEvent)
2793 ExecuteModuleEventEx($arEvent, array($ELEMENT_ID, $IBLOCK_ID, $PROPERTY_VALUES, $PROPERTY_CODE));
2794 }
2795
2796 public static function GetRandFunction()
2797 {
2799 $helper = $connection->getSqlHelper();
2800
2801 return ' ' . $helper->getRandomFunction() . ' ';
2802 }
2803
2804 public static function GetShowedFunction()
2805 {
2806 return " coalesce(BE.SHOW_COUNTER/((UNIX_TIMESTAMP(now())-UNIX_TIMESTAMP(BE.SHOW_COUNTER_START)+0.1)/60/60),0) ";
2807 }
2808
2810 // Update list of elements w/o any events
2812 protected function UpdateList($arFields, $arFilter = array())
2813 {
2814 global $DB;
2815
2816 $strUpdate = $DB->PrepareUpdate("b_iblock_element", $arFields, "iblock", false, "BE");
2817 if ($strUpdate == "")
2818 return false;
2819
2820 $element = new CIBlockElement;
2821 $element->strField = "ID";
2822 $element->GetList(array(), $arFilter, false, false, array("ID"));
2823
2824 $strSql = "
2825 UPDATE ".$element->sFrom." SET ".$strUpdate."
2826 WHERE 1=1 ".$element->sWhere."
2827 ";
2828
2829 return $DB->Query($strSql);
2830 }
2831
2832 private static function getUserNameSql(string $tableAlias): string
2833 {
2835 $helper = $connection->getSqlHelper();
2836
2837 return $helper->getConcatFunction(
2838 "'('",
2839 $tableAlias . '.LOGIN',
2840 "') '",
2841 $helper->getIsNullFunction($tableAlias . '.NAME', "''"),
2842 "' '",
2843 $helper->getIsNullFunction($tableAlias . '.LAST_NAME', "''")
2844 );
2845 }
2846}
$currentPermission
Определения access_edit.php:117
$connection
Определения actionsdefinitions.php:38
if($canUseYandexMarket) $strWarning
Определения options.php:74
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
static update(int $iblockId, int $elementId, array $searchIndexParams)
Определения FullText.php:115
const RIGHTS_EXTENDED
Определения iblocktable.php:88
const PROPERTY_STORAGE_SEPARATE
Определения iblocktable.php:85
const RIGHTS_SIMPLE
Определения iblocktable.php:87
static updateElementIndex($iblockId, $elementId)
Определения manager.php:264
const TYPE_ELEMENT
Определения propertytable.php:68
const TYPE_FILE
Определения propertytable.php:67
const TYPE_LIST
Определения propertytable.php:70
const TYPE_SECTION
Определения propertytable.php:69
const TYPE_NUMBER
Определения propertytable.php:66
static getTableName()
Определения propertytable.php:102
static makeFileName(\Bitrix\Iblock\InheritedProperty\BaseTemplate $ipropTemplates, string $templateName, array $fields, array $file)
Определения helper.php:136
static getConnection($name="")
Определения application.php:638
Определения loader.php:13
static includeModule($moduleName)
Определения loader.php:67
static cleanCache()
Определения datamanager.php:1983
static GetElementGroups($ID, $bElementOnly=false, $arSelect=array())
Определения iblockelement.php:5618
static WF_CleanUpHistoryCopies($ELEMENT_ID=false, $HISTORY_COPIES=false)
Определения iblockelement.php:506
$sGroupBy
Определения iblockelement.php:56
CheckFields(&$arFields, $ID=false, $bCheckDiskQuota=true)
Определения iblockelement.php:4991
$sSelect
Определения iblockelement.php:53
WF_SetMove($NEW_ID, $OLD_ID=0)
Определения iblockelement.php:283
static WF_GetLast($ID)
Определения iblockelement.php:568
string $countFrom
Определения iblockelement.php:58
static DeleteFile($FILE_ID, $ELEMENT_ID, $TYPE=false, $PARENT_ID=-1, $IBLOCK_ID=false, $bCheckOnly=false)
Определения iblockelement.php:4500
static GetByID($ID)
Определения iblockelement.php:4919
static RecalcSections($ID, $sectionId=null)
Определения iblockelement.php:5731
getSearchableContent(int $id, array $fields, array $iblock)
Определения iblockelement.php:8137
PrepareGetList(&$arIblockElementFields, &$arJoinProps, &$arSelectFields, &$sSelect, &$arAddSelectFields, &$arFilter, &$sWhere, &$sSectionWhere, &$arAddWhereFields, &$arGroupBy, &$sGroupBy, &$arOrder, &$arSqlOrder, &$arAddOrderByFields)
Определения iblockelement.php:3284
$arFilter
Определения iblockelement.php:40
static SetElementSection($ID, $arSections, $bNew=false, $bRightsIBlock=0, $sectionId=null)
Определения iblockelement.php:5847
Add($arFields, $bWorkFlow=false, $bUpdateSearch=true, $bResizePictures=false)
Определения iblockelement.php:3895
static DeletePropertySQL($property, $iblock_element_id)
Определения iblockelement.php:7181
$sOrderBy
Определения iblockelement.php:57
static GetProperty($IBLOCK_ID, $ELEMENT_ID, $by="sort", $order="asc", $arFilter=Array())
Определения iblockelement.php:6924
static UpdateSearch($ID, $bOverWrite=false)
Определения iblockelement.php:6020
$sWhere
Определения iblockelement.php:55
static GetOptionString($module_id, $name, $def="", $site=false)
Определения pageoption.php:10
Определения dbresult.php:88
static recalculateDb(bool $mode=true)
Определения quota.php:29
static Log($SEVERITY, $AUDIT_TYPE_ID, $MODULE_ID, $ITEM_ID, $DESCRIPTION=false, $SITE_ID=false)
Определения event_log.php:32
Определения iblockelement.php:9
static GetShowedFunction()
Определения iblockelement.php:2804
Update($ID, $arFields, $bWorkFlow=false, $bUpdateSearch=true, $bResizePictures=false, $bCheckDiskQuota=true)
Определения iblockelement.php:889
static GetList($arOrder=array("SORT"=>"ASC"), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
Определения iblockelement.php:658
static SetPropertyValues($ELEMENT_ID, $IBLOCK_ID, $PROPERTY_VALUES, $PROPERTY_CODE=false)
Определения iblockelement.php:1858
static GetRandFunction()
Определения iblockelement.php:2796
UpdateList($arFields, $arFilter=array())
Определения iblockelement.php:2812
prepareSql($arSelectFields=array(), $arFilter=array(), $arGroupBy=false, $arOrder=array("SORT"=>"ASC"))
Определения iblockelement.php:10
Определения iblockresult.php:3
static makeQuery(array $parameters, array $options=[])
Определения querybuilder.php:76
static makeFilter(array $filter, array $options=[])
Определения querybuilder.php:56
$arFields
Определения dblapprove.php:5
</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
if($ajaxMode) $ID
Определения get_user.php:27
$p
Определения group_list_element_edit.php:23
if(Loader::includeModule( 'bitrix24')) elseif(Loader::includeModule('intranet') &&CIntranetUtils::getPortalZone() !=='ru') $description
Определения .description.php:24
$uid
Определения hot_keys_act.php:8
global $BX_IBLOCK_PROP_CACHE
Определения iblockelement.php:17
if(! $catalogEdit->isSuccess()) $iblock
Определения iblock_catalog_edit.php:38
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
global $DB
Определения cron_frame.php:29
$IBLOCK_ID
Определения csv_new_run.php:168
CheckDirPath($path)
Определения tools.php:2707
ExecuteModuleEventEx($arEvent, $arParams=[])
Определения tools.php:5214
HTMLToTxt($str, $strSiteUrl="", $aDelete=[], $maxlen=70)
Определения tools.php:2587
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
Определения tools.php:5177
Rel2Abs($curdir, $relpath)
Определения tools.php:3297
is_set($a, $k=false)
Определения tools.php:2133
GetMessage($name, $aReplace=null)
Определения tools.php:3397
Определения arrayresult.php:2
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$ar
Определения options.php:199
if(empty($signedUserToken)) $key
Определения quickway.php:257
$i
Определения factura.php:643
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
$props
Определения template.php:269
$val
Определения options.php:1793
$rs
Определения action.php:82
$k
Определения template_pdf.php:567
$arIBlock['PROPERTY']
Определения yandex_detail.php:172
$fields
Определения yandex_run.php:501