Макрос system numpages() (http://dev.docs.umi-cms.ru/spravochnik_makrosov_umicms/virtualnyj_modul_system/system_numpages/) реализован классом umiPagenum выдает вот такую структуру данных:
<udata module="system" method="numpages" generation-time="0.000595">
<items>
<item link="?p=0" is-active="1">1</item>
<item link="?p=1" page-num="1">2</item>
<item link="?p=2" page-num="2">3</item>
<item link="?p=3" page-num="3">4</item>
</items>
<toend_link page-num="3">?p=3</toend_link>
<tonext_link page-num="1">?p=1</tonext_link>
</udata>
Поэтому все верно для первой страницы будет дубль ?p=0 от него можно избавиться на уровне шаблонизатора, не знаю как это сделать в TPL, но в XSLT просто:
<xsl:template match="udata[@method='numpages']/items/item">
<li>
<xsl:apply-templates select="@is-active"/>
<a href="{@link}">
<xsl:value-of select="."/>
</a>
</li>
</xsl:template>
<xsl:template match="udata[@method='numpages']/items/item[position()=1]">
<li>
<xsl:apply-templates select="@is-active"/>
<a href=".">
<xsl:value-of select="."/>
</a>
</li>
</xsl:template>
Еще вариант кастомизировать макрос system numpages().
Да, совсем забыл - писал костыль для этих целей.
В custom.php:
public function numpages($total = 0, $per_page = 0, $template = "default", $varName = "p", $max_pages = false) {
$system = system_buildin_load('system');
$return = $system->numpages($total, $per_page, $template, $varName, $max_pages);
if(!is_array($return))
return $return;
if($return['void:pages'][0]['attribute:page-num'] === 0) {
$link = str_replace('p=0', '', $return['void:pages'][0]['attribute:link']);
if($link === '?' || $link === '')
$link = '/';
$return['void:pages'][0]['attribute:link'] = $link;
$return['items']['nodes:item'][0]['attribute:link'] = $link;
}
if(isset($return['toprev_link']) && $return['toprev_link']['attribute:page-num'] === 0) {
$link = str_replace('p=0', '', $return['toprev_link']['node:value']);
if($link === '?' || $link === '')
$link = '/';
$return['toprev_link']['node:value'] = $link;
}
if(isset($return['tobegin_link']) && $return['tobegin_link']['attribute:page-num'] === 0) {
$link = str_replace('p=0', '', $return['tobegin_link']['node:value']);
if($link === '?' || $link === '')
$link = '/';
$return['tobegin_link']['node:value'] = $link;
}
return $return;
}
Писал код по памяти, забыл про существенную деталь (параметр $first_page_link в конце). Правильный код и немного рефакторинга:
public function numpages($total = 0, $per_page = 0, $template = "default", $varName = "p", $max_pages = false, $first_page_link = false) {
if(!$first_page_link)
$first_page_link = umiHierarchy::getInstance()->getPathById(cmsController::getInstance()->getCurrentElementId());
$system = system_buildin_load('system');
$return = $system->numpages($total, $per_page, $template, $varName, $max_pages);
if(is_array($return)) {
if($return['void:pages'][0]['attribute:page-num'] === 0) {
$link = $this->prepareNumpagesLink($return['void:pages'][0]['attribute:link'], $first_page_link);
$return['void:pages'][0]['attribute:link'] = $link;
$return['items']['nodes:item'][0]['attribute:link'] = $link;
}
if(isset($return['toprev_link']) && $return['toprev_link']['attribute:page-num'] === 0) {
$link = $this->prepareNumpagesLink($return['toprev_link']['node:value'], $first_page_link);
$return['toprev_link']['node:value'] = $link;
}
if(isset($return['tobegin_link']) && $return['tobegin_link']['attribute:page-num'] === 0) {
$link = $this->prepareNumpagesLink($return['tobegin_link']['node:value'], $first_page_link);
$return['tobegin_link']['node:value'] = $link;
}
} elseif(trim($return) !== '') {
$return = $this->prepareNumpagesLink($return, $first_page_link);
}
return $return;
}
public function prepareNumpagesLink($string, $first_page_link) {
$string = str_replace('?p=0&', '?', $string);
$string = str_replace('?p=0', $first_page_link, $string);
$string = str_replace('p=0', '', $string);
return $string;
}