2010-02-17 12 views
0

J'ai un petit script qui affiche les billets de blog à partir d'un fichier texte, comment puis-je ajouter la pagination afin qu'elle ne montre que 5 billets de blog à la fois?Pagination du fichier texte avec PHP

est le script ici:

<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> 

Et voici le fichier texte:

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] 

Toute aide est grandement appréciée!

+2

Pourquoi êtes-vous lire à partir d'un fichier texte au lieu d'une base de données? –

+0

Parce que sa partie d'un script plus grand qui n'utilise pas de bases de données, c'est l'une de ses "caractéristiques". Il suffit de le déposer sur le serveur et partir. Je sais que les DB sont meilleurs, mais c'est comme ça que j'ai besoin que ça marche. – mark

Répondre

1

Quelque chose comme ceci:

<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>"; 
} 
?> 

(ceci est tout à fait non testé, mais nous espérons que vous pouvez le prendre d'ici)

+0

Ok, vous avez racheté votre auto. Merci pour l'aide, désolé de vous appeler arrogant;) Je vais essayer dans un petit peu et voir comment ça se passe. Merci encore! – mark

+0

Pas de problème, revenez avec les progrès/questions! – Dolph

+0

(Mise à jour mon code ci-dessus) Découvrez la fonction file() pour lire un fichier dans un tableau: http://php.net/manual/fr/function.file.php Si vous utilisez PHP5, vous pouvez ajouter le flags: (FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) pour éliminer un peu plus de code – Dolph

1

Cela a fonctionné dans mes tests:

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

merci beaucoup, c'est génial, mais s'il y a 7 entrées, il ne montrera que 5. aussi, comment puis-je faire trier avec le plus récent étant sur le dessus? – mark

+0

ce que je veux dire, il n'y aura pas de lien vers le prochain ensemble, sauf s'il y a 5 autres messages. Idéalement, il y aurait un lien même s'il n'y a qu'un poste de plus. – mark

+0

Correction (espérons-le). – Dereleased