Обновленный макрос system order by (двойная сортировка по одной ссылке)

Материал из Umicms

Перейти к: навигация, поиск

В шаблон для вывода ссылки сортировки добавляем новый блок order_by_b. Макрос custom order_by_new аналогичен макросу system order_by, отличие в том, что когда произведена сортировка по возрастанию, т.е. order_filter[field_name]=1, то обрабатывается блок order_by_a, в котором макросом %link% формируется ссылка для сортировки по убыванию (order_filter[field_name]=0). И когда произведена сортировка по убыванию обрабатывается блок order_by_b, в котором макросом %link% формируется ссылка для сортировки по возрастанию.

Пример вызова макроса для объектов каталога с type_id = 11 и сортировкой по полю price:

%custom order_by_new('price', 11, 'default')%

Код, который необходимо добавить в файл ~classes/modules/custom.php, после слов //TODO: Write your own macroses here:

public function order_by_new($fieldName, $typeId, $template = "default") {
$from = Array('%5B', '%5D');
$to = Array('[', ']');
$result = self::generateOrderBy_new($fieldName, $typeId, $template);
$result = str_replace($from, $to, $result);
return $result;
}
public static function generateOrderBy_new($fieldName, $type_id, $template = "default") {
 
if(!$template) $template = "default";
list($template_block, $template_block_a1, $template_block_a2) = def_module::loadTemplates("tpls/numpages/{$template}.tpl", "order_by", "order_by_a", "order_by_b");
if(!($type = umiObjectTypesCollection::getInstance()->getType($type_id))) {
return "";
}
 
$block_arr = Array();
if(($field_id = $type->getFieldId($fieldName)) || ($fieldName == "name")) {
$params = $_GET;
 
unset($params['path']);
$order_filter = getArrayKey($params, 'order_filter');
 
$tpl = 0;      
if(is_array($order_filter)) {
 
if (array_key_exists($fieldName, $order_filter)){
if ($order_filter[$fieldName] == 1){
$tpl = $template_block_a1;
unset($params['order_filter']);
$params['order_filter'][$fieldName] = 0;
} else {
$tpl = $template_block_a2;
unset($params['order_filter']);
$params['order_filter'][$fieldName] = 1;
}
} else {
unset($params['order_filter']);
$params['order_filter'][$fieldName] = 1;
$tpl = $template_block;
}
} else {
unset($params['order_filter']);
$params['order_filter'][$fieldName] = 1;
$tpl = $template_block;
}
 
$params = self::protectParams($params);
$q = (sizeof($params)) ? "&" . str_replace("&", "&", http_build_query($params)) : ""; 
$q = urldecode($q);
$q = str_replace("%", "%", $q);
 
$block_arr['link'] = "?" . $q;
 
if($fieldName == "name") {
 
$block_arr['title'] = getLabel('field-name');
 
} else {
$block_arr['title'] = umiFieldsCollection::getInstance()->getField($field_id)->getTitle();
}    
return def_module::parseTemplate($tpl, $block_arr);
}
return "";
}
protected static function protectParams($params) {
foreach($params as $i => $v) {
if(is_array($v)) {
$params[$i] = self::protectParams($v);
} else {
$v = htmlspecialchars($v);
$params[$i] = str_replace("%", "%", $v);
}
}
return $params;
}

Пример использования в шаблоне (~tpls/numpages/default.tpl):

$FORMS = Array();
 
$FORMS['order_by'] = <<<END
 <a href="%link%">%title%</a>
END;
 
$FORMS['order_by_a'] = <<<END
По возрастанию:<a href="%link%">%title%</a>
END;
 
$FORMS['order_by_b'] = <<<END
По убыванию:<a href="%link%">%title%</a>
END;

Макрос %custom order_by_new('price', 11, 'default')% необходимо прописывать как в блоке pages_block, так и в pages_block_empty (~tpls/numpages/)

Личные инструменты