Line # Revision Author
1 8 ahitrov@rambler.ru <% $LINE %>
2 <%args>
3
4 $p => 1
5 $n => 10
6 $size => 8
7 $total => undef
8 $href => undef
9 $params => {}
10 $pname => 'p'
11 $delimiter => ' | '
12
13 </%args>
14 <%init>
15
16 # хер знает, мож и хватит...
17 $p = 1 if $p > 10000;
18
19 # если !$href и файл страницы не является DirectoryIndex, напр:
20 # .../../gallery.html. а ссылка в нем относительная, напр: <a href="?param=1">,
21 # то IE перейдет на .../../gallery.html?param=1., а NN (4.x) перейдет на
22 # .../../?param=1.., следующий блок вытащит и подставит нужное имя файла.
23 #
24 604 ahitrov if (!$href) {
25 8 ahitrov@rambler.ru $href = $r->uri();
26 604 ahitrov if ( $href =~ /\/(\w+\.[sp]?html?)$/ ) {
27 $href = $1;
28 } else {
29 $href = '';
30 }
31 8 ahitrov@rambler.ru if ($href =~ /(index|default|main)$2/ ){
32 $href = '';
33 }
34 }
35 my @params;
36 while ( my ($key, $value) = each %$params ) {
37 next if $key eq $pname;
38 if ( ref $value eq 'ARRAY' ) {
39 push @params, ( map { "$key=$_" } @$value );
40 } else {
41 push @params, "$key=$value";
42 }
43 }
44
45 my $parts = int($total/$n) + ($total % $n ? 1 : 0);
46 return undef if ($parts <= 1);
47
48 my @parts;
49
50 my $mid_position = int($size/2);
51
52 my $left_pushed_border = $mid_position;
53 my $right_pushed_border = $parts - $mid_position;
54
55 my $LINE = '';
56 my $left_border;
57 my $right_border;
58
59 604 ahitrov if ($p >= $left_pushed_border) {
60 8 ahitrov@rambler.ru $left_border = $p-$mid_position+1;
61 $right_border = $left_border+$size-1;
62 } else {
63 $left_border = 1;
64 $right_border = $size;
65 }
66 604 ahitrov if ($right_border > $parts) {
67 8 ahitrov@rambler.ru $left_border = $left_border-($right_border-$parts);
68 $right_border = $parts;
69 }
70 $left_border = 1 if ($left_border < 1);
71
72 # А не надо ли вставить [В начало]...
73 if ($left_border > 1) {
74 $params->{$pname} = 1;
75 $LINE .= "[<a href=\"$href?$pname=1".(@params ? '&'.join('&', @params) : '')."\">В начало</a>] ";
76 }
77
78 # А надо ли вставить [Пред.]...
79 604 ahitrov if ($p > 1) {
80 8 ahitrov@rambler.ru $params->{$pname} = $p-1;
81 push(@parts, "<a title=\"Предыдущая страница\" href=\"$href?$pname=".($p-1).(@params ? '&'.join('&', @params) : '')."\">&lt;&lt;</a>");
82 }
83
84 604 ahitrov foreach my $pn ($left_border .. $right_border) {
85 8 ahitrov@rambler.ru
86 $params->{$pname} = $pn;
87 push @parts, ($pn == $p) ? "<b>$pn</b>" : "<a href=\"$href?$pname=$pn".(@params ? '&'.join('&', @params) : '')."\">$pn</a>";
88 }
89
90 # А надо ли вставить [След.]...
91 604 ahitrov if ($p < $parts) {
92 8 ahitrov@rambler.ru $params->{$pname} = $p+1;
93 push(@parts, "<a title=\"Следующая страница\" href=\"$href?$pname=".($p+1).(@params ? '&'.join('&', @params) : '')."\">&gt;&gt;</a>");
94 }
95 $LINE .= join($delimiter, @parts);
96
97
98 # А не надо ли вставить [В конец]...
99 604 ahitrov if ($right_border < $parts) {
100 8 ahitrov@rambler.ru $params->{$pname} = $parts;
101 $LINE .= " [<a href=\"$href?$pname=$parts".(@params ? '&'.join('&', @params) : '')."\">В конец</a>]";
102 }
103
104 </%init>
105 <%doc>
106
107 Стандартная линеечка
108
109 </%doc>