Ben al even bezig maar ik kom er niet uit. Ik heb er al iets eerder over gepost.
De opdracht is in wezen simpel:
- lees een stuk tekst
- verdeel dat in pagina's van maximaal x regels
- met een maximale breedte van y
- laat telkens 2 pagina's naast elkaar zien
- oneven pagina's links en even pagina's rechts
- zorg voor correcte navigatie (first, previous, next, last)

Het is me tot op zekere hoogte gelukt, maar:
- óf de laaste pagina wordt niet getoond bij [next]
- óf er staat een oneven pagina rechts
- óf er staat een even pagina links

Als trucje verhoog ik de totaal_pagina's_teller met 1, als dit een even getal is.
Maar dan zie je bij [last] twee lege pagina's.
Zucht. Iemand beter ideeën? Ik zou er erg dankbaar voor zijn.

Dit is de link: (let op: zit in 2 regels, dus even samenvoegen)
http://www.misdaadauteurs.be/site/gvm_boekfragment.php?
key=1056&p=1
Dit is de code:

<?php
// haal een veld uit de database in de variabele $x_fragment.
// dit is gebeurd.

// stop deze variabele in en global.
$_SESSION["thistext"] = $x_fragment;

if ($x_fragment <> "") {
// tekst in array plaatsen:
// - eerst de <br /> en <br> vervangen door \n (wordwrap ziet <br />/<br> niet als CR-LF
// - dan wordwrap op 45 tekens breed
// - dan \n replacen door <br /> met nl2br
$_SESSION["data"] = explode("<br />", nl2br(wordwrap (str_replace("<br>","\n",str_replace("<br />","\n",$_SESSION["thistext"])), 45)));

// maximaal aantal regels per bladzijde
$_SESSION["maxlines"] = 19;
// totaal aantal regels van fragment
$_SESSION["totallines"] = count($_SESSION["data"]);
// totaal aantal pagina's
$_SESSION["totalpages"] = ceil(($_SESSION["totallines"] / $_SESSION["maxlines"]));

// welke pagina moet worden getoond
$page = $_GET["p"];
// if pagina niet gedefinieerd, dan beginnen op pagina 1
if($page <= 0) {
$page = 1;
// if pagina groter dan totaal aantal pagina's, dan beginnen op laatste pagina
} elseif ($page > $_SESSION["totalpages"]) {
$page = $_SESSION["totalpages"];
}

if ((($page % 2) == 0) && ($page > 0)) {
// Gebruiker vraagt een even pagina op;
// begin bij de vorige (oneven) pagina.
$page--;
}

?>

<div id="boekImage"
style="z-index:1; position:relative; font-family:'Times New Roman', Times, serif;font-size:120%; color:#000000;
margin-left:16px; margin-top:10px; border:0px; width:775px; height:427px; background-image:url(images/sitesys/BoekOpen.jpg);">

<!-- bladzijde links -->
<div id="pagL"
style="z-index:2;position:absolute; left:64px; top:18px; width:310px; height:380px; border:0px solid #333333;">
<?php
// te tonen startpagina
$start = ($page * $_SESSION["maxlines"]) - $_SESSION["maxlines"];

// de regels met tekst die worden getoond in een sub-array
$displayLeft = array_slice($_SESSION["data"], $start, $_SESSION["maxlines"]);
// toon deze regels op de linker bladzijde
showPage($displayLeft);
?>
</div>

<div id="pagnrL"
style="z-index:3; position:absolute; font-size:small; left:74px; top:404px; width:23px; height:17px; ">
<?php
// toon pagina nummer
echo $page;
?>
</div>

<div id="titel"
style="z-index:3; font-size:small; color:#999999; position:absolute; left:103px; top:404px; width:265px; height:19px; z-index:2;">
<?php
// toon titel van het boek
echo $x_titel;
?>
</div>

<?php
// if verder dan pagina 1+2, toon link naar vorige pagina('s)
if ($page > 1) { ?>
<div id="prev" style="z-index:4; position:absolute;left:34px; top:403px; width:40px; height:16px;overflow:hidden">
<a href="<?=$PHP_SELF;?>?key=<?php echo $x_bkn_id; ?>&amp;p=0">
<img src="images/sitesys/first.gif" width="16" height="16" border="0"></a>
<a href="<?=$PHP_SELF;?>?key=<?php echo $x_bkn_id; ?>&amp;p=<?php echo ($page - 2); ?>">
<img src="images/sitesys/prev.gif" width="16" height="16" border="0"></a>
</div>
<?php } // end if ($page > 2) ?>

<!-- bladzijde rechts-->
<div id="pagR"
style="z-index:5; position:absolute; left:430px; top:18px; width:310px; height:380px; vertical-align:top; border:0px solid #333333;">
<?php
// te tonen startpagina
$start = ($page * $_SESSION["maxlines"]);

// de regels met tekst die worden getoond in een sub-array
$displayRight = array_slice($_SESSION["data"], $start, $_SESSION["maxlines"]);
// toon deze regels op de rechter bladzijde
showPage($displayRight);
?>
</div>

<div id="pagnrR" align="right"
style="z-index:6; position:absolute; font-size:small; left:661px; top:403px; width:23px; height:17px; ">
<?php
// if nog een rechter bladzijde: toon pagina nummer
if ($displayRight) { echo $page + 1; }
?>
</div>

<div id="auteur" align="right"
style="z-index:3; font-size:small; color:#999999; position:absolute; left:431px; top:403px; width:224px; height:18px;">
<?php
// toon auteur van het boek, ook al is de pagina leeg
echo $auteur;
?>
</div>

<?php
// if nog meer pagina's, toon link naar volgende pagina('s)
if (($page + 1) < $_SESSION["totalpages"]) { ?>
<div id="next" style="z-index:7;position:absolute; left:690px; top:402px; width:40px;overflow:hidden">
<a href="<?=$PHP_SELF;?>?key=<?php echo $x_bkn_id; ?>&amp;p=<?=($page + 2 );?>">
<img src="images/sitesys/next.gif" width="16" height="16" border="0"></a>
<a href="<?=$PHP_SELF;?>?key=<?php echo $x_bkn_id; ?>&amp;p=<?php echo $_SESSION["totalpages"]; ?>">
<img src="images/sitesys/last.gif" width="16" height="16" border="0"></a>
</div>
<?php } // end if (($page + 1) < $_SESSION["totalpages"]) ?>

</div>

<?php } // end if ($x_fragment <> "") ?>

