Наверное многие замечали, что при формирование страницы идет запрос на каждую позицию модуля в шаблоне.
Благодаря данному способу, мы оставляем только один запрос на страницу.
Раньше было
количество позиций в шаблоне = количество запросов на доступность модуля на странице
Сейчас количество позиций в шаблоне = 1
1. Открываем файл coreclassespage.class.php
и вставляем перед последней закрывающейся скобкой
Код PHP:
Теперь у нас функции для проверки модулей с позициями
////////////////////////////////////////////////////////////////////// public function CountModules_new ($position, $array){ return true; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public function getAllModules(){ $inCore = cmsCore::getInstance(); $inDB = cmsDatabase::getInstance(); //Получаем id пункта меню $menuid = $inCore->menuId(); // Проверяем позиции if (!$inCore->isMenuIdStrict()){ $strict_sql = "AND (m.is_strict_bind = 0)"; } else { $strict_sql = ""; } // Получаем все модули на позицию $sql = "SELECT *, m.id as mid, m.template as tpl FROM cms_modules m, cms_modules_bind mb WHERE m.published = 1 AND m.id = mb.module_id AND (mb.menu_id = '$menuid' OR mb.menu_id = 0) $strict_sql ORDER BY m.ordering ASC"; $result = $inDB->query($sql); if(!$inDB->num_rows($result)){ return false; } while ($mod = $inDB->fetch_assoc($result)){ $mods[$mod['position']][] = $mod; }//while return $mods; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** * Выводит модули для указанной позиции и текущего пункта меню * @param string $position * @return html */ public function printModules_new($position, $mods){ $inCore = cmsCore::getInstance(); $inDB = cmsDatabase::getInstance(); $inUser = cmsUser::getInstance(); global $_CFG; global $_LANG; //Получаем id пункта меню $menuid = $inCore->menuId(); // Проверяем позиции if (!$position) { return false; } if ($position=='top' && @$_REQUEST['view']=='search') { return true; } foreach($mods[$position] as $mod){ // Проверяем права доступа if (!$inCore->checkContentAccess($mod['access_list'])) { continue; } $modulefile = PATH.'/modules/'.$mod['content'].'/module.php'; if (!$mod['user']) { cmsCore::loadLanguage('modules/'.$mod['content']); } if( !$mod['is_external'] ){ //PROCESS FILTERS $filters = $inCore->getFilters(); if ($filters){ foreach($filters as $id=>$_data){ require_once 'filters/'.$_data['link'].'/filter.php'; $_data['link']($mod['content']); } } $callback = true; $modulebody = $mod['content']; } if( $mod['is_external'] ){ //load module file require_once $modulefile; //run module and get its output to $modulebody if ($mod['cache'] && $inCore->isCached('module', $mod['mid'], $mod['cachetime'], $mod['cacheint'])){ $modulebody = $inCore->getCache('module', $mod['mid']); $callback = true; } else { $config = $inCore->yamlToArray($mod['config']); $inCore->cacheModuleConfig($mod['module_id'], $config); $callback = $mod['content']($mod['module_id']); if($mod['cache']) { $inCore->saveCache('module', $mod['mid'], $modulebody); } } } } if ( $callback ){ //if module returns TRUE $mod['body'] = $modulebody; $smarty = $inCore->initSmartyModule(); if ($_CFG['fastcfg'] && $inCore->userIsAdmin($inUser->id)){ $smarty->assign('cfglink', '/admin/index.php?view=modules&do=edit&id='.$mod['mid']); } $smarty->assign('mod', $mod); $smarty->display($module_tpl); } }//while }
2. Идем в свой шаблон проверяем если нет
Код PHP:
то добавляем его в шаблон
$inPage = cmsPage::getInstance();
3. Собираем общее количество позиций с модулями
Код PHP:
У нас все модули с позициями собраны
$mods = $inPage->getAllModules();
4. делаем проверку на вывод модуля в позицию для примера для позиции top
Код PHP:
для видимого эффекта нужно сделать проверку всех позиций для вывода
$mod_count['top'] = $inPage->CountModules_new('top', $mods);
и пример как делается проверка для этой же позиции
Код PHP:
Необходимую операцию необходимо проделать для каждой позиции
<?php if ($mod_count['top']){ ?> <div class="clear"></div> <div id="topwide" class="container_12"> <div class="grid_12" id="topmod"><?php $inPage->printModules_new('mainbottom', $mods); ?></div> </div> <?php } ?>
Вот и все.
До установки данного хака было 51 запрос после 44 (все зависит от позиций в шаблоне)
---------------------------------------------------------------------------------------
P.S. Поменялись функции