Кастомизация макроса 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, '.', '\'');
if($line_arr['status_zakaza_id'] != false) {
	$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 данные.