Можно так еще... реализовать класс меню -
Код:
<?
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]