Кастомизация макроса catalog getObjectsList для ускорения формирования страницы
Материал из Umicms
Макрос catalog getObjectsList() можно вынести в кастом и изменить логику его работы таким образом, что список объектов каталога будет формироваться значительно быстрее. Суть заключается в том, что все необходимые данные об объекте каталога мы получаем внутри метода getObjectsListCustom, а в самом XSL-шаблоне, через протокол upage – никакие данные о странице уже не получаем, т.к. все есть в XML-данных полученных через метод getObjectsListCustom.
Для подключения кастомного макроса необходимо сначала в папке classes/modules/catalog/ создать файл permissions.custom.php следующего содержания:
<?php $permissions = Array('view' => Array('getObjectsListCustom')); ?>
Потом в файл classes/modules/catalog/__custom.php необходимо добавить измененный код метода getObjectsList:
public function getObjectsListCustom($template = "default", $path = false, $limit = false, $ignore_paging = false, $i_need_deep = 0) { if(def_module::breakMe()) return; if(!$template) $template = "default"; if (!$i_need_deep) $i_need_deep = intval(getRequest('param4')); if (!$i_need_deep) $i_need_deep = 0; $i_need_deep = intval($i_need_deep); if ($i_need_deep === -1) $i_need_deep = 100; $hierarchy = umiHierarchy::getInstance(); $hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("catalog", "object")->getId(); if($category_id === false && $path != KEYWORD_GRAB_ALL) { throw new publicException("Element not found: \"{$path}\""); } $hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("catalog", "object")->getId(); $hierarchy_type = umiHierarchyTypesCollection::getInstance()->getType($hierarchy_type_id); $type_id = umiObjectTypesCollection::getInstance()->getBaseType($hierarchy_type->getName(), $hierarchy_type->getExt()); if(!$type_id) { $type_id = umiObjectTypesCollection::getInstance()->getBaseType($hierarchy_type->getName(), $hierarchy_type->getExt()); } $per_page_r = regedit::getInstance()->getVal("//modules/catalog/per_page"); $per_page = ($limit) ? $limit : $per_page_r; $curr_page = getRequest('p'); if($ignore_paging) $curr_page = 0; $sel = new umiSelection; $sel->setElementTypeFilter(); $sel->addElementType($hierarchy_type_id); if($path != KEYWORD_GRAB_ALL) { $sel->setHierarchyFilter(); $sel->addHierarchyFilter($category_id, $i_need_deep); } $sel->setPermissionsFilter(); $sel->addPermissions(); if($path === KEYWORD_GRAB_ALL) { $curr_category_id = cmsController::getInstance()->getCurrentElementId(); } else { $curr_category_id = $category_id; } if($path != KEYWORD_GRAB_ALL) { $type_id = $hierarchy->getDominantTypeId($curr_category_id, $i_need_deep); } if($type_id) { def_module::autoDetectOrders($sel, $type_id); def_module::autoDetectFilters($sel, $type_id); } else { $sel->setOrderFilter(); $sel->setOrderByName(); } if($curr_page !== "all") { $curr_page = (int) $curr_page; $sel->setLimitFilter(); $sel->addLimit($per_page, $curr_page); } $result = umiSelectionsParser::runSelection($sel); $total = umiSelectionsParser::runSelectionCounts($sel); $objects = umiObjectsCollection::getInstance(); if(($sz = sizeof($result)) > 0) { $block_arr = Array(); $lines = Array(); for($i = 0; $i < $sz; $i++) { $element_id = $result[$i]; $element = umiHierarchy::getInstance()->getElement($element_id); if(!$element) continue; $line_arr = Array(); $line_arr['attribute:id'] = $element_id; $line_arr['attribute:alt_name'] = $element->getAltName(); $line_arr['attribute:link'] = umiHierarchy::getInstance()->getPathById($element_id); $line_arr['xlink:href'] = "upage://" . $element_id; $line_arr['name'] = $element->getName(); $line_arr['status_zakaza_id'] = $element->getValue('status_zakaza'); $line_arr['osobennost_id'] = $element->getValue('osobennost'); $line_arr['h1'] = $element->getValue('h1'); $price = $element->getValue('price'); $line_arr['price'] = number_format($price, 0, '.', '\''); $line_arr['status_zakaza_name'] = $objects->getObject($line_arr['status_zakaza_id'])->getName(); $kratkoe_opisanie = $element->getValue('kratkoe_opisanie'); $line_arr['kratkoe_opisanie'] = $kratkoe_opisanie; $line_arr['header_pic'] = $element->getValue('header_pic'); $lines['nodes:item'][] = $line_arr; templater::pushEditable("catalog", "object", $element_id); umiHierarchy::getInstance()->unloadElement($element_id); } $block_arr['lines'] = $lines; $block_arr['numpages'] = umiPagenum::generateNumPage($total, $per_page); $block_arr['total'] = $total; $block_arr['per_page'] = $per_page; $block_arr['category_id'] = $category_id; if($type_id) { $block_arr['type_id'] = $type_id; } return $block_arr; } else { $block_arr['numpages'] = umiPagenum::generateNumPage(0, 0); $block_arr['lines'] = ""; $block_arr['total'] = 0; $block_arr['per_page'] = 0; $block_arr['category_id'] = $category_id; return $block_arr; } }
Результат работы оригинального метода getObjectsList выглядит следующим образом:
<?xml version="1.0" encoding="utf-8"?> <udata module="catalog" method="getObjectsList" generation-time="0.872797"> <lines> <item id="2430" alt_name="garmin_nuvi_3790t" link="/goods/gps/garmin_nuvi_3790t/" xlink:href="upage://2585">Автомобильный GPS Навигатор Garmin Nuvi 3790T</item> <item id="2429" alt_name="garmin_nuvi_3760t" link="/goods/gps/garmin_nuvi_3760t/" xlink:href="upage://2590">Автомобильный GPS Навигатор Garmin Nuvi 3760T</item> <item id="2428" alt_name="garmin_nuvi_1410t" link="/goods/gps/garmin_nuvi_1410t/" xlink:href="upage://2613">Автомобильный GPS Навигатор Garmin Nuvi 1410T</item> <lines> <udata>
а элемент item кастомного метода getObjectsListCustom:
<item id="2622" num="1" alt_name="garmin_nuvi_1200" link="/goods/gps/garmin_nuvi_1200/" xlink:href="upage://2622"> <name>Автомобильный GPS Навигатор Garmin Nuvi 1200</name> <status_zakaza_id>27658</status_zakaza_id> <osobennost_id>28407</osobennost_id> <h1>Автомобильный GPS Навигатор Garmin Nuvi 1200</h1> <price>4'990</price> <status_zakaza_name>в наличии</status_zakaza_name> <kratkoe_opisanie>Компактная модель автомобильного GPS навигатора nuvi 1200 легко помещается в кармане.</kratkoe_opisanie> <header_pic path="./images/cms/data/garmin_nuvi_1200.jpg" size="13568" ext="jpg" width="150" height="150">/images/cms/data/garmin_nuvi_1200.jpg</header_pic> </item>
В XSL-шаблоне необходимо вместо стандартного метода вызывать getObjectsListCustom и средствами XSLT обработать полученные XML данные.
