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 if (!$href)
25 {
26 $href = $r->uri();
27 $href =~ s/\/([\w]{1,}(\.[sp]?html?))//;
28 $href = $1;
29 if ($href =~ /(index|default|main)$2/ ){
30 $href = '';
31 }
32 }
33 my @params;
34 while ( my ($key, $value) = each %$params ) {
35 next if $key eq $pname;
36 if ( ref $value eq 'ARRAY' ) {
37 push @params, ( map { "$key=$_" } @$value );
38 } else {
39 push @params, "$key=$value";
40 }
41 }
42
43 my $parts = int($total/$n) + ($total % $n ? 1 : 0);
44 return undef if ($parts <= 1);
45
46 my @parts;
47
48 my $mid_position = int($size/2);
49
50 my $left_pushed_border = $mid_position;
51 my $right_pushed_border = $parts - $mid_position;
52
53 my $LINE = '';
54 my $left_border;
55 my $right_border;
56
57 if ($p >= $left_pushed_border)
58 {
59 $left_border = $p-$mid_position+1;
60 $right_border = $left_border+$size-1;
61 } else {
62 $left_border = 1;
63 $right_border = $size;
64 }
65 if ($right_border > $parts)
66 {
67 $left_border = $left_border-($right_border-$parts);
68 $right_border = $parts;
69 }
70 $left_border = 1 if ($left_border < 1);
71
72
73 # А не надо ли вставить [В начало]...
74 if ($left_border > 1) {
75 $params->{$pname} = 1;
76 $LINE .= "[<a href=\"$href?$pname=1".(@params ? '&'.join('&', @params) : '')."\">В начало</a>] ";
77 }
78
79 # А надо ли вставить [Пред.]...
80 if ($p > 1)
81 {
82 $params->{$pname} = $p-1;
83 push(@parts, "<a title=\"Предыдущая страница\" href=\"$href?".join('&', map { "$_=$params->{$_}" } keys %$params)."\">&lt;&lt;</a>");
84 push(@parts, "<a title=\"Предыдущая страница\" href=\"$href?$pname=".($p-1).(@params ? '&'.join('&', @params) : '')."\">&lt;&lt;</a>");
85 }
86
87
88 foreach my $pn ($left_border .. $right_border)
89 {
90
91 $params->{$pname} = $pn;
92 push @parts, ($pn == $p) ? "<b>$pn</b>" : "<a href=\"$href?$pname=$pn".(@params ? '&'.join('&', @params) : '')."\">$pn</a>";
93 }
94
95 # А надо ли вставить [След.]...
96 if ($p < $parts)
97 {
98 $params->{$pname} = $p+1;
99 push(@parts, "<a title=\"Следующая страница\" href=\"$href?$pname=".($p+1).(@params ? '&'.join('&', @params) : '')."\">&gt;&gt;</a>");
100 }
101 $LINE .= join($delimiter, @parts);
102
103
104 # А не надо ли вставить [В конец]...
105 if ($right_border < $parts)
106 {
107 $params->{$pname} = $parts;
108 $LINE .= " [<a href=\"$href?$pname=$parts".(@params ? '&'.join('&', @params) : '')."\">В конец</a>]";
109 }
110
111
112
113 </%init>
114 <%doc>
115
116 Стандартная линеечка
117
118 </%doc>