1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
smile.php
См. документацию.
1<?php
8
10
11IncludeModuleLangFile(__FILE__);
12
13trait OptionsHelperTrait
14{
15 protected static function setLastUpdate(): void
16 {
18 'main',
19 'smile_last_update',
20 (new DateTime())->getTimestamp()
21 );
22 }
23
27 public static function getLastUpdate(): DateTime
28 {
29 $lastUpdateTimestamp = COption::GetOptionInt(
30 'main',
31 'smile_last_update',
32 );
33
34 if (!$lastUpdateTimestamp)
35 {
36 self::setLastUpdate();
37 }
38
39 return DateTime::createFromTimestamp($lastUpdateTimestamp);
40 }
41}
42
43class CSmile
44{
45 use OptionsHelperTrait;
46
47 const TYPE_ALL = '';
48 const TYPE_SMILE = 'S';
49 const TYPE_ICON = 'I';
50 const PATH_TO_SMILE = "/upload/main/smiles/";
51 const PATH_TO_ICON = "/upload/main/icons/";
52 const CHECK_TYPE_ADD = 1;
53 const CHECK_TYPE_UPDATE = 2;
54 const GET_ALL_LANGUAGE = false;
55 const IMAGE_SD = 'SD';
56 const IMAGE_HD = 'HD';
57 const IMAGE_UHD = 'UHD';
58
59 private static function checkFields(&$arFields, $actionType = self::CHECK_TYPE_ADD)
60 {
61 global $APPLICATION;
62
63 $aMsg = array();
64
65 if(isset($arFields['TYPE']) && (!in_array($arFields['TYPE'], array(self::TYPE_SMILE, self::TYPE_ICON))))
66 $aMsg[] = array("id"=>"TYPE", "text"=> GetMessage("MAIN_SMILE_TYPE_ERROR"));
67 else if($actionType == self::CHECK_TYPE_ADD && !isset($arFields['TYPE']))
68 $arFields['TYPE'] = self::TYPE_SMILE;
69
70 if($actionType == self::CHECK_TYPE_ADD && (!isset($arFields['SET_ID']) || intval($arFields['SET_ID']) <= 0))
71 $aMsg[] = array("id"=>"SET_ID", "text"=> GetMessage("MAIN_SMILE_SET_ID_ERROR"));
72
73 if($actionType == self::CHECK_TYPE_ADD && (!isset($arFields['SORT']) || intval($arFields['SORT']) <= 0))
74 $arFields['SORT'] = 300;
75
76 if($actionType == self::CHECK_TYPE_ADD && $arFields['TYPE'] == self::TYPE_SMILE && (!isset($arFields['TYPING']) || $arFields['TYPING'] == ''))
77 $aMsg[] = array("id"=>"TYPING", "text"=> GetMessage("MAIN_SMILE_TYPING_ERROR"));
78
79 if($actionType == self::CHECK_TYPE_UPDATE && $arFields['TYPE'] == self::TYPE_SMILE && (isset($arFields['TYPING']) && $arFields['TYPING'] == ''))
80 $aMsg[] = array("id"=>"TYPING", "text"=> GetMessage("MAIN_SMILE_TYPING_ERROR"));
81
82 if(isset($arFields['CLICKABLE']) && $arFields['CLICKABLE'] != 'N')
83 $arFields['CLICKABLE'] = 'Y';
84
85 if(isset($arFields['IMAGE_DEFINITION']) && !in_array($arFields['IMAGE_DEFINITION'], Array(self::IMAGE_SD, self::IMAGE_HD, self::IMAGE_UHD)))
86 $arFields['IMAGE_DEFINITION'] = self::IMAGE_SD;
87
88 if(isset($arFields['HIDDEN']) && $arFields['HIDDEN'] != 'Y')
89 $arFields['HIDDEN'] = 'N';
90
91 if($actionType == self::CHECK_TYPE_ADD && (!isset($arFields['IMAGE']) || $arFields['IMAGE'] == ''))
92 $aMsg[] = array("id"=>"IMAGE", "text"=> GetMessage("MAIN_SMILE_IMAGE_ERROR"));
93
94 if (isset($arFields['IMAGE']) && (!in_array(mb_strtolower(GetFileExtension($arFields['IMAGE'])), Array('png', 'jpg', 'gif')) || !CBXVirtualIo::GetInstance()->ValidateFilenameString($arFields['IMAGE'])))
95 $aMsg[] = array("id"=>"IMAGE", "text"=> GetMessage("MAIN_SMILE_IMAGE_ERROR"));
96
97 if(isset($arFields['IMAGE']) && (!isset($arFields['IMAGE_WIDTH']) || intval($arFields['IMAGE_WIDTH']) <= 0))
98 $aMsg["IMAGE_XY"] = array("id"=>"IMAGE_XY", "text"=> GetMessage("MAIN_SMILE_IMAGE_XY_ERROR"));
99
100 if(isset($arFields['IMAGE']) && (!isset($arFields['IMAGE_HEIGHT']) || intval($arFields['IMAGE_HEIGHT']) <= 0))
101 $aMsg["IMAGE_XY"] = array("id"=>"IMAGE_XY", "text"=> GetMessage("MAIN_SMILE_IMAGE_XY_ERROR"));
102
103 if(!empty($aMsg))
104 {
105 $e = new CAdminException($aMsg);
106 $APPLICATION->ThrowException($e);
107 return false;
108 }
109
110 return true;
111 }
112
113 public static function add($arFields)
114 {
115 global $DB, $CACHE_MANAGER;
116
117 if (!self::checkFields($arFields, self::CHECK_TYPE_ADD))
118 return false;
119
120 $arInsert = array(
121 'TYPE' => $arFields['TYPE'],
122 'SET_ID' => intval($arFields['SET_ID']),
123 'SORT' => intval($arFields['SORT']),
124 'IMAGE' => $arFields['IMAGE'],
125 'IMAGE_WIDTH' => intval($arFields['IMAGE_WIDTH']),
126 'IMAGE_HEIGHT' => intval($arFields['IMAGE_HEIGHT']),
127 );
128
129 if (isset($arFields['IMAGE_DEFINITION']))
130 {
131 $arInsert['IMAGE_DEFINITION'] = $arFields['IMAGE_DEFINITION'];
132 if ($arInsert['IMAGE_DEFINITION'] == self::IMAGE_UHD)
133 {
134 $arInsert['IMAGE_WIDTH'] = $arInsert['IMAGE_WIDTH']/4;
135 $arInsert['IMAGE_HEIGHT'] = $arInsert['IMAGE_HEIGHT']/4;
136 }
137 else if ($arInsert['IMAGE_DEFINITION'] == self::IMAGE_HD)
138 {
139 $arInsert['IMAGE_WIDTH'] = $arInsert['IMAGE_WIDTH']/2;
140 $arInsert['IMAGE_HEIGHT'] = $arInsert['IMAGE_HEIGHT']/2;
141 }
142 }
143
144 if (isset($arFields['TYPING']))
145 $arInsert['TYPING'] = $arFields['TYPING'];
146
147 if (isset($arFields['CLICKABLE']))
148 $arInsert['CLICKABLE'] = $arFields['CLICKABLE'];
149
150 if (isset($arFields['HIDDEN']))
151 $arInsert['HIDDEN'] = $arFields['HIDDEN'];
152
153 $setId = intval($DB->Add("b_smile", $arInsert));
154
155 if ($setId && isset($arFields['LANG']))
156 {
157 $arLang = Array();
158 if (is_array($arFields['LANG']))
159 $arLang = $arFields['LANG'];
160 else
161 $arLang[LANG] = $arFields['LANG'];
162
163 foreach ($arLang as $lang => $name)
164 {
165 if (trim($name) <> '')
166 {
167 $arInsert = array(
168 'TYPE' => self::TYPE_SMILE,
169 'SID' => $setId,
170 'LID' => htmlspecialcharsbx($lang),
171 'NAME' => trim($name),
172 );
173 $DB->Add("b_smile_lang", $arInsert);
174 }
175 }
176 }
177
178 self::setLastUpdate();
179 $CACHE_MANAGER->CleanDir("b_smile");
180
181 return $setId;
182 }
183
184 public static function update($id, $arFields)
185 {
186 // TODO
187 global $DB, $CACHE_MANAGER;
188
189 $id = intval($id);
190 if (!self::checkFields($arFields, self::CHECK_TYPE_UPDATE))
191 return false;
192
193 $arUpdate = Array();
194
195 if (isset($arFields['TYPE']))
196 $arUpdate['TYPE'] = "'".$arFields['TYPE']."'";
197
198 if (isset($arFields['SET_ID']))
199 $arUpdate['SET_ID'] = intval($arFields['SET_ID']);
200
201 if (isset($arFields['SORT']))
202 $arUpdate['SORT'] = intval($arFields['SORT']);
203
204 if (isset($arFields['IMAGE']))
205 {
206 $arUpdate['IMAGE'] = "'".$DB->ForSql($arFields['IMAGE'])."'";
207 $arUpdate['IMAGE_WIDTH'] = intval($arFields['IMAGE_WIDTH']);
208 $arUpdate['IMAGE_HEIGHT'] = intval($arFields['IMAGE_HEIGHT']);
209
210 if (isset($arFields['IMAGE_DEFINITION']))
211 {
212 $arUpdate['IMAGE_DEFINITION'] = "'".$DB->ForSql($arFields['IMAGE_DEFINITION'])."'";
213 if ($arFields['IMAGE_DEFINITION'] == self::IMAGE_UHD)
214 {
215 $arUpdate['IMAGE_WIDTH'] = $arUpdate['IMAGE_WIDTH']/4;
216 $arUpdate['IMAGE_HEIGHT'] = $arUpdate['IMAGE_HEIGHT']/4;
217 }
218 else if ($arFields['IMAGE_DEFINITION'] == self::IMAGE_HD)
219 {
220 $arUpdate['IMAGE_WIDTH'] = $arUpdate['IMAGE_WIDTH']/2;
221 $arUpdate['IMAGE_HEIGHT'] = $arUpdate['IMAGE_HEIGHT']/2;
222 }
223 }
224 }
225
226 if (isset($arFields['TYPING']))
227 $arUpdate['TYPING'] = "'".$DB->ForSql($arFields['TYPING'])."'";
228
229 if (isset($arFields['CLICKABLE']))
230 $arUpdate['CLICKABLE'] = "'".$arFields['CLICKABLE']."'";
231
232 if (isset($arFields['HIDDEN']))
233 $arUpdate['HIDDEN'] = "'".$arFields['HIDDEN']."'";
234
235 if (!empty($arUpdate))
236 $DB->Update("b_smile", $arUpdate, "WHERE ID = ".intval($id));
237
238 if (isset($arFields['LANG']))
239 {
240 $arLang = Array();
241 if (is_array($arFields['LANG']))
242 $arLang = $arFields['LANG'];
243 else
244 $arLang[LANG] = $arFields['LANG'];
245
246 foreach ($arLang as $lang => $name)
247 {
248 if (trim($name) <> '')
249 {
250 $DB->Query("DELETE FROM b_smile_lang WHERE TYPE = '".self::TYPE_SMILE."' AND SID = ".$id." AND LID = '".$DB->ForSql(htmlspecialcharsbx($lang))."'", true);
251 $arInsert = array(
252 'TYPE' => self::TYPE_SMILE,
253 'SID' => $id,
254 'LID' => htmlspecialcharsbx($lang),
255 'NAME' => trim($name),
256 );
257 $DB->Add("b_smile_lang", $arInsert);
258 }
259 }
260 }
261
262 self::setLastUpdate();
263 $CACHE_MANAGER->CleanDir("b_smile");
264
265 return true;
266 }
267
268 public static function delete($id, $removeFile = true)
269 {
270 global $DB, $CACHE_MANAGER;
271
272 $id = intval($id);
273 if ($id <= 0)
274 return false;
275
276 if ($removeFile)
277 {
278 $arSmile = CSmile::getByID($id);
279 @unlink($_SERVER["DOCUMENT_ROOT"].($arSmile['TYPE'] == CSmile::TYPE_ICON? CSmile::PATH_TO_ICON: CSmile::PATH_TO_SMILE).$arSmile['SET_ID'].'/'.$arSmile['IMAGE']);
280 }
281
282 $DB->Query("DELETE FROM b_smile WHERE ID = ".$id, true);
283 $DB->Query("DELETE FROM b_smile_lang WHERE TYPE = '".self::TYPE_SMILE."' AND SID = ".$id, true);
284
285 self::setLastUpdate();
286 $CACHE_MANAGER->CleanDir("b_smile");
287
288 return true;
289 }
290
291 public static function deleteBySet($id, $removeFile = true)
292 {
293 global $DB, $CACHE_MANAGER;
294
295 $id = intval($id);
296 if ($id <= 0)
297 return false;
298
299 $arDelete = Array();
300 $arSmiles = self::getList(Array(
301 'SELECT' => Array('ID', 'SET_ID', 'TYPE', 'IMAGE'),
302 'FILTER' => Array('SET_ID' => $id),
303 ));
304 foreach ($arSmiles as $key => $arSmile)
305 {
306 $arDelete[] = intval($key);
307 }
308
309 if ($removeFile)
310 {
311 DeleteDirFilesEx(CSmile::PATH_TO_ICON.$id.'/');
312 DeleteDirFilesEx(CSmile::PATH_TO_SMILE.$id.'/');
313 }
314
315 if (!empty($arDelete))
316 {
317 $DB->Query("DELETE FROM b_smile WHERE ID IN (".implode(',', $arDelete).")", true);
318 $DB->Query("DELETE FROM b_smile_lang WHERE TYPE = '".self::TYPE_SMILE."' AND SID IN (".implode(',', $arDelete).")", true);
319
320 self::setLastUpdate();
321 $CACHE_MANAGER->CleanDir("b_smile");
322 }
323
324 return true;
325 }
326
327 public static function deleteByGallery($id, $removeFile = true)
328 {
329 global $DB, $CACHE_MANAGER;
330
331 $id = intval($id);
332 if ($id <= 0)
333 return false;
334
335 $arDelete = Array();
336 $arDir = Array();
337 $arSmiles = self::getList(Array(
338 'SELECT' => Array('ID', 'SET_ID', 'TYPE', 'IMAGE'),
339 'FILTER' => Array('PARENT_ID' => $id),
340 ));
341
342 foreach ($arSmiles as $key => $arSmile)
343 {
344 $arDelete[] = intval($key);
345 $arDir[$arSmile['SET_ID']] = ($arSmile['TYPE'] == CSmile::TYPE_ICON? CSmile::PATH_TO_ICON: CSmile::PATH_TO_SMILE).$arSmile['SET_ID'].'/';
346
347 }
348 if ($removeFile)
349 {
350 foreach ($arDir as $path)
351 {
353 }
354 }
355
356 if (!empty($arDelete))
357 {
358 $DB->Query("DELETE FROM b_smile WHERE ID IN (".implode(',', $arDelete).")", true);
359 $DB->Query("DELETE FROM b_smile_lang WHERE TYPE = '".self::TYPE_SMILE."' AND SID IN (".implode(',', $arDelete).")", true);
360
361 self::setLastUpdate();
362 $CACHE_MANAGER->CleanDir("b_smile");
363 }
364
365 return true;
366 }
367
368 public static function getById($id, $lang = LANGUAGE_ID)
369 {
370 global $DB;
371
372 $id = intval($id);
373 $arResult = Array();
374
375 $strSql = "
376 SELECT s.*, sl.NAME, sl.LID
377 FROM b_smile s
378 LEFT JOIN b_smile_lang sl ON sl.TYPE = '".self::TYPE_SMILE."' AND sl.SID = s.ID".($lang !== false? " AND sl.LID = '".$DB->ForSql(htmlspecialcharsbx($lang))."'": "")."
379 WHERE s.ID = ".$id."";
380 $res = $DB->Query($strSql);
381
382 if ($lang !== self::GET_ALL_LANGUAGE)
383 {
384 $arResult = $res->GetNext(true, false);
385 unset($arResult['LID']);
386 }
387 else
388 {
389 while ($row = $res->GetNext(true, false))
390 {
391 if (empty($arResult))
392 {
393 $arResult = $row;
394 $arResult['NAME'] = Array();
395 unset($arResult['LID']);
396 }
397 $arResult['NAME'][$row['LID']] = $row['NAME'];
398 }
399 }
400 return $arResult;
401 }
402
403 public static function getList($arParams = Array(), $lang = LANGUAGE_ID)
404 {
405 global $DB;
406
407 $arResult = $arSelect = $arOrder = $arFilter = $arJoin = Array();
408 if (!isset($arParams['SELECT']) || !is_array($arParams['SELECT']))
409 $arParams['SELECT'] = Array('ID', 'SET_ID', 'TYPE', 'NAME', 'SORT', 'TYPING', 'CLICKABLE', 'HIDDEN', 'IMAGE', 'IMAGE_DEFINITION', 'IMAGE_WIDTH', 'IMAGE_HEIGHT');
410
411 // select block
412 foreach ($arParams['SELECT'] as $fieldName)
413 {
414 if ($fieldName == 'NAME')
415 {
416 $arSelect['NAME'] = 'sl.'.$fieldName;
417 $arJoin['LANG'] = "LEFT JOIN b_smile_lang sl ON sl.TYPE = '".self::TYPE_SMILE."' AND sl.SID = s.ID AND sl.LID = '".$DB->ForSql(htmlspecialcharsbx($lang))."'";
418 }
419 elseif ($fieldName == 'SET_NAME')
420 {
421 $arSelect['SET_ID'] = 's.SET_ID';
422 $arSelect['SET_NAME'] = 'sl2.NAME as SET_NAME';
423 $arJoin['LANG2'] = "LEFT JOIN b_smile_lang sl2 ON sl2.TYPE = '".CSmileSet::TYPE_SET."' AND sl2.SID = s.SET_ID AND sl2.LID = '".$DB->ForSql(htmlspecialcharsbx($lang))."'";
424 }
425 else
426 {
427 $arSelect[$fieldName] = 's.'.$fieldName;
428 }
429 }
430 $arSelect['ID'] = 's.ID';
431
432 // filter block
433 if (isset($arParams['FILTER']['ID']))
434 {
435 if (is_array($arParams['FILTER']['ID']))
436 {
437 $ID = Array();
438 foreach ($arParams['FILTER']['ID'] as $key => $value)
439 $ID[$key] = intval($value);
440
441 if (!empty($ID))
442 $arFilter[] = "s.ID IN (".implode(',', $ID).')';
443 }
444 else
445 {
446 $arFilter[] = "s.ID = ".intval($arParams['FILTER']['ID']);
447 }
448 }
449 if (isset($arParams['FILTER']['SET_ID']))
450 {
451 if (is_array($arParams['FILTER']['SET_ID']))
452 {
453 $ID = Array();
454 foreach ($arParams['FILTER']['SET_ID'] as $key => $value)
455 $ID[$key] = intval($value);
456
457 if (!empty($ID))
458 $arFilter[] = "s.SET_ID IN ('".implode("','", $ID)."')";
459 }
460 else
461 {
462 $arFilter[] = "s.SET_ID = ".intval($arParams['FILTER']['SET_ID']);
463 }
464 }
465 if (isset($arParams['FILTER']['TYPE']) && in_array($arParams['FILTER']['TYPE'], Array(self::TYPE_SMILE, self::TYPE_ICON)))
466 {
467 $arFilter[] = "s.TYPE = '".$arParams['FILTER']['TYPE']."'";
468 }
469 if (isset($arParams['FILTER']['PARENT_ID']))
470 {
471 $arFilter[] = "ss2.PARENT_ID = ".intval($arParams['FILTER']['PARENT_ID']);
472 $arJoin['PARENT'] = "LEFT JOIN b_smile_set ss2 ON ss2.ID = s.SET_ID";
473 }
474
475 // order block
476 if (isset($arParams['ORDER']) && is_array($arParams['ORDER']))
477 {
478 foreach ($arParams['ORDER'] as $by => $order)
479 {
480 $order = mb_strtoupper($order) == 'ASC'? 'ASC': 'DESC';
481 $by = mb_strtoupper($by);
482 if (in_array($by, Array('ID', 'SET_ID', 'SORT', 'IMAGE_DEFINITION', 'HIDDEN')))
483 {
484 $arOrder[$by] = 's.'.$by.' '.$order;
485 }
486 }
487 }
488 else
489 {
490 $arOrder['ID'] = 's.ID DESC';
491 }
492
493 $strSelect = "SELECT ".implode(', ', $arSelect);
494 $strSql = "
495 FROM b_smile s
496 ".(!empty($arJoin)? implode(' ', $arJoin): "")."
497 ".(!empty($arFilter)? "WHERE ".implode(' AND ', $arFilter): "")."
498 ".(!empty($arOrder)? "ORDER BY ".implode(', ', $arOrder): "")."
499 ";
500
501 if (isset($arParams['RETURN_SQL']) && $arParams['RETURN_SQL'] == 'Y')
502 {
503 return $strSelect.$strSql;
504 }
505
506 if(array_key_exists("NAV_PARAMS", $arParams) && is_array($arParams["NAV_PARAMS"]))
507 {
508 $nTopCount = intval($arParams['NAV_PARAMS']['nTopCount'] ?? 0);
509 if($nTopCount > 0)
510 {
511 $strSql = $DB->TopSql($strSelect.$strSql, $nTopCount);
512 $res = $DB->Query($strSql);
513 }
514 else
515 {
516 $res_cnt = $DB->Query("
517 SELECT COUNT(s.ID) as CNT
518 FROM b_smile s
519 ".(!empty($arFilter)? "WHERE ".implode(' AND ', $arFilter): "")
520 );
521 $arCount = $res_cnt->Fetch();
522 $res = new CDBResult();
523 $res->NavQuery($strSelect.$strSql, $arCount["CNT"], $arParams["NAV_PARAMS"]);
524 }
525 }
526 else
527 {
528 $res = $DB->Query($strSelect.$strSql);
529 }
530
531 if (isset($arParams['RETURN_RES']) && $arParams['RETURN_RES'] == 'Y')
532 {
533 return $res;
534 }
535 else
536 {
537 while ($row = $res->GetNext(true, false))
538 $arResult[$row['ID']] = $row;
539
540 return $arResult;
541 }
542 }
543
547 public static function getByType($type = self::TYPE_ALL, $setId = CSmileSet::SET_ID_BY_CONFIG, $lang = LANGUAGE_ID)
548 {
549 return self::getBySetId($type, $setId, $lang);
550 }
551
552 public static function getBySetId($type = self::TYPE_ALL, $setId = CSmileSet::SET_ID_BY_CONFIG, $lang = LANGUAGE_ID)
553 {
554 $arFilter = array();
555 if (in_array($type, array(self::TYPE_SMILE, self::TYPE_ICON)))
556 $arFilter["TYPE"] = $type;
557
558 $setId = intval($setId);
559
560 if ($setId == CSmileSet::SET_ID_BY_CONFIG)
561 {
562 $arFilter['PARENT_ID'] = CSmileGallery::getDefaultId();
563 $cacheSetId = 'p'.$arFilter['PARENT_ID'];
564 }
565 else
566 {
567 $cacheSetId = $setId;
568 if ($setId != CSmileSet::SET_ID_ALL)
569 $arFilter['SET_ID'] = $setId;
570 }
571
572 if ($lang <> '')
574
575 global $CACHE_MANAGER;
576 $cache_id = "b_smile_set_2_".$arFilter["TYPE"]."_".$cacheSetId."_".$lang;
577
578 if (CACHED_b_smile !== false && $CACHE_MANAGER->Read(CACHED_b_smile, $cache_id, "b_smile"))
579 {
580 $arResult = $CACHE_MANAGER->Get($cache_id);
581 }
582 else
583 {
584 $arResult = self::getList(Array(
585 'ORDER' => Array('SORT' => 'ASC'),
586 'FILTER' => $arFilter,
587 ));
588
589 if (CACHED_b_smile !== false)
590 $CACHE_MANAGER->Set($cache_id, $arResult);
591 }
592
593 return $arResult;
594
595 }
596
597 public static function getByGalleryId($type = self::TYPE_ALL, $galleryId = CSmileGallery::GALLERY_DEFAULT, $lang = LANGUAGE_ID)
598 {
599 $arFilter = array();
600 if (in_array($type, array(self::TYPE_SMILE, self::TYPE_ICON)))
601 $arFilter["TYPE"] = $type;
602
603 $galleryId = intval($galleryId);
604 if ($galleryId == CSmileGallery::GALLERY_DEFAULT)
605 $galleryId = CSmileGallery::getDefaultId();
606
607 if ($lang <> '')
609
610 global $CACHE_MANAGER;
611 $cache_id = "b_smile_gallery_".$arFilter["TYPE"]."_".$galleryId."_".$arFilter["LID"];
612
613 if (CACHED_b_smile !== false && $CACHE_MANAGER->Read(CACHED_b_smile, $cache_id, "b_smile"))
614 {
615 $arResult = $CACHE_MANAGER->Get($cache_id);
616 }
617 else
618 {
619 $arSets = CSmileSet::getList(Array(
620 'FILTER' => Array('PARENT_ID' => $galleryId)
621 ));
622 foreach ($arSets as $set)
623 {
624 $arFilter['SET_ID'][] = $set['ID'];
625 }
626
627 $arResult = self::getList(Array(
628 'ORDER' => Array('SORT' => 'ASC'),
629 'FILTER' => $arFilter,
630 ));
631
632 if (CACHED_b_smile !== false)
633 $CACHE_MANAGER->Set($cache_id, $arResult);
634 }
635
636 return $arResult;
637 }
638
639
640 public static function import($arParams)
641 {
642 global $APPLICATION;
643
644 // check fields
645 $aMsg = array();
646 $arParams['SET_ID'] = intval($arParams['SET_ID']);
647 $arParams['IMPORT_IF_FILE_EXISTS'] = isset($arParams['IMPORT_IF_FILE_EXISTS']) && $arParams['IMPORT_IF_FILE_EXISTS'] == 'Y'? true: false;
648 if(isset($arParams['FILE']) && GetFileExtension($arParams['FILE']) != 'zip')
649 {
650 $aMsg["FILE_EXT"] = array("id"=>"FILE_EXT", "text"=> GetMessage("MAIN_SMILE_IMPORT_FILE_EXT_ERROR"));
651 }
652 else if (!isset($arParams['FILE']) || !file_exists($arParams['FILE']))
653 {
654 $aMsg["FILE"] = array("id"=>"FILE", "text"=> GetMessage("MAIN_SMILE_IMPORT_FILE_ERROR"));
655 }
656 else if($arParams['SET_ID'] <= 0)
657 {
658 $aMsg["SET_ID"] = array("id"=>"SET_ID", "text"=> GetMessage("MAIN_SMILE_IMPORT_SET_ID_ERROR"));
659 }
660 if(!empty($aMsg))
661 {
662 $e = new CAdminException($aMsg);
663 $APPLICATION->ThrowException($e);
664 return false;
665 }
666 $sUnpackDir = CTempFile::GetDirectoryName(1);
667 CheckDirPath($sUnpackDir);
668
670 $oArchiver = CBXArchive::GetArchive($arParams['FILE'], "ZIP");
671 $oArchiver->SetOptions(array("STEP_TIME" => 300));
672
673 if (!$oArchiver->Unpack($sUnpackDir))
674 {
675 $aMsg["UNPACK"] = array("id"=>"UNPACK", "text"=> GetMessage("MAIN_SMILE_IMPORT_UNPACK_ERROR"));
676 $e = new CAdminException($aMsg);
677 $APPLICATION->ThrowException($e);
678 return false;
679 }
680
681 $arSmiles = Array();
682 if (file_exists($sUnpackDir.'install.csv'))
683 {
684 $arLang = Array();
686 while ($res = $db_res->Fetch())
687 {
688 if (file_exists($sUnpackDir.'install_lang_'. $res["LID"].'.csv'))
689 {
690 $csvFile = new CCSVData();
691 $csvFile->LoadFile($sUnpackDir.'install_lang_'.$res["LID"].'.csv');
692 $csvFile->SetFieldsType("R");
693 $csvFile->SetFirstHeader(false);
694 while($smile = $csvFile->Fetch())
695 {
696 $arLang[$smile[0]][$res["LID"]] = $smile[1];
697 }
698 }
699 }
700
701 $csvFile = new CCSVData();
702 $csvFile->LoadFile($sUnpackDir.'install.csv');
703 $csvFile->SetFieldsType("R");
704 $csvFile->SetFirstHeader(false);
705 while($smileRes = $csvFile->Fetch())
706 {
707 $smile = Array(
708 'TYPE' => $smileRes[0],
709 'CLICKABLE' => $smileRes[1] == 'Y'? 'Y': 'N',
710 'SORT' => intval($smileRes[2]),
711 'IMAGE' => $smileRes[3],
712 'IMAGE_WIDTH' => intval($smileRes[4]),
713 'IMAGE_HEIGHT' => intval($smileRes[5]),
714 'IMAGE_DEFINITION' => in_array($smileRes[6], Array(self::IMAGE_SD, self::IMAGE_HD, self::IMAGE_UHD))? $smileRes[6]: ($smileRes[6] == 'Y'? self::IMAGE_HD: self::IMAGE_SD),
715 'HIDDEN' => in_array($smileRes[7], Array('Y', 'N'))? $smileRes[7]: 'N',
716 'IMAGE_LANG' => in_array($smileRes[7], Array('Y', 'N'))? $smileRes[8]: $smileRes[7], // for legacy
717 'TYPING' => in_array($smileRes[7], Array('Y', 'N'))? $smileRes[9]: $smileRes[8]
718 );
719
720 if (!in_array($smile['TYPE'], Array(CSmile::TYPE_SMILE, CSmile::TYPE_ICON)))
721 continue;
722
723 $smile['IMAGE'] = GetFileName($smile['IMAGE']);
724
725 $info = (new \Bitrix\Main\File\Image($sUnpackDir.$smile['IMAGE']))->getInfo();
726 if (!$info)
727 continue;
728
729 $arInsert = Array(
730 'TYPE' => $smile['TYPE'],
731 'SET_ID' => $arParams['SET_ID'],
732 'CLICKABLE' => $smile['CLICKABLE'],
733 'SORT' => $smile['SORT'],
734 'IMAGE' => $smile['IMAGE'],
735 'IMAGE_WIDTH' => $smile['IMAGE_WIDTH'],
736 'IMAGE_HEIGHT' => $smile['IMAGE_HEIGHT'],
737 'IMAGE_DEFINITION' => $smile['IMAGE_DEFINITION'],
738 'HIDDEN' => $smile['HIDDEN'],
739 'TYPING' => $smile['TYPING'],
740 );
741
742 if (isset($arLang[$smile['IMAGE_LANG']]))
743 $arInsert['LANG'] = $arLang[$smile['IMAGE_LANG']];
744
745 $arSmiles[] = $arInsert;
746 }
747 }
748 else
749 {
750 $smileSet = CSmileSet::getById($arParams['SET_ID']);
751 if ($handle = @opendir($sUnpackDir))
752 {
753 $sort = 300;
754 while (($file = readdir($handle)) !== false)
755 {
756 if ($file == "." || $file == "..")
757 continue;
758
759 if (is_file($sUnpackDir.$file))
760 {
761 $info = (new \Bitrix\Main\File\Image($sUnpackDir.$file))->getInfo();
762 if ($info)
763 {
764 $smileHR = self::IMAGE_SD;
765 $smileType = CSmile::TYPE_SMILE;
766 $smileCode = GetFileNameWithoutExtension($file);
767 if (str_starts_with($file, 'smile_'))
768 {
769 $smileCode = mb_substr($smileCode, 6);
770 }
771 elseif (str_starts_with($file, 'smile'))
772 {
773 $smileCode = mb_substr($smileCode, 5);
774 }
775 elseif (str_starts_with($file, 'icon_'))
776 {
777 $smileType = CSmile::TYPE_ICON;
778 $smileCode = mb_substr($smileCode, 5);
779 }
780 else if (str_starts_with($file, 'icon'))
781 {
782 $smileType = CSmile::TYPE_ICON;
783 $smileCode = mb_substr($smileCode, 4);
784 }
785 if (mb_strrpos($smileCode, '_hr') !== false && mb_strrpos($smileCode, '_hr') == mb_strlen($smileCode) - 3)
786 {
787 $smileHR = self::IMAGE_HD;
788 $smileCode = mb_substr($smileCode, 0, mb_strrpos($smileCode, '_hr'));
789 }
790 else if (($pos = mb_strpos($smileCode, '_hr_')))
791 {
792 $smileHR = self::IMAGE_HD;
793 $smileCode = mb_substr($smileCode, 0, $pos).'_'.mb_substr($smileCode, $pos + 4);
794 }
795 else if (mb_strrpos($smileCode, '_uhd') !== false && mb_strrpos($smileCode, '_uhd') == mb_strlen($smileCode) - 4)
796 {
797 $smileHR = self::IMAGE_UHD;
798 $smileCode = mb_substr($smileCode, 0, mb_strrpos($smileCode, '_uhd'));
799 }
800
801 $arSmiles[] = Array(
802 'TYPE' => $smileType,
803 'SET_ID' => $arParams['SET_ID'],
804 'CLICKABLE' => 'Y',
805 'SORT' => $sort,
806 'IMAGE' => $file,
807 'IMAGE_WIDTH' => intval($info->getWidth()),
808 'IMAGE_HEIGHT' => intval($info->getHeight()),
809 'IMAGE_DEFINITION' => $smileHR,
810 'TYPING' => ':'.($smileSet['STRING_ID'] ?? $smileSet['ID']).'/'.$smileCode.':',
811 );
812 $sort = $sort+5;
813 }
814 }
815 }
816 @closedir($handle);
817 }
818 }
819 $importSmile = 0;
820 foreach ($arSmiles as $smile)
821 {
822 $sUploadDir = ($smile['TYPE'] == CSmile::TYPE_ICON? CSmile::PATH_TO_ICON: CSmile::PATH_TO_SMILE).intval($smile["SET_ID"]).'/';
823 if (file_exists($sUnpackDir.$smile['IMAGE']) && ($arParams['IMPORT_IF_FILE_EXISTS'] || !file_exists($_SERVER["DOCUMENT_ROOT"].$sUploadDir.$smile['IMAGE'])))
824 {
825 if (CheckDirPath($_SERVER["DOCUMENT_ROOT"].$sUploadDir))
826 {
827 $insertId = CSmile::add($smile);
828 if ($insertId)
829 {
830 if ($arParams['IMPORT_IF_FILE_EXISTS'] && file_exists($_SERVER["DOCUMENT_ROOT"].$sUploadDir.$smile['IMAGE']))
831 {
832 $importSmile++;
833 }
834 else if (copy($sUnpackDir.$smile['IMAGE'], $_SERVER["DOCUMENT_ROOT"].$sUploadDir.$smile['IMAGE']))
835 {
836 @chmod($_SERVER["DOCUMENT_ROOT"].$sUploadDir.$smile['IMAGE'], BX_FILE_PERMISSIONS);
837 $importSmile++;
838 }
839 else
840 {
841 CSmile::delete($insertId);
842 }
843 }
844
845 $APPLICATION->ResetException();
846 }
847 }
848 }
849
850 self::setLastUpdate();
851 return $importSmile;
852 }
853
859 public static function moveSmilesToUploadAgent(): string
860 {
861 $paths = [
862 'smiles' => [
863 'old' => '/bitrix/images/main/smiles/',
864 'new' => self::PATH_TO_SMILE
865 ],
866 'icons' => [
867 'old' => '/bitrix/images/main/icons/',
868 'new' => self::PATH_TO_ICON
869 ]
870 ];
871
872 $returnValue = '';
873 foreach ($paths as $path)
874 {
875 $oldPath = $_SERVER["DOCUMENT_ROOT"] . $path['old'];
876 $newPath = $_SERVER["DOCUMENT_ROOT"] . $path['new'];
877
878 $directory = new \Bitrix\Main\IO\Directory($oldPath);
879 if ($directory->isExists())
880 {
881 CopyDirFiles($directory->getPhysicalPath(), $newPath, true, true);
882 self::setLastUpdate();
883 }
884 else
885 {
886 $returnValue = __METHOD__ . '();';
887 }
888 }
889
890 return $returnValue;
891 }
892}
893
894class CSmileGallery
895{
896 use OptionsHelperTrait;
897
898 const GALLERY_DEFAULT = 0;
899 const GET_ALL_LANGUAGE = false;
900
901 public static function add($arFields)
902 {
903 $arFields['TYPE'] = CSmileSet::TYPE_GALLERY;
904 return CSmileSet::add($arFields);
905 }
906
907 public static function update($id, $arFields)
908 {
909 return CSmileSet::update($id, $arFields);
910 }
911
912 public static function delete($id)
913 {
914 global $DB, $CACHE_MANAGER;
915
916 $id = intval($id);
917
918 $res = $DB->Query("SELECT ID, TYPE FROM b_smile_set WHERE ID = ".$id);
919 if ($smileGallery = $res->Fetch())
920 {
921 CSmile::deleteByGallery($smileGallery['ID']);
922
923 $DB->Query("DELETE FROM b_smile_set WHERE ID = ".$smileGallery['ID'], true);
924 $DB->Query("DELETE FROM b_smile_set WHERE PARENT_ID = ".$smileGallery['ID'], true);
925 $DB->Query("DELETE FROM b_smile_lang WHERE TYPE = '".$smileGallery['TYPE']."' AND SID = ".$smileGallery['ID'], true);
926 }
927
928 self::setLastUpdate();
929 $CACHE_MANAGER->CleanDir("b_smile");
930
931 }
932
933 public static function getById($id, $lang = LANGUAGE_ID)
934 {
935 return CSmileSet::getById($id, $lang);
936 }
937
938 public static function getByStringId($stringId, $lang = LANGUAGE_ID)
939 {
940 return CSmileSet::getByStringId($stringId, CSmileSet::TYPE_GALLERY, $lang);
941 }
942
943 public static function getList($arParams = Array(), $lang = LANGUAGE_ID)
944 {
945 $arParams['FILTER']['TYPE'] = CSmileSet::TYPE_GALLERY;
946 return CSmileSet::getList($arParams, $lang);
947 }
948
949 public static function getListCache($lang = LANGUAGE_ID)
950 {
951 if ($lang <> '')
953
954 global $CACHE_MANAGER;
955 $cache_id = "b_smile_gallery_".$lang;
956
957 if (CACHED_b_smile !== false && $CACHE_MANAGER->Read(CACHED_b_smile, $cache_id, "b_smile"))
958 {
959 $arResult = $CACHE_MANAGER->Get($cache_id);
960 }
961 else
962 {
963 $arResult = self::getList(Array('ORDER' => Array('SORT' => 'ASC')), $lang);
964 if (CACHED_b_smile !== false)
965 $CACHE_MANAGER->Set($cache_id, $arResult);
966 }
967
968 return $arResult;
969 }
970
971 public static function getListForForm($lang = LANGUAGE_ID)
972 {
973 $arSetList = Array();
974 foreach (self::getListCache($lang) as $key => $value)
975 $arSetList[$key] = !empty($value['NAME'])? $value['NAME']: GetMessage('MAIN_SMILE_GALLERY_NAME', Array('#ID#' => $key));
976
977 return $arSetList;
978 }
979
980 public static function getDefaultId()
981 {
982 $galleryId = COption::GetOptionString("main", "smile_gallery_id", self::GALLERY_DEFAULT);
983 if ($galleryId == 0)
984 {
985 $gallery = CSmileGallery::getByStringId('bitrix');
986
987 if ($gallery)
988 {
989 $galleryId = $gallery['ID'];
990 self::setDefaultId($galleryId);
991 }
992 }
993
994 $eventGalleryId = -1;
995 foreach(GetModuleEvents("main", "OnBeforeSmileGalleryGetDefaultId", true) as $arEvent)
996 $eventGalleryId = intval(ExecuteModuleEventEx($arEvent, array($galleryId)));
997
998 return $eventGalleryId > 0 && $eventGalleryId != $galleryId? $eventGalleryId: $galleryId;
999 }
1000
1001 public static function setDefaultId($id)
1002 {
1003 return COption::SetOptionString("main", "smile_gallery_id", $id);
1004 }
1005
1006 public static function getSmilesWithSets($galleryId = self::GALLERY_DEFAULT, $options = [])
1007 {
1008 if ($galleryId == self::GALLERY_DEFAULT)
1009 {
1010 $galleryId = self::getDefaultId();
1011 }
1012
1013 $result = array('SMILE' => Array(), 'SMILE_SET' => Array());
1014
1015 $smiles = CSmile::getByGalleryId(CSmile::TYPE_SMILE, $galleryId);
1016
1017 $smilesSet = CSmileSet::getListCache();
1018
1019 $fullTypings = isset($options['FULL_TYPINGS']) && $options['FULL_TYPINGS'] === 'Y';
1020
1021 $userSets = Array();
1022 foreach ($smiles as $smile)
1023 {
1024 if ($smile['HIDDEN'] == 'Y')
1025 continue;
1026
1027 $typing = explode(" ", $smile['TYPING']);
1028 if (isset($result['SMILE'][$typing[0]]))
1029 continue;
1030
1031 $result['SMILE'][] = Array(
1032 'ID' => (int)$smile['ID'],
1033 'SET_ID' => (int)$smile['SET_ID'],
1034 'NAME' => $smile['NAME'],
1035 'IMAGE' => CSmile::PATH_TO_SMILE.$smile["SET_ID"]."/".$smile["IMAGE"],
1036 'TYPING' => $fullTypings? $smile['TYPING']: $typing[0],
1037 'WIDTH' => (int)$smile['IMAGE_WIDTH'],
1038 'HEIGHT' => (int)$smile['IMAGE_HEIGHT'],
1039 'DEFINITION' => $smile['IMAGE_DEFINITION'],
1040 );
1041 $userSets[$smile['SET_ID']] = true;
1042 }
1043 foreach ($smilesSet as $key => $value)
1044 {
1045 if (!$userSets[$value['ID']])
1046 continue;
1047
1048 if (empty($value['NAME']))
1049 $value['NAME'] = GetMessage('MAIN_SMILE_SET_NAME', Array('#ID#' => $key));
1050
1051 $result['SMILE_SET'][] = Array(
1052 'ID' => (int)$value['ID'],
1053 'PARENT_ID' => (int)$value['PARENT_ID'],
1054 'NAME' => $value['NAME'],
1055 'TYPE' => $value['TYPE'],
1056 );
1057 }
1058
1059 return $result;
1060 }
1061
1062 public static function installGallery()
1063 {
1064 $smileGalleryId = 0;
1065
1066 $arLang = Array();
1067 $arLang2 = Array();
1069 while($language = $langs->Fetch())
1070 {
1071 $lid = $language["LID"];
1072 $MESS = IncludeModuleLangFile(__FILE__, $lid, true);
1073 if ($MESS && isset($MESS['MAIN_SMILE_DEF_GALLERY_NAME']))
1074 $arLang[$lid] = $MESS['MAIN_SMILE_DEF_GALLERY_NAME'];
1075 if ($MESS && isset($MESS['MAIN_SMILE_DEF_SET_NAME']))
1076 $arLang2[$lid] = $MESS['MAIN_SMILE_DEF_SET_NAME'];
1077 }
1078
1079 $gallery = CSmileGallery::getByStringId('bitrix');
1080 if (!$gallery)
1081 {
1082
1083 $smileGalleryId = CSmileGallery::add(Array(
1084 'STRING_ID' => 'bitrix',
1085 'LANG' => $arLang,
1086 ));
1087 }
1088 else
1089 {
1090 $smileGalleryId = $gallery['ID'];
1091 }
1092
1093 if ($smileGalleryId)
1094 {
1095 $smileSet = CSmileSet::getByStringId('bitrix_main');
1096 if ($smileSet)
1097 {
1098 $smileSetId = $smileSet['ID'];
1099 CSmile::deleteBySet($smileSet['ID']);
1100 }
1101 else
1102 {
1103 $smileSetId = CSmileSet::add(Array(
1104 'STRING_ID' => 'bitrix_main',
1105 'PARENT_ID' => $smileGalleryId,
1106 'LANG' => $arLang2,
1107 ));
1108 }
1109
1110 CSmile::import(array('FILE' => $_SERVER["DOCUMENT_ROOT"].'/bitrix/modules/main/install/smiles/smiles_default.zip', 'SET_ID' => $smileSetId, 'IMPORT_IF_FILE_EXISTS' => 'Y'));
1111 }
1112 }
1113
1114 public static function convertGallery()
1115 {
1116 global $DB;
1117
1118 $arLang = Array();
1119 $arLang2 = Array();
1120 $arLang3 = Array();
1122 while($language = $langs->Fetch())
1123 {
1124 $lid = $language["LID"];
1125 $MESS = IncludeModuleLangFile(__FILE__, $lid, true);
1126 if ($MESS && isset($MESS['MAIN_SMILE_DEF_GALLERY_NAME']))
1127 $arLang[$lid] = $MESS['MAIN_SMILE_DEF_GALLERY_NAME'];
1128 if ($MESS && isset($MESS['MAIN_SMILE_DEF_SET_NAME']))
1129 $arLang2[$lid] = $MESS['MAIN_SMILE_DEF_SET_NAME'];
1130 if ($MESS && isset($MESS['MAIN_SMILE_USER_GALLERY_NAME']))
1131 $arLang3[$lid] = $MESS['MAIN_SMILE_USER_GALLERY_NAME'];
1132 }
1133
1134 $smileGalleryId = 0;
1135
1136 $gallery = CSmileGallery::getByStringId('bitrix');
1137 if (!$gallery)
1138 {
1139 $smileGalleryId = CSmileGallery::add(Array(
1140 'STRING_ID' => 'bitrix',
1141 'LANG' => $arLang,
1142 ));
1143 }
1144 else
1145 {
1146 $smileGalleryId = $gallery['ID'];
1147 }
1148
1149 if (COption::GetOptionInt("main", "smile_gallery_converted", 0) == 0)
1150 {
1151 $res = $DB->Query('SELECT * FROM b_smile');
1152
1153 $smileOriginalSet = Array(
1154 'smile_smile.png' => array('TYPING' => ':) :-)', 'IMAGE_WIDTH' => '16', 'IMAGE_HEIGHT' => '16'),
1155 'smile_wink.png' => array('TYPING' => ';) ;-)', 'IMAGE_WIDTH' => '16', 'IMAGE_HEIGHT' => '16'),
1156 'smile_biggrin.png' => array('TYPING' => ':D :-D', 'IMAGE_WIDTH' => '16', 'IMAGE_HEIGHT' => '16'),
1157 'smile_cool.png' => array('TYPING' => '8) 8-)', 'IMAGE_WIDTH' => '16', 'IMAGE_HEIGHT' => '16'),
1158 'smile_sad.png' => array('TYPING' => ':( :-(', 'IMAGE_WIDTH' => '16', 'IMAGE_HEIGHT' => '16'),
1159 'smile_neutral.png' => array('TYPING' => ':| :-|', 'IMAGE_WIDTH' => '16', 'IMAGE_HEIGHT' => '16'),
1160 'smile_redface.png' => array('TYPING' => ':oops:', 'IMAGE_WIDTH' => '16', 'IMAGE_HEIGHT' => '16'),
1161 'smile_cry.png' => array('TYPING' => ':cry: :~(', 'IMAGE_WIDTH' => '16', 'IMAGE_HEIGHT' => '16'),
1162 'smile_evil.png' => array('TYPING' => ':evil: >:-<', 'IMAGE_WIDTH' => '16', 'IMAGE_HEIGHT' => '16'),
1163 'smile_eek.png' => array('TYPING' => ':o :-o :shock:', 'IMAGE_WIDTH' => '16', 'IMAGE_HEIGHT' => '16'),
1164 'smile_confuse.png' => array('TYPING' => ':/ :-/', 'IMAGE_WIDTH' => '16', 'IMAGE_HEIGHT' => '16'),
1165 'smile_kiss.png' => array('TYPING' => ':{} :-{}', 'IMAGE_WIDTH' => '16', 'IMAGE_HEIGHT' => '16'),
1166 'smile_idea.png' => array('TYPING' => ':idea:', 'IMAGE_WIDTH' => '16', 'IMAGE_HEIGHT' => '16'),
1167 'smile_question.png' => array('TYPING' => ':?:', 'IMAGE_WIDTH' => '16', 'IMAGE_HEIGHT' => '16'),
1168 'smile_exclaim.png' => array('TYPING' => ':!:', 'IMAGE_WIDTH' => '16', 'IMAGE_HEIGHT' => '16'),
1169 );
1170 $smileCount = 0;
1171 $smileOriginalCount = 0;
1172 while ($smile = $res->fetch())
1173 {
1174 if ($smile['TYPE'] != CSmile::TYPE_SMILE)
1175 {
1176 continue;
1177 }
1178
1179 if (
1180 $smileOriginalSet[$smile['IMAGE']]
1181 && $smileOriginalSet[$smile['IMAGE']]['IMAGE_WIDTH'] == $smile['IMAGE_WIDTH']
1182 && $smileOriginalSet[$smile['IMAGE']]['IMAGE_HEIGHT'] == $smile['IMAGE_HEIGHT']
1183 && $smileOriginalSet[$smile['IMAGE']]['TYPING'] == $smile['TYPING']
1184 )
1185 {
1186 $smileOriginalCount++;
1187 }
1188
1189 $smileCount++;
1190 }
1191
1192 if (!(($smileCount == 0 || $smileCount == 15) && $smileCount == $smileOriginalCount))
1193 {
1194 $smileCustomGalleryId = 0;
1195 $smileSet = CSmileGallery::getByStringId('bitrix_convert');
1196 if (!$smileSet)
1197 {
1198 $smileCustomGalleryId = CSmileGallery::add(Array(
1199 'STRING_ID' => 'bitrix_convert',
1200 'SORT' => 300,
1201 'LANG' => $arLang3,
1202 ));
1203
1204 }
1205 else
1206 {
1207 $smileCustomGalleryId = $smileSet['ID'];
1208 }
1209 CSmileGallery::setDefaultId($smileCustomGalleryId);
1210 $DB->Query("UPDATE b_smile_set SET PARENT_ID = ".$smileCustomGalleryId." WHERE TYPE = 'G' AND PARENT_ID = 0");
1211 }
1212 else
1213 {
1214 $smileSet = CSmileSet::getByStringId('main');
1215 if ($smileSet)
1216 {
1217 CSmileSet::delete($smileSet['ID']);
1218 }
1219 }
1220 COption::SetOptionInt("main", "smile_gallery_converted", 1);
1221 }
1222
1223 if ($smileGalleryId)
1224 {
1225 $smileSet = CSmileSet::getByStringId('bitrix_main');
1226 if ($smileSet)
1227 {
1228 $smileSetId = $smileSet['ID'];
1229 CSmile::deleteBySet($smileSet['ID']);
1230 }
1231 else
1232 {
1233 $smileSetId = CSmileSet::add(Array(
1234 'STRING_ID' => 'bitrix_main',
1235 'PARENT_ID' => $smileGalleryId,
1236 'LANG' => $arLang2,
1237 ));
1238 }
1239
1240 CSmile::import(array('FILE' => $_SERVER["DOCUMENT_ROOT"].'/bitrix/modules/main/install/smiles/smiles_default.zip', 'SET_ID' => $smileSetId, 'IMPORT_IF_FILE_EXISTS' => 'Y'));
1241 }
1242
1243 return false;
1244 }
1245}
1246
1247class CSmileSet
1248{
1249 use OptionsHelperTrait;
1250
1251 const TYPE_SET = 'G';
1252 const TYPE_GALLERY = 'P';
1253
1254 const SET_ID_ALL = 0;
1255 const SET_ID_BY_CONFIG = -1;
1256 const GET_ALL_LANGUAGE = false;
1257
1258 public static function add($arFields)
1259 {
1260 global $DB, $CACHE_MANAGER;
1261
1262 $arInsert = array();
1263
1264 $arFields['PARENT_ID'] = intval($arFields['PARENT_ID']);
1265 $arInsert['PARENT_ID'] = $arFields['PARENT_ID'];
1266
1267 $arFields['TYPE'] = isset($arFields['TYPE']) && $arFields['TYPE'] == self::TYPE_GALLERY? self::TYPE_GALLERY: self::TYPE_SET;
1268
1269 if ($arFields['TYPE'] != self::TYPE_GALLERY && !$arFields['PARENT_ID'] )
1270 return false;
1271
1272 if (isset($arFields['STRING_ID']))
1273 $arInsert['STRING_ID'] = $arFields['STRING_ID'];
1274
1275 if (isset($arFields['SORT']))
1276 $arInsert['SORT'] = intval($arFields['SORT']);
1277
1278 $arInsert['TYPE'] = $arFields['TYPE'];
1279
1280 $setId = intval($DB->Add("b_smile_set", $arInsert));
1281
1282 if ($setId && isset($arFields['LANG']))
1283 {
1284 $arLang = Array();
1285 if (is_array($arFields['LANG']))
1286 $arLang = $arFields['LANG'];
1287 else
1288 $arLang[LANG] = $arFields['LANG'];
1289
1290 foreach ($arLang as $lang => $name)
1291 {
1292 $arInsert = array(
1293 'TYPE' => $arFields['TYPE'],
1294 'SID' => $setId,
1295 'LID' => htmlspecialcharsbx($lang),
1296 'NAME' => $name,
1297 );
1298 $DB->Add("b_smile_lang", $arInsert);
1299 }
1300 }
1301
1302 self::setLastUpdate();
1303 $CACHE_MANAGER->CleanDir("b_smile");
1304
1305 return $setId;
1306 }
1307
1308 public static function update($id, $arFields)
1309 {
1310 global $DB, $CACHE_MANAGER;
1311
1312 $id = intval($id);
1313
1314 $arUpdate = Array();
1315
1316 if (isset($arFields['STRING_ID']))
1317 $arUpdate['STRING_ID'] = "'".$DB->ForSql($arFields['STRING_ID'])."'";
1318
1319 if (isset($arFields['SORT']))
1320 $arUpdate['SORT'] = intval($arFields['SORT']);
1321
1322 if (!empty($arUpdate))
1323 $DB->Update("b_smile_set", $arUpdate, "WHERE ID = ".$id);
1324
1325 if (isset($arFields['LANG']))
1326 {
1327 $arLang = Array();
1328 if (is_array($arFields['LANG']))
1329 $arLang = $arFields['LANG'];
1330 else
1331 $arLang[LANG] = $arFields['LANG'];
1332
1333 $res = $DB->Query("SELECT TYPE FROM b_smile_set WHERE ID = ".$id);
1334 $smileSet = $res->Fetch();
1335
1336 foreach ($arLang as $lang => $name)
1337 {
1338 $DB->Query("DELETE FROM b_smile_lang WHERE TYPE = '".$smileSet['TYPE']."' AND SID = ".$id." AND LID = '".$DB->ForSql(htmlspecialcharsbx($lang))."'", true);
1339 $arInsert = array(
1340 'TYPE' => $smileSet['TYPE'],
1341 'SID' => $id,
1342 'LID' => htmlspecialcharsbx($lang),
1343 'NAME' => $name,
1344 );
1345 $DB->Add("b_smile_lang", $arInsert);
1346 }
1347 }
1348
1349 self::setLastUpdate();
1350 $CACHE_MANAGER->CleanDir("b_smile");
1351
1352 return true;
1353 }
1354
1355 public static function delete($id)
1356 {
1357 global $DB, $CACHE_MANAGER;
1358
1359 $id = intval($id);
1360
1361 $res = $DB->Query("SELECT ID, TYPE FROM b_smile_set WHERE ID = ".$id);
1362 if ($smileSet = $res->Fetch())
1363 {
1364 $DB->Query("DELETE FROM b_smile_set WHERE ID = ".$smileSet['ID'], true);
1365 $DB->Query("DELETE FROM b_smile_lang WHERE TYPE = '".$smileSet['TYPE']."' AND SID = ".$smileSet['ID'], true);
1366
1367 CSmile::deleteBySet($smileSet['ID']);
1368 }
1369
1370 self::setLastUpdate();
1371 $CACHE_MANAGER->CleanDir("b_smile");
1372
1373 return true;
1374 }
1375
1376 public static function getById($id, $lang = LANGUAGE_ID)
1377 {
1378 global $DB;
1379
1380 $id = intval($id);
1381 $arResult = Array();
1382
1383 $strSql = "
1384 SELECT ss.*, sl.NAME, sl.LID
1385 FROM b_smile_set ss
1386 LEFT JOIN b_smile_lang sl ON sl.TYPE = ss.TYPE AND sl.SID = ss.ID".($lang !== false? " AND sl.LID = '".$DB->ForSql(htmlspecialcharsbx($lang))."'": "")."
1387 WHERE ss.ID = ".$id."";
1388 $res = $DB->Query($strSql);
1389
1390 if ($lang !== self::GET_ALL_LANGUAGE)
1391 {
1392 $arResult = $res->GetNext(true, false);
1393 unset($arResult['LID']);
1394 }
1395 else
1396 {
1397 while ($row = $res->GetNext(true, false))
1398 {
1399 if (empty($arResult))
1400 {
1401 $arResult = $row;
1402 $arResult['NAME'] = Array();
1403 unset($arResult['LID']);
1404 }
1405 $arResult['NAME'][$row['LID']] = $row['NAME'];
1406 }
1407 }
1408 return $arResult;
1409 }
1410
1411 public static function getByStringId($stringId, $type = self::TYPE_SET, $lang = LANGUAGE_ID)
1412 {
1413 global $DB;
1414
1415 $arResult = Array();
1416
1417 if (!in_array($type, Array(self::TYPE_SET, self::TYPE_GALLERY))) // for legacy
1418 {
1419 $lang = $type;
1420 $type = self::TYPE_SET;
1421 }
1422
1423 $strSql = "
1424 SELECT ss.*, sl.NAME, sl.LID
1425 FROM b_smile_set ss
1426 LEFT JOIN b_smile_lang sl ON sl.TYPE = ss.TYPE AND sl.SID = ss.ID".($lang !== false? " AND sl.LID = '".$DB->ForSql(htmlspecialcharsbx($lang))."'": "")."
1427 WHERE ss.STRING_ID = '".$DB->ForSql($stringId)."' AND ss.TYPE = '".$DB->ForSql($type)."'";
1428 $res = $DB->Query($strSql);
1429
1430 if ($lang !== false)
1431 {
1432 $arResult = $res->GetNext(true, false);
1433 unset($arResult['LID']);
1434 }
1435 else
1436 {
1437 while ($row = $res->GetNext(true, false))
1438 {
1439 if (empty($arResult))
1440 {
1441 $arResult = $row;
1442 $arResult['NAME'] = Array();
1443 unset($arResult['LID']);
1444 }
1445 $arResult['NAME'][$row['LID']] = $row['NAME'];
1446 }
1447 }
1448 return $arResult;
1449 }
1450
1451 public static function getBySmiles($arSmiles)
1452 {
1453 $arResult = Array();
1454 $arSets = self::getListCache();
1455
1456 foreach ($arSmiles as $smile)
1457 {
1458 if (isset($arSets[$smile['SET_ID']]))
1459 $arResult[$smile['SET_ID']] = $arSets[$smile['SET_ID']];
1460 }
1461
1462 return $arResult;
1463 }
1464
1465 public static function getList($arParams = Array(), $lang = LANGUAGE_ID)
1466 {
1467 global $DB;
1468
1469 $arResult = $arSelect = $arOrder = $arFilter = $arJoin = Array();
1470 if (!isset($arParams['SELECT']) || !is_array($arParams['SELECT']))
1471 $arParams['SELECT'] = Array('ID', 'STRING_ID', 'SORT', 'NAME', 'TYPE', 'PARENT_ID');
1472
1473 if (isset($arParams['ORDER']['SMILE_COUNT']))
1474 $arParams['SELECT'][] = 'SMILE_COUNT';
1475
1476 // select block
1477
1478 $type = $arParams['FILTER']['TYPE'] ?? '';
1479 if (!in_array($type, Array(CSmileSet::TYPE_SET, CSmileSet::TYPE_GALLERY)))
1480 {
1481 $arParams['FILTER']['TYPE'] = CSmileSet::TYPE_SET;
1482 }
1483
1484 foreach ($arParams['SELECT'] as $fieldName)
1485 {
1486 if ($fieldName == 'NAME')
1487 {
1488 $arSelect['NAME'] = 'sl.'.$fieldName;
1489 $arJoin['LANG'] = "LEFT JOIN b_smile_lang sl ON sl.TYPE = ss.TYPE AND sl.SID = ss.ID AND sl.LID = '".$DB->ForSql(htmlspecialcharsbx($lang))."'";
1490 }
1491 elseif ($fieldName == 'SMILE_COUNT')
1492 {
1493 if ($arParams['FILTER']['TYPE'] == CSmileSet::TYPE_SET)
1494 {
1495 $arSelect['SMILE_COUNT'] = '(SELECT COUNT(s.ID) FROM b_smile s WHERE s.SET_ID = ss.ID) as SMILE_COUNT';
1496 }
1497 else
1498 {
1499 $arSelect['SMILE_COUNT'] = '(SELECT COUNT(s.ID) FROM b_smile_set ss1 LEFT JOIN b_smile s ON ss1.ID = s.SET_ID WHERE ss1.PARENT_ID = ss.ID) as SMILE_COUNT';
1500 }
1501 }
1502 else
1503 {
1504 $arSelect[$fieldName] = 'ss.'.$fieldName;
1505 }
1506 }
1507 $arSelect['ID'] = 'ss.ID';
1508
1509 // filter block
1510 if (isset($arParams['FILTER']['ID']))
1511 {
1512 if (is_array($arParams['FILTER']['ID']))
1513 {
1514 $ID = Array();
1515 foreach ($arParams['FILTER']['ID'] as $key => $value)
1516 $ID[$key] = intval($value);
1517
1518 if (!empty($ID))
1519 $arFilter[] = "ss.ID IN (".implode(',', $ID).')';
1520 }
1521 else
1522 {
1523 $arFilter[] = "ss.ID = ".intval($arParams['FILTER']['ID']);
1524 }
1525 }
1526 if (isset($arParams['FILTER']['PARENT_ID']))
1527 {
1528 $arFilter[] = "ss.PARENT_ID = ".intval($arParams['FILTER']['PARENT_ID']);
1529 }
1530 if (isset($arParams['FILTER']['STRING_ID']))
1531 {
1532 if (is_array($arParams['FILTER']['STRING_ID']))
1533 {
1534 $ID = Array();
1535 foreach ($arParams['FILTER']['STRING_ID'] as $key => $value)
1536 $ID[$key] = intval($value);
1537
1538 if (!empty($ID))
1539 $arFilter[] = "ss.STRING_ID IN ('".implode("','", $ID)."')";
1540 }
1541 else
1542 {
1543 $arFilter[] = "ss.STRING_ID = ".intval($arParams['FILTER']['STRING_ID']);
1544 }
1545 }
1546
1547 $arFilter[] = "ss.TYPE = '".$arParams['FILTER']['TYPE']."'";
1548
1549 // order block
1550 if (isset($arParams['ORDER']) && is_array($arParams['ORDER']))
1551 {
1552 foreach ($arParams['ORDER'] as $by => $order)
1553 {
1554 $order = mb_strtoupper($order) == 'ASC'? 'ASC': 'DESC';
1555 $by = mb_strtoupper($by);
1556 if (in_array($by, Array('ID', 'SORT')))
1557 {
1558 $arOrder[$by] = 'ss.'.$by.' '.$order;
1559 }
1560 else if ($by == 'SMILE_COUNT')
1561 $arOrder[$by] = $by.' '.$order;
1562 }
1563 }
1564 else
1565 {
1566 $arOrder['ID'] = 'ss.ID DESC';
1567 }
1568
1569 $strSelect = "SELECT ".implode(', ', $arSelect);
1570 $strSql = "
1571 FROM b_smile_set ss
1572 ".(!empty($arJoin)? implode(' ', $arJoin): "")."
1573 ".(!empty($arFilter)? "WHERE ".implode(' AND ', $arFilter): "")."
1574 ".(!empty($arOrder)? "ORDER BY ".implode(', ', $arOrder): "")."
1575 ";
1576
1577 if (isset($arParams['RETURN_SQL']) && $arParams['RETURN_SQL'] == 'Y')
1578 {
1579 return $strSelect.$strSql;
1580 }
1581
1582 if(array_key_exists("NAV_PARAMS", $arParams) && is_array($arParams["NAV_PARAMS"]))
1583 {
1584 $nTopCount = intval($arParams['NAV_PARAMS']['nTopCount'] ?? 0);
1585 if($nTopCount > 0)
1586 {
1587 $strSql = $DB->TopSql($strSelect.$strSql, $nTopCount);
1588 $res = $DB->Query($strSql);
1589 }
1590 else
1591 {
1592 $res_cnt = $DB->Query("
1593 SELECT COUNT(ss.ID) as CNT
1594 FROM b_smile_set ss
1595 ".(!empty($arFilter)? "WHERE ".implode(' AND ', $arFilter): "")
1596 );
1597 $arCount = $res_cnt->Fetch();
1598 $res = new CDBResult();
1599 $res->NavQuery($strSelect.$strSql, $arCount["CNT"], $arParams["NAV_PARAMS"]);
1600 }
1601 }
1602 else
1603 {
1604 $res = $DB->Query($strSelect.$strSql);
1605 }
1606
1607 if (isset($arParams['RETURN_RES']) && $arParams['RETURN_RES'] == 'Y')
1608 {
1609 return $res;
1610 }
1611 else
1612 {
1613 while ($row = $res->GetNext(true, false))
1614 $arResult[$row['ID']] = $row;
1615
1616 return $arResult;
1617 }
1618 }
1619
1620 public static function getListCache($lang = LANGUAGE_ID)
1621 {
1622 if ($lang <> '')
1624
1625 global $CACHE_MANAGER;
1626 $cache_id = "b_smile_set_2_".$lang;
1627
1628 if (CACHED_b_smile !== false && $CACHE_MANAGER->Read(CACHED_b_smile, $cache_id, "b_smile"))
1629 {
1630 $arResult = $CACHE_MANAGER->Get($cache_id);
1631 }
1632 else
1633 {
1634 $arResult = self::getList(Array('ORDER' => Array('SORT' => 'ASC')), $lang);
1635 if (CACHED_b_smile !== false)
1636 $CACHE_MANAGER->Set($cache_id, $arResult);
1637 }
1638
1639 return $arResult;
1640 }
1641
1645 public static function getFormList($bWithOptionAll = false, $lang = LANGUAGE_ID)
1646 {
1647 return self::getListForForm(0, $lang);
1648 }
1649
1650 public static function getListForForm($galleryId = 0, $lang = LANGUAGE_ID)
1651 {
1652 $arGalleryList = Array();
1653 if (!$galleryId)
1654 {
1655 $arGalleryList = CSmileGallery::getListForForm($lang);
1656 }
1657
1658 $arSetList = Array();
1659 foreach (CSmileSet::getListCache($lang) as $key => $value)
1660 {
1661 if ($galleryId > 0 && $value['PARENT_ID'] != $galleryId)
1662 continue;
1663
1664 $arSetList[$key] = !empty($value['NAME'])? $value['NAME']: GetMessage('MAIN_SMILE_SET_NAME', Array('#ID#' => $key));
1665 if (count($arGalleryList) > 1)
1666 {
1667 $arSetList[$key] = $arGalleryList[$value['PARENT_ID']].' > '.$arSetList[$key];
1668 }
1669 }
1670
1671 return $arSetList;
1672 }
1673
1677 public static function getConfigSetId()
1678 {
1679 $setId = COption::GetOptionString("main", "smile_set_id", self::SET_ID_ALL);
1680
1681 return $setId;
1682 }
1683}
1684
$arParams
Определения access_dialog.php:21
$path
Определения access_edit.php:21
$type
Определения options.php:106
$db_res
Определения options_user_settings.php:8
global $APPLICATION
Определения include.php:80
$arResult
Определения generate_coupon.php:16
static GetList($by="sort", $order="asc", $arFilter=[])
Определения language.php:12
static GetOptionString($module_id, $name, $def="", $site=false, $bExactSite=false)
Определения option.php:8
static GetOptionInt($module_id, $name, $def="", $site=false)
Определения option.php:49
static SetOptionString($module_id, $name, $value="", $desc=false, $site="")
Определения option.php:29
static SetOptionInt($module_id, $name, $value="", $desc="", $site="")
Определения option.php:54
static GetArchive($strArcName, $strType="")
Определения archive.php:26
static GetInstance()
Определения virtual_io.php:60
static GetDirectoryName($hours_to_keep_files=0, $subdir="")
Определения file_temp.php:57
global $CACHE_MANAGER
Определения clear_component_cache.php:7
$options
Определения commerceml2.php:49
$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
$handle
Определения include.php:55
$result
Определения get_property_values.php:14
if($ajaxMode) $ID
Определения get_user.php:27
global $MESS
Определения bill.php:2
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
global $DB
Определения cron_frame.php:29
if(!defined('SITE_ID')) $lang
Определения include.php:91
if($NS['step']==6) if( $NS[ 'step']==7) if(COption::GetOptionInt('main', 'disk_space', 0) > 0) $info
Определения backup.php:924
GetFileExtension($path)
Определения tools.php:2972
CheckDirPath($path)
Определения tools.php:2707
ExecuteModuleEventEx($arEvent, $arParams=[])
Определения tools.php:5214
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
Определения tools.php:2701
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
Определения tools.php:5177
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
DeleteDirFilesEx($path, $root=null)
Определения tools.php:2823
CopyDirFiles($path_from, $path_to, $ReWrite=true, $Recursive=false, $bDeleteAfterCopy=false, $strExclude="")
Определения tools.php:2732
GetMessage($name, $aReplace=null)
Определения tools.php:3397
GetFileNameWithoutExtension($path)
Определения tools.php:2986
GetFileName($path)
Определения tools.php:3001
$name
Определения menu_edit.php:35
getList(array $select, array $filter, array $order, PageNavigation $pageNavigation=null)
$value
Определения Param.php:39
$order
Определения payment.php:8
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
if(empty($signedUserToken)) $key
Определения quickway.php:257
</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
$paths
Определения options.php:2080
$langs
Определения options.php:141
$arFilter
Определения user_search.php:106