Обновленный макрос doSelection, который принимает GET параметры (Фильтрация данных)
Материал из Umicms
В данной статье представлен обновленный макрос data doSelection(), в коде прописано название doSelectionNew, сам макрос пропишем в файле ~classes/modules/custom.php, после слов: //TODO: Write your own macroses here
public function doSelectionNew($template = "default", $uselName, $per_page) { if(!$per_page) return; def_module::templatesMode('tpl'); $params = func_get_args(); $params = array_slice($params, 3, sizeof($params) - 3); if($usel_get = getRequest('usel')){ $usel_p = explode("-",$usel_get); $params = array_merge($params, $usel_p); } $stream = new uselStream; $result = $stream->call($uselName, $params); list($objects_block, $objects_line, $objects_empty, $elements_block, $elements_line, $elements_empty, $separator, $separator_last) = def_module::loadTemplates("tpls/data/usel/{$template}.tpl", "objects_block", "objects_block_line", "objects_block_empty", "elements_block", "elements_block_line", "elements_block_empty", "separator", "separator_last" ); switch($result['mode']) { case "objects": $tpl_block = $objects_block; $tpl_line = $objects_line; $tpl_empty = $objects_empty; break; case "pages": $tpl_block = $elements_block; $tpl_line = $elements_line; $tpl_empty = $elements_empty; break; default: { throw new publicException("Unsupported return mode \"{$result['mode']}\""); } } if($result['sel'] instanceof selector) { $sel = $result['sel']; $limit = $per_page; $curr_page = (int) getRequest('p'); $offset = $curr_page * $limit; $sel->limit($offset, $limit); $results = $sel->result; $total = $sel->length; if($total == 0) { $tpl_block = $tpl_empty; } $objectsCollection = umiObjectsCollection::getInstance(); $hierarchy = umiHierarchy::getInstance(); $block_arr = Array(); $lines = Array(); $objectId = false; $elementId = false; $sz = sizeof($results); $c = 0; foreach($results as $item) { $line_arr = array(); if($result['mode'] == "objects") { $object = $item; if($object instanceof iUmiObject) { $line_arr['attribute:id'] = $object->id; $line_arr['attribute:name'] = $object->getName(); $line_arr['attribute:type-id'] = $object->getTypeId(); $line_arr['xlink:href'] = "uobject://" . $line_arr['attribute:id']; if($object_element = $hierarchy->getObjectInstances($line_arr['attribute:id'])){ $line_arr['attribute:link'] = $hierarchy->getPathById($object_element[0]); } } else { continue; } } else { $element = $item; if($element instanceof iUmiHierarchyElement) { $line_arr['attribute:id'] = $element->id; $line_arr['attribute:name'] = $element->getName(); $line_arr['attribute:link'] = $hierarchy->getPathById($element->id); $line_arr['xlink:href'] = "upage://" . $element->id; } else { continue; } } $line_arr['void:separator'] = (($sz == ($c + 1)) && $separator_last) ? $separator_last : $separator; $lines[] = def_module::parseTemplate($tpl_line, $line_arr, $elementId, $objectId); ++$c; } $block_arr['subnodes:items'] = $lines; $block_arr['total'] = $total; $block_arr['per_page'] = $per_page; return def_module::parseTemplate($tpl_block, $block_arr); } else { throw new publicException("Can't execute selection"); } }
Обратите внимание, что макрос имеет три обязательных параметра, а не два, третий параметр определяет количество элементов выводимых на странице. Первые два параметра стандартны, первый это tpl шаблон для отображения найденных элементов (или объектов), второй параметр это xml шаблон с правилами фильтрации данных. Как было озвучено в названии статьи, макрос может принимать параметры из адресной строки, индекс должен быть прописан как 'usel', а параметры перечислены через дефис:
?usel=45-27522 http://домен/obychnaya_stranica/?usel=45-27522
Пример вызова макроса:
%custom doSelectionNew(default,filtr,20)%
Пример xml шаблона:
<?xml version="1.0" encoding="utf-8"?> <selection> <target result="pages"> <type id="824" /> <category depth="3">{1}</category> </target> <property name="gender" value="{2}"/> </selection>
Если переданы дополнительные параметры в самом макросе и в адресной строке, то нумерация будет начинаться с дополнительных параметров макроса, а потом уже пойдут GET параметры. Еще одно отличие данного макроса в том, что если происходит выборка объектов (поиск object_id), и если найденные object_id являются источниками данных для страниц сайта (element_id), то в блоке objects_block_line можно получить ссылку на страницу макросом %link%
Макросом поддерживается постраничный вывод, т.е. можно использовать подобный макрос:
%system numpages(%total%, %per_page%)%
