Перейти к содержимому


Глюк функции разбивки на страницы


  • Вы не можете ответить в тему
В теме одно сообщение

#1 Robby

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 162 сообщений
Репутация: 75
Продвинутый

Отправлено 20 November 2011 - 02:59 PM

Выявлено в админке в Обсуждении товаров, но возможно проявляеться везде, так как функция разбивки используется везде где превышен лимит вывода данных для одной страницы.
Суть в следующем:
пока страниц меньше или равно 5, то вроде все нормально
если страниц более 5 то формируется пропуск в нумерации следующего вида
1 2 3 4 5 6 ... 10 след >>
и когда число сообщений деленное на лимит равно целому количеству страниц, то формируется лишняя страница которая не содержит информации и соответственно ведет в пустоту. Например,
Обсуждений товаров = 180
лимит вывода сообщений на страницу = 20
Делим 180 на 20, получаем 180/20=9 страниц
А вот скрипт формирует 10 страницу ведущую в никуда, т.е. вместо
1 2 3 4 5 6 ... 9 след >>
мы получаем
1 2 3 4 5 6 ... 10 след >>
Еще один момент если выбрать вторую страницу, то получим
<< пред 1 2 3 4 5 6 7 ... 10 след >>
если 3 - то будет так << пред 1 2 3 4 5 6 7 8 10 след >>
с 4 страницы будет так << пред 1 2 3 4 5 6 7 8 9 след >>
с 8 - << пред 1 ... 3 4 5 6 7 8 9 след >>

Если полное число страниц не получается, например 179/20, то ссылки формируются правильно
Хотелось бы это исправить.
  • 0

#2 Robby

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 162 сообщений
Репутация: 75
Продвинутый

Отправлено 20 November 2011 - 05:49 PM

Покапался немного,вроде нашел проблему.

За вывод навигации отвечают две функции из core\functions\functions.php (первая функция навигация в админке, вторая в товарах)
  function ShowNavigator($a, $offset, $q, $path, &$out)
{
//shows navigator [prev] 1 2 3 4 … [next]
//$a - count of elements in the array, which is being navigated
//$offset - current offset in array (showing elements [$offset ... $offset+$q])
//$q - quantity of items per page
//$path - link to the page (f.e: "index.php?categoryID=1&")
if ($a > $q) //if all elements couldn't be placed on the page
{
//[prev]
if ($offset > 0) $out .= "<a href=\"".$path."offset=".($offset - $q)."\">&lt;&lt; ".STRING_PREVIOUS.
"</a>&nbsp;&nbsp;";
//digital links
$k = $offset / $q;
//not more than 4 links to the left
$min = $k - 5;
if ($min < 0)
{
$min = 0;
}
else
{
if ($min >= 1)
{ //link on the 1st page
$out .= "<a href=\"".$path."offset=0\">1</a>&nbsp;&nbsp;";
if ($min != 1)
{
$out .= "... &nbsp;&nbsp;";
}
;
}
}
for ($i = $min; $i < $k; $i++)
{
$m = $i * $q + $q;
if ($m > $a) $m = $a;
$out .= "<a href=\"".$path."offset=".($i * $q)."\">".($i + 1)."</a>&nbsp;&nbsp;";
}
//# of current page
if (strcmp($offset, "show_all"))
{
$min = $offset + $q;
if ($min > $a) $min = $a;
$out .= "<b>".($k + 1)."</b>&nbsp;&nbsp;";
}
else
{
$min = $q;
if ($min > $a) $min = $a;
$out .= "<a href=\"".$path."offset=0\">1</a>&nbsp;&nbsp;";
}
//not more than 5 links to the right
$min = $k + 6;
if ($min > $a / $q)
{
$min = $a / $q;
}
;
for ($i = $k + 1; $i < $min; $i++)
{
$m = $i * $q + $q;
if ($m > $a) $m = $a;
$out .= "<a href=\"".$path."offset=".($i * $q)."\">".($i + 1)."</a>&nbsp;&nbsp;";
}
if (ceil($min * $q) < $a)
{ //the last link
if ($min * $q < $a - $q) $out .= "... &nbsp;&nbsp;";
$out .= "<a href=\"".$path."offset=".($a - $a % $q)."\">".(floor($a / $q) + 1)."</a>&nbsp;&nbsp;";
}
//[next]
if (strcmp($offset, "show_all"))
if ($offset < $a - $q) $out .= "<a href=\"".$path."offset=".($offset + $q)."\">".STRING_NEXT.
" &gt;&gt;</a>&nbsp;&nbsp;";
//[show all]
if (strcmp($offset, "show_all")) $out .= "|&nbsp;&nbsp;<a href=\"".$path."show_all=yes\">".
STRING_SHOWALL."</a>";
else $out .= "|&nbsp;&nbsp;<b>".STRING_SHOWALL."</b>";
}
}
function ShowNavigatormd($a, $offset, $q, $path, &$out)
{
//shows navigator [prev] 1 2 3 4 … [next]
//$a - count of elements in the array, which is being navigated
//$offset - current offset in array (showing elements [$offset ... $offset+$q])
//$q - quantity of items per page
//$path - link to the page (f.e: "index.php?categoryID=1&")
if ($a > $q) //if all elements couldn't be placed on the page
{
//[prev]
if ($offset > 0) $out .= "<a href=\"".$path."offset_".($offset - $q).".html\">&lt;&lt; ".STRING_PREVIOUS.
"</a>&nbsp;&nbsp;";
//digital links
$k = $offset / $q;
//not more than 4 links to the left
$min = $k - 5;
if ($min < 0)
{
$min = 0;
}
else
{
if ($min >= 1)
{ //link on the 1st page
$out .= "<a href=\"".$path."offset_0.html\">1</a>&nbsp;&nbsp;";
if ($min != 1)
{
$out .= "...&nbsp;&nbsp;";
}
;
}
}
for ($i = $min; $i < $k; $i++)
{
$m = $i * $q + $q;
if ($m > $a) $m = $a;
$out .= "<a href=\"".$path."offset_".($i * $q).".html\">".($i + 1)."</a>&nbsp;&nbsp;";
}
//# of current page
if (strcmp($offset, "show_all"))
{
$min = $offset + $q;
if ($min > $a) $min = $a;
$out .= "<b>".($k + 1)."</b>&nbsp;&nbsp;";
}
else
{
$min = $q;
if ($min > $a) $min = $a;
$out .= "<a href=\"".$path."offset_0.html\">1</a>&nbsp;&nbsp;";
}
//not more than 5 links to the right
$min = $k + 6;
if ($min > $a / $q)
{
$min = $a / $q;
}
;
for ($i = $k + 1; $i < $min; $i++)
{
$m = $i * $q + $q;
if ($m > $a) $m = $a;
$out .= "<a href=\"".$path."offset_".($i * $q).".html\">".($i + 1)."</a>&nbsp;&nbsp;";
}
if (ceil($min * $q) < $a)
{ //the last link
if ($min * $q < $a - $q) $out .= "... &nbsp;&nbsp;";
$out .= "<a href=\"".$path."offset_".($a - $a % $q).".html\">".(floor($a / $q) + 1)."</a>&nbsp;&nbsp;";
}
//[next]
if (strcmp($offset, "show_all"))
if ($offset < $a - $q) $out .= "<a href=\"".$path."offset_".($offset + $q).".html\">".
STRING_NEXT." &gt;&gt;</a>&nbsp;&nbsp;";
//[show all]
if (strcmp($offset, "show_all")) $out .= "|&nbsp;&nbsp;<noindex><a href=\"".$path."show_all.html\" rel=\"nofollow\">".
STRING_SHOWALL."</a></noindex>";
else $out .= "|&nbsp;&nbsp;<b>".STRING_SHOWALL."</b>";
}
}

