%PDF- %PDF-
| Direktori : /proc/self/root/home/bitrix/www/bitrix/modules/sale/lib/tradingplatform/vk/ |
| Current File : //proc/self/root/home/bitrix/www/bitrix/modules/sale/lib/tradingplatform/vk/vkcategories.php |
<?php
namespace Bitrix\Sale\TradingPlatform\Vk;
use Bitrix\Sale\TradingPlatform\Vk\Api\ApiHelper;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\Application;
Loc::loadMessages(__FILE__);
/**
* Class VkCategories
* Download categories from vk, save them in cache, get from cache
* @package Bitrix\Sale\TradingPlatform\Vk
*/
class VkCategories
{
const CACHE_DIR = '/sale/vkexport/';
const CACHE_TTL = 86400;
const CACHE_ID_PREFIX = "vkcategory_cache";
private $exportId;
/**
* VkCategories constructor.
* @param $exportId - int, ID of export profile
*/
public function __construct($exportId)
{
$this->exportId = $exportId;
}
/**
* Create agent for pereodical update vk-categories in values (main function)
*
* @return array|bool|false|mixed|null - ID of created or existing agent
*/
public function createAgent()
{
// CREATE agent if not exist
if (!$agent = $this->getAgentId())
{
$ttl = self::CACHE_TTL;
$timeToStart = ConvertTimeStamp(strtotime(date('Y-m-d H:i:s', time() + $ttl)), 'FULL');
$resultAgentAdd = \CAgent::AddAgent(
self::createAgentName($this->exportId),
'sale',
"N",
$ttl,
$timeToStart,
"Y",
$timeToStart
);
return $resultAgentAdd;
}
else
{
return $agent;
}
}
/**
* @return array|bool|false|mixed|null
* Check if exist agent for update vk-categories.
* Return agent ID
*/
private function getAgentId()
{
$dbRes = \CAgent::GetList(
array(),
array(
'NAME' => self::createAgentName($this->exportId),
)
);
if ($agent = $dbRes->Fetch())
return $agent;
else
return false;
}
/**
* @param $exportid
* Remove agent for current export ID
*/
public static function deleteAgent($exportid)
{
// not change cache - they will self dropped after ttl
// dropped agent
$dbRes = \CAgent::GetList(
array(),
array(
'NAME' => self::createAgentName($exportid),
)
);
if ($agent = $dbRes->Fetch())
\CAgent::Delete($agent["ID"]);
}
/**
* Remove agents for ALL export IDs
*/
public static function deleteAllAgents()
{
$vk = Vk::getInstance();
$settings = $vk->getSettings();
foreach ($settings as $id => $value)
{
self::deleteAgent($id);
}
}
/**
* @return string
* Create name for cache
*/
private static function createCacheId()
{
// we need only one cache for all exports => no needed export ID for cache ID
return self::CACHE_ID_PREFIX;
}
/**
* @param $exportid
* @return string
* Create name for agent
*/
private static function createAgentName($exportid)
{
return 'Bitrix\Sale\TradingPlatform\Vk\VkCategories::updateVkCategoriesAgent("' . $exportid . '");';
}
/**
* If cache exist - get values from it.
* Else - download categories via API
*
* @param bool $isTree
* @return array|bool
*/
public function getList($isTree = true)
{
$cacheManager = Application::getInstance()->getManagedCache();
$result = NULL;
if ($cacheManager->read(self::CACHE_TTL, self::createCacheId()))
{
$result = $cacheManager->get(self::createCacheId());
}
else
{
$result = self::updateDataToCache($this->exportId);
}
if ($isTree)
$result = self::convertVkCategoriesToTree($result);
else
$result = self::convertVkCategoriesToList($result);
return $result;
}
/**
* Load vk-categories from VK and save them to cache.
*
* @param $exportId
* @return bool - array of VkCategories or false if error
*/
private static function updateDataToCache($exportId)
{
$vkCategories = self::getDataFromVk($exportId);
if (is_array($vkCategories))
{
$cacheManager = Application::getInstance()->getManagedCache();
$cacheManager->set(self::createCacheId(), $vkCategories);
return $vkCategories;
}
else
{
return false;
}
}
/**
* get vk categories from vk-api
*
* @param $exportId
* @return array
*/
private static function getDataFromVk($exportId)
{
$apiHelper = new ApiHelper($exportId);
return $apiHelper->getVkCategories();
}
/**
* Convert category list to tree
*
* @param $categoriesList
* @return array
*/
private static function convertVkCategoriesToTree($categoriesList)
{
$categoriesTree = array();
foreach ($categoriesList as $category)
{
if (!isset($categoriesTree[$category["section"]["id"]]))
{
// create NEW tree-item
$categoriesTree[$category["section"]["id"]] = array(
"ID" => $category["section"]["id"],
"NAME" => $category["section"]["name"],
"ITEMS" => array(),
);
}
// put data in exist tree item
$categoriesTree[$category["section"]["id"]]["ITEMS"][$category["id"]] = array(
"ID" => $category["id"],
"NAME" => $category["name"],
);
}
return $categoriesTree;
}
/**
* Convert category list from VK to correct list
*
* @param $categoriesList
* @return array
*/
private static function convertVkCategoriesToList($categoriesList)
{
$categoriesListFormatted = array();
foreach ($categoriesList as $category)
{
$categoriesListFormatted[$category["id"]]= array(
"ID" => $category["id"],
"NAME" => $category["name"],
);
}
return $categoriesListFormatted;
}
/**
* Formmatted selector to HTML. Not create <select> tag. only inner options.
*
* @param null $catVkSelected - ID of item, which it is necessary to ckecked
* @param string $defaultItemText - if set - rename first element. Default - 'Check category'
* @return string
*/
public function getVkCategorySelector($catVkSelected = NULL, $defaultItemText = '')
{
$vkCategory = $this->getList();
// todo: why upper case dont work?
$defaultItemText = strlen($defaultItemText) > 0 ? $defaultItemText : Loc::getMessage("SALE_CATALOG_CHANGE_VK_CATEGORY");
$strSelect = '<option value="-1">[' . $defaultItemText . ']</option>';
foreach ($vkCategory as $vkTreeItem)
{
$strSelect .= '<option disabled value="0">' . strtoupper($vkTreeItem["NAME"]) . '</option>';
foreach ($vkTreeItem["ITEMS"] as $sectionItem)
{
$selected = '';
if ($catVkSelected && ($sectionItem["ID"] == $catVkSelected))
$selected = " selected";
$strSelect .= '<option' . $selected . ' value="' . $sectionItem["ID"] . '">- ' . $sectionItem["NAME"] . '</option>';
}
}
return $strSelect;
}
/**
* Agent wrap-method for update cache
*
* @param $exportId
* @return string
*/
public function updateVkCategoriesAgent($exportId)
{
if (self::updateDataToCache($exportId))
return self::createAgentName($exportId);
else return '';
}
}