Разбивка на страницы
Публикую свою функцию разбивки на страницы, её преимущество перед другими методами в том, что список страниц занимает ровно требуемое количество пунктов. Код не ахти какой, но работает отлично.
На выходе получим:
<paginator count="99" page="4" size="10">
<page>1</page>
<page>..</page>
<page>3</page>
<page>4</page>
<page>5</page>
<page>..</page>
<page>99</page>
</paginator>
Пример шаблона на XSLT:
<xsl:template match="paginator">
<xsl:if test="@count > 1">
<p class="paginator">
<xsl:if test="@page > 1"><a href="?page={@page - 1}"><< Назад</a></xsl:if>
<xsl:apply-templates select="page"/>
<xsl:if test="@page < @count"><a href="?page={@page + 1}">Далее >></a></xsl:if>
</p>
</xsl:if>
</xsl:template>
<xsl:template match="page">
<a href="?page={.}" class="page">
<xsl:if test=". = ../@page"><xsl:attribute name="class">sel</xsl:attribute></xsl:if>
<xsl:value-of select="."/>
</a>
</xsl:template>
PHP функция разбивки на страницы:
Параметры:
$node
- узел SimpleXml
$page
- текущая страница ($_GET['page']
)
$count
- количество записей на странице
$records
- всего записей, которые разбиваем на страницы
$max
- количество выводимых пунктов (включая ..
)
function paginator($node, $page = 1, $count = 10, $records = 1, $max = 7) { // [1]..[3][4][5]..[99]
if ($max < 5) $max = 5;
$paginator = $node->addChild('paginator');
$count_pages = ceil($records / $count);
$paginator->addAttribute('count', $count_pages);
$paginator->addAttribute('page', $page);
$paginator->addAttribute('size', $count);
if ($count_pages > $max and $page == 0) {
for($i = 1; $i <= floor($max / 2 - 0) ; $i ++) {
$paginator->addChild('page', $i);
}
$paginator->addChild('page', '..');
for($i = ($count_pages - ceil($max / 2 - 2)); $i <= $count_pages; $i ++) {
$paginator->addChild('page', $i);
}
} else if ($count_pages > $max and $page < ($max - 2)) {
for($i = 1; $i <= ($max - 2); $i ++) {
$paginator->addChild('page', $i);
}
$paginator->addChild('page', '..');
$paginator->addChild('page', $count_pages);
} else if ($count_pages > $max and $page > ($count_pages - ($max - 3))) {
$paginator->addChild('page', 1);
$paginator->addChild('page', '..');
for($i = ($count_pages - ($max - 3)); $i <= $count_pages ; $i ++) {
$paginator->addChild('page', $i);
}
} else if ($count_pages > ($max + 1) and $page > ($max - 3) and $page < ($count_pages - ($max - 4))) {
$paginator->addChild('page', 1);
$paginator->addChild('page', '..');
for($i = ($page - ceil($max / 2 - 3)); $i <= ($page + floor($max / 2 - 2)); $i ++) {
$paginator->addChild('page', $i);
}
$paginator->addChild('page', '..');
$paginator->addChild('page', $count_pages);
} else {
for($i = 1; $i <= $count_pages; $i ++) {
$paginator->addChild('page', $i);
}
}
}
05 сентября 2012