Blätterfunktion mit $_SESSION Variablen

J0gurt

Grünschnabel
wunderschönen guten Morgen zusammen,

ich bastel zurzeit etwas an einem kleines News System basierend auf .txt files welche im format
DDMMYYYHI.txt abgelegt werden, also im Dateiname ist das eindeutige erstellungsdatum enthalten und somit ist der name mehr oder weniger einzigartig. So weit so gut. die einzelnen Daten anzusprechen und auf einmal auf einer Seite auszugeben ist kein Thema, auch die begrenzung der Einträge habe ich nach mehreren anläufen mit einer Schleife realisiert.
Code:
session_start();
$_SESSION['anfang'] =0;
$_SESSION['ende'] =4;

Code:
function getNewsList()
{
$fileList = array();
if ($handle = opendir("news"))
   {
   while ($file = readdir($handle))
     {
     if (!is_dir($file))
       {
       $fileList[] = $file;
       }
     }
   }   
rsort($fileList);
return $fileList;
}

Code:
<?php
     
     $list = getNewsList();
     $i = 0;
     $cutlist = array_slice($list,$_SESSION['anfang'],$_SESSION['ende']);

     foreach ($cutlist as $value) {

     $newsData = file("news/".$value);
     $autor = $newsData[0];
     $newsTitle  = $newsData[1];
     $submitDate = $newsData[2];   
     unset ($newsData['0']);
     unset ($newsData['1']);
     unset ($newsData['2']);
     
     $newsContent = "";
     foreach ($newsData as $value)
     {
     $newsContent .= $value;
     }
     

  echo"<div class='news-entry'>";
  echo"<h2><span class='date'>$submitDate Uhr</span><div id='titlelink'><a href='ansichtnw.php?Data=$list[$i]' id='titlelink'>$newsTitle</a></div></h2>";
   echo"<div id='news_h'>";
  echo"$newsContent";
   echo"</div>";
   echo"<div id='readmore_news' class='readmore_news'>";
   echo"<hr>";
   echo"<a href='ansichtnw.php?Data=$list[$i]'>weiter lesen..</a>";
   echo"<div id='autor'>autor: $autor</div>";
   echo"</div>";
  echo"</div>";

   $i = $i + 1;
   $_SESSION['anfang'] = $_SESSION['anfang'] +1;

   if ($_SESSION['anfang'] >= $_SESSION['ende'])
   {
   break;
   }

}

echo $_SESSION['anfang'];
echo $_SESSION['ende'];
?>

es werden also 4 Einträge angezeigt wenn die index.php aufgerufen wird.
Mit diesen beiden Buttons möchte ich nun also die "Seiten" blättern, das echo $_SESSION['anfang']
und 'ende' geben mir an dieser Stelle jeweils eine 4 aus, ist ja auch richtig, 4x ist die Schleife durchlaufen und ist somit >= ['ende']

Code:
<form action="" method="post">
<input type="submit" id="back" name="back" value ="zurück (testing)"/>
</form>

<form action="" method="post">
<input type="submit" id="vor" name="vor" value ="vor (testing)"/>
</form>

Code:
if(isset($_POST['vor']))
{
$_SESSION['anfang'] = $_SESSION['anfang'] +4;
$_SESSION['ende'] = $_SESSION['ende'] +4;
}

if(isset($_POST['back']))
{
$_SESSION['anfang'] = $_SESSION['anfang'] -4;
$_SESSION['ende'] = $_SESSION['ende'] -4;
}

benutze ich den button $_POST['vor'] erhöht sich ['ende'] auf 8, laut echo zumindest und ['anfang'] ist bei 6 da es im moment nur 6 .txt Dateien gibt. drücke ich jetzt aber auf $_POST['back'] werden meine variablen zerpflückt und anfang / ende wird mit echo -4 und 0 ausgegeben. Klar, hier werden die start werte der $_SESSION variablen benutzt da die seite ja neu gezeichnet wird...

wenn ich dinge ausprobiere wie...

Code:
if(!isset($_SESSION['anfang']))
{
$_SESSION['anfang'] =0;
$_SESSION['ende'] =4;
}

...sind die Variablen wie gewünscht beim ersten durchlauf der schleife auf jeweils "4"
wenn man die Seite aktualisiert aber komischerweiße auf 5 und 4.. nochmal aktualisieren 6 und 4 und keine news angezeigt.

ist es generell quatsch ein solches vorhaben mit Session Variablen zu realisieren ? habt ihr tipps & tricks für mich oder sogar ein gedankenanstoß was ich falsch mache ? :)

Viele Grüße & Danke

J0gurt
 
Ja, pagination in der Session zu realisieren ist ne schlechte Idee. So kann keiner eine Seite verlinken bzw. Man sieht unter der gleichen URL immer andere Inhalte. Dafür verwendet man GET Parameter.
 
danke für die antwort :)

also wird sowas in der regel mit variablen in der url zeile und GET umgesetzt ? daran habe ich jetzt noch garnicht gedacht, werd ich direkt mal ausprobieren ob ich da was gebastelt bekomm :)
 
