static function import($arParams)
{
global $APPLICATION;
// check fields
$aMsg = array();
$arParams['SET_ID'] = intval($arParams['SET_ID']);
$arParams['IMPORT_IF_FILE_EXISTS'] = isset($arParams['IMPORT_IF_FILE_EXISTS']) && $arParams['IMPORT_IF_FILE_EXISTS'] == 'Y'? true: false;
if(isset($arParams['FILE']) && GetFileExtension($arParams['FILE']) != 'zip')
{
$aMsg["FILE_EXT"] = array("id"=>"FILE_EXT", "text"=> GetMessage("MAIN_SMILE_IMPORT_FILE_EXT_ERROR"));
}
else if (!isset($arParams['FILE']) || !file_exists($arParams['FILE']))
{
$aMsg["FILE"] = array("id"=>"FILE", "text"=> GetMessage("MAIN_SMILE_IMPORT_FILE_ERROR"));
}
else if($arParams['SET_ID'] <= 0)
{
$aMsg["SET_ID"] = array("id"=>"SET_ID", "text"=> GetMessage("MAIN_SMILE_IMPORT_SET_ID_ERROR"));
}
if(!empty($aMsg))
{
$e = new CAdminException($aMsg);
$APPLICATION->ThrowException($e);
return false;
}
$sUnpackDir = CTempFile::GetDirectoryName(1);
CheckDirPath($sUnpackDir);
/** @var IBXArchive $oArchiver */
$oArchiver = CBXArchive::GetArchive($arParams['FILE'], "ZIP");
$oArchiver->SetOptions(array("STEP_TIME" => 300));
if (!$oArchiver->Unpack($sUnpackDir))
{
$aMsg["UNPACK"] = array("id"=>"UNPACK", "text"=> GetMessage("MAIN_SMILE_IMPORT_UNPACK_ERROR"));
$e = new CAdminException($aMsg);
$APPLICATION->ThrowException($e);
return false;
}
$arSmiles = Array();
if (file_exists($sUnpackDir.'install.csv'))
{
$arLang = Array();
$db_res = CLanguage::GetList();
while ($res = $db_res->Fetch())
{
if (file_exists($sUnpackDir.'install_lang_'. $res["LID"].'.csv'))
{
$csvFile = new CCSVData();
$csvFile->LoadFile($sUnpackDir.'install_lang_'.$res["LID"].'.csv');
$csvFile->SetFieldsType("R");
$csvFile->SetFirstHeader(false);
while($smile = $csvFile->Fetch())
{
if (defined('BX_UTF') && BX_UTF)
{
if ($res["LID"] == 'ru')
{
$smile[1] = BitrixMainTextEncoding::convertEncoding($smile[1], 'windows-1251', 'utf-8');
}
elseif ($res["LID"] == 'de')
{
$smile[1] = BitrixMainTextEncoding::convertEncoding($smile[1], 'iso8859-15', 'utf-8');
}
}
$arLang[$smile[0]][$res["LID"]] = $smile[1];
}
}
}
$csvFile = new CCSVData();
$csvFile->LoadFile($sUnpackDir.'install.csv');
$csvFile->SetFieldsType("R");
$csvFile->SetFirstHeader(false);
while($smileRes = $csvFile->Fetch())
{
$smile = Array(
'TYPE' => $smileRes[0],
'CLICKABLE' => $smileRes[1] == 'Y'? 'Y': 'N',
'SORT' => intval($smileRes[2]),
'IMAGE' => $smileRes[3],
'IMAGE_WIDTH' => intval($smileRes[4]),
'IMAGE_HEIGHT' => intval($smileRes[5]),
'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),
'HIDDEN' => in_array($smileRes[7], Array('Y', 'N'))? $smileRes[7]: 'N',
'IMAGE_LANG' => in_array($smileRes[7], Array('Y', 'N'))? $smileRes[8]: $smileRes[7], // for legacy
'TYPING' => in_array($smileRes[7], Array('Y', 'N'))? $smileRes[9]: $smileRes[8]
);
if (!in_array($smile['TYPE'], Array(CSmile::TYPE_SMILE, CSmile::TYPE_ICON)))
continue;
$smile['IMAGE'] = GetFileName($smile['IMAGE']);
$info = (new BitrixMainFileImage($sUnpackDir.$smile['IMAGE']))->getInfo();
if (!$info)
continue;
$arInsert = Array(
'TYPE' => $smile['TYPE'],
'SET_ID' => $arParams['SET_ID'],
'CLICKABLE' => $smile['CLICKABLE'],
'SORT' => $smile['SORT'],
'IMAGE' => $smile['IMAGE'],
'IMAGE_WIDTH' => $smile['IMAGE_WIDTH'],
'IMAGE_HEIGHT' => $smile['IMAGE_HEIGHT'],
'IMAGE_DEFINITION' => $smile['IMAGE_DEFINITION'],
'HIDDEN' => $smile['HIDDEN'],
'TYPING' => $smile['TYPING'],
);
if (isset($arLang[$smile['IMAGE_LANG']]))
$arInsert['LANG'] = $arLang[$smile['IMAGE_LANG']];
$arSmiles[] = $arInsert;
}
}
else
{
$smileSet = CSmileSet::getById($arParams['SET_ID']);
if ($handle = @opendir($sUnpackDir))
{
$sort = 300;
while (($file = readdir($handle)) !== false)
{
if ($file == "." || $file == "..")
continue;
if (is_file($sUnpackDir.$file))
{
$info = (new BitrixMainFileImage($sUnpackDir.$file))->getInfo();
if ($info)
{
$smileHR = self::IMAGE_SD;
$smileType = CSmile::TYPE_SMILE;
$smileCode = GetFileNameWithoutExtension($file);
if (strpos($file, 'smile_') === 0)
{
$smileCode = mb_substr($smileCode, 6);
}
elseif (strpos($file, 'smile') === 0)
{
$smileCode = mb_substr($smileCode, 5);
}
elseif (strpos($file, 'icon_') === 0)
{
$smileType = CSmile::TYPE_ICON;
$smileCode = mb_substr($smileCode, 5);
}
else if (strpos($file, 'icon') === 0)
{
$smileType = CSmile::TYPE_ICON;
$smileCode = mb_substr($smileCode, 4);
}
if (mb_strrpos($smileCode, '_hr') !== false && mb_strrpos($smileCode, '_hr') == mb_strlen($smileCode) - 3)
{
$smileHR = self::IMAGE_HD;
$smileCode = mb_substr($smileCode, 0, mb_strrpos($smileCode, '_hr'));
}
else if (($pos = mb_strpos($smileCode, '_hr_')))
{
$smileHR = self::IMAGE_HD;
$smileCode = mb_substr($smileCode, 0, $pos).'_'.mb_substr($smileCode, $pos + 4);
}
else if (mb_strrpos($smileCode, '_uhd') !== false && mb_strrpos($smileCode, '_uhd') == mb_strlen($smileCode) - 4)
{
$smileHR = self::IMAGE_UHD;
$smileCode = mb_substr($smileCode, 0, mb_strrpos($smileCode, '_uhd'));
}
$arSmiles[] = Array(
'TYPE' => $smileType,
'SET_ID' => $arParams['SET_ID'],
'CLICKABLE' => 'Y',
'SORT' => $sort,
'IMAGE' => $file,
'IMAGE_WIDTH' => intval($info->getWidth()),
'IMAGE_HEIGHT' => intval($info->getHeight()),
'IMAGE_DEFINITION' => $smileHR,
'TYPING' => ':'.($smileSet['STRING_ID'] ?? $smileSet['ID']).'/'.$smileCode.':',
);
$sort = $sort+5;
}
}
}
@closedir($handle);
}
}
$importSmile = 0;
foreach ($arSmiles as $smile)
{
$sUploadDir = ($smile['TYPE'] == CSmile::TYPE_ICON? CSmile::PATH_TO_ICON: CSmile::PATH_TO_SMILE).intval($smile["SET_ID"]).'/';
if (file_exists($sUnpackDir.$smile['IMAGE']) && ($arParams['IMPORT_IF_FILE_EXISTS'] || !file_exists($_SERVER["DOCUMENT_ROOT"].$sUploadDir.$smile['IMAGE'])))
{
if (CheckDirPath($_SERVER["DOCUMENT_ROOT"].$sUploadDir))
{
$insertId = CSmile::add($smile);
if ($insertId)
{
if ($arParams['IMPORT_IF_FILE_EXISTS'] && file_exists($_SERVER["DOCUMENT_ROOT"].$sUploadDir.$smile['IMAGE']))
{
$importSmile++;
}
else if (copy($sUnpackDir.$smile['IMAGE'], $_SERVER["DOCUMENT_ROOT"].$sUploadDir.$smile['IMAGE']))
{
@chmod($_SERVER["DOCUMENT_ROOT"].$sUploadDir.$smile['IMAGE'], BX_FILE_PERMISSIONS);
$importSmile++;
}
else
{
CSmile::delete($insertId);
}
}
$APPLICATION->ResetException();
}
}
}
self::setLastUpdate();
return $importSmile;
}