Обновленный макрос 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%)%