практически уже не сохранилось. навскидку это было так:
<?php
//Здесь записываем в сессию количество страниц и редирект обратно
public function setPager(){
if($pager = getRequest('pager')){
$_SESSION['pager'] = $pager;
}
$refererUrl = getServer('HTTP_REFERER') ? getServer('HTTP_REFERER') : '/';
def_module::redirect($refererUrl);
}
//выводит список товаров в каталоге
public function getObjectsList2($template = "default", $path = false, $limit = false, $ignore_paging = false, $i_need_deep = 0, $field_id = false, $asc = true){
if(!$limit){
if(isset($_SESSION['pager'])) $limit = $_SESSION['pager'];
}
$moduleCatalog = cmsController::getInstance()->getModule('catalog');
return $moduleCatalog -> getObjectsList($template, $path, $limit, $ignore_paging, $i_need_deep, $field_id, $asc);
}
public function pagerList(){
$arr = array(20,30,40);//кол страниц
if(getSession('pager')){
$pager = (int) getSession('pager')
}
else $pager = 20;
$s = <<<END
<form action="/catalog/setPager/">
<select name="pager">
END;
foreach($arr as $v){
if($v == $pager) $checked = 'checked';else $checked = '';//чтобы был выбран правильный элемент
$s .= <<<END
<option value="{$v}" {$checked}>{$v}</option>
END;
}
$s .= <<<END
</select>
</form>
END;
return $s;
}
?>
Соотв. в шаблоне выбор количества страниц
%catalog pagerList()%
Список товаров %catalog getObjectsList2()%
Конечно, для xslt надо будет изменить вывод списка
Параметры: catalog getObjectsList( [template = 'default', category_id = false, limit = false, ignore_paging = false, i_need_deep = 0, field_id = false, asc = true])
вызов исходный
<xsl:apply-templates select="document(concat('udata://catalog/getObjectsList/', page/@id, '////2/have/1'))/udata" />
как правильно вставить переменную %custom getcount()%
в какой шаблон в данном случае добавлять
<select name="count" onchange="this.form.submit()">
<option %custom is_sel(10)%>10</option>
<option %custom is_sel(20)%>20</option>
<option %custom is_sel(30)%>30</option>
</select>
? и опять таки, а как правильно указывать значения %макросов% что в TPL, для XSLT.
Правильно ли я понимаю что:
%custom getcount()% это равно udata://custom/getcount
и получается что надо получить значение из select (пока не понятно куда и как его добавлять)
и передать в:
<xsl:apply-templates select="document(concat('udata://catalog/getObjectsList/', page/@id, '// СЮДА? //2/have/1'))/udata" />
можно пойти еще более простым путем, так как в xslt мы можем подхватывать значения из адресной строки в глобальные параметры, то надо просто дописать в файл /xsltTpls/default.xsl, повыше <xsl:param name="p">0</xsl:param> параметр с именем count, который будет подхватывать из адресной строки, а если его не будет то параметр count будет равен пустому значению
<xsl:param name="count" select="''" />
теперь мы можtм использовать переменную $count в наших шаблонах/ В итоге, в шаблоне где происходит вызов %catalog getObjectsList()% мы пишем:
<xsl:apply-templates select="document(concat('udata://catalog/getObjectsList/', page/@id, '//',$count))/udata" />
а там, где надо вывести выпадающий список для смены количества, пишем:
<select name="count" onchange="this.form.submit()">
<option>
<xsl:if test="$count=10"><xsl:attribute name="selected">selected</xsl:attribute></xsl:if>
10
</option>
<option>
<xsl:if test="$count=20"><xsl:attribute name="selected">selected</xsl:attribute></xsl:if>
20
</option>
<option>
<xsl:if test="$count=30"><xsl:attribute name="selected">selected</xsl:attribute></xsl:if>
30
</option>
</select>
Вывод количества товаров на странице изменяется. но вот где отредактировать параметр: maxPages='5' у %system numpages()% чтобы выводилось всё количество страниц.
а в чем сложность? делаем вызов с параметром maxPages настолько большим, чтобы уж точно хватило, например maxPages=10000
то же самое с выводом всех товаров в данном разделе.... делаете в выпадающем списке, который меняет количество товаров отображаемых на странице, новый option такого вида
<option value="100000">
<xsl:if test="$count=100000" ><xsl:attribute name="selected">selected</xsl:attribute></xsl:if>
Вывести все товары
</option>
у меня в стандартном шаблоне такой вызов:
<xsl:template match="total[. > ../per_page]">
<xsl:apply-templates select="document(concat('udata://system/numpages/', ., '/', ../per_page))" />
</xsl:template>
если я данный вызов меняю на предложенный , то не выводится вообще ничего.
так и есть, для замены написанного скорее всего нужно писать так
<xsl:template match="total[. > ../per_page]">
<xsl:apply-templates select="document(concat('udata://system/numpages/', ., '/', ../per_page,'//100000'))" />
</xsl:template>
скорее всего форма должна содержать в себе и выбор сортировки и поля для фильтра. Хотя в вашем случае, наверно проще применить onchange="window.location = this.options[this.selectedIndex].value;"
На данный момент вот так всё отладил:
<form>
<input type="text" name="" />
<select name="count" onchange="this.form.submit()">
<option>
<xsl:if test="$count=20">
<xsl:attribute name="selected">selected</xsl:attribute>
</xsl:if>
20
</option>
<option>
<xsl:if test="$count=32">
<xsl:attribute name="selected">selected</xsl:attribute>
</xsl:if>
32
</option>
<option>
<xsl:if test="$count=40">
<xsl:attribute name="selected">selected</xsl:attribute>
</xsl:if>
40
</option>
<option value="100000">
<xsl:if test="$count=100000" >
<xsl:attribute name="selected">selected</xsl:attribute>
</xsl:if>
Всё
</option>
</select>
</form>
И в результате в адресную строку стали вроде правильные поступать ?fields_filter%5B%5D=&count=100000
однако как было восемь объектов (как поумолчанию) на одной странице, так и осталось...
1. параметр в адресной строке должен подхватываться. Проверьте так ли это, вставьте вручную в адресную строку данный параметр и сделайте вывод данной переменной в шаблоне.
Да, в адресную строку данный параметр вставляется в виде ?count=40, если выбрать, к примеру, значение = 40
А в шаблоне я так его вывод сделал:
<form>
<input type="text" name="" />
<select name="count" onchange="this.form.submit()">
<option>
<xsl:if test="$count=20">
<xsl:attribute name="selected">selected</xsl:attribute>
</xsl:if>
20
</option>
<option>
<xsl:if test="$count=32">
<xsl:attribute name="selected">selected</xsl:attribute>
</xsl:if>
32
</option>
<option>
<xsl:if test="$count=40">
<xsl:attribute name="selected">selected</xsl:attribute>
</xsl:if>
40
</option>
<option value="100000">
<xsl:if test="$count=100000" >
<xsl:attribute name="selected">selected</xsl:attribute>
</xsl:if>
Всё
</option>
</select>
</form>
2. параметр переданный в вызов getobjectsList меняет кол-во товаров. Попробуйте вручную в шаблоне передавать разные значения, меняется ли кол-во при выводе.
У меня в шаблоне значение количество объектоа на странице = 8
<xsl:template match="result[@method = 'category']" mode="layout_0_s1">
<xsl:apply-templates select=".//property[@name = 'descr']" mode="seo_content" />
<xsl:apply-templates select="document(concat('udata://catalog/getObjectsList/', '//8//10/,$count'))/udata" mode="layout_0" />
<xsl:apply-templates select="document('udata://catalog/getObjectsList/')/udata/total" mode="total_items" />
</xsl:template>, если я его, к примеру, в ручную меняю на 16, то и 16 объектов на странице выводятся как и указано.
3. при выборе в выпадающем списке передается тот же параметр который вы тестировали в первом пункте
в шаблоне, рядом свызовом вывести данную переменную, чтобы её было видно
<xsl:apply-templates select="document(concat('udata://catalog/getObjectsList/', '//$count//10/'))/udata" mode="layout_0" />
<xsl:value-of select="$count" />
в шаблоне, рядом свызовом вывести данную переменную, чтобы её было видно
<xsl:apply-templates select="document(concat('udata://catalog/getObjectsList/', '//$count//10/'))/udata" mode="layout_0" />
<xsl:value-of select="$count" />
При таком варианте
<xsl:apply-templates select="document(concat('udata://catalog/getObjectsList/', '//$count//10/'))/udata" mode="layout_0" />
<xsl:value-of select="$count" />
Не выводятся ни объекты, ни значение переменной,
а при таком
<xsl:apply-templates select="document(concat('udata://catalog/getObjectsList/', '//8//10/,$count'))/udata" mode="layout_0" />
<xsl:value-of select="$count" />
выводятся только объекты, но значение переменной по прежнему не видно по прежнему...
Во всех вариациях, которые я описал чуть выше здесь http://umihelp.ru/forum/index.php/topic,1249.msg8645.html#msg8645
, как выяснилось, срабатывает шаблон такой
<xsl:template match="udata[@method = 'getObjectsList'][total = '0']" mode="layout_0">
в разделе нет товаров
</xsl:template>
то есть всё-таки что-то происходит... :)
может, просто в остальных есть переменная $count?
Только что проверил и <xsl:param name="count" select="''" /> на месте выше всех в списке переменных в этом самом файле
/templates/demodizzy/xslt/default.xsl
приведите кусок этого файла от начала, до этой переменной
в общем весь файл изнутри таков:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xlink="http://www.w3.org/TR/xlink">
<xsl:output encoding="utf-8" method="html" indent="yes"/>
<xsl:variable name="errors" select="document('udata://system/listErrorMessages')/udata"/>
<xsl:variable name="lang-prefix" select="/result/@pre-lang" />
<xsl:variable name="document-page-id" select="/result/@pageId" />
<xsl:variable name="default-page" select="/result/page/@is-default" />
<xsl:variable name="document-title" select="/result/@title" />
<xsl:variable name="user-type" select="/result/user/@type" />
<xsl:variable name="request-uri" select="/result/@request-uri" />
<xsl:variable name="domain" select="/result/@domain" />
<xsl:variable name="templates" select="'/templates/bs/'" />
<xsl:variable name="parents" select="/result/parents" />
<xsl:variable name="parentsTypeId1" select="$parents/page[1]/@type-id" />
<xsl:variable name="site-info-id" select="document('upage://techno_contacts/')/udata/page/@id" />
<xsl:variable name="site-info" select="document(concat('upage://',$site-info-id))//group[@name = 'transverse_data']/property" />
<xsl:variable name="catalogPagesId" select="$site-info[@name = 'catalog_pages_count_default']/value/item/@id" />
<xsl:param name="catalog_per_pages" select="number(concat('0',document(concat('uobject://', $catalogPagesId))/udata/object/properties/group/property/value))" />
<xsl:param name="count" select="$catalog_per_pages" />
<xsl:variable name="catalogLayoutId" select="$site-info[@name = 'catalog_default_layout']/value/item/@id" />
<xsl:param name="catalog_layout" select="number(concat('0',document(concat('uobject://', $catalogLayoutId))/udata/object/properties/group/property/value))" />
<xsl:variable name="user-id" select="/result/user/@id" />
<xsl:variable name="user-info" select="document(concat('uobject://', $user-id))" />
<xsl:variable name="module" select="/result/@module" />
<xsl:variable name="method" select="/result/@method" />
<xsl:decimal-format name="price" decimal-separator="," grouping-separator=" "/>
<xsl:variable name="currency-prefix" select="document('udata://emarket/cart/')/udata/summary/price/@prefix" />
<xsl:variable name="currency-suffix" select="document('udata://emarket/cart/')/udata/summary/price/@suffix" />
<xsl:param name="p">0</xsl:param>
<xsl:param name="catalog" />
<xsl:param name="search_string" />
<xsl:include href="library/common.xsl" />
<xsl:include href="layouts/default.xsl" />
<xsl:include href="modules/users/common.xsl" />
<xsl:include href="modules/content/common.xsl" />
<xsl:include href="modules/catalog/common.xsl" />
<xsl:include href="modules/data/common.xsl" />
<xsl:include href="modules/emarket/common.xsl" />
<xsl:include href="modules/search/common.xsl" />
<xsl:include href="modules/webforms/common.xsl" />
<xsl:include href="modules/filemanager/common.xsl" />
</xsl:stylesheet>
А ещё я переделал переключатели
<div class="sort_box mod_2">
<dl class="sort_item">
<dt>Выводить по:</dt>
<dd class="sort_link_w active">
<a href="?count=20" class="sort_link">20</a>
</dd>
<dd class="sort_link_w">
<a href="?count=32" class="sort_link">32</a>
</dd>
<dd class="sort_link_w">
<a href="?count=40" class="sort_link">40</a>
</dd>
<dd class="sort_link_w">
<a href="?count=10000" class="sort_link">Все</a>
</dd>
</dl>
</div>
А вот так заработало:
<xsl:apply-templates select="document(concat('udata://catalog/getObjectsList/', '//', $count, '//10/'))/udata" mode="layout_0" /> |
Теперь вот как-то надо додумать такой момент, что кроме выбора показа количества страниц, есть ещё и выбор показа "Плитка" "Список", которые так же через переменные вызываются в таком порядке:
<dl class="sort_item mod_1">
<dt>&objectsview;</dt>
<dd>
<a rel="nofollow" title="плитка" href="?catalog_layout=0&">
<xsl:attribute name="class">type type_1</xsl:attribute>
<xsl:if test="$catalog_layout = 0">
<xsl:attribute name="class">type type_1 active</xsl:attribute>
</xsl:if>
</a>
</dd>
<dd>
<a rel="nofollow" title="список" href="?catalog_layout=2&">
<xsl:attribute name="class">type type_2</xsl:attribute>
<xsl:if test="$catalog_layout = 2">
<xsl:attribute name="class">type type_2 active</xsl:attribute>
</xsl:if>
</a>
</dd>
</dl>
и всё бы ни чего, да вот только при выборе одного или другого в строке браузера они конечно взаимоотменяюся,
то есть либо выбираем показывать по сорок страниц: /?count=40
либо показывать плиткой /?catalog_layout=0
А надо бы конечно, что бы они были в один ряд в строке браузера, как например:
/?catalog_layout=0&count=40&
Есть такая задумка срастить эти переменные в адресной строке <form> , где переменная $catalog_layout показывать плиткой "по умолчанию" у меня уже прописана:
<xsl:template match="udata[@method = 'search'][group]">
<form class="catalog_filter" action="/result_search_snowboards/">
<input type="hidden" id="catalog_layout" name="catalog_layout" value="{$catalog_layout}" />
<input type="hidden" id="count" name="count" value="{$count}" />
<div class="left">
<xsl:apply-templates select=".//field[not(@data-type = 'boolean')]" mode="search" />
</div>
<div class="right">
<xsl:apply-templates select=".//field[@data-type = 'boolean']" mode="search" />
</div>
<div class="clear"></div>
<div class="select-btns">
<input class="button" type="submit" value="&apply;"/>
<input class="button" type="button" value="&reset;" onclick="javascript: window.location = '/';" />
</div>
</form>
</xsl:template>