2010-02-17 90 views
0

我有一個小文本顯示來自文本文件的博客帖子,如何添加分頁以便一次只顯示5篇博文?帶有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

你爲什麼從文本文件而不是數據庫讀取? – 2010-02-17 21:27:42

+0

因爲它是不使用任何數據庫的較大腳本的一部分,這是它的一個「特性」。只需將它放在服務器上即可。我知道DB的更好,但這是我需要這個工作。 – mark 2010-02-17 21:38:24

回答

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 2010-02-17 21:49:14

+0

沒問題,請檢查進度/問題! – Dolph 2010-02-17 21:50:22

+0

(更新了我的代碼)檢出file()函數以讀取文件到數組:http://php.net/manual/en/function.file.php如果您使用的是PHP5,則可以添加標誌:(FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES)消除一些代碼 – Dolph 2010-02-17 21:53:15

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 2010-02-18 15:13:46

+0

我的意思是,除非有5個帖子,否則不會有鏈接到下一個集。理想情況下,即使只有一個帖子,也會有鏈接。 – mark 2010-02-18 15:22:00

+0

已修復(希望)。 – Dereleased 2010-02-20 07:58:46