|
|
|
| Добрый вечер.
помогите пожалуйста, додумать как сделать постраничную навигацию.
за основу взял гостевую http://www.softtime.ru/info/gbfile.php, хочу в ней переделать навигацию.
посмотрел на форуме, но ни чего подходящего не нашёл, а то что я видел, так там сначала читается построчно файл, а потом разбивается на страницы.
в указаной гостевой каждое сообщение хранится в отдельном файле.
как я понимаю, надо посчитать кол-во файлов, а потом выводить на страницу нужное кол-во файлов и читать.
попробовал сделать, но на последнем этапе тормознулся и ни чего в голову не приходит.
получаем имена файлов в гостевой
<?php
$patch = "msg";
$read = dir($patch);
if(!$read) echo "<p class='error'>Ошибка при чтении файла.".mysql_error()."</p>";
$i = 0;
while(false !== ($readd = $read->read())){
if(substr($readd,0,8)=="msg_rec_"){
/* имена файлов */
$names[$i]=substr($readd,8);
$i++;
}
}
$read->close();
?>
|
присваиваем переменной $count кол-во индексов массива $names, в переменню попадает нужное ков-во файлов.
<?php
/* кол-во сообщений */
$count = $i;
/* кол-во выводимых сообщений */
$pnumber = 2;
$page = $_GET['page'];
/* находим общее число страниц */
$total = intval(($count - 1) / $pnumber) + 1;
/* определяем начало сообщений для текущей страницы */
$page = intval($page);
/* если значение $page меньше еденици или отрицательное -
переходим на первую страницу.
Если больше переходим на последнюю */
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
// Вычисляем начиная к какого номера
// следует выводить сообщения
$start = $page * $pnumber - $pnumber;
// дальше идёт вывод сообщений
for ($i = $start; $i < $pnumber; $i++) {
$readd = $names[$i];
$data = file("msg/msg_rec_".$readd);
$name = trim($data[0]);
$text = trim($data[2]);
// выводим содержимое файлов
echo "Имя : ".$name."<br>
Текст : ".$text;
}
?>
|
вывел на экран значение переменной $start, в неё попадают нужные значения, но выводит только первые два сообщения и значения $i не меняется.
подскажите, пожалуйста как доделать постраничный вывод сообщений?
p.s. если что то не понятно написал, так просто уже сам запутался. | |
|
|
|
|
|
|
|
для: Slo_Nik
(01.11.2009 в 21:04)
| | может
for ($i = $start; $i < $start + $pnumber; $i++)
последняя страница, впрочем будет выводиться с избытком.
Так что лучше сперва рассчитать значение $end. | |
|
|
|
|
|
|
|
для: Trianon
(01.11.2009 в 21:23)
| | что Вы имеете ввиду "с избытком"?
как расчитывать $end где то сегодня встречал, посмотрю ещё раз.
а пока попробовал поменять условие цикла вроде получилось.
по крайней мере с тем кол-вом сообщений, что есть у меня.
общее кол-во - 6шт,
надо выводить по 2 шт на страницу.
получается 3 страницы и выводит ровно по 2 сообщения.
пожалуйста, вот это объясните подробней
>последняя страница, впрочем будет выводиться с избытком. | |
|
|
|
|
|
|
|
для: Slo_Nik
(01.11.2009 в 21:35)
| | Если у Вас 10 элементов на страницу и 24 элемента всего - что тут еще можно объяснить?
>где то сегодня встречал, посмотрю ещ
Да не смотреть нужно по сторонам, а думать! Считать! Перекладывать в код и записывать! | |
|
|
|
|
|
|
|
для: Trianon
(01.11.2009 в 21:59)
| | Думать надо, я согласен....
но что то ни чего не придумывается.
как я понимаю надо прервать цикл когда $i станет больше $start777
пробовал прописать условие в теле цикла - ни чего не получилось...
что то наподобе
<?php
if($i > $ start) { .......... }
?>
|
| |
|
|
|
|
|
|
|
для: Slo_Nik
(01.11.2009 в 23:52)
| | Если ничего не придумывается, нужно писать простейший цикл. Такой:
for($i = $start; $i < $end; $i++)
{
//...
}
|
А перед этим правильно посчитать $start и $end | |
|
|
|
|
|
|
|
для: Trianon
(02.11.2009 в 00:04)
| | спасибо за подсказку, попробую посчитать.
ну это как я понял Вы привели простейший пример, значит можно и без простейшего цикла обойтись? | |
|
|
|
|
|
|
|
для: Slo_Nik
(02.11.2009 в 00:36)
| | >значит можно и без простейшего цикла обойтись?
теоретически можно, только пример от этого сложнее станет. Идти по этому пути я бы совершенно точно не советовал.
Короче - считайте, что нельзя. | |
|
|
|
|
|
|
|
для: Trianon
(02.11.2009 в 00:04)
| | я правильно понял, что посчитать переменную $end и ею заменить в цикле $i<$start+$pnumber ? | |
|
|
|
|
|
|
|
для: Slo_Nik
(02.11.2009 в 02:13)
| | Вам придется подумать.
Хотя Вы и очень этого не хотите. | |
|
|
|
|
|
|
|
для: Trianon
(02.11.2009 в 09:24)
| | я знаю что прийдётся
>я правильно понял, что посчитать переменную $end и ею заменить в цикле $i<$start+$pnumber ?
вот сейчас и буду думать куда эту переменную всунуть и как её посчитать, но так как со счётчиками опыта работы совсем ни чего, хотелось бы знать в какую стророну думать... :):):):) | |
|
|
|
|
|
|
|
для: Slo_Nik
(01.11.2009 в 21:04)
| | Я бы посоветовал Вам скачать исходные коды из книги Объектно-ориентированное программирование на PHP -
http://www.softtime.ru/php5/?id_article=112
|
Там есть прекрасные примеры постраничной навигации для (файловой, БД, директории) в последнем случае как раз для Вашего примера.
Да Вам нужно найти классы pager и унаследованный от него класс pager_dir. Думаю не сложно будет разобраться тем более там много комментариев в коде. | |
|
|
|
|
|
|
|
для: Mirage
(01.11.2009 в 21:23)
| | спасибо за подсказку.
ну а это, что я пытаюсь сделать, можно как то до ума довести?
хотелось бы довести, хотя бы ради интереса и практики. | |
|
|
|
|
|
|
|
для: Slo_Nik
(01.11.2009 в 21:27)
| | как не думал, так ни чего и не придумал.
на последней странице выводится Undefined offset: 14 и как это победить я не могу понять.
на предыдущих всё нормально выводит.
<?php
for($i = $start; $i < $start + $pnumber; $i++){
...............................................................
}
?>
|
не могу понять, как сделать так, что когда выводится последнее сообщение $i дальше не считалась
может кто то подскажет? | |
|
|
|
|
|
|
|
для: Slo_Nik
(02.11.2009 в 16:10)
| | ну если совсем ничего не придумали - пишите if(!isset($names[$i])) break; | |
|
|
|
|
|
|
|
для: Trianon
(02.11.2009 в 16:26)
| | но всё таки хотелось бы увидеть пример как расчитывать переменную $end; | |
|
|
|
|
|
|
|
для: Slo_Nik
(02.11.2009 в 16:38)
| | Мне - тоже. | |
|
|
|