Вот полное решение этой задачи (приснилось на выходные):
my $start_pos = param ("start_pos"); //текущая страница для просмотра
my $page_size = 10; //количество данных на странице
my $max_rec = param ("max_rec"); //всего записей в базе, как подсчитать сообразите, если не указано (при первом запуске) - значит надо подсчитать
my @nav_link; //массив навигационных связей
my $start_nav; //первая страница навигации
my $end_nav; //последняя страница навигации, т.е. на экран выводятся не все 154 ссылки на страницы, а только 10 (или сколько хотите), вот первая и последняя это и есть начало и конец этого блока ссылок
if (!defined (param ("start_pos")))
{
$start_pos = 0;
$max_rec = 0;
//подсчитываем количество записей в базе ($max_rec)
}
if ($max_rec > $page_size) //если страниц больше одной
{
$start_nav = $start_pos - 5*$page_size; //подсчитываем первую страницу блока ссылок (5 - это 10/2, т.е. если всего видимых ссылок у вас будет 10)
if ($start_nav < 0) { //если первая страница левее нуля сдвигаем последнюю в право на это количество
$end_nav = $start_pos + 5*$page_size + abs($start_nav);
$start_nav = 0;
}
else { // или высчитываем последнюю страницу без понтов
$end_nav = $start_pos + 5*$page_size;
}
if ($end_nav > $max_rec) { //если последняя страница больше количества записей всего
$end_nav = $max_rec;
}
if ($start_pos == 0) //если находимся на первой странице - значит предыдущих нет
{
#push (@nav_link, "prev."); //выталкиваем в массив навигации неактивную ссылку на предыдущую страницу (у меня она не печатается)
}
else //если находимся не на первой стр.
{
my $prev = $start_pos-$page_size; //вычисляем ссылку на предыдущую страницу
push (@nav_link, " [
// здесь можите напихать туда свои параметры
push (@nav_link, ">prev.]"); //закрываем ссылку
}
// дальше рисуем ссылку на предыдущие 10 страниц
if ($start_pos <= (5*$page_size))
{
#push (@nav_link, " prev.10");
}
else
{
my $prev_nav = $start_nav - $page_size;
push (@nav_link, " [
}
push (@nav_link, ">prev.10]");
}
// рисуем ссылки на страницы
for (my $i = $start_nav; $i < $end_nav; $i += $page_size)
{
my $page_no = int ($i/$page_size) + 1;
if ($start_pos == $i)
{
push (@nav_link, " ".$page_no." ");
}
else
{
my $pag = $page_no*$page_size;
push (@nav_link, " [
push (@nav_link, ">$page_no]");
}
}
// ссылка на следующие 10 страниц
if (($start_pos+5*$page_size) >= $max_rec)
{
#push (@nav_link, " next");
}
else
{
my $next_nav = $end_nav;
push (@nav_link, " [
push (@nav_link, ">next 10]");
}
// ссылка на следующую страницу
if ($start_pos+$page_size > $max_rec)
{
push (@nav_link, " next");
}
else
{
my $next = $start_pos+$page_size;
push (@nav_link, " [
push (@nav_link, ">next]");
}
// заканчиваем и печатаем всю эту лабуду
@nav_link=join("",@nav_link);
print "
@nav_link\\n";
}
Этот код 100% работает (стоит у меня на сайте)
Если где то допустил ошибку - зазвиняйте, у меня в ссылки передаются куча параметров, я их убирал и мог где то промазать.
Последний вопрос - нафига я это так все ПОДРОБНО описываю?
Для тех кому это на самом деле надо! И кого коцают умные предложения читать мануал! Кто либо, когда либо что то понял в перлдок по модулям сторонних разработчиков?
Отдельное спасибо за помощь Корепанов Иван