<?php
function showPage($display) {
foreach($display as $key => $value) {
print($value . "<br />");
}
}
?>


Ligt dat niet aan de increment?

<?php
// knip - plak
if (($_SESSION["totalpages"] % 2) == 0) {
$_SESSION["totalpages"]++;
}
?>

Wellicht dat het met:

<?php
// knip - plak
if (($_SESSION["totalpages"] % 2) == 0) {
++$_SESSION["totalpages"];
}
?>
wel werkt?

Leuke website trouwens!
@Kasper:

++$var is in dit geval gelijk aan $var++

De enige situatie waarin het verschil maakt, is wanneer je tegelijkertijd de waarde toekent aan een andere variabele. Dus:

$tmp = $var++;

is niet gelijk aan

$tmp = ++$var;

Maar aangezien er in dit geval niets met de return value wordt gedaan, maakt het niet uit waar je de ++ zet.
@Roland:

Het is overigens het stukje code dat Kasper aanhaalde, dat er volgens mij gewoon uit moet, maar in je vraagstelling gaf je ook al aan dat dat een workaround was.

Dat er een even pagina aan de linkerkant komt, komt door de manier waarop je met $page omgaat. Als $page <= 0, maak je er 1 van. Laat dat nu net een even pagina zijn ;-)

Ik stel dus voor het stukje code als volgt te veranderen:

<?
$page = $_GET['p'];
if ($page < 0)
{
$page = 0;
}
elseif ($page > $totalpages)
{
$page = $totalpages;
}
elseif (($page % 2) == 1)
{
// Gebruiker vraagt een even pagina op;
// begin bij de vorige (oneven) pagina.
$page--;
}
?>

Voor de duidelijkheid heb ik even $totalpages gebruikt i.p.v. $_SESSION['totalpages']; dat moet je uiteraard nog even aanpassen.
Rare vraag misschien.. maar loop je niet tegen het probleem op dat sommige zinnen nu eenmaal langer zijn dan andere?

Hoe 'reken' je de pagina hoogte uit van bijv. 30 willekeurige zinnen waarbij elke 'zin' gemiddeld 1 tot 3 regels in beslag neemt. Lijkt mij onmogelijk. Of je moet bijv. karakters gaan tellen, maar dan nog mag het een wonder heten om 2 pagina's goed naast elkaar te krijgen lijkt me..
@Pholeron:
Helemaal in het begin wordt een word wrap gedaan op maximaal 45 tekens per regel. Ik ga er dus vanuit dat het met de regellengte wel goed wordt afgehandeld...
Okay dan ;).. met een beetje marge aan de onderkant van de pagina, zou ut dan idd in 99% van de gevallen moeten werken lijkt me.. Succes!
@Kasper: increment werkt idd hetzelfde, zoals Willem zei.
@Willem: jouw snippet zit erin. Werkt nog niet helemasal jofel, want het probleem blijft: bij [last] staat pagina 6 links (zie www.misdaadauteurs.be/site/gvm_boekfragment.php?key=121). Dit is dus eigenlijk pagina 7 (want we beginnen bij 0), dus het zou goed moeten zijn. Maar als je dan met [previous] terug bladert, dan kom je niet verder terug dan pagina 2. Pagina 0 en 1 zijn dan onbereikbaar.
Back to the drawing board dus :)

Bedankt in elk geval!
Eerlijk gezegd geloof ik niet dat page bij 0 begint. Als ik naar je code kijkt, wijst juist alles erop dat de boel bij page == 1 start.

$realstart wordt bijvoorbeeld nergens gebruikt; als ik het goed begrijp, zou dat ervoor moeten zorgen dat de gebruiker niet wordt geconfronteerd met pagina 0.

Maar een veel duidelijker aanwijzing vind ik deze:

$start = ($page * $_SESSION["maxlines"]) - $_SESSION["maxlines"];

Als je hier $page==0 invult, krijg je $start == -19 en dat lijkt me een beetje lastig voor je array slice ;-)
@Willem:
[$realstart wordt bijvoorbeeld nergens gebruikt]

Weg ermee dus :)

[$start = ($page * $_SESSION["maxlines"]) - $_SESSION["maxlines"];

Als je hier $page==0 invult, krijg je $start == -19 en dat lijkt me een beetje lastig voor je array slice ;-)]

Klopt. Opgevangen met:
if($page <= 0) {
$page = 1;
etc.

Maar jouw aanvulling:
[quote=elseif (($page % 2) == 1)
{
// Gebruiker vraagt een even pagina op;
// begin bij de vorige (oneven) pagina.
$page--;
}
[/quote]

did the trick :)
Het werkt nu. Hartstikke bedankt!

Reageren