Создание кастомного макроса на основе существующего (catalog getObjectsList)
Материал из Umicms
Бывает возникает ситуация, что необходимо немного модернизировать существующий в системе макрос, добавить какую-либо функциональность. Изменять код системы нельзя потому что изменения затрутся при обновлении. Один из вариантов решения данной задачи это перенос кода существующего метода в кастомный макрос, добавив необходимые изменения. Рассмотрим пример изменения макроса data getObjectList(), добавим в него функционал, который позволит пронумеровать объекты каталога. Пропишем обновленный код в файл ~classes/modules/custom.php, после слов //TODO: Write your own macroses here.
public function getObjectsListNew($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(); list($template_block, $template_block_empty, $template_block_search_empty, $template_line) = def_module::loadTemplates("tpls/catalog/{$template}.tpl", "objects_block", "objects_block_empty", "objects_block_search_empty", "objects_block_line"); $hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("catalog", "object")->getId(); $category_id = def_module::analyzeRequiredPath($path); 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 (кол-во элементов на странице) из атрибута макроса либо из реестра каталога (настройка модуля каталог) $per_page_r = regedit::getInstance()->getVal("//modules/catalog/per_page"); $per_page = ($limit) ? $limit : $per_page_r; // $curr_page - текущая страница $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); 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:num'] = $curr_page*$per_page + $i + 1; $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['node:text'] = $element->getName(); $lines[] = def_module::parseTemplate($template_line, $line_arr, $element_id); templater::pushEditable("catalog", "object", $element_id); umiHierarchy::getInstance()->unloadElement($element_id); } $block_arr['subnodes: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 def_module::parseTemplate($template_block, $block_arr, $category_id); } 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 def_module::parseTemplate($template_block_empty, $block_arr, $category_id); } }
Для подобных задач, в основном необходимо поменять вызов методов класса def_module (/classes/modules/def_module.php). Допустим, необходимо данный вызов метода breakMe():
$this->breakMe()
поменять на:
def_module::breakMe()
В классе модуля Каталог (classes/modules/catalog/class.php), в конструкторе __construct() часто определяются переменные, значения которых соответствуют настройкам модуля (/admin/catalog/config/), прописаные в административной части системы. В конструкторе модуля Каталог определяется переменная per_page, которой присваивается значение "Количество объектов на странице" установленное в настройках модуля Каталог:
$this->per_page = regedit::getInstance()->getVal("//modules/catalog/per_page");
пропишем переменную в нашем кастомном макросе в таком виде:
$per_page_r = regedit::getInstance()->getVal("//modules/catalog/per_page");
В конце метода, там где определяются различные атрибуты для каждого объекта каталога, допустим:
$line_arr['attribute:link'] = umiHierarchy::getInstance()->getPathById($element_id);
в том же блоке пропишем еще один параметр:
$line_arr['attribute:num'] = $curr_page*$per_page + $i + 1;
данный параметр позволит нам в tpl-шаблоне модуля Каталог (/tpls/catalog/), в блоке objects_block_line, использовать макрос %num% который пронумерует каждый объект каталога, от 1 до N. Пример вызова макроса: %custom getObjectsListNew('default',45)%
