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