2010-02-17 4 views
0

У меня есть небольшой скрипт, который отображает сообщения в блоге из текстового файла, как я могу добавить разбивку на страницы так, чтобы он показывал только 5 сообщений в блоге за раз?Paginate текстовый файл с PHP

Вот сценарий:

<html> 
<head> 

<title>blog</title> 
</head> 
<body> 

<?php 

$mode = 0; 
if ($mode == 0) { $opFile = "blogfile.txt"; } 

$fp = fopen($opFile,"r") or die("Error Reading File"); 
    $data = fread($fp, filesize($opFile)); 
fclose($fp); 

$line = explode("\n", $data); 
$i=count($line); 

for ($n=0 ; $n < $i-1 ; $n++) { 
    $blog = explode("|", $line[$n]); 

    if (isset($blog[0])) 
    {  
    echo "<div class=\"blog-post\">"; 
    echo "<p class=\"blog-title\">".$blog[1]."</p>";   
    echo "<p class=\"blog-message\">".$blog[2]."</p>"; 
    echo "<p class=\"blog-date\">Posted: " .$blog[0]."</p>"; 
    echo "<div style=\"clear: both;\"></div>"; 
    echo "</div>"; 

} 
}   

?> 
</body> 
</html> 

А вот текстовый файл:

Feb 17 2010|Title|Blog post content here|[end] 
Feb 17 2010|Title|Blog post content here|[end] 
Feb 17 2010|Title|Blog post content here|[end] 
Feb 17 2010|Title|Blog post content here|[end] 

Любая помощь очень ценится!

+2

Почему ты чтение из текстового файла вместо базы данных? –

+0

Поскольку его часть более крупного скрипта, который не использует никаких баз данных, это одна из его «функций». Просто бросьте его на сервер и идите. Я знаю, что DB лучше, но это то, как мне нужно, чтобы это работало. – mark

ответ

1

Что-то вроде этого:

<html> 
<head> 

<title>blog</title> 
</head> 
<body> 

<?php 
$POSTS_PER_PAGE = 10; 

//Not sure what this is for, but I left it? 
$mode = 0; 
if ($mode == 0) { $opFile = "blogfile.txt"; } 

//Explode the textfile into lines 
$lines = file($opFile); 

$posts = array(); 
foreach($lines as $line) { 
    //Ignore blank lines 
    if($line != "") { 
     //Explode each non-empty line 
     $post = explode("|", $line); 

     //Store the blog post 
     array_push($posts, $post) 
    } 
} 

//Output the pagination links 
echo "<div class=\"blog-pagination\">"; 
for($i = 1; $i < ceil(count($posts)/$POSTS_PER_PAGE; $i++) { 
    echo '<a href="http://mydomain/blog.php?page=' + $i + '">' + $i + '</a>&nbsp;'; 
} 
echo "</div>"; 

//Assume the user wants the first page if it's not specified 
if(!isset($_GET['page'])) { 
    $_GET['page'] = 1; 
} 

//Figure out the first and last posts on this page 
$first_post = ($_GET['page'] - 1) * $POSTS_PER_PAGE; 
$last_post = $_GET['page'] * $POSTS_PER_PAGE - 1; 

//Display the requested posts 
for($i = $first_post; $i <= $last_post; $i++) { 
    echo "<div class=\"blog-post\">"; 
    echo "<p class=\"blog-title\">".$blog[1]."</p>";   
    echo "<p class=\"blog-message\">".$blog[2]."</p>"; 
    echo "<p class=\"blog-date\">Posted: " .$blog[0]."</p>"; 
    echo "<div style=\"clear: both;\"></div>"; 
    echo "</div>"; 
} 
?> 

(! Это совершенно непроверенные, но, надеюсь, вы можете взять его здесь)

+0

Хорошо, ты искупил себя. Спасибо за помощь, извините за то, что назвали вас высокомерным;) Я немного попробую это и посмотрю, как это происходит. Еще раз спасибо! – mark

+0

Нет проблем, загляните в прошлое/вопросы! – Dolph

+0

(Обновлен мой код выше) Проверьте функцию file() для чтения файла в массив: http://php.net/manual/en/function.file.php Если вы используете PHP5, вы можете добавить flags: (FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES), чтобы устранить еще один код – Dolph

1

Это работало в моих тестах:

define('MAX_PER_PAGE',10); 
// sanity checks for per-page and page index 
$numPosts = ctype_digit((string)$_GET['perpage']) ? $_GET['perpage'] : 5; 
$ostart = $start = max(1, ctype_digit((string)$_GET['page']) ? $_GET['page'] : 1) - 1; 

$mode = 0; 
if ($mode == 0) { 
    $file = "blogfile.txt"; 
} 

// read the file into an array, strip newlines and ignore empty lines 
file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES | FILE_TEXT); 

// sort array (see custom function at bottom) 
usort($line, 'blogsort'); 

$lines = count($line); 

// get total number of pages 
$numPages = ceil($lines/$numPosts); 

// additional sanity checks (also sets $ostart if it was invalid; used later) 
$numPosts = min(MAX_PER_PAGE, max(1, $numPosts)); 
if ($start * $numPosts > $lines) { 
    $ostart = $start = max(0, $lines - $numPosts); 
} 
else { 
    $start *= $numPosts; 
} 

// Only grab the part of the array we need 
$sliced = array_slice($line, $start, $numPosts); 

// loop through posts, but break early if we run out 
for ($n = 0; $n < $numPosts && isset($sliced[$n]); $n++) { 
    $blog = explode("|", $sliced[$n]); 

    if (isset($blog[0])) {  
     echo "<div class=\"blog-post\">\n", 
      "<p class=\"blog-title\">{$blog[1]}</p>\n", 
      "<p class=\"blog-message\">{$blog[2]}</p>\n", 
      "<p class=\"blog-date\">Posted: {$blog[0]}</p>\n", 
      "<div style=\"clear: both;\"></div>\n", 
      "</div>\n\n"; 

    } 
} 
// back link 
if ($ostart > 0) { 
    echo "<a href=\"{$_SERVER['SCRIPT_NAME']}?perpage={$numPosts}&page={$ostart}\">&larr; Older</a>"; 
} 
else { 
    echo "None Older"; 
} 
echo " || "; 
// forward link 
if ($ostart + 1 < $numPages) { 
    $next = $ostart + 2; 
    echo "<a href=\"{$_SERVER['SCRIPT_NAME']}?perpage={$numPosts}&page={$next}\">Newer &rarr;</a>"; 
} 
else { 
    echo "None Newer"; 
} 

function blogsort($a, $b) { 
    $dateA = strtotime(substr($a, 0, strpos($a, '|'))); 
    $dateB = strtotime(substr($b, 0, strpos($b, '|'))); 

    if ($dateA == $dateB) { 
     return 0; 
    } 
    elseif ($dateA > $dateB) { 
     return -1; 
    } 
    else { 
     return 1; 
    } 
} 
+0

Большое спасибо, это здорово, но если есть 7 записей, это покажет только 5. Кроме того, как мне его сортировать с новейшим, находящимся сверху? – mark

+0

, что я имею в виду, не будет ссылки на следующий набор, если не будет еще 5 сообщений. в идеале, будет ссылка, даже если есть еще одна запись. – mark

+0

Исправлено (надеюсь). – Dereleased

Смежные вопросы