UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: KTI от 15 Августа 2012, 13:27:20

Название: Как сделать кнопки перехода к следующему, предыдущему товару
Отправлено: KTI от 15 Августа 2012, 13:27:20
Нужно сделать 2 кнопки в форме товара: переход к следующему, переход к предыдущему товару.
Мне хотя-бы идею, алгоритм для начала, там уже буду пробовать

я не знаю как мне получить id следующего, предыдущего товара, и передать его в вызов шаблона

<xsl:template match="/result[@module = 'catalog' and @method = 'object']">
<xsl:apply-templates select="document(concat('upage://', page/@id,'?show-empty'))/udata" mode="object-view" />
</xsl:template>
Название: Re:Как сделать кнопки перехода к следующему, предыдущему товару
Отправлено: BaceH от 16 Августа 2012, 23:41:23
getCategoryList по ид объекта находите позицию (pos), повтороно вызвав getCategoryList и по позиции pos+1 pos-1 берете два ид следующего и предыдущего товара, а по ид и название и ссылка на объект.
Название: Re:Как сделать кнопки перехода к следующему, предыдущему товару
Отправлено: KTI от 17 Августа 2012, 07:51:52
не совсем понял, где вызывать getCategoryList, и зачем мне список категорий  :(

как мне кажется: (мой вариант)
в шаблоне обработки товара
<xsl:template match="udata" mode="object-view">
мы знаем parentId, т.е. Id родителя, потом вызываем что-то типа
document(concat('udata://catalog/getObjectsList/void/', page/@parentId, '////2/'))/udata
получаем список товаров в этой категории, потом нужен какой-то алгоритм, который на выходе давал два id (пред и след)
и потом создавать кнопки..

если есть у кого другие варианты, велком  :)
на сколько замедлит метод getObjectsList работу, хотя у меня пишет generation-time="0.074229", т.е. терпимо
еще нужно учитывать пейджинг, сортировку..

Было-бы лучше написать кастом на php, и вызывать типа getPrevNextId/@id
за основу взять
Кастомизация макроса catalog getObjectsList для ускорения формирования страницы (http://wiki.umisoft.ru/%D0%9A%D0%B0%D1%81%D1%82%D0%BE%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B0%D0%BA%D1%80%D0%BE%D1%81%D0%B0_catalog_getObjectsList_%D0%B4%D0%BB%D1%8F_%D1%83%D1%81%D0%BA%D0%BE%D1%80%D0%B5%D0%BD%D0%B8%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B)
только переделать не umiSelection, а на selector, может кто возьмется
Название: Re:Как сделать кнопки перехода к следующему, предыдущему товару
Отправлено: admin от 17 Августа 2012, 10:49:08
самый простой вариант пользоваться макросами udata://system/getNext (http://help-dev.umi-cms.ru/system.getNext.html) и udata://system/getPrevious (http://help-dev.umi-cms.ru/system.getPrevious.html)

или на основе данных макросов написать свой единый который сразу выводит и то и другое
Название: Re:Как сделать кнопки перехода к следующему, предыдущему товару
Отправлено: KTI от 21 Августа 2012, 09:51:01
на основе getNext, getPrev набросал свой (правда не учитывает сортировку, но мне и не надо):

	    public function getPrevNextId($elem_id = NULL) {
if(!$elem_id) return;
$element = umiHierarchy::getInstance()->getElement($elem_id);
if(!$element) return;
$parent_id = $element->getParentId();
$childs = umiHierarchy::getInstance()->getChilds($parent_id, false);
$result = array_keys($childs);
// print_r($result);
if (($sz = sizeof($result)) > 1) {
$block_arr = Array();
$empty_arr = array();
$empty_arr['attribute:link'] = "#";
$empty_arr['attribute:id'] = 0;

$prev_id = false;
$next_id = false;
foreach($result as $element_id) {
if($element_id == $elem_id) {
$next_id = current($result);
break;
} else {
$prev_id = $element_id;
}
}

if($prev_id !== false) {
$list = Array();
$list['attribute:id'] = $prev_id;
$list['attribute:link'] = umiHierarchy::getInstance()->getPathById($prev_id);
$block_arr['nodes:prev'][] = $list;
} else {
$block_arr['nodes:prev'][] = $empty_arr;
}
if($next_id !== false) {
$list = Array();
$list['attribute:id'] = $next_id;
$list['attribute:link'] = umiHierarchy::getInstance()->getPathById($next_id);
$block_arr['nodes:next'][] = $list;
} else {
$block_arr['nodes:next'][] = $empty_arr;
}
return $block_arr;
}
}


возвращает типа

<udata xmlns:xlink="http://www.w3.org/TR/xlink" module="catalog" method="getPrevNextId" generation-time="0.011779">
<prev id="25" link="/shop/dvd_tehnika/dvd_pleery/akai_apa206c/"/>
<next id="28" link="/shop/dvd_tehnika/dvd_pleery/toshiba_srq660/"/>
</udata>
<!-- This page generated in 0.079422 secs -->

примечательно, что работает и на категориях, т.е. если ему передать id категории, то вернет id следующей и предыдущей категории.

Почему-то используется цикл (для поиска id в массиве), я хочу переделать, на что-то типа:
				$key = array_search($elem_id, $result);  
if ($key === false) {
return $empty_arr;}
switch ($key) {
case 0:
$next_id = $result[1];
$prev_id = 0;
break;
case $sz-1:
$prev_id = $result[$key-1];
$next_id = 0;
break;
default:
$next_id = $result[$key+1];
$prev_id = $result[$key-1];
break;
}