Проблема в следующих местах:
для первой функции
		  if (ceil($min * $q) < $a)
{ //the last link
if ($min * $q < $a - $q) $out .= "... &nbsp;&nbsp;";
$out .= "<a href=\"".$path."offset=".($a - $a % $q)."\">".(floor($a / $q) + 1)."</a>&nbsp;&nbsp;";
}


для второй
		  if (ceil($min * $q) < $a)
{ //the last link
if ($min * $q < $a - $q) $out .= "... &nbsp;&nbsp;";
$out .= "<a href=\"".$path."offset_".($a - $a % $q).".html\">".(floor($a / $q) + 1)."</a>&nbsp;&nbsp;";
}



$a - количество элементов в массиве, в моем случае 180, $q - количество элементов на странице 20

что даст следующее выражение при таких числах ($a - $a % $q) = 180-180%20=180-0=180, а должно быть 160 отсюда и ошибка.
ссылка при оригинальном коде имеет вид (за пределами массива)

/admin.php?dpt=catalog&sub=discuss&productID=0&offset=180

при измененном
/admin.php?dpt=catalog&sub=discuss&productID=0&offset=160


Вот так ссылки будут формироваться правильно, замените выше приведенный проблемный код на следующий:
				    if (ceil($min * $q) < $a)
{ //the last link
if ($min * $q < $a - $q) $out .= "... &nbsp;&nbsp;";
if ($a % $q == 0){
$out .= "<a href=\"".$path."offset=".($a - $q)."\">".floor($a / $q)."</a>&nbsp;&nbsp;";
} else {
$out .= "<a href=\"".$path."offset=".($a - $a % $q)."\">".(floor($a / $q) + 1)."</a>&nbsp;&nbsp;";
}
}

и
		  if (ceil($min * $q) < $a)
{ //the last link
if ($min * $q < $a - $q) $out .= "... &nbsp;&nbsp;";
if ($a % $q == 0) {
$out .= "<a href=\"".$path."offset_".($a - $q).".html\">".floor($a / $q)."</a>&nbsp;&nbsp;";
} else {
$out .= "<a href=\"".$path."offset_".($a - $a % $q).".html\">".(floor($a / $q) + 1)."</a>&nbsp;&nbsp;";
}
}

  • 2