13trait OptionsHelperTrait
15 protected static function setLastUpdate(): void
27 public static function getLastUpdate(): DateTime
34 if (!$lastUpdateTimestamp)
36 self::setLastUpdate();
39 return DateTime::createFromTimestamp($lastUpdateTimestamp);
45 use OptionsHelperTrait;
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';
59 private static function checkFields(&
$arFields, $actionType = self::CHECK_TYPE_ADD)
66 $aMsg[] =
array(
"id"=>
"TYPE",
"text"=>
GetMessage(
"MAIN_SMILE_TYPE_ERROR"));
67 else if($actionType == self::CHECK_TYPE_ADD && !isset(
$arFields[
'TYPE']))
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"));
73 if($actionType == self::CHECK_TYPE_ADD && (!isset(
$arFields[
'SORT']) || intval(
$arFields[
'SORT']) <= 0))
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"));
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"));
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;
91 if($actionType == self::CHECK_TYPE_ADD && (!isset(
$arFields[
'IMAGE']) ||
$arFields[
'IMAGE'] ==
''))
92 $aMsg[] =
array(
"id"=>
"IMAGE",
"text"=>
GetMessage(
"MAIN_SMILE_IMAGE_ERROR"));
95 $aMsg[] =
array(
"id"=>
"IMAGE",
"text"=>
GetMessage(
"MAIN_SMILE_IMAGE_ERROR"));
98 $aMsg[
"IMAGE_XY"] =
array(
"id"=>
"IMAGE_XY",
"text"=>
GetMessage(
"MAIN_SMILE_IMAGE_XY_ERROR"));
101 $aMsg[
"IMAGE_XY"] =
array(
"id"=>
"IMAGE_XY",
"text"=>
GetMessage(
"MAIN_SMILE_IMAGE_XY_ERROR"));
105 $e =
new CAdminException($aMsg);
117 if (!self::checkFields(
$arFields, self::CHECK_TYPE_ADD))
125 'IMAGE_WIDTH' => intval(
$arFields[
'IMAGE_WIDTH']),
126 'IMAGE_HEIGHT' => intval(
$arFields[
'IMAGE_HEIGHT']),
129 if (isset(
$arFields[
'IMAGE_DEFINITION']))
131 $arInsert[
'IMAGE_DEFINITION'] =
$arFields[
'IMAGE_DEFINITION'];
132 if ($arInsert[
'IMAGE_DEFINITION'] == self::IMAGE_UHD)
134 $arInsert[
'IMAGE_WIDTH'] = $arInsert[
'IMAGE_WIDTH']/4;
135 $arInsert[
'IMAGE_HEIGHT'] = $arInsert[
'IMAGE_HEIGHT']/4;
137 else if ($arInsert[
'IMAGE_DEFINITION'] == self::IMAGE_HD)
139 $arInsert[
'IMAGE_WIDTH'] = $arInsert[
'IMAGE_WIDTH']/2;
140 $arInsert[
'IMAGE_HEIGHT'] = $arInsert[
'IMAGE_HEIGHT']/2;
145 $arInsert[
'TYPING'] =
$arFields[
'TYPING'];
148 $arInsert[
'CLICKABLE'] =
$arFields[
'CLICKABLE'];
151 $arInsert[
'HIDDEN'] =
$arFields[
'HIDDEN'];
153 $setId = intval(
$DB->Add(
"b_smile", $arInsert));
165 if (trim(
$name) <>
'')
168 'TYPE' => self::TYPE_SMILE,
171 'NAME' => trim(
$name),
173 $DB->Add(
"b_smile_lang", $arInsert);
178 self::setLastUpdate();
184 public static function update($id,
$arFields)
190 if (!self::checkFields(
$arFields, self::CHECK_TYPE_UPDATE))
196 $arUpdate[
'TYPE'] =
"'".$arFields[
'TYPE'].
"'";
199 $arUpdate[
'SET_ID'] = intval(
$arFields[
'SET_ID']);
202 $arUpdate[
'SORT'] = intval(
$arFields[
'SORT']);
206 $arUpdate[
'IMAGE'] =
"'".$DB->ForSql(
$arFields[
'IMAGE']).
"'";
207 $arUpdate[
'IMAGE_WIDTH'] = intval(
$arFields[
'IMAGE_WIDTH']);
208 $arUpdate[
'IMAGE_HEIGHT'] = intval(
$arFields[
'IMAGE_HEIGHT']);
210 if (isset(
$arFields[
'IMAGE_DEFINITION']))
212 $arUpdate[
'IMAGE_DEFINITION'] =
"'".$DB->ForSql(
$arFields[
'IMAGE_DEFINITION']).
"'";
213 if (
$arFields[
'IMAGE_DEFINITION'] == self::IMAGE_UHD)
215 $arUpdate[
'IMAGE_WIDTH'] = $arUpdate[
'IMAGE_WIDTH']/4;
216 $arUpdate[
'IMAGE_HEIGHT'] = $arUpdate[
'IMAGE_HEIGHT']/4;
218 else if (
$arFields[
'IMAGE_DEFINITION'] == self::IMAGE_HD)
220 $arUpdate[
'IMAGE_WIDTH'] = $arUpdate[
'IMAGE_WIDTH']/2;
221 $arUpdate[
'IMAGE_HEIGHT'] = $arUpdate[
'IMAGE_HEIGHT']/2;
227 $arUpdate[
'TYPING'] =
"'".$DB->ForSql(
$arFields[
'TYPING']).
"'";
230 $arUpdate[
'CLICKABLE'] =
"'".$arFields[
'CLICKABLE'].
"'";
233 $arUpdate[
'HIDDEN'] =
"'".$arFields[
'HIDDEN'].
"'";
235 if (!empty($arUpdate))
236 $DB->Update(
"b_smile", $arUpdate,
"WHERE ID = ".intval($id));
248 if (trim(
$name) <>
'')
250 $DB->Query(
"DELETE FROM b_smile_lang WHERE TYPE = '".self::TYPE_SMILE.
"' AND SID = ".$id.
" AND LID = '".
$DB->ForSql(
htmlspecialcharsbx(
$lang)).
"'",
true);
252 'TYPE' => self::TYPE_SMILE,
255 'NAME' => trim(
$name),
257 $DB->Add(
"b_smile_lang", $arInsert);
262 self::setLastUpdate();
268 public static function delete($id, $removeFile =
true)
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']);
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);
285 self::setLastUpdate();
291 public static function deleteBySet($id, $removeFile =
true)
300 $arSmiles = self::getList(Array(
301 'SELECT' => Array(
'ID',
'SET_ID',
'TYPE',
'IMAGE'),
302 'FILTER' => Array(
'SET_ID' => $id),
304 foreach ($arSmiles as
$key => $arSmile)
306 $arDelete[] = intval(
$key);
315 if (!empty($arDelete))
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);
320 self::setLastUpdate();
327 public static function deleteByGallery($id, $removeFile =
true)
337 $arSmiles = self::getList(Array(
338 'SELECT' => Array(
'ID',
'SET_ID',
'TYPE',
'IMAGE'),
339 'FILTER' => Array(
'PARENT_ID' => $id),
342 foreach ($arSmiles as
$key => $arSmile)
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'].
'/';
350 foreach ($arDir as
$path)
356 if (!empty($arDelete))
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);
361 self::setLastUpdate();
368 public static function getById($id,
$lang = LANGUAGE_ID)
376 SELECT s.*, sl.NAME, sl.LID
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.
"";
382 if (
$lang !== self::GET_ALL_LANGUAGE)
389 while ($row =
$res->GetNext(
true,
false))
397 $arResult[
'NAME'][$row[
'LID']] = $row[
'NAME'];
409 $arParams[
'SELECT'] = Array(
'ID',
'SET_ID',
'TYPE',
'NAME',
'SORT',
'TYPING',
'CLICKABLE',
'HIDDEN',
'IMAGE',
'IMAGE_DEFINITION',
'IMAGE_WIDTH',
'IMAGE_HEIGHT');
412 foreach (
$arParams[
'SELECT'] as $fieldName)
414 if ($fieldName ==
'NAME')
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)).
"'";
419 elseif ($fieldName ==
'SET_NAME')
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)).
"'";
427 $arSelect[$fieldName] =
's.'.$fieldName;
430 $arSelect[
'ID'] =
's.ID';
449 if (isset(
$arParams[
'FILTER'][
'SET_ID']))
451 if (is_array(
$arParams[
'FILTER'][
'SET_ID']))
458 $arFilter[] =
"s.SET_ID IN ('".implode(
"','",
$ID).
"')";
465 if (isset(
$arParams[
'FILTER'][
'TYPE']) && in_array(
$arParams[
'FILTER'][
'TYPE'], Array(self::TYPE_SMILE, self::TYPE_ICON)))
467 $arFilter[] =
"s.TYPE = '".$arParams[
'FILTER'][
'TYPE'].
"'";
469 if (isset(
$arParams[
'FILTER'][
'PARENT_ID']))
472 $arJoin[
'PARENT'] =
"LEFT JOIN b_smile_set ss2 ON ss2.ID = s.SET_ID";
481 $by = mb_strtoupper($by);
482 if (in_array($by, Array(
'ID',
'SET_ID',
'SORT',
'IMAGE_DEFINITION',
'HIDDEN')))
484 $arOrder[$by] =
's.'.$by.
' '.
$order;
490 $arOrder[
'ID'] =
's.ID DESC';
493 $strSelect =
"SELECT ".implode(
', ', $arSelect);
496 ".(!empty($arJoin)? implode(
' ', $arJoin):
"").
"
498 ".(!empty($arOrder)?
"ORDER BY ".implode(
', ', $arOrder):
"").
"
503 return $strSelect.$strSql;
508 $nTopCount = intval(
$arParams[
'NAV_PARAMS'][
'nTopCount'] ?? 0);
511 $strSql =
$DB->TopSql($strSelect.$strSql, $nTopCount);
516 $res_cnt =
$DB->Query(
"
517 SELECT COUNT(s.ID) as CNT
521 $arCount = $res_cnt->Fetch();
522 $res =
new CDBResult();
523 $res->NavQuery($strSelect.$strSql, $arCount[
"CNT"],
$arParams[
"NAV_PARAMS"]);
528 $res =
$DB->Query($strSelect.$strSql);
537 while ($row =
$res->GetNext(
true,
false))
547 public static function getByType(
$type = self::TYPE_ALL, $setId = CSmileSet::SET_ID_BY_CONFIG,
$lang = LANGUAGE_ID)
549 return self::getBySetId(
$type, $setId,
$lang);
552 public static function getBySetId(
$type = self::TYPE_ALL, $setId = CSmileSet::SET_ID_BY_CONFIG,
$lang = LANGUAGE_ID)
555 if (in_array(
$type,
array(self::TYPE_SMILE, self::TYPE_ICON)))
558 $setId = intval($setId);
560 if ($setId == CSmileSet::SET_ID_BY_CONFIG)
562 $arFilter[
'PARENT_ID'] = CSmileGallery::getDefaultId();
563 $cacheSetId =
'p'.$arFilter[
'PARENT_ID'];
567 $cacheSetId = $setId;
568 if ($setId != CSmileSet::SET_ID_ALL)
576 $cache_id =
"b_smile_set_2_".$arFilter[
"TYPE"].
"_".$cacheSetId.
"_".
$lang;
578 if (CACHED_b_smile !==
false &&
$CACHE_MANAGER->Read(CACHED_b_smile, $cache_id,
"b_smile"))
585 'ORDER' => Array(
'SORT' =>
'ASC'),
589 if (CACHED_b_smile !==
false)
597 public static function getByGalleryId(
$type = self::TYPE_ALL, $galleryId = CSmileGallery::GALLERY_DEFAULT,
$lang = LANGUAGE_ID)
600 if (in_array(
$type,
array(self::TYPE_SMILE, self::TYPE_ICON)))
603 $galleryId = intval($galleryId);
604 if ($galleryId == CSmileGallery::GALLERY_DEFAULT)
605 $galleryId = CSmileGallery::getDefaultId();
611 $cache_id =
"b_smile_gallery_".$arFilter[
"TYPE"].
"_".$galleryId.
"_".
$arFilter[
"LID"];
613 if (CACHED_b_smile !==
false &&
$CACHE_MANAGER->Read(CACHED_b_smile, $cache_id,
"b_smile"))
619 $arSets = CSmileSet::getList(Array(
620 'FILTER' => Array(
'PARENT_ID' => $galleryId)
622 foreach ($arSets as $set)
628 'ORDER' => Array(
'SORT' =>
'ASC'),
632 if (CACHED_b_smile !==
false)
647 $arParams[
'IMPORT_IF_FILE_EXISTS'] = isset(
$arParams[
'IMPORT_IF_FILE_EXISTS']) &&
$arParams[
'IMPORT_IF_FILE_EXISTS'] ==
'Y'?
true:
false;
650 $aMsg[
"FILE_EXT"] =
array(
"id"=>
"FILE_EXT",
"text"=>
GetMessage(
"MAIN_SMILE_IMPORT_FILE_EXT_ERROR"));
654 $aMsg[
"FILE"] =
array(
"id"=>
"FILE",
"text"=>
GetMessage(
"MAIN_SMILE_IMPORT_FILE_ERROR"));
658 $aMsg[
"SET_ID"] =
array(
"id"=>
"SET_ID",
"text"=>
GetMessage(
"MAIN_SMILE_IMPORT_SET_ID_ERROR"));
662 $e =
new CAdminException($aMsg);
671 $oArchiver->SetOptions(
array(
"STEP_TIME" => 300));
673 if (!$oArchiver->Unpack($sUnpackDir))
675 $aMsg[
"UNPACK"] =
array(
"id"=>
"UNPACK",
"text"=>
GetMessage(
"MAIN_SMILE_IMPORT_UNPACK_ERROR"));
676 $e =
new CAdminException($aMsg);
682 if (file_exists($sUnpackDir.
'install.csv'))
688 if (file_exists($sUnpackDir.
'install_lang_'.
$res[
"LID"].
'.csv'))
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())
696 $arLang[$smile[0]][
$res[
"LID"]] = $smile[1];
701 $csvFile =
new CCSVData();
702 $csvFile->LoadFile($sUnpackDir.
'install.csv');
703 $csvFile->SetFieldsType(
"R");
704 $csvFile->SetFirstHeader(
false);
705 while($smileRes = $csvFile->Fetch())
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],
717 'TYPING' => in_array($smileRes[7], Array(
'Y',
'N'))? $smileRes[9]: $smileRes[8]
720 if (!in_array($smile[
'TYPE'], Array(CSmile::TYPE_SMILE, CSmile::TYPE_ICON)))
725 $info = (new \Bitrix\Main\File\Image($sUnpackDir.$smile[
'IMAGE']))->getInfo();
730 'TYPE' => $smile[
'TYPE'],
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'],
742 if (isset($arLang[$smile[
'IMAGE_LANG']]))
743 $arInsert[
'LANG'] = $arLang[$smile[
'IMAGE_LANG']];
745 $arSmiles[] = $arInsert;
750 $smileSet = CSmileSet::getById(
$arParams[
'SET_ID']);
751 if (
$handle = @opendir($sUnpackDir))
754 while (($file = readdir(
$handle)) !==
false)
756 if ($file ==
"." || $file ==
"..")
759 if (is_file($sUnpackDir.$file))
761 $info = (new \Bitrix\Main\File\Image($sUnpackDir.$file))->getInfo();
764 $smileHR = self::IMAGE_SD;
765 $smileType = CSmile::TYPE_SMILE;
767 if (str_starts_with($file,
'smile_'))
769 $smileCode = mb_substr($smileCode, 6);
771 elseif (str_starts_with($file,
'smile'))
773 $smileCode = mb_substr($smileCode, 5);
775 elseif (str_starts_with($file,
'icon_'))
777 $smileType = CSmile::TYPE_ICON;
778 $smileCode = mb_substr($smileCode, 5);
780 else if (str_starts_with($file,
'icon'))
782 $smileType = CSmile::TYPE_ICON;
783 $smileCode = mb_substr($smileCode, 4);
785 if (mb_strrpos($smileCode,
'_hr') !==
false && mb_strrpos($smileCode,
'_hr') == mb_strlen($smileCode) - 3)
787 $smileHR = self::IMAGE_HD;
788 $smileCode = mb_substr($smileCode, 0, mb_strrpos($smileCode,
'_hr'));
790 else if (($pos = mb_strpos($smileCode,
'_hr_')))
792 $smileHR = self::IMAGE_HD;
793 $smileCode = mb_substr($smileCode, 0, $pos).
'_'.mb_substr($smileCode, $pos + 4);
795 else if (mb_strrpos($smileCode,
'_uhd') !==
false && mb_strrpos($smileCode,
'_uhd') == mb_strlen($smileCode) - 4)
797 $smileHR = self::IMAGE_UHD;
798 $smileCode = mb_substr($smileCode, 0, mb_strrpos($smileCode,
'_uhd'));
802 'TYPE' => $smileType,
807 'IMAGE_WIDTH' => intval(
$info->getWidth()),
808 'IMAGE_HEIGHT' => intval(
$info->getHeight()),
809 'IMAGE_DEFINITION' => $smileHR,
810 'TYPING' =>
':'.($smileSet[
'STRING_ID'] ?? $smileSet[
'ID']).
'/'.$smileCode.
':',
820 foreach ($arSmiles as $smile)
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'])))
827 $insertId = CSmile::add($smile);
830 if (
$arParams[
'IMPORT_IF_FILE_EXISTS'] && file_exists(
$_SERVER[
"DOCUMENT_ROOT"].$sUploadDir.$smile[
'IMAGE']))
834 else if (copy($sUnpackDir.$smile[
'IMAGE'],
$_SERVER[
"DOCUMENT_ROOT"].$sUploadDir.$smile[
'IMAGE']))
836 @chmod(
$_SERVER[
"DOCUMENT_ROOT"].$sUploadDir.$smile[
'IMAGE'], BX_FILE_PERMISSIONS);
841 CSmile::delete($insertId);
850 self::setLastUpdate();
859 public static function moveSmilesToUploadAgent(): string
863 'old' =>
'/bitrix/images/main/smiles/',
864 'new' => self::PATH_TO_SMILE
867 'old' =>
'/bitrix/images/main/icons/',
868 'new' => self::PATH_TO_ICON
878 $directory = new \Bitrix\Main\IO\Directory($oldPath);
879 if ($directory->isExists())
881 CopyDirFiles($directory->getPhysicalPath(), $newPath,
true,
true);
882 self::setLastUpdate();
886 $returnValue = __METHOD__ .
'();';
896 use OptionsHelperTrait;
898 const GALLERY_DEFAULT = 0;
899 const GET_ALL_LANGUAGE =
false;
903 $arFields[
'TYPE'] = CSmileSet::TYPE_GALLERY;
907 public static function update($id,
$arFields)
909 return CSmileSet::update($id,
$arFields);
912 public static function delete($id)
918 $res =
$DB->Query(
"SELECT ID, TYPE FROM b_smile_set WHERE ID = ".$id);
919 if ($smileGallery =
$res->Fetch())
921 CSmile::deleteByGallery($smileGallery[
'ID']);
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);
928 self::setLastUpdate();
933 public static function getById($id,
$lang = LANGUAGE_ID)
935 return CSmileSet::getById($id,
$lang);
938 public static function getByStringId($stringId,
$lang = LANGUAGE_ID)
940 return CSmileSet::getByStringId($stringId, CSmileSet::TYPE_GALLERY,
$lang);
945 $arParams[
'FILTER'][
'TYPE'] = CSmileSet::TYPE_GALLERY;
949 public static function getListCache(
$lang = LANGUAGE_ID)
955 $cache_id =
"b_smile_gallery_".$lang;
957 if (CACHED_b_smile !==
false &&
$CACHE_MANAGER->Read(CACHED_b_smile, $cache_id,
"b_smile"))
963 $arResult = self::getList(Array(
'ORDER' => Array(
'SORT' =>
'ASC')),
$lang);
964 if (CACHED_b_smile !==
false)
971 public static function getListForForm(
$lang = LANGUAGE_ID)
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));
980 public static function getDefaultId()
985 $gallery = CSmileGallery::getByStringId(
'bitrix');
989 $galleryId = $gallery[
'ID'];
990 self::setDefaultId($galleryId);
994 $eventGalleryId = -1;
995 foreach(
GetModuleEvents(
"main",
"OnBeforeSmileGalleryGetDefaultId",
true) as $arEvent)
998 return $eventGalleryId > 0 && $eventGalleryId != $galleryId? $eventGalleryId: $galleryId;
1001 public static function setDefaultId($id)
1006 public static function getSmilesWithSets($galleryId = self::GALLERY_DEFAULT,
$options = [])
1008 if ($galleryId == self::GALLERY_DEFAULT)
1010 $galleryId = self::getDefaultId();
1013 $result =
array(
'SMILE' => Array(),
'SMILE_SET' => Array());
1015 $smiles = CSmile::getByGalleryId(CSmile::TYPE_SMILE, $galleryId);
1017 $smilesSet = CSmileSet::getListCache();
1019 $fullTypings = isset(
$options[
'FULL_TYPINGS']) &&
$options[
'FULL_TYPINGS'] ===
'Y';
1021 $userSets = Array();
1022 foreach ($smiles as $smile)
1024 if ($smile[
'HIDDEN'] ==
'Y')
1027 $typing = explode(
" ", $smile[
'TYPING']);
1028 if (isset(
$result[
'SMILE'][$typing[0]]))
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'],
1041 $userSets[$smile[
'SET_ID']] =
true;
1043 foreach ($smilesSet as
$key => $value)
1045 if (!$userSets[$value[
'ID']])
1048 if (empty($value[
'NAME']))
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'],
1062 public static function installGallery()
1064 $smileGalleryId = 0;
1069 while($language =
$langs->Fetch())
1071 $lid = $language[
"LID"];
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'];
1079 $gallery = CSmileGallery::getByStringId(
'bitrix');
1083 $smileGalleryId = CSmileGallery::add(Array(
1084 'STRING_ID' =>
'bitrix',
1090 $smileGalleryId = $gallery[
'ID'];
1093 if ($smileGalleryId)
1095 $smileSet = CSmileSet::getByStringId(
'bitrix_main');
1098 $smileSetId = $smileSet[
'ID'];
1099 CSmile::deleteBySet($smileSet[
'ID']);
1103 $smileSetId = CSmileSet::add(Array(
1104 'STRING_ID' =>
'bitrix_main',
1105 'PARENT_ID' => $smileGalleryId,
1110 CSmile::import(
array(
'FILE' =>
$_SERVER[
"DOCUMENT_ROOT"].
'/bitrix/modules/main/install/smiles/smiles_default.zip',
'SET_ID' => $smileSetId,
'IMPORT_IF_FILE_EXISTS' =>
'Y'));
1114 public static function convertGallery()
1122 while($language =
$langs->Fetch())
1124 $lid = $language[
"LID"];
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'];
1134 $smileGalleryId = 0;
1136 $gallery = CSmileGallery::getByStringId(
'bitrix');
1139 $smileGalleryId = CSmileGallery::add(Array(
1140 'STRING_ID' =>
'bitrix',
1146 $smileGalleryId = $gallery[
'ID'];
1149 if (COption::GetOptionInt(
"main",
"smile_gallery_converted", 0) == 0)
1151 $res =
$DB->Query(
'SELECT * FROM b_smile');
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'),
1171 $smileOriginalCount = 0;
1172 while ($smile =
$res->fetch())
1174 if ($smile[
'TYPE'] != CSmile::TYPE_SMILE)
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']
1186 $smileOriginalCount++;
1192 if (!(($smileCount == 0 || $smileCount == 15) && $smileCount == $smileOriginalCount))
1194 $smileCustomGalleryId = 0;
1195 $smileSet = CSmileGallery::getByStringId(
'bitrix_convert');
1198 $smileCustomGalleryId = CSmileGallery::add(Array(
1199 'STRING_ID' =>
'bitrix_convert',
1207 $smileCustomGalleryId = $smileSet[
'ID'];
1209 CSmileGallery::setDefaultId($smileCustomGalleryId);
1210 $DB->Query(
"UPDATE b_smile_set SET PARENT_ID = ".$smileCustomGalleryId.
" WHERE TYPE = 'G' AND PARENT_ID = 0");
1214 $smileSet = CSmileSet::getByStringId(
'main');
1217 CSmileSet::delete($smileSet[
'ID']);
1223 if ($smileGalleryId)
1225 $smileSet = CSmileSet::getByStringId(
'bitrix_main');
1228 $smileSetId = $smileSet[
'ID'];
1229 CSmile::deleteBySet($smileSet[
'ID']);
1233 $smileSetId = CSmileSet::add(Array(
1234 'STRING_ID' =>
'bitrix_main',
1235 'PARENT_ID' => $smileGalleryId,
1240 CSmile::import(
array(
'FILE' =>
$_SERVER[
"DOCUMENT_ROOT"].
'/bitrix/modules/main/install/smiles/smiles_default.zip',
'SET_ID' => $smileSetId,
'IMPORT_IF_FILE_EXISTS' =>
'Y'));
1249 use OptionsHelperTrait;
1251 const TYPE_SET =
'G';
1252 const TYPE_GALLERY =
'P';
1254 const SET_ID_ALL = 0;
1255 const SET_ID_BY_CONFIG = -1;
1256 const GET_ALL_LANGUAGE =
false;
1262 $arInsert =
array();
1265 $arInsert[
'PARENT_ID'] =
$arFields[
'PARENT_ID'];
1273 $arInsert[
'STRING_ID'] =
$arFields[
'STRING_ID'];
1276 $arInsert[
'SORT'] = intval(
$arFields[
'SORT']);
1280 $setId = intval(
$DB->Add(
"b_smile_set", $arInsert));
1298 $DB->Add(
"b_smile_lang", $arInsert);
1302 self::setLastUpdate();
1308 public static function update($id,
$arFields)
1314 $arUpdate = Array();
1317 $arUpdate[
'STRING_ID'] =
"'".$DB->ForSql(
$arFields[
'STRING_ID']).
"'";
1320 $arUpdate[
'SORT'] = intval(
$arFields[
'SORT']);
1322 if (!empty($arUpdate))
1323 $DB->Update(
"b_smile_set", $arUpdate,
"WHERE ID = ".$id);
1333 $res =
$DB->Query(
"SELECT TYPE FROM b_smile_set WHERE ID = ".$id);
1334 $smileSet =
$res->Fetch();
1338 $DB->Query(
"DELETE FROM b_smile_lang WHERE TYPE = '".$smileSet[
'TYPE'].
"' AND SID = ".$id.
" AND LID = '".
$DB->ForSql(
htmlspecialcharsbx(
$lang)).
"'",
true);
1340 'TYPE' => $smileSet[
'TYPE'],
1345 $DB->Add(
"b_smile_lang", $arInsert);
1349 self::setLastUpdate();
1355 public static function delete($id)
1361 $res =
$DB->Query(
"SELECT ID, TYPE FROM b_smile_set WHERE ID = ".$id);
1362 if ($smileSet =
$res->Fetch())
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);
1367 CSmile::deleteBySet($smileSet[
'ID']);
1370 self::setLastUpdate();
1376 public static function getById($id,
$lang = LANGUAGE_ID)
1384 SELECT ss.*, sl.NAME, sl.LID
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.
"";
1390 if (
$lang !== self::GET_ALL_LANGUAGE)
1397 while ($row =
$res->GetNext(
true,
false))
1405 $arResult[
'NAME'][$row[
'LID']] = $row[
'NAME'];
1411 public static function getByStringId($stringId,
$type = self::TYPE_SET,
$lang = LANGUAGE_ID)
1417 if (!in_array(
$type, Array(self::TYPE_SET, self::TYPE_GALLERY)))
1420 $type = self::TYPE_SET;
1424 SELECT ss.*, sl.NAME, sl.LID
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).
"'";
1430 if (
$lang !==
false)
1437 while ($row =
$res->GetNext(
true,
false))
1445 $arResult[
'NAME'][$row[
'LID']] = $row[
'NAME'];
1451 public static function getBySmiles($arSmiles)
1454 $arSets = self::getListCache();
1456 foreach ($arSmiles as $smile)
1458 if (isset($arSets[$smile[
'SET_ID']]))
1459 $arResult[$smile[
'SET_ID']] = $arSets[$smile[
'SET_ID']];
1471 $arParams[
'SELECT'] = Array(
'ID',
'STRING_ID',
'SORT',
'NAME',
'TYPE',
'PARENT_ID');
1473 if (isset(
$arParams[
'ORDER'][
'SMILE_COUNT']))
1479 if (!in_array(
$type, Array(CSmileSet::TYPE_SET, CSmileSet::TYPE_GALLERY)))
1481 $arParams[
'FILTER'][
'TYPE'] = CSmileSet::TYPE_SET;
1484 foreach (
$arParams[
'SELECT'] as $fieldName)
1486 if ($fieldName ==
'NAME')
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)).
"'";
1491 elseif ($fieldName ==
'SMILE_COUNT')
1493 if (
$arParams[
'FILTER'][
'TYPE'] == CSmileSet::TYPE_SET)
1495 $arSelect[
'SMILE_COUNT'] =
'(SELECT COUNT(s.ID) FROM b_smile s WHERE s.SET_ID = ss.ID) as SMILE_COUNT';
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';
1504 $arSelect[$fieldName] =
'ss.'.$fieldName;
1507 $arSelect[
'ID'] =
'ss.ID';
1512 if (is_array(
$arParams[
'FILTER'][
'ID']))
1526 if (isset(
$arParams[
'FILTER'][
'PARENT_ID']))
1530 if (isset(
$arParams[
'FILTER'][
'STRING_ID']))
1532 if (is_array(
$arParams[
'FILTER'][
'STRING_ID']))
1535 foreach (
$arParams[
'FILTER'][
'STRING_ID'] as
$key => $value)
1539 $arFilter[] =
"ss.STRING_ID IN ('".implode(
"','",
$ID).
"')";
1547 $arFilter[] =
"ss.TYPE = '".$arParams[
'FILTER'][
'TYPE'].
"'";
1554 $order = mb_strtoupper(
$order) ==
'ASC'?
'ASC':
'DESC';
1555 $by = mb_strtoupper($by);
1556 if (in_array($by, Array(
'ID',
'SORT')))
1558 $arOrder[$by] =
'ss.'.$by.
' '.
$order;
1560 else if ($by ==
'SMILE_COUNT')
1561 $arOrder[$by] = $by.
' '.
$order;
1566 $arOrder[
'ID'] =
'ss.ID DESC';
1569 $strSelect =
"SELECT ".implode(
', ', $arSelect);
1572 ".(!empty($arJoin)? implode(
' ', $arJoin):
"").
"
1574 ".(!empty($arOrder)?
"ORDER BY ".implode(
', ', $arOrder):
"").
"
1579 return $strSelect.$strSql;
1584 $nTopCount = intval(
$arParams[
'NAV_PARAMS'][
'nTopCount'] ?? 0);
1587 $strSql =
$DB->TopSql($strSelect.$strSql, $nTopCount);
1592 $res_cnt =
$DB->Query(
"
1593 SELECT COUNT(ss.ID) as CNT
1597 $arCount = $res_cnt->Fetch();
1598 $res =
new CDBResult();
1599 $res->NavQuery($strSelect.$strSql, $arCount[
"CNT"],
$arParams[
"NAV_PARAMS"]);
1604 $res =
$DB->Query($strSelect.$strSql);
1613 while ($row =
$res->GetNext(
true,
false))
1620 public static function getListCache(
$lang = LANGUAGE_ID)
1626 $cache_id =
"b_smile_set_2_".$lang;
1628 if (CACHED_b_smile !==
false &&
$CACHE_MANAGER->Read(CACHED_b_smile, $cache_id,
"b_smile"))
1634 $arResult = self::getList(Array(
'ORDER' => Array(
'SORT' =>
'ASC')),
$lang);
1635 if (CACHED_b_smile !==
false)
1645 public static function getFormList($bWithOptionAll =
false,
$lang = LANGUAGE_ID)
1647 return self::getListForForm(0,
$lang);
1650 public static function getListForForm($galleryId = 0,
$lang = LANGUAGE_ID)
1652 $arGalleryList = Array();
1655 $arGalleryList = CSmileGallery::getListForForm(
$lang);
1658 $arSetList = Array();
1659 foreach (CSmileSet::getListCache(
$lang) as
$key => $value)
1661 if ($galleryId > 0 && $value[
'PARENT_ID'] != $galleryId)
1664 $arSetList[
$key] = !empty($value[
'NAME'])?
$value[
'NAME']:
GetMessage(
'MAIN_SMILE_SET_NAME', Array(
'#ID#' =>
$key));
1665 if (
count($arGalleryList) > 1)
1667 $arSetList[
$key] = $arGalleryList[
$value[
'PARENT_ID']].
' > '.$arSetList[
$key];
1677 public static function getConfigSetId()
static GetList($by="sort", $order="asc", $arFilter=[])
static GetOptionString($module_id, $name, $def="", $site=false, $bExactSite=false)
static GetOptionInt($module_id, $name, $def="", $site=false)
static SetOptionString($module_id, $name, $value="", $desc=false, $site="")
static SetOptionInt($module_id, $name, $value="", $desc="", $site="")
static GetArchive($strArcName, $strType="")
static GetDirectoryName($hours_to_keep_files=0, $subdir="")
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
$_SERVER["DOCUMENT_ROOT"]
if(!defined('SITE_ID')) $lang
if($NS['step']==6) if( $NS[ 'step']==7) if(COption::GetOptionInt('main', 'disk_space', 0) > 0) $info
ExecuteModuleEventEx($arEvent, $arParams=[])
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
DeleteDirFilesEx($path, $root=null)
CopyDirFiles($path_from, $path_to, $ReWrite=true, $Recursive=false, $bDeleteAfterCopy=false, $strExclude="")
GetMessage($name, $aReplace=null)
GetFileNameWithoutExtension($path)
getList(array $select, array $filter, array $order, PageNavigation $pageNavigation=null)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key
</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."%"