XTRO

Участники
  • Публикации

    1039
  • Зарегистрирован

  • Посещение

  • Days Won

    59

Все публикации пользователя XTRO

  1. скорее всего скорее всего не по памяти, а move_uploaded_file не отработал. У нас If в этом месте не обрабатывается. По идее, по хорошему, Exception тут не хватает.
  2. а файлы админки трогались? у админа в базе соответствующая группа (group_id) стоит?
  3. 1) RewriteCond %{HTTP_HOST} ^www\.ваш_сайт\.ruRewriteRule ^(.*)$ http://ваш_сайт.ru/$1 [R=permanent,L]2 ) уже обсуждалось 3) у каждого он будет всё равно свой из-за вариантов доступа к настройкам сервера. Например, мне пришлось добавлять: AddDefaultCharset UTF-8php_value upload_max_filesize 4Mphp_value post_max_size 4Mphp_value max_execution_time 90
  4. Вы имеете ввиду так? Тогда это уже не breadcrumbs, а полноценное меню получается.
  5. Это полный листинг? у меня для админки 404
  6. получим 500 вообще, правило работает, слэш добавляется, но нарушается роутинг шкуры
  7. а я, по своей тупости, (ещё до просмотра этого видео) полез приспосабливать для другого , т.к понадобилось сделать рандомный вывод графических custom_банеров в определенном разделе, подход использовал аналогичный: хтмл_код - обычная ссылка с картинки, а в имени - осмысленное системное имя для каждого банера (типа right_top_banner1, right_top_banner2, right_top_banner3 ), т.е. отличаются только цифрой, потом в нужном месте темплейта: {if $smarty.server.REQUEST_URI|regex_replace:"/\?(.*)/":"" eq '/kommercheskaya'} <div class="custom_banners"> {assign var=tmp_var value = $right_top_banner{rand(1,3)} } {if $tmp_var} {$tmp_var} {/if} </div> {/if} + добавить учёт кликов и получим миниротатор
  8. а я юзаю Smarty Debug Console просто через {debug} или для конкретники <pre>{$news_list_column|debug_print_var}</pre>или {$themeurl|var_dump}
  9. я добавил в .htaccess (подробнee в PM) Options +FollowSymLinksRewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})RewriteRule ^(.*)$ index.php [F,L]
  10. по сабжу: а мы о каком css говорим? 2? 3? Если 3, то будем использовать препроцессор SASS? какой тогда синтаксис: SCSS (более новый) и SASS (более старый)? Юзаем ли Compass ?
  11. Что база, что файлы : перед любыми работами/экспериментами: backup, backup и ещё раз backup! Как в поговорке : люди делятся на тех кто делает бэкапы и на тех кто теперь делает.
  12. если срочно, то пост выше. Но, правильнее, вариант переопределения в main.php. Тогда останется после обновления.
  13. подозреваю, что apps\system\lib\sitebill.php $rs = implode(' / ', array_reverse($ra));
  14. тогда конкретнее, где именно необходимо заменить?
  15. вообще в нескольких местах, в т.ч. apps\system\lib\sitebill_krascap.php apps\system\lib\sitebill.php в function get_breadcrumbs ( $items ) заменить символ / на свой Но, надо иметь ввиду, что исправление здесь только до следующего обновления ядра.
  16. я сделал по другому (всё по аналогии, не совсем кошерно, т.к. дублирование в декораторе, но на скорую руку работает) : В темплейте как обычно: {$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() в виде опции (в конфиге рядом с выбором типа меню в следующих релизах )
  17. и что нам даст добавление? (getTemplateMenu ведь нигде не дёргается + private)
  18. в начало 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 панелька. Хотя лучше всё организовать на уровне хелпера.