Навигаци постраничная. Прошу помощи.

VE
На сайте с 17.08.2006
Offline
76
755

Необходимо сделать следующее (без привязки к цмс, просто код):

записей, скажем 72.

На странице по 10 штук записей в навигации по 5 линков.

на первой

1-2-3-4-5 >(ссылка на 6), ткнули в нее и видим

<(ссылка на 5) 6-7

Если тыкать в промежуточные (2-3-4-5) остается та же линейка (1-2-3-4-5->). Ну выделено цветом для понта, где сидим.

Помогите с алгоритмом, упарился реально.

RO
На сайте с 13.07.2009
Offline
88
#1

покажите свои наработки.

!
На сайте с 29.11.2007
Offline
109
#2

Посмотрите здесь: http://webscript.ru/stories/07/04/08/0689928

А вообще там была еще статья по постраничной навигации, как раз под то, что вам нужно, но сейчас ее не нашел, может у вас получится. Есть еще варианты, напр. http://webscript.ru/stories/02/05/24/7528505 скорее всего не совсем то, что хотите..

.
VE
На сайте с 17.08.2006
Offline
76
#3

Наработки - все что ли за 8 лет и Perl включая? :)

Вебскрипт... Есть у меня эта статья.

Спасибо.

Будем мучать того парня, где видел. Правда, шансов его найти даже физически мало.

Qinghua
На сайте с 01.09.2009
Offline
103
#4

крайние в ифы, серединные просто делаются

[Удален]
#5

за 8 лет ни одного пейджера не сделали? :D

неповезло вам

Ink-developer
На сайте с 31.01.2009
Offline
138
#6
view'er:

Помогите с алгоритмом, упарился реально.
...
Наработки - все что ли за 8 лет и Perl включая? :)

Какие 8 лет? Вы говорите что упарились с алгоритмом, вас просят показать код который уже написан в алгоритме. Как можно упарится не написав ни чего? Если нет ни чего то вопрос поставлен не правильно и вы обмынываете тут народ, в противном случае выкладывайте то что есть и мы постараемся подправить код.

rtyug
На сайте с 13.05.2009
Offline
263
#7

view'er, имхо, таких алгоритмов больше чем предостаточно в гугле, я уже не помню какой я использовал, они все одинаковые, только что нашел:

(можете изменить их как хотите...)


<?php
function table($nameArray){
GLOBAL $_POST, $_GET;
if (isset($_POST['page'])) {
$page = intval($_POST['page']);
} else if (isset($_GET['page'])) {
$page = intval($_GET['page']);
} else {
$page = 1;
}
if ($page == 0) {
$page = 1;
}
$st = 3; // количество столбцов
$maxRecords = 3; // Количество записей на страницу
$allRecords = sizeof($nameArray);
$maxPages = floor(($allRecords / $maxRecords) / $st); // Добавляем $st, т.к. вывод идёт еще и колоночно, а если обычно, то не нужно
if ($page == 1) {
$start = 0;
$finish = $maxRecords;
} else {
$start = ($page * $maxRecords) - $maxRecords;
$finish = $page * $maxRecords;
}
//echo $page."<br>";
//echo $allRecords."<br>";
//echo $start."<br>";
//echo $finish."<br>";
$a = "<table border=0 width= '100%' align='center'>";
for($i = $start; $i < $finish; $i++){
$a .= "<tr>";
for($j = 0;$j < $st; $j++){
$a .= (isset( $nameArray[(($i*$st)+$j)]))? "<td>".$nameArray[(($i * $st)+$j)]."</td>": '';
}
$a .= "</tr>";
}
$a .= "</table>";
echo $a;
echo "<center>";
if (($allRecords % $maxRecords) != 0) {
$maxPages++;
}
if ($page != 1) {
echo " <a href=\"".$_SERVER['PHP_SELF']."?page=1\">&lt;&lt;</a> ";
}
if ($page == 1) {
echo " &lt;&lt; ";
}
if ($page >= 3) {
echo " <a href=\"".$_SERVER['PHP_SELF']."?page=".($page - 2)."\">".($page - 2)."</a> ";
}
if ($page != 1) {
echo " <a href=\"".$_SERVER['PHP_SELF']."?page=".($page - 1)."\">".($page - 1)."</a> ";
}
echo " ".$page." ";
if ($page < $maxPages) {
echo " <a href=\"".$_SERVER['PHP_SELF']."?page=".($page + 1)."\">".($page + 1)."</a> ";
}
if (($page + 1) < $maxPages) {
echo " <a href=\"".$_SERVER['PHP_SELF']."?page=".($page + 2)."\">".($page + 2)."</a> ";
}
if ($page != $maxPages) {
echo " <a href=\"".$_SERVER['PHP_SELF']."?page=".$maxPages."\">&gt;&gt;</a> ";
}
if ($page == $maxPages) {
echo " &gt;&gt; ";
}
echo "</center>";
}
?>

вот который сейчас:


