Your IP : 18.226.185.28


Current Path : /home/bitrix/ext_www/ballu.in.ua/local/modules/rusklimat.exchange/classes/general/
Upload File :
Current File : /home/bitrix/ext_www/ballu.in.ua/local/modules/rusklimat.exchange/classes/general/file.php

<?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);
		}
	}
}