Leaderboard
Popular Content
Showing content with the highest reputation on 04/21/14 in all areas
-
1 point
количество тем в категориях
Дмитрий Кондин reacted to XTRO for сообщение в теме
я сделал по другому (всё по аналогии, не совсем кошерно, т.к. дублирование в декораторе, но на скорую руку работает) : В темплейте как обычно: {$resp_menu}создал \apps\system\lib\frontend\menu\resp_menu.php: <?php/** * Resp menu class */class Resp_Menu extends Structure_Manager{ /** * Constructor */ function __construct() { $this->SiteBill(); } /** * Get resp menu * @param * @return */ function get_menu() { require_once(SITEBILL_DOCUMENT_ROOT.'/apps/system/lib/frontend/menu/menu_decorator.php'); //require_once(SITEBILL_DOCUMENT_ROOT.'/apps/system/lib/admin/structure/structure_implements.php'); $SM=new Structure_Manager(); $structure=$SM->loadCategoryStructure(); $data_structure=$SM->load_data_structure(0); foreach($structure['catalog'] as $cat_point){ $ch=0; $SM->getChildsItemsCount($cat_point['id'], $structure['childs'], $data_structure['data'][0], $ch); $data_structure['data'][0][$cat_point['id']]+=$ch; } foreach($structure['catalog'] as $id=>$cat_point){ if(!in_array($cat_point['id'], $structure['childs'][0])){ $structure['catalog'][$id]['name']=$structure['catalog'][$id]['name'].' ('.$data_structure['data'][0][$id].')'; } } $rs = Menu_Decorator::getMenu('resp_menu', $structure); return $rs; }}?>в apps\system\lib\frontend\menu\menu_decorator.php добавил выбор: case 'resp_menu' : { $function_name='getMenu_respmenu'; break; }и в конец класса: private static function getMenu_respmenu($category_structure){ $rs = '<ul class="menu">'; foreach ( $category_structure['childs'][0] as $item_id => $categoryID ) { if($category_structure['catalog'][$categoryID]['url']!=''){ if ( preg_match('/^http/', $category_structure['catalog'][$categoryID]['url']) ) { $rs .= '<li><a href="'.$category_structure['catalog'][$categoryID]['url'].'">'.$category_structure['catalog'][$categoryID]['name'].'</a>'; } else { $rs .= '<li><a href="'.SITEBILL_MAIN_URL.'/'.$category_structure['catalog'][$categoryID]['url'].'">'.$category_structure['catalog'][$categoryID]['name'].'</a>'; } }else{ $rs .= '<li><a href="'.SITEBILL_MAIN_URL.'/topic'.$categoryID.'.html">'.$category_structure['catalog'][$categoryID]['name'].'</a>'; } $rs .= self::getChildNodes_respmenu($categoryID, $category_structure, $current_category_id); $rs .= '</li>'; } $rs .= '</ul>'; return $rs; } private static function getChildNodes_respmenu($categoryID, $category_structure, $current_category_id) { if ( !is_array($category_structure['childs'][$categoryID]) ) { return ''; } $rs = '<ul style="z-index: 50">';//TODO move in css // foreach ( $category_structure['childs'][$categoryID] as $child_id ) { if($category_structure['catalog'][$child_id]['url']!=''){ $rs .= '<li><a href="'.SITEBILL_MAIN_URL.'/'.$category_structure['catalog'][$child_id]['url'].'">'.$category_structure['catalog'][$child_id]['name'].'</a>'; }else{ $rs .= '<li><a href="'.SITEBILL_MAIN_URL.'/topic'.$child_id.'.html"><span class="no-image">'.$category_structure['catalog'][$child_id]['name'].'</a>'; } if ( count($category_structure['childs'][$child_id]) > 0 ) { $rs .= self::getChildNodes_respmenu($child_id, $category_structure, $current_category_id); } $rs .= '</li>'; } $rs .= '</ul>'; return $rs; }в main.php в main() добавил } elseif ( $this->getConfigValue('menu_type') == 'respmenu' ) { require_once(SITEBILL_DOCUMENT_ROOT.'/apps/system/lib/frontend/menu/respmenu.php'); $resp_menu = new Resp_Menu(); $this->template->assert('resp_menu', $resp_menu->get_menu());Ну, и в \apps\config\admin\config_mask.php, чтобы в админке можно было выбрать тип, заменил на: $data_model['menu_type']['select_data'] = array('purecss'=>'purecss','slidemenu'=>'slidemenu','megamenu'=>'megamenu', 'respmenu'=>'respmenu');css по вкусу. Я юзал KickStart. Правда, этот вариант отработает до очередного обновления . Имхо, просто добавить getChildsItemsCount() в виде опции (в конфиге рядом с выбором типа меню в следующих релизах ) -
1 pointв начало index.php $time_start = microtime(true);require('memdbg.php');$m = new MemoryUsageInformation(true);сам класс: <?php/* спасибо автору скрипта, к сожадению мне не известному*/class MemoryUsageInformation { private $real_usage; private $statistics = array(); public function __construct($real_usage = false) { $this->real_usage = $real_usage; } public function getCurrentMemoryUsage($with_style = true) { $mem = memory_get_usage($this->real_usage); return ($with_style) ? $this->byteFormat($mem) : $mem; } public function getPeakMemoryUsage($with_style = true) { $mem = memory_get_peak_usage($this->real_usage); return ($with_style) ? $this->byteFormat($mem) : $mem; } public function setMemoryUsage($info = '') { $this->statistics[] = array('time' => time(), 'info' => $info, 'memory_usage' => $this->getCurrentMemoryUsage()); } public function printMemoryUsageInformation() { foreach ($this->statistics as $satistic) { $str = "Time: " . $satistic['time'] . " | Memory Usage: " . $satistic['memory_usage'] . " | Info: " . $satistic['info']; $str .= "\n"; } $str.= "\n\n<br />"; $str.= "Peak of memory usage: " . $this->getPeakMemoryUsage(); $str.= "\n\n<br />"; return $str; } public function setStart($info = 'Initial Memory Usage') { $this->setMemoryUsage($info); } public function setEnd($info = 'Memory Usage at the End') { $this->setMemoryUsage($info); } private function byteFormat($bytes, $unit = "", $decimals = 2) { $units = array('B' => 0, 'KB' => 1, 'MB' => 2, 'GB' => 3, 'TB' => 4, 'PB' => 5, 'EB' => 6, 'ZB' => 7, 'YB' => 8); $value = 0; if ($bytes > 0) { if (!array_key_exists($unit, $units)) { $pow = floor(log($bytes)/log(1024)); $unit = array_search($pow, $units); } $value = ($bytes/pow(1024,floor($units[$unit]))); } if (!is_numeric($decimals) || $decimals < 0) { $decimals = 2; } return sprintf('%.' . $decimals . 'f '.$unit, $value); }}для независимости добавил в main.php перед render шаблона , но по правильному надо в выход: // ************************************************// global $time_start, $m; $time_end = microtime(true); $precision = 2; $tr= 'Build time : '. intval(($time_end - $time_start)*pow(10,$precision))/pow(10,$precision).' sec'; $smarty->assign('timerender',$tr); unset($tr); $usemem= memory_get_peak_usage(); $usemem = 'Memory: '. round($usemem/1024/1024,2) . ' Mb'; $smarty->assign('usemem',$usemem); unset($usemem); $smarty->assign('pr_m',$m->printMemoryUsageInformation());// ************************************************//ну и в самом main.tpl перед </body>: <div class="dbg">{$timerender} - {$usemem} - {$pr_m}</div> можно использовать, как вариант, для замера цикла: $m = new MemoryUsageInformation(true);$m->setStart();$a = array();$m->setMemoryUsage("до цикла");for($i = 0; $i < 100000; $i++) { $a[$i] = uniqid();}$m->setMemoryUsage("после цикла");unset($a);$m->setMemoryUsage("после unset()");$m->setEnd();$m->printMemoryUsageInformation();Осталось притулить sql вывод и получится debug панелька. Хотя лучше всё организовать на уровне хелпера.