sub build_pages {
my $self = shift;
my ( $url, $count, $cuttent_page, $url_panel, $max_page, $class_id ) = @_;

my ( $count_limit, $page );

$max_page ||= '10';

# $count ||= 0;

$cuttent_page = 0 if ($count == 0);

$cuttent_page = $cuttent_page || '';

my $total_pages = ceil( $count / $max_page );

$count_limit = 0;

if ( ( $cuttent_page eq 'end' && $total_pages > 0 )
|| ( $cuttent_page =~ /^\d+$/ && $cuttent_page > $total_pages ) )
{
# print '11 '.$total_pages ;
$cuttent_page = $total_pages;

}

if ( $cuttent_page =~ /^\d+$/ ) {
$count_limit = ( $cuttent_page - 1 ) * $max_page;
}

$cuttent_page = 1 if ( $cuttent_page !~ /^\d+$/ );

$class_id = $class_id ? "class='".$class_id."'" : '';



my $page_number;
my $i;
for ( $i = 0 ; $i < $total_pages ; $i++ ) {

$page_number++;
last if ( $total_pages <= 1 );

next if ( $page_number > $cuttent_page + 4 );
next if ( $page_number < $cuttent_page - 4 );

if ( $page_number > $cuttent_page + 3 ) {

$page .=
' <a '.$class_id.' href="'
. $url . ''
. $total_pages . ''
. ( $url_panel || '' )
. '"> | ... '
. $total_pages
. ' | </a>';

next;
}

if ( $page_number < $cuttent_page - 3 ) {

$page .=
' <a '.$class_id.' href="'
. $url . ''
. $page_number . ''
. ( $url_panel || '' )
. '"> | 1... | </a>';

next;
}

if ( $page_number != $cuttent_page ) {

$page .=
' <a '.$class_id.' href="'
. $url . ''
. $page_number . ''
. ( $url_panel || '' ) . '"> | '
. $page_number
. ' | </a>';
}
else {

$page .=
' <a '.$class_id.' href="'
. $url . ''
. $page_number . ''
. ( $url_panel || '' )
. '"> | <b>'
. $page_number
. '</b> |</a>';

}
}

return ( $count_limit, $page, $max_page );

}


my ( $count_limit, $page, $max_page ) = $c->model('DBI')->build_pages( $url, $count, $id_page, $max_line || undef);
# $max_line - default 10

====

еще другой:


#!perl
use HTML::Template;
use CGI qw(:standard);
# имитация загрузки данных из базы
my %data = map { $_, {id => $_, data => time ^ $_} } 0 .. 42;
my $total_data = scalar keys %data;
# позволим пользователю выбирать кол-во записей на страницу (можно в куки засунуть)
my $default_per_page = 20;
my $per_page = int url_param('per_page') || $default_per_page;
my $offset = int url_param('offset') || 0;
# вывести последнюю страницу, на случай, если у кого ручки шаловливые окажутся)
$per_page = $default_per_page if $per_page > $total_data;
$offset = $total_data - $per_page if $offset > $total_data;
# сюда будут выбраны записи для отображения (от текущего смещения до текущеего смещения + кол-во записей на страницу)
my $tmpl_data = [];
for($offset .. $offset + $per_page) {
last unless defined $data{$_}; # на случай, если записей осталось меньше, чем выводится на страницу
push @$tmpl_data, delete $data{$_}
}
# признак наличия следующей страницы: текущее смещение + кол-во записей на страницу должно быть меньше общего кол-ва записей
my $has_next = ($offset + $per_page) < $total_data;
my $next_page = $has_next ? $offset + $per_page : '';
# признак наличия предыдущей страницы: смещение больше нуля (т.е. мы не в начале)
my $has_prev = $offset > 0;
my $prev_page = $has_prev ? $offset - $per_page : '';
# запишем сюда все страницы для того, чтобы можно было перескакивать на любую страницу
# page - номер страницы (+1 для того, чтобы нумерация не начиналась с нуля)
# offset = кол-во записей на страницу * на номер текущей страницы
# per_page надо указывать для того, чтобы сохранялось нестандартное значение
my $all_pages = [ map +{page => $_+1, offset => $per_page*$_, per_page => $per_page},
0 .. int($total_data / $per_page) # кол-во страниц = общее число записей / кол-во записей на страницу
];
my $tmpl = HTML::Template->new(filename => 'pager.html');
$tmpl->param(
tmpl_data => $tmpl_data,
all_pages => $all_pages,
has_next => $has_next,
next_page => $next_page,
has_prev => $has_prev,
prev_page => $prev_page,
per_page => $per_page,
);
print header(), $tmpl->output


<html>
<body>
<table border="1">
<TMPL_LOOP NAME="tmpl_data">
<tr>
<td><TMPL_VAR NAME="id"></td>
<td><TMPL_VAR NAME="data"></td>
</tr>
</TMPL_LOOP>
</table>
<br>
<TMPL_IF NAME="has_prev">
<a href='?offset=<TMPL_VAR NAME="prev_page">&per_page=<TMPL_VAR NAME="per_page">'>&lt;&lt;&nbsp;Previous</a>&nbsp;
</TMPL_IF>
<TMPL_LOOP NAME="all_pages">
<a href='?offset=<TMPL_VAR NAME="offset">&per_page=<TMPL_VAR NAME="per_page">'><TMPL_VAR NAME="page"></a>
</TMPL_LOOP>
<TMPL_IF NAME="has_next">
&nbsp;<a href='?offset=<TMPL_VAR NAME="next_page">&per_page=<TMPL_VAR NAME="per_page">'>Next&nbsp;&gt;&gt;</a>
</TMPL_IF>
</body>
</html>
Спалил тему: Pokerstars вывод WMZ, etc на VISA 0% или SWIFT + Конверт USD/GBP,etc (net profit $0,5 млрд) (https://minfin.com.ua/blogs/94589307/115366/) Monobank - 50₴ на счет при рег. тут (https://clck.ru/DLX4r) | Номер SIP АТС Москва 7(495) - 0Ꝑ, 8(800) - 800Ꝑ/0Ꝑ (http://goo.gl/XOrCSn)
Dreammaker
На сайте с 20.04.2006
Offline
569
#8
rtyug:
GLOBAL $_POST, $_GET;

Это говорит о уровне программера написавшего этот код :)

[Удален]
#9

Dreammaker, зачод

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий