Created
June 26, 2012 14:13
-
-
Save ilyabrin/2996012 to your computer and use it in GitHub Desktop.
JustMyWork.php
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?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