Your IP : 18.226.185.28
<?php
/*
* RusKlimat
* Работа с файлами
*
* @author Alex
* @date 16/01/2018
*/
IncludeModuleLangFile(__FILE__);
class RusklimatFile extends RusklimatMain
{
protected $file_limit = 0;
protected $addressFileInfo = "";
protected $addressGetFile = "";
public function __construct()
{
parent::__construct();
$this->file_limit = COption::GetOptionInt("rusklimat.exchange", "RK_EXCHANGE_MAIN_FILE_LIMIT");
$this->addressFileInfo = $this->connection->getAddress("file_info");
$this->addressGetFile = $this->connection->getAddress("file_get");
if(empty($this->file_limit))
$this->setError('Empty setting: File Limit in module Catalog');
}
/*
* Проверка что свойство является типом Файл | на уровне логике 1С
*/
public function checkValForFile($value = false)
{
if(empty($value))
throw new Exception('Empty $value from checkValForFile function');
if(empty($value) || strlen($value) != 36)
return false;
if(substr_count($value, "-") == 4)
return true;
return false;
}
/*
* Проверка доступности файла, возвращение результата - адреса файла на сервере, или пометки что файл принят на загрузку
*/
function CheckGatewayFile($hash = "")
{
if(empty($hash))
throw new Exception('Empty $hash from CheckGatewayFile function');
global $DB;
// если ничего не найдется скажем, что пусто
$out = "none";
$sql = "SELECT * FROM a_gateway_file_stack WHERE HASH='$hash'; ";
$results = $DB->Query($sql);
while ($row = $results->Fetch())
{
// что-то вернулось
if(!empty($row["PATH"]))
$out = $row["PATH"]; // найден, вернем путь
else
$out = "not_ready"; // не готов
}
return $out;
}
/*
* Обновление или добавление информации о файле в таблице a_gateway_file_element
*/
function setFileElementLink($arFile){
if(empty($arFile["HASH"] || $arFile["ELEMENT_ID"] || $arFile["PROPERTY_CODE"]))
throw new Exception('Empty some $arFile option from setFileElementLink function');
global $DB;
// готовим параметры
$fid = $arFile["HASH"];
$elid = $arFile["ELEMENT_ID"];
$pcode = $arFile["PROPERTY_CODE"];
$hash = md5($fid.$elid.$pcode);
// обновляем или добавляем
$strSql = "INSERT INTO a_gateway_file_element (HASH, FILE_ID, ELEMENT_ID, DATE, PROPERTY_KEY, COUNT_ERROR) VALUES ('$hash', '$fid', '$elid', NOW(), '$pcode', 0) ON DUPLICATE KEY UPDATE DATE=NOW();";
$DB->Query($strSql, false, $err_mess.__LINE__);
}
/*
* Регистрация файла на обработку или если он есть вернем путь
*/
function registerGatewayFile($arFile = array())
{
if(empty($arFile["HASH"] || $arFile["ELEMENT_ID"] || $arFile["PROPERTY_CODE"]))
throw new Exception('Empty some $arFile option from registerGatewayFile function');
try {
// получение статуса файла error | not_ready | false | <PATH>
$check = self::CheckGatewayFile($arFile["HASH"]);
} catch (Exception $e) {
throw new Exception($e->GetMessage());
}
if($check == "none")
{
// пока пусто, файла нет
global $DB;
$strSql = "INSERT INTO a_gateway_file_stack (HASH, DATE, COUNT_ERROR) VALUES ('".$arFile["HASH"]."', NOW(), 0);";
$DB->Query($strSql, false, $err_mess.__LINE__);
//регистрируем элемента - слушателя
self::setFileElementLink($arFile); // не ставлю try...catch, т.к. данные проверяются выше
return "registered";
}
elseif($check == "not_ready")
{
// файл есть, не готов
//регистрируем элемента - слушателя
self::setFileElementLink($arFile);
return "not_ready";
}
else
{
// должен вернуть путь
self::setFileElementLink($arFile);
return $check;
}
}
/*
* Получить путь для сохранения файлов из настроек модуля
*/
public function getFileFolder()
{
$file_folder = COption::GetOptionString("rusklimat.exchange", "RK_EXCHANGE_MAIN_SERVER_API_FILE_FOLDER");
if(empty($file_folder))
throw new Exception('Empty settung File Folder from module Rusklimat');
else
return $_SERVER["DOCUMENT_ROOT"].$file_folder;
}
/*
* Скачивание файла из 1С на сервак
*/
function downloadFile($arFile = array())
{
if(empty($this->addressFileInfo))
throw new Exception('Empty addressFileInfo from downloadFile function');
if(empty($this->addressGetFile))
throw new Exception('Empty addressGetFile from downloadFile function');
if(empty($arFile))
throw new Exception('Empty arFile from downloadFile function');
global $DB;
$hash = $arFile["HASH"];
$arparams = array(
"max_len" => 200,
"change_case" => "L",
"replace_space" => "_",
"replace_other" => "",
"delete_repeat_replace" => true
);
$data = $this->connection->getRest($this->addressFileInfo."?guid=".$hash, [], "GET", true);
// версия
$version = $data["data"][0]["ТекущаяВерсия"]["ИдентификаторВБазе"];
// полный путь до файла
$path = $data["data"][0]["Наименование"];
$path_parts = pathinfo($path);
// расширение файла
if($path_parts["extension"] == "")
$ext = $data["data"][0]["ТекущаяВерсияРасширение"];
else
$ext = $path_parts["extension"];
// полное имя файла
$filename = Cutil::translit($path_parts['filename'], "ru", $arParams).".".$ext;
// путь до файла
$folder = $path_parts['dirname'];
if( $folder != "." && trim($folder) != "")
$folder = $folder."/";
else
$folder = "";
$file_folder = $this->getFileFolder();
$files[$hash]["FOLDER"] = $file_folder.$folder;
$files[$hash]["NEW_NAME"] = $file_folder.$folder.$filename;
$files[$hash]["URL"] = $this->addressGetFile.$hash."/";
// Проверка наличия папки загрузки
if (!is_dir($files[$hash]["FOLDER"])) {
mkdir($files[$hash]["FOLDER"], 0777, true);
}
// Загрузка файла
$content = $this->connection->getRestFile($files[$hash]["URL"]);
// если файл нашелся, то зальем его на сервер
if($content != "error")
{
file_put_contents($files[$hash]["NEW_NAME"], $content);
$sqlUp = "UPDATE a_gateway_file_stack SET PATH='" . $files[$hash]["NEW_NAME"] . "', UPDATED='Y', DATE_UPDATE=NOW(), VERSION='$version' WHERE HASH='$hash';";
$DB->Query($sqlUp, false, $err_mess . __LINE__);
$this->setResult("File GUID [$hash] - Downloaded!");
}
else
{
// если не нашелся, то добавим к неудачным попыткам+1
$count_error = $arFile["COUNT_ERROR"] + 1;
$sqlUp = "UPDATE a_gateway_file_stack SET COUNT_ERROR=$count_error, PATH=NULL, DATE_UPDATE=NOW() WHERE HASH='$hash';";
$DB->Query($sqlUp);
$this->setResult("File GUID [$hash] - Not downloaded! Сount error: $count_error.", true);
}
}
}