Разбиение на страницы (pagination)

Статус
В этой теме нельзя размещать новые ответы.
Пацаны а это к примеру если я буду делать вывод из бд 10 записей я могу сделать постранично? т.е 5 на одной остальные пять на другой и т.д?
 
Приведённый код разбивает длинный текст на страницы, предполагая, что конец предложения - это точка. Также выводится некоторая отладочная информация.
PHP:
define("PAGE_LENGTH",2000);
$text = join(file("./big_plain_text.txt")); // большой текст без тегов, с переводами строк
$numpages = ceil(strlen($text)/PAGE_LENGTH);
$page = Array(); $n = $i = 0;
while ($n<$numpages) {$page[$n++] = substr($text,$i,PAGE_LENGTH); $i += PAGE_LENGTH;}
$n = 0;
while ($n<$numpages-1){
  $dot = 1+strpos($page[++$n],"."); // предполагается, что хотя бы одна точка найдётся
  $page[$n-1] .= substr($page[$n],0,$dot);
  $page[$n] = trim(substr($page[$n],$dot));
  echo "[Page $n] <<<<<<<<{$page[$n-1]}>>>>>>>> [Length: ",strlen($page[$n-1]),"]<br><br>\n";
}
Но в середине предложений встречается "г. Москва" или "и т.д.", а в конце предложения, кроме точки, может стоять '?', '!' или '...'. Так что правильно обнаружить конец предложения - это уже отдельная тема.
 
2Kirgonh
LIMIT 5, 10
5 - кол-во записей на странице, начиная с 10 записи.

2Avtandil
Интересная реализация!
 
Еще добавил бы:
Разбивать лучше заранее и созранять каким-то образом все это(например в БД), потому как каждый раз очень ресурсоемко.
 
А есть ли возможности разбить текст по заголовкам?
 
Честно говоря тему внимательно читать не стал, тем более что в php я ламер. Но сам пользуюсь одним скриптом, который полностью меня устраивает. Взял его с одного из обучающих этому сайтов.

Скрипт простой, с подробными комментами и т.к. в я в нем не зная php - вполне разобрался - то значит разберется почти любой. Он позволяет разбивать текст на страницы ПОСТРОЧНО. Вы сами определяете сколько строк вы желаете на одной странице иметь. Если строку разбивать не хотите, а на письме требуется новый абзац или строка, вставляете в текстовом файле - где надо
Код:
<br>

А есть ли возможности разбить текст по заголовкам?

Вполне, если заголовки в текстовом массиве будет отделен (в любом html редакторе массово юзаете функцию replace) перед ним переводом строки, и до конца текста под заголовком не будет больше такого перевода, вместо этого для новых абзацев юзаете
Код:
<br>

Скрипт:

PHP:
        <?php

// Создаем функцию с 2-мя обязательными
// и одним новым необязательным параметром
// с уже указанным значением по умолчанию
function separator($file, $notes, $limit=0){

// Загоняем всю инфу из файла в массив
$file = file($file);
// Получаем количество строк в файле
$q = sizeof($file); 
// Делим кол-во строк на кол-во записей - получаем кол-во страниц
// ! Если число не делится ровно, оно округлится по верхней границе (с избытком)
// Для этого существует функция ceil()
// В дальнейшем нам не нужно ставить (int) перед переменной
$np = ceil($q/$notes);

// Если в адресной строке есть $page, значит
//нужно показать блок, соответсвующий значению $page
if(isset($_GET['page']))
{
// Для удобства переименуем $_GET['page'] в $page
$page = $_GET['page'];

// Если $page больше, чем кол-во страниц, показываем последний блок
if($page > $np) $page = $np;
// Если вдруг значение $page отрицательно - выводим первый блок
if($page <= 0) $page = 1;
// Формулы начальной и конечной строки блока, вычислены опытнам путем
$begin = $notes*($page-1);
$end = $notes*$page-1;

// Вывод данных
for($i=$begin; $i<=$end; $i++)
{
if(isset($file[$i])) echo $file[$i].'<br>';
}
}

// Если $page в адресной строке нет, то показываем 1-й блок
else
{
// Если количество строк в файле меньше или равно допустимому
// количеству, то просто выводим их и не паримся с постраничным
// выводом, ибо нефига...
if($q <= $notes)
{
for($i=0; $i<$q; $i++) {
echo $file[$i].'<br>';
}

// Дальнейшее выполнение функции бессмыслено (все возможное выведено), поэтому выходим
exit;
}

// А если больше, то выводим первый блок
else
{
for($i=0; $i<$notes; $i++)
{
echo $file[$i].'<br>';
}
}
}

// Вывод навигации

// Делаем пробел между выводимой информацией
// и навигацией :)
echo '<br>';

// Если страница не первая (иначе нет смысла выводить
// стрелки), то выводим стрелки "В начало" и "Предыдущая"
if(isset($_GET['page']) && $_GET['page'] > 1){
// Будет вернее писать $_SERVER['SCRIPT_NAME'], а не index.php, как было раньше
echo '<a href='.$_SERVER['SCRIPT_NAME'].'?page=1>&lt;&lt;</a> ';
$prev = $_GET['page']-1;
echo '<a href='.$_SERVER['SCRIPT_NAME'].'?page='.$prev.'>&lt;</a> ';
}

// Если параметр, ограничивающий длину выводимой
// навигации не установлен или равен нулю, то выводим
// навигацию как обычно
if($limit == '0'){
for($i=0; $i<$np; $i++){
if(isset($_GET['page']) && $_GET['page'] == $i+1) echo '['.($i+1).'/'.$np.']';
else echo '<a href='.$_SERVER['SCRIPT_NAME'].'?page='.($i+1).'>['.($i+1).']</a> ';
}

}else{
// Самое интересное: ограничение выводимой навгиации
if(!isset($_GET['page'])) $page=1;
// Форумла начала "обрезанной" навигации (НОН)
$begin = $page-$limit;
// Формула конца "обрезанной" навигации (КОН)
$end = $page+$limit;
// Если НОН выходит за ноль, то можно не "обрезать" навигацию слева
if($begin <= 0) $begin = 1;
// Если КОН выходит за последнюю страницу, то можно не "орбезать" навигацию справа
if($end > $np) $end = $np;
// Если между 1-й страницей и НОН есть какие-то страницы, заменяем их на "..." 
if($begin > 1) echo "...";

//Ну и сам вывод...

for($i=$begin; $i<=$end; $i++){
if(isset($_GET['page']) && $_GET['page'] == $i) echo '['.$i.'/'.$np.']';
else echo '<a href='.$_SERVER['SCRIPT_NAME'].'?page='.$i.'>['.$i.']</a> ';
}

// Если между КОН и последней страницей есть какие-то страницы, заменяем их на "..." 
if($end < $np) echo "...";

}
// Вывод стрелок "Следующая" и "В конец" 
if(@$_GET['page'] < $np){
$next = @$_GET['page']+1;
echo '<a href='.$_SERVER['SCRIPT_NAME'].'?page='.$next.'>&gt;</a> ';
echo '<a href='.$_SERVER['SCRIPT_NAME'].'?page='.$np.'>&gt;&gt;</a> ';
}
}

// Ну и вызов функции
separator('file.txt', '10');
?>

Настройки скрипта внизу кода:

file.txt - неопсредственно текстовый файл для обработки.
тут '10' - число строк на странице.
 
  • Нравится
Реакции: NMN
Совет: возьми joomla и покопайтесь там на предмет разбиения по страницам. На сколько я помню, там было неплохая функция, которую можно несложно адаптировать к своим условиям.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху