Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: постраничная навигация(файлы)
 
 автор: Slo_Nik   (01.11.2009 в 21:04)   письмо автору
 
 

Добрый вечер.
помогите пожалуйста, додумать как сделать постраничную навигацию.
за основу взял гостевую 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. если что то не понятно написал, так просто уже сам запутался.

  Ответить  
 
 автор: Trianon   (01.11.2009 в 21:23)   письмо автору
 
   для: Slo_Nik   (01.11.2009 в 21:04)
 

может
for ($i = $start; $i < $start + $pnumber; $i++)

последняя страница, впрочем будет выводиться с избытком.
Так что лучше сперва рассчитать значение $end.

  Ответить  
 
 автор: Slo_Nik   (01.11.2009 в 21:35)   письмо автору
 
   для: Trianon   (01.11.2009 в 21:23)
 

что Вы имеете ввиду "с избытком"?
как расчитывать $end где то сегодня встречал, посмотрю ещё раз.
а пока попробовал поменять условие цикла вроде получилось.
по крайней мере с тем кол-вом сообщений, что есть у меня.
общее кол-во - 6шт,
надо выводить по 2 шт на страницу.
получается 3 страницы и выводит ровно по 2 сообщения.
пожалуйста, вот это объясните подробней
>последняя страница, впрочем будет выводиться с избытком.

  Ответить  
 
 автор: Trianon   (01.11.2009 в 21:59)   письмо автору
 
   для: Slo_Nik   (01.11.2009 в 21:35)
 

Если у Вас 10 элементов на страницу и 24 элемента всего - что тут еще можно объяснить?


>где то сегодня встречал, посмотрю ещ

Да не смотреть нужно по сторонам, а думать! Считать! Перекладывать в код и записывать!

  Ответить  
 
 автор: Slo_Nik   (01.11.2009 в 23:52)   письмо автору
 
   для: Trianon   (01.11.2009 в 21:59)
 

Думать надо, я согласен....
но что то ни чего не придумывается.
как я понимаю надо прервать цикл когда $i станет больше $start777
пробовал прописать условие в теле цикла - ни чего не получилось...
что то наподобе

<?php
if($i > $ start) { .......... }
?>

  Ответить  
 
 автор: Trianon   (02.11.2009 в 00:04)   письмо автору
 
   для: Slo_Nik   (01.11.2009 в 23:52)
 

Если ничего не придумывается, нужно писать простейший цикл. Такой:
for($i = $start; $i < $end; $i++)
{
  //...
}

А перед этим правильно посчитать $start и $end

  Ответить  
 
 автор: Slo_Nik   (02.11.2009 в 00:36)   письмо автору
 
   для: Trianon   (02.11.2009 в 00:04)
 

спасибо за подсказку, попробую посчитать.
ну это как я понял Вы привели простейший пример, значит можно и без простейшего цикла обойтись?

  Ответить  
 
 автор: Trianon   (02.11.2009 в 09:27)   письмо автору
 
   для: Slo_Nik   (02.11.2009 в 00:36)
 

>значит можно и без простейшего цикла обойтись?

теоретически можно, только пример от этого сложнее станет. Идти по этому пути я бы совершенно точно не советовал.
Короче - считайте, что нельзя.

  Ответить  
 
 автор: Slo_Nik   (02.11.2009 в 02:13)   письмо автору
 
   для: Trianon   (02.11.2009 в 00:04)
 

я правильно понял, что посчитать переменную $end и ею заменить в цикле $i<$start+$pnumber ?

  Ответить  
 
 автор: Trianon   (02.11.2009 в 09:24)   письмо автору
 
   для: Slo_Nik   (02.11.2009 в 02:13)
 

Вам придется подумать.
Хотя Вы и очень этого не хотите.

  Ответить  
 
 автор: Slo_Nik   (02.11.2009 в 10:34)   письмо автору
 
   для: Trianon   (02.11.2009 в 09:24)
 

я знаю что прийдётся

>я правильно понял, что посчитать переменную $end и ею заменить в цикле $i<$start+$pnumber ?

вот сейчас и буду думать куда эту переменную всунуть и как её посчитать, но так как со счётчиками опыта работы совсем ни чего, хотелось бы знать в какую стророну думать... :):):):)

  Ответить  
 
 автор: Mirage   (01.11.2009 в 21:23)   письмо автору
 
   для: Slo_Nik   (01.11.2009 в 21:04)
 

Я бы посоветовал Вам скачать исходные коды из книги Объектно-ориентированное программирование на PHP -
http://www.softtime.ru/php5/?id_article=112

Там есть прекрасные примеры постраничной навигации для (файловой, БД, директории) в последнем случае как раз для Вашего примера.
Да Вам нужно найти классы pager и унаследованный от него класс pager_dir. Думаю не сложно будет разобраться тем более там много комментариев в коде.

  Ответить  
 
 автор: Slo_Nik   (01.11.2009 в 21:27)   письмо автору
 
   для: Mirage   (01.11.2009 в 21:23)
 

спасибо за подсказку.
ну а это, что я пытаюсь сделать, можно как то до ума довести?
хотелось бы довести, хотя бы ради интереса и практики.

  Ответить  
 
 автор: Slo_Nik   (02.11.2009 в 16:10)   письмо автору
 
   для: Slo_Nik   (01.11.2009 в 21:27)
 

как не думал, так ни чего и не придумал.
на последней странице выводится Undefined offset: 14 и как это победить я не могу понять.
на предыдущих всё нормально выводит.

<?php 
for($i $start$i $start $pnumber$i++){
 ...............................................................
}
?>

не могу понять, как сделать так, что когда выводится последнее сообщение $i дальше не считалась
может кто то подскажет?

  Ответить  
 
 автор: Trianon   (02.11.2009 в 16:26)   письмо автору
 
   для: Slo_Nik   (02.11.2009 в 16:10)
 

ну если совсем ничего не придумали - пишите if(!isset($names[$i])) break;

  Ответить  
 
 автор: Slo_Nik   (02.11.2009 в 16:38)   письмо автору
 
   для: Trianon   (02.11.2009 в 16:26)
 

но всё таки хотелось бы увидеть пример как расчитывать переменную $end;

  Ответить  
 
 автор: Trianon   (02.11.2009 в 17:51)   письмо автору
 
   для: Slo_Nik   (02.11.2009 в 16:38)
 

Мне - тоже.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования