Skip to content

Instantly share code, notes, and snippets.

@ilyabrin
Created June 26, 2012 14:13
Show Gist options
  • Select an option

  • Save ilyabrin/2996012 to your computer and use it in GitHub Desktop.

Select an option

Save ilyabrin/2996012 to your computer and use it in GitHub Desktop.
JustMyWork.php
<?php
//TODO: написать пустышку похожую на рабочий вариант и прогнать под отладчиком
class k_servicepayment_cache
{
const SERVICE_CACHE_DIR = '/terminal/_servicelib_cache';
const SERVICE_TREE_FILE = '/terminal/servicelib/service_tree.js';
const SERVICE_LOGO_DIR = '/terminal/servicelib/logo';
function refreshCache()
{
$json = Fh::_read(self::SERVICE_TREE_FILE);
if ($json)
{
$tree = Utils::_jsonDecode($json);
if (is_array($tree))
{
$config = configService::_get();
if (is_array($config))
{
$this->clearCache();
$terminal_tree = array();
foreach ($tree as $k=>$service)
{
if ($service['is_cat'] == 1)
{
$terminal_tree['k'.$k] = $service;
$terminal_tree['k'.$k]['op'] = 0;
$terminal_tree['k'.$k]['ic'] = (file_exists(self::SERVICE_LOGO_DIR."/".$service['id'].".png")) ? 1 : 0;
}
elseif (isset($service['service_provider_operator']))
{
foreach ($service['service_provider_operator'] as $id_service_provider_operator=>$operator)
{
if (isset($config[$id_service_provider_operator]))
{
$terminal_tree['k'.$k] = $service;
$terminal_tree['k'.$k]['fee_rule'] = $config[$id_service_provider_operator];
$terminal_tree['k'.$k]['op'] = $id_service_provider_operator;
$terminal_tree['k'.$k]['ic'] = (file_exists(self::SERVICE_LOGO_DIR."/".$service['id'].".png")) ? 1 : 0;
$this->cacheParam($id_service_provider_operator,$operator);
break;
}
}
}
unset($terminal_tree['k'.$k]['service_provider_operator']);
}
$this->cacheTree($terminal_tree);
return true;
}
}
}
return false;
}
///////////////////////////////////////////////
function refreshCacheDBG()
{
//header('Content-type: application/json'); //оставить для проверок
$json = Fh::_read(self::SERVICE_TREE_FILE); // загружаем в $json все данные из файла service_tree.js
if ($json) //загрузили?
{
$tree = Utils::_jsonDecode($json); //переводим из json в массив php (десериализация)
if (is_array($tree)) // десериализация в массив прошла успешно?
{
$config = configService::_get(); // читаем файл /terminal/service.cfg и десерализуем его на лету
if (is_array($config)) //если массив создан
{
#$this->clearCacheDBG(); // выносим все содержимое папки _servicelib_cache
$terminal_tree = array(); //инит массива для записи нового дерева
//new var
$parents = array(); // папки
$childs = array(); // вложенные папки
foreach ($tree as $k=>$service) //проходим каждую услугу из дерева услуг
{
if ($service['is_cat'] == 1) //если ключ равен 1, значит это категория услуг (если 0, значит это услуга)
{
$terminal_tree['k'.$k] = $service; // записываем услугу в елемент k*
$terminal_tree['k'.$k]['op'] = 0; // 0 - значит, что это категория (т.е. не имеет оператора)
$terminal_tree['k'.$k]['ic'] = (file_exists(self::SERVICE_LOGO_DIR."/".$service['id'].".png")) ? 1 : 0;
$parents['k'.$k] = $terminal_tree['k'.$k];
#$parents[$k] = $terminal_tree[$k];
}
//если это услуга, а не каталог
/*---------------------------------
if ($service['is_cat'] == 0) {
$terminal_tree['k'.$k] = $service;
#chekingPID:
if ($service['pid'] != 0) {
//найти оператора, у которого ID=&PID
foreach ($service['service_provider_operator'] as $id_service_provider_operator=>$operator) {
}
#goto checkingPID;
}
}
----------------------------------*/
elseif (isset($service['service_provider_operator'])) //такого параметра не имеют категории, только услуги
{
//function findOperatorByPID() <- recursive -> return $id_service_provider_operator
foreach ($service['service_provider_operator'] as $id_service_provider_operator=>$operator) //id_spo => номер оператора
{
if (isset($config[$id_service_provider_operator]))//если в .cfg есть провайдер с таким же id как в service_tree.js
{
$terminal_tree['k'.$k] = $service; //в дерево пишем услугу ( { "0":{..},"1":{..},"3":{..} } )
$terminal_tree['k'.$k]['fee_rule'] = $config[$id_service_provider_operator]; //правило комиссии из .cfg
$terminal_tree['k'.$k]['op'] = $id_service_provider_operator; // номер оператора в дерево
$terminal_tree['k'.$k]['ic'] = (file_exists(self::SERVICE_LOGO_DIR."/".$service['id'].".png")) ? 1 : 0;
$childs['k'.$k] = $terminal_tree['k'.$k];
#$childs[$k] = $terminal_tree[$k.];
$this->cacheParamDBG($id_service_provider_operator,$operator); //кешируем услугу в отдельный файл *.php
break; //и выходим
}
}
}
//unset($terminal_tree); //освобождаем ресурсы
} //.foreach (tree)
ksort($parents);
ksort($childs);
/*
Итак,
если услуга имеет PID равный ID папки,
смотрим, имеет ли папка PID не равный нулю
если PID папки не равен нулю, смотрим до тех пор, пока не PID=0
op=0 && pid=!id
*/
//////////////////// TODO: recode from skratch /////////////////////////////////////
function compareNodes(&$childs,$parentID, $isFolder = 0){ // подсчет вложенных папок
$num = 0;
foreach ($childs as $key2=>$childsValue) { // перебираем каждую услугу
if (intval($parentID['id']) == intval($childsValue['pid'])) { // если услуга вложена в папку
if ($isFolder == 0) {
if($terminal_tree['op'] !== 0) { // 1 = в папке, 0 - не в папке
if (compareNodes($childs,$childsValue,1) != 0) {
unset($terminal_tree[$key2]); // удаляем ее из дерева
//$num++;
$num_global++;
}
} //.op
}
elseif($isFolder == 1) { // иначе
//$num--;
return compareNodes($childs,$childsValue,1); // получаем количество вложенных папок
}
$num++;
} //.if
}
return $num;
}
////
function iamRock($parents, $childs ) {
$_parents = $parents; #array(); #папки
$_childs = $childs; #array(); #услуги
$countP = 0; #счетчик папок
$countC = 0; #счетчик услуг
foreach ($_parents AS $key=>$value) {
if ($countC != 0) {
foreach ($_childs AS $key2=>$value2) {
//...
if ($value['pid'] = $value2['id']) {
unset($terminal_tree[$key2]);
unset($_childs[$key2]);
$countC++;
iamRock($_parents,$_childs);
}
}
}
else {
// if $countC > 0 //
}
}
}
//
///--->
/**********************************************************************************************************************************************/
//function callForeach(){
//global $num_glogal;// = 0;
//$num_global = 0;
foreach ($parents as $key=>$parentID) { // перебираем каждую папку
//$num_folders = $num_global; // счетчик папок
$num = compareNodes($childs,$parentID); // количество папок внутри
$rootFolders = compareNodes($parents, $parentID, 1); // количество корневых папок
if ( $num == 0 ) {
unset($childs[$key]); // если нет вложенных папок, удалить из дерева
unset($terminal_tree[$key]);
//callForeach();
}
elseif ($num > 0) {
#вызвать себя же отсюда <---
//callForeach();
#$num = compareNodes();
//если есть главные папки
}
} //.foreach (parents)
//}//.fn
/**********************************************************************************************************************************************/
//iamRock($parents, $childs);
//callForeach();
$this->cacheTreeDBG($terminal_tree); //пишем новое дерево услуг в servicetree.js
Log::_log($terminal_tree, "__TT");
return true; //все круто //.refreshCacheDBG
} //.if array(config)
} //.if array(tree)
} //.if array(json)
return false; //не удалось загрузить файл
} //.fn refreshCacheDBG
/*
для каждой папки перебираем услуги
для каждой услуги
если id папки равен pid'у услуги, то
и если в папке нет элементов, то
удаляем папку из дерева услуг (terminal-tree)
а если папка не пустая,
то проходим ее заново
до тех пор, пока не будет найден корневой элемент id которого равен pid услуги
*/
/// переписать заново всю логику, что находится выше ////
///////////////////////////////////////////////////////////////////////////////////////////
/* Удаляет все содержимое директории /terminal/_servicelib_cache
*
*/
private function clearCacheDBG()
{
$dir = self::SERVICE_CACHE_DIR;
$objects = scandir($dir);
foreach ($objects as $object) {
if ($object != "." && $object != "..") {
if (filetype($dir."/".$object) == "dir") rrmdir($dir."/".$object); else unlink($dir."/".$object);
}
}
reset($objects);
rmdir($dir);
mkdir($dir,0755);
}
private function cacheTreeDBG($tree)
{
$file = self::SERVICE_CACHE_DIR.'/servicetree.js';
$content = Utils::_jsonEncode($tree);
return Fh::_write($file, $content);
}
/* Создает файл в /terminal/_service_lib_cache вида "$id_service_provider_operator.php"
*
* @id_service_provider_operator - номер оператора услуги
* @params - параметры, которые будут записаны в файл
*
*/
private function cacheParamDBG($id_service_provider_operator,$params)
{
$file = self::SERVICE_CACHE_DIR.'/'.$id_service_provider_operator.'_DBG'.'.php';
$content = "<?php \$data=".var_export($params,1)."?>";
$fh=fopen($file, 'w');
if ($fh)
{
if (fwrite($fh, $content))
{
fclose($fh);
@chmod($file, 0644);
return true;
}
}
}
//////////////////////////////////////////////
private function clearCache()
{
$dir = self::SERVICE_CACHE_DIR;
$objects = scandir($dir);
foreach ($objects as $object) {
if ($object != "." && $object != "..") {
if (filetype($dir."/".$object) == "dir") rrmdir($dir."/".$object); else unlink($dir."/".$object);
}
}
reset($objects);
rmdir($dir);
mkdir($dir,0755);
}
private function cacheTree($tree)
{
$file = self::SERVICE_CACHE_DIR.'/servicetree.js';
$content = Utils::_jsonEncode($tree);
return Fh::_write($file, $content);
}
private function cacheParam($id_service_provider_operator,$params)
{
$file = self::SERVICE_CACHE_DIR.'/'.$id_service_provider_operator.'.php';
$content = "<?php \$data=".var_export($params,1)."?>";
$fh=fopen($file, 'w');
if ($fh)
{
if (fwrite($fh, $content))
{
fclose($fh);
@chmod($file, 0644);
return true;
}
}
}
}
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment