Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Название темы: постраничный вывод
Показать сообщение отдельно

Аватара для Prisoner

Engrossed by the Void


Сообщения: 2229
Благодарности: 60

Профиль | Отправить PM | Цитировать


Можно так еще... реализовать класс меню -
Код: Выделить весь код
<?
  define('PART1_LENGTH', 10);
  define('PART2_LENGTH', 3);
  define('PART3_LENGTH', 2);
  define('FULL_LENGTH', 37);

class Navigation
  {

   var $ParamName;      /* имя параметра строки адреса с инфой о меню*/
   var $FileName;       /* куда, собственно, меню будет строить ссылки*/
   var $Delimiter;      /* символ-разделитель пунктов*/
   var $DelimiterClass; /* имя стиля для символа-разделителя*/
   var $CurPage;        /* номер активной паги */
   var $Total;          /* общее число элементов */
   var $AClass;         /* имя стиля для ссылки*/
   var $NAClass;        /* имя стиля не для ссылки*/
   var $ColPerStr;      /* количество столбцов на строку при выводе номеров страниц*/

   function Info()
     {
      echo "<br>Class info:<br> CurPage: ".$this->CurPage."<br> Total: ".$this->Total."<br> ParamName: ".$this->ParamName."<br> FileName: ".$this->FileName."<br> Delimiter: ".$this->Delimiter."<br> AClass: ".$this->AClass."<br> NAClass: ".$this->NAClass."<br> DelimiterClass: ".$this->DelimiterClass."<br>";
     }

   function Init()
     {
      if (isset($_GET[$this->ParamName]))
        {
         $Str = substr($_GET[$this->ParamName], PART1_LENGTH);
        }
      else
        {
        $Str='';
        }

      if (!trim($Str))
        {
         $this->CurPage = $this->Total = 0;
         return false;
        }

      @list($CurPage, $Total) = preg_split('/[^0-9]/si', $Str, 3, PREG_SPLIT_NO_EMPTY);
      $this->CurPage = abs(intval($CurPage));
      $this->Total = abs(intval($Total));

      if ($this->Total<$this->CurPage)
        $this->CurPage=$this->Total;
     }

   function MakeSecureParam($CurIndex, $Total)
     {
      srand(time());
      $Part1 = substr(md5(uniqid(mt_rand())), 0, PART1_LENGTH);

      srand(time());
      $T_Str = eregi_replace('[0-9]', '', md5(uniqid(mt_rand())));
      $Part2 = substr($T_Str, 0, PART2_LENGTH);

      srand(time());
      $T_Str = eregi_replace('[0-9]', '', md5(uniqid(mt_rand())));
      $Part3 = substr($T_Str, 0, PART3_LENGTH);

      srand(time());
      return str_pad($Part1.$CurIndex.$Part2.$Total.$Part3,
                     FULL_LENGTH,
                     md5(uniqid(mt_rand())),
                     STR_PAD_RIGHT );
     }

   function ShowMenu()
     {
      if (strpos($this->FileName, "?")===false)
        $ParamDelimiter='?';
      else
        $ParamDelimiter='&';

      echo '<table cellpadding=3 cellspacing=0 border=0><tr>';

      $ColCnt = 0;

      for ($I=1;$I<=$this->Total;$I++)
        {
         if ($ColCnt<=$this->ColPerStr)
           {
            echo '<td>';
            $ColCnt++;
           }
         else
           {
            echo '</tr><tr><td>';
            $ColCnt = 0;
           }


         if ($I==$this->CurPage)
           {
            if (Trim($this->NAClass))
              echo "<span class=\"".Trim($this->NAClass)."\">".$I."</span>\n";
            else
              echo $I;

            if ($I<$this->Total)
              echo $this->Delimiter;
           }
         else
           {
            if (Trim($this->AClass))
              echo "<a class=\"".Trim($this->AClass)."\" href=\"".$this->FileName.$ParamDelimiter.$this->ParamName."=".$this->MakeSecureParam($I,$this->Total)."\">".$I."</a>\n";
            else
              echo "<a href=\"".$this->FileName."?".$this->ParamName."=".$this->MakeSecureParam($I,$this->Total)."\">".$I."</a>\n";
            if ($I<$this->Total)
              echo $this->Delimiter;
           }

         echo '</td>';
        }

      echo '</tr><tr><td align=center colspan='.$this->ColPerStr.'>';

      if ($this->CurPage>1)
        echo "<a class=\"".$this->AClass."\" href=\"".$this->FileName.$ParamDelimiter.$this->ParamName."=".$this->MakeSecureParam(($this->CurPage-1),$this->Total)."\">назад</a>".$this->Delimiter;
      else
        echo " <span class=\"".$this->NAClass."\">назад</span>".$this->Delimiter;
      if ($this->CurPage<$this->Total)
        echo " <a class=\"".$this->AClass."\" href=\"".$this->FileName.$ParamDelimiter.$this->ParamName."=".$this->MakeSecureParam(($this->CurPage+1),$this->Total)."\">вперед</a>";
      else
        echo " <span class=\"".$this->NAClass."\">вперед</span>";

      echo '</td></tr>';
      echo '<tr><td align=center colspan='.$this->ColPerStr.'>';
      echo " <a class=\"".$this->AClass."\" href=\"".$this->FileName.$ParamDelimiter.'full=1'."\">все страницы</a>";
      echo '</td></tr></table>';
     }

  function Navigation($ParamName, $FileName, $Delimiter, $AClass, $NAClass, $DelimiterClass, $ColPerStr)
     {
      $this->CurPage        = $this->Total = 0;
      $this->ParamName      = $ParamName;
      $this->FileName       = $FileName;
      $this->Delimiter      = $Delimiter;
      $this->AClass         = $AClass;
      $this->NAClass        = $NAClass;
      $this->DelimiterClass = $DelimiterClass;
      $this->ColPerStr      = $ColPerStr;
     }
  }
?>
Скажем выборка из БД (здесь это MySql) производится НЕ по лимиту (см. LIMIT). Создаем экземпляр класса и инициализируем его:
Код: Выделить весь код
 $Result = mysql_query ('какой-то запрос');
  $StringsNum = mysql_num_rows($Result)
//инициализация страничной системы
     $NavMenu = new Navigation('nav', 'index.php', ' ', 'navmenu', 'navmenu', '', 15);
// nav - имя параметра где от скрипта к скрипту будет хранится информация о текущей странице и их полного числа
// index.php - скрипт который будет участвовать в ссылках страниц
// 15 - число страниц в строке, остальные переносятся на новую
     $NavMenu->Init();
     if ($NavMenu->CurPage==0 && $NavMenu->Total==0)
       {
        $NavMenu->CurPage=1;
        // StringsPerPage - константа с числом записей на странице (= лимиту выборки)
        $NavMenu->Total=$NewsNum / StringsPerPage;
        if ($StringsNum % StringsPerPage!=0)
        $NavMenu->Total+=1;
       }
     $Page = $NavMenu->CurPage;
Теперь нам нужно организовать вывод:
Код: Выделить весь код
    while ($Row = mysql_fetch_array($Result, MYSQL_NUM))
       {
        $Data[]=$Row;
       }
    // собственно вывод
    foreach (Range (($Page-1)*StringsPerPage, $Page*StringsPerPage-1) as $I)
        {
         if (isset($Data[$I]))
           {
              вывод в каком угодно виде
           }
        }
    //проверка надобности рисования менюшки страничной системы и отрисовка в каком надо виде
    if ($StringsNum>StringsPerPage)
       {
        echo "<br><center>";
        $NavMenu->ShowMenu();
        echo "</center>";
       }
вот... кажется нигде не ошибся...

[s]Исправлено: Prisoner, 2:20 17-01-2004[/s]

-------
Не могу дать более дельный совет - не хватает системных ресурсов...


Отправлено: 22:46, 16-01-2004 | #5

Название темы: постраничный вывод