UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: niakriss от 02 Ноября 2012, 17:20:10

Название: класс ссылки
Отправлено: niakriss от 02 Ноября 2012, 17:20:10
мучаюсь уже пол дня... у меня сделана сортировка объектов кастомным макросом. сортируются по цене и наименованию. при нажатии на ссылку цена или наименование к ссылке приписывается ?&order_filter[price]=1 например.
Мне надо сделать так, чтобы при активной ссылки ей присваивался class="active"
ума не приложу как условие поставить(((
Название: Re:класс ссылки
Отправлено: NOIRMAN от 02 Ноября 2012, 18:00:11
А шаблончики вывода Ваши не покажете ?
Название: Re:класс ссылки
Отправлено: admin от 03 Ноября 2012, 13:35:33
я думаю, ваш кастомный макрос, в идеале, должен возвращать статус, который вы можете вставить в вашу ссылку. Можете привести сюда ваш кастом?
Название: Re:класс ссылки
Отправлено: niakriss от 06 Ноября 2012, 09:25:32
ну кастом я взяла где то с этого сайта в заметках или уроках.. не помн.  вот он:
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 &gt; 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" />
Название: Re:класс ссылки
Отправлено: admin от 07 Ноября 2012, 08:33:49
во первых не понял зачем вам нужен такой блок

<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>

а во вторых, у каждой ссылки есть атрибут direction, который может иметь значения 'non' - сортировка по данной ссылке не использовалась, '1' и '0' сортировка по ссылке использовалась и имеет определенное направление

код скорее всего вы взяли сиз статьи http://umihelp.ru/articles/custom_order_by-for_xslt/ и там же есть пример xslt шаблона по выводу разных ссылок в зависимости от осуществляется ли сейчас сортировка и в каком направлении
Название: Re:класс ссылки
Отправлено: niakriss от 07 Ноября 2012, 09:47:55
1. Это сделано, чтоб сортировка работала в тех каталогах, где есть только подкаталоги с объектами, а объектов нет.

2. так как у меня класс ссылки не меняется в зависимости отнаправления сортировки, поэтому у меня прописано @direction!='non'
а не @direction='1' и @direction='0'
мне нужно чтоб, просто выделялась ссылка при входена страницу.. и снималось выделение при выборе сортировки...
Название: Re:класс ссылки
Отправлено: admin от 07 Ноября 2012, 10:41:35
то есть, с вопросом как вывести каталог сразу отсортированный вы выяснили, а вот как при этом пометить ссылку на соответствующую сортировку, учитывая что в адресной строке нет параметра сортировке, вам  и не понятно, так?
Название: Re:класс ссылки
Отправлено: niakriss от 07 Ноября 2012, 11:07:07
именно... я хочу вообще сделать ссылку которая возвращает на сортировку по умолчанию.. ссылка у меня есть... класс ей присвоила.. а как его убрать, когда включаю сортировку и вернуть когда возвращаюсь по этой ссылке обратно не понимаю..(
Название: Re:класс ссылки
Отправлено: admin от 07 Ноября 2012, 11:23:02
предположим, что у вас есть ссылка на сортировку по цене и прочие сортировки, а также у вас есть прочие сортировки. По умолчанию, при загрузке каталога происходит сортировка по цене, но как следствие в адресной строке нет параметров, по которым можно было бы отловить, по какому полю идет сортировка. Поэтому, вы прописываете класс в стилях (для выделения ссылки на ссортировки по цене) при формировании 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
Название: Re:класс ссылки
Отправлено: niakriss от 07 Ноября 2012, 12:31:33
не убирается класс special_sort... всегда он.. какую бы я сортировку не выбрала(
Название: Re:класс ссылки
Отправлено: admin от 07 Ноября 2012, 12:48:03
свой код сюда выкладывайте, в логике проверке надо порыться
Название: Re:класс ссылки
Отправлено: niakriss от 07 Ноября 2012, 14:20:56
<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>
Название: Re:класс ссылки
Отправлено: niakriss от 07 Ноября 2012, 15:48:03
все получилось)) надо было все наоборот сделать и добавить 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>
Название: Re:класс ссылки
Отправлено: admin от 08 Ноября 2012, 05:41:05
точно в условии был затык)