ну кастом я взяла где то с этого сайта в заметках или уроках.. не помн. вот он:
public function order_by($fieldName, $parent_id=NULL, $typeId=NULL, $template = "default") {
if(!$fieldName) return;
$from = Array('%5B', '%5D');
$to = Array('[', ']');
$result = self::generateOrderBy($fieldName, $typeId, $template, $parent_id);
$result = str_replace($from, $to, $result);
return $result;
}
public static function generateOrderBy($fieldName, $type_id, $template = "default", $parent_id) {
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(!$parent_id) $parent_id = cmsController::getInstance()->getCurrentElementId();
$i_need_deep = 1;
if(!$type_id) $type_id = umiHierarchy::getInstance()->getDominantTypeId($parent_id, $i_need_deep);
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;
$order_direction = 1;
} else {
$tpl = $template_block_a2;
unset($params['order_filter']);
$params['order_filter'][$fieldName] = 1;
$order_direction = 0;
}
} else {
unset($params['order_filter']);
$params['order_filter'][$fieldName] = 1;
$tpl = $template_block;
$order_direction = 'non';
}
} else {
unset($params['order_filter']);
$params['order_filter'][$fieldName] = 1;
$tpl = $template_block;
$order_direction = 'non';
}
$params = self::protectParams($params);
$q = (sizeof($params)) ? "&" . http_build_query($params, '', '&') : "";
//$q = (sizeof($params)) ? "&" . str_replace("&", "&", http_build_query($params)) : "";
$q = urldecode($q);
$q = str_replace("%", "%", $q);
$block_arr['link'] = "?" . $q;
$block_arr['attribute:direction'] = $order_direction; //главное тут
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;
<!-- сортировка -->
<xsl:template match="udata[@module='custom' and @method = 'order_by']">
<xsl:attribute name="href">
<xsl:value-of select="link" />
</xsl:attribute>
<xsl:if test="@direction!='non'">
<xsl:attribute name="class">
active
</xsl:attribute>
</xsl:if>
</xsl:template>
<xsl:template match="udata" mode="object_list">
<!--xsl:apply-templates select="document('udata://catalog/search')" /-->
<!--div class="catalog open-sans" umi:element-id="{category_id}" umi:module="catalog" umi:method="getObjectsList" umi:sortable="sortable" umi:add-method="popup"-->
<div class="standardDoc section open-sans">
<p>
<xsl:text>&empty-category;</xsl:text>
</p>
</div>
</xsl:template>
<xsl:template match="udata[total > 0]" mode="object_list">
<xsl:variable name="row-limit" select="3" />
<div>
<div class="catalog_caption" category="{category_id}">
<div class="sort-options">
<span class="title">Сортировать по:</span>
<xsl:variable name="order_by_price" select="document(concat('udata://custom/order_by/price/',category_id))" />
<xsl:choose>
<xsl:when test="boolean($order_by_price/udata/link)">
<a><xsl:apply-templates select="$order_by_price" />цене</a>
</xsl:when>
<xsl:otherwise>
<a><xsl:apply-templates select="document(concat('udata://custom/order_by/price//',category_id))" />цене</a>
</xsl:otherwise>
</xsl:choose>
<a><xsl:apply-templates select="document(concat('udata://custom/order_by/title/',category_id))" />наименованию</a>
<!--a><xsl:apply-templates select="document(concat('udata://custom/order_by/.../',category_id))" />дате поступления</a-->
</div>
</div>
Ну тут выводятся объекты каталога еще неотсортированные. Но хотелось бы чтобы они сразу отсортироанные выводились и эта сортировка была помечена.
</div>
<div class="clear" />
<xsl:apply-templates select="total" />
</xsl:template>
Ну и в result вывожу все это:
<xsl:apply-templates select="document(concat('udata://catalog/getObjectsList//', page/@id, '///100/'))/udata" mode="object_list" />
предположим, что у вас есть ссылка на сортировку по цене и прочие сортировки, а также у вас есть прочие сортировки. По умолчанию, при загрузке каталога происходит сортировка по цене, но как следствие в адресной строке нет параметров, по которым можно было бы отловить, по какому полю идет сортировка. Поэтому, вы прописываете класс в стилях (для выделения ссылки на ссортировки по цене) при формировании html данной страницы. для того чтобы эта ссылка исчезала когда выбрана другая сортировка, вам надо сделать так
все вызовы макроса сортирки для всех полей загнать в переменные чтобы их можно было несколько раз использовать и не делать повторных вызовов
так же как вы и делали в вашем коде
<xsl:variable name="order_by_price" select="document(concat('udata://custom/order_by/price/',category_id))" />
<xsl:variable name="order_by_proizvoditel" select="document(concat('udata://custom/order_by/proizvoditel/',category_id))" />
<xsl:variable name="order_by_else" select="document(concat('udata://custom/order_by/else/',category_id))" />
и т.д.
далее вы пишете условие в котором проверяете нет ли сортировки по другим ссылкам и если их нет, то класс для ссылки сортировки по цене выставляется, иначе он заменяется другим или убирается вовсе... сама проверка выглядит примерно так
шаблон где вы делаете вызов макроса для вывода ссылок сортировки
<xsl:variable name="order_by_price" select="document(concat('udata://custom/order_by/price/',category_id))" />
<xsl:variable name="order_by_proizvoditel" select="document(concat('udata://custom/order_by/proizvoditel/',category_id))" />
<xsl:variable name="order_by_else" select="document(concat('udata://custom/order_by/else/',category_id))" />
<div class="default_sort">
<xsl:if test="not($order_by_proizvoditel/@direction='non') or not($order_by_else/@direction='non')"><xsl:attribute name="class">special_sort</xsl:attribute ></xsl:if>
<xsl:apply-templates select="$order_by_price" />
<xsl:apply-templates select="$order_by_proizvoditel" />
<xsl:apply-templates select="$order_by_else" />
</div>
при этом класс default_sort будет в случае когда не применяются сортировки по полю proizvoditel и полю else, в других случаях он замениться на класс special_sort
<xsl:variable name="order_by_price_a" select="document(concat('udata://custom/order_by/price//',category_id))" />
<xsl:variable name="order_by_price" select="document(concat('udata://custom/order_by/price/',category_id))" />
<xsl:variable name="order_by_title" select="document(concat('udata://custom/order_by/title/',category_id))" />
<a class="noactive" href="{$link}">
<xsl:if test="not($order_by_price/@direction='non') or not($order_by_title/@direction='non') or not($order_by_price_a/@direction='non')">
<xsl:attribute name="class">
active
</xsl:attribute>
</xsl:if>
по умолчанию</a>
<xsl:choose>
<xsl:when test="boolean($order_by_price/udata/link)">
<a>
<xsl:apply-templates select="$order_by_price" />цене</a>
</xsl:when>
<xsl:otherwise>
<a><xsl:apply-templates select="$order_by_price_a" />цене</a>
</xsl:otherwise>
</xsl:choose>
<a><xsl:apply-templates select="$order_by_title" />наименованию</a>
все получилось)) надо было все наоборот сделать и добавить udata...
вот так:
<xsl:if test="$order_by_title/udata/@direction='non' and $order_by_price_a/udata/@direction='non'">
<xsl:attribute name="class">
active
</xsl:attribute>
</xsl:if>