Desweiteren würde ich Dir raten, dass Du das Namenssystem Deiner Dateien änderst, denn so wie es gerade ist, bekommst Du keine korrekte chronologische Ordnung. Sinnvoll wäre folgendes: YYYYMMDDHI.txt
 
alles klar, danke dir. Habe es eben angepasst :)

nochmal als rücksicherung... ich könnte also mit 2 Variablen arbeiten: $anfang und $ende diese beim ersten zeichnen der seite auf 0 und 4 setzen, anschließend aber ein GET auf die URL Variablen ausführen, falls ein knopf gedrückt wurde.. und $anfang / $ende werden somit erhöht auf den gewünschten array bereich aus $list bzw. $cutlist

beim ersten betrachten der seite würde ja in der URL Zeile nur die index.php stehen, beim drücken eines knopfes wird der wert erhöht oder verkleinertdann ein header("Location: index.php?var1=$anfang&var2=$ende"); dürfte mir doch im anschluss das nächste array schnipsel liefern.

hoffe das ist nicht allzu wirr formuliert.

ist das n logischer ansatz ? :)


Danke für die informationen.
 
habe meinen Code folgendermaßen angepasst, funktioniert auch einwandfrei :) habt ihr nen Tipp wie ich unterbinden kann dass die Seiten weiter geblättert werden obwohl kein Inhalt mehr zu sehen ist ?.. also mit meiner variante kann ich die variablen ja beliebig oft erhöhen per klick, auch über die eigentliche Seitenzahl hinaus.
wäre an der stelle ein vergleich mit $list angebracht ?

Variablen & iffset:
Code:
if(!isset($_GET['a']))
{
$_GET['a'] = 0;
$_GET['e'] = 4;
}

$anfang = $_GET['a'];
$ende = $_GET['e'];

if(!isset($anfang))
{
$anfang = 0;
$ende = 4;
}


if(isset($_POST['vor']))
{
$ende = $ende +4;
$anfang = $anfang +4;
header("Location: index.php?a=$anfang&e=$ende");
}

if(isset($_POST['back']))
{
$ende = $ende -4;
$anfang = $anfang -4;
header("Location: index.php?a=$anfang&e=$ende");
}

Buttons:
Code:
<div id="pagination">
<table id="pagination">
<tr><td>
<form action="" method="post">
<input type="submit" name ="back" id="back" value="vorherige Seite" style="
  border:0;
  background-color:transparent;
  color: #008FFF;
  text-decoration:underline;
">
</form>
</td>
<td>
<form action="" method="post">
<input type="submit" name ="vor" id="vor" value="nächste Seite" style="
  border:0;
  background-color:transparent;
  color: #008FFF;
  text-decoration:underline;
">
</form>
</td></tr>
</table>
</div>
Anzeige:
Code:
    <?php
     
     $list = getNewsList();
     $i = 0;
     $cutlist = array_slice($list,$anfang,$ende);

     foreach ($cutlist as $value) {

     $newsData = file("news/".$value);
     $autor = $newsData[0];
     $newsTitle  = $newsData[1];
     $submitDate = $newsData[2];   
     unset ($newsData['0']);
     unset ($newsData['1']);
     unset ($newsData['2']);
     
     $newsContent = "";
     foreach ($newsData as $value)
     {
     $newsContent .= $value;
     }
     

  echo"<div class='news-entry'>";
  echo"<h2><span class='date'>$submitDate Uhr</span><div id='titlelink'><a href='ansichtnw.php?Data=$list[$i]' id='titlelink'>$newsTitle</a></div></h2>";
   echo"<div id='news_h'>";
  echo"$newsContent";
   echo"</div>";
   echo"<div id='readmore_news' class='readmore_news'>";
   echo"<hr>";
   echo"<a href='ansichtnw.php?Data=$list[$i]'>weiter lesen..</a>";
   echo"<div id='autor'>autor: $autor</div>";
   echo"</div>";
  echo"</div>";

   $i = $i + 1;
   $anfang = $anfang +1;

   if ($anfang >= $ende)
   {
   break;
   }

}

Grüße
J0gurt
 
ja, mit
Code:
<?php
$list = getNewsList();
$result = count($list);
echo" <div id='pagination'>";
echo "<table id='pagination'>";
echo "<tr><td>";
if($anfang !=4)
{
echo "<form action='' method='post'>";
echo "<input type='submit' name ='back' id='back' value='vorherige Seite' style='border:0;background-color:transparent;color: #008FFF;text-decoration:underline;'>";
echo "</form>";
}
echo"</td>";
echo"<td>";
if($ende < $result)
{
echo"<form action='' method='post'>";
echo"<input type='submit' name ='vor' id='vor' value='nächste Seite' style='border:0;background-color:transparent;color: #008FFF;text-decoration:underline;'>";
echo"</form>";
}
echo"</td></tr>";
echo"</table>";
echo"</div>";
?>

wird vor bzw. zurück nicht gezeichnet wenn anfang/ende außerhalb des arrays liegt.
 
Zurück