WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Avancerad sidnumrering i PHP (https://www.wn.se/forum/showthread.php?t=1054091)

jonssondesign 2012-07-08 03:17

Avancerad sidnumrering i PHP
 
Godmorgon mina kära wn-vänner!

Jag har 2 frågor som jag hoppas att ni kan svara på.

1) Säg att du är inne på en klädbutik på internet, och du sitter och kollar på badbyxor för killar. Sen känner du att du vill gå in på tjej avdelningen, och när du trycker på "kvinnor" i gender-menyn, vilket känns mest naturligt då?

1.1) Att man kommer till avdelningen för tjejer och direkt till kategoryn badkläder.

1.2) Att man kommer till avdelningen för tjejer, men inte in i någon underkategori.

Vad tror ni?

--------------------------------------
--------------------------------------

2) Nu till programmeringsproblemet.

Jag håller på och försöker programmera en sidnumrering, men får (uppenbarligen) inte till det som jag vill.

I dagsläget har jag det såhär:

1 2 3 4 5 ... 25
1 2 3 4 5 6 ... 25
1 2 3 4 5 6 7 ... 25
1 2 3 4 5 6 7 8 ... 25
osv ända tills:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

Som du förstår kan man ju inte ha det så..
Jag försöker eftersträva en version som liknar detta:

1 2 3 4 5 ... 25
1 2 3 4 5 ... 25
1 2 3 4 5 ... 25
1 2 3 4 5 ... 25
5 6 7 8 9... 25
5 6 7 8 9... 25
5 6 7 8 9... 25
5 6 7 8 9 ... 25
osv ända tills:
21 22 23 24 25

Hur ska jag tänka då? Någon som kan ge mig tips, eller ännu bättre, göra om min kod så att den (enligt din tro) fungerar som jag vill ha det. (Förklara inte hur du har gjort till en början, utan låt mig istället få försöka tänka ut det hela själv, och sen får du rätta mig om jag har fel :))

Såhär ser min kod ut i function.php:

Tips!:

$num_rows = 49 produkter (rader i databasen)
$page = vilken sida man är på (startar på 0)
$page_amount = hur många sidor det finns (produkter delat på antal per sida, avrundat uppåt)
$dottes = räknare var ... ska finnas


PHP-kod:

function paging(){
    global 
$num_rows;
    global 
$page;
    global 
$page_amount;
    
$dottes 0;
    if(
$page_amount != "0"){

        echo 
"<ul>";

        if(
$page != "0"){
            
$prev $page-1;
            echo 
"<li><a href=\"index.php?p=$prev\">F&ouml;reg&aring;ende</a></li>";
        }

        for ( 
$counter 0$counter <= $page_amount$counter += 1) {

            if (
$counter == $page) {
                echo 
"<li class=\"curr\"><a href=\"index.php?p=$counter\">";
                echo 
$counter+1;
                echo 
"</a></li>";
            } else {

                if (
$counter $page+5) {
                    echo 
"<li><a href=\"index.php?p=$counter\">";
                    echo 
$counter+1;
                    echo 
"</a></li>";
                } else if (
$counter $page_amount-1) {
                    echo 
"<li><a href=\"index.php?p=$counter\">";
                    echo 
$counter+1;
                    echo 
"</a></li>";
                } else {
                    
$dottes++;
                    if (
$dottes == 1) {echo "<li>...</li>";}
                };
            }
        }

        if(
$page $page_amount){
            
$next $page+1;
            echo 
"<li><a href=\"index.php?p=$next\">N&auml;sta</a></li>";
        }
        echo 
"</ul>";

    }


Klarar ni att besvara båda frågorna, och även lyckas hjälpa med mitt eländiga problem med sidnumreringen så tackar jag verkligen mycket! (jag har bara jobbat med php och mysql några veckor... That's why i can't solve it myself..

Vi höres nästa gång jag slår upp ögonlocken! Godnatt!

Björn 2012-07-08 09:25

1. Använd inte kontextberoende huvudmenyer. Ett menyalternativ, om det är en huvudmeny, ska alltid vara till samma sida.

jonssondesign 2012-07-08 12:53

Björne, du har så rätt. Precis vad jag också kände/tänkte. Men var osäker. Kände att jag bara ville ha någon med samma tänk som mig själv. :)

Någon som kan lösa programmeringsproblemet? :)

Nu är jag tillräckligt pigg för att leta på google efter svaret, men de är inte alltid så lätt att förstå vad andra personer skriver. tyvärr. Men får se efter! Hittar jag en lösning berättar jag även den för er ;)

På återseende!

jonssondesign 2012-07-08 14:12

Jag antar att problemet/lösningen ligger i denna if-satts. Eller hur? :)

PHP-kod:

if ($counter $page+5

eftersom att: Om $counter är mindre än nuvarande sidan + 5...

Tänk Fredrik, TÄNK!

Linuus 2012-07-08 16:23

Jag skulle nog rekommendera att göra en som ser ut såhär:

<<Första <Föregående ... 7 8 9 10 11 12 13 ... Nästa> Sista>>

Känns lite tydligare än ditt exempel :)

jonssondesign 2012-07-08 17:30

Smart tänkt där Linuus! ;) Ser mycket bättre ut! :) Tänkte mig förstå såhär typ:

Föregående 1 ... 7 8 9 10 11 ... 25 Nästa
Egentligen bara för att (Första och Sista) knappar är så fult.. Tänkte då istället använda mig av 1 och 25 (eller högsta siffran).

Men kanske ska testa med vanliga knappar som du säger . :)

jonssondesign 2012-07-08 17:34

På PHPportalen fick jag detta som svar:

Om du är på sida p skall det första sidnumret (av de fem) vara 4 * ((p-1) div 4) + 1.
I PHP implementeras x div y som (int)floor(x/y).


Förstår inte riktigt, för han menar på att "p" ska vara den nuvarande sidan. Alltså, p innehåller nuvarande sidans siffra.

Är man tex på startsidan är p = 0.

Vilket gör att hans uträkning blir 0!

Och man får då:

1 ... 25
1 2 ... 25
1 2 3 ... 25
1 2 3 4 ... 25

osv..

Inte riktigt som jag vill :P

Någon som kan förklara vad han menar?

Jag satte in hans kod kanske på fel ställe? Eller så fattar jag bara itne.. hm


PHP-kod:

                    $cut = (int)floor(* (($page-1) / 4)+ 1);
                    if (
$counter $cut) {
                        echo 
"<li><a href=\"index.php?p=$counter\">";
                        echo 
$counter+1;
                        echo 
"</a></li>";
                    } else if (
$counter $page_amount-1) {
                        echo 
"<li><a href=\"index.php?p=$counter\">";
                        echo 
$counter+1;
                        echo 
"</a></li>";
                    } else {
                        
$dottes++;
                        if (
$dottes == 1) {echo "<li>...</li>";}
                    }; 


Droog 2012-07-08 22:02

Här är ett förslag på hur paginering kan se ut. Den har
"till första sidan i listan",
"till föregående sida i listan"
"+/-5 steg i listan"
antal sidor i listan
select för att hoppa till valfri sida
"till nästa sida i listan"

Vad gäller att hoppa till specifika underkategorier beroende på kön, jag hade gärna velat stanna kvar på den nivå jag är, men det kommer att bli så mycket extra pill med att hålla koll på om kategorin finns för respektive kön eller ej, samt att användarna då kommer att landa kors och tvärs beroende på om kategorin finns eller ej, så det kommer bara att framstå som konstigt och förvirrande. Så i slutändan: Skippa det.

jonssondesign 2012-07-08 22:48

Hej vänner! Jag har gjort om sidnumreringen aningen. Jag gillar den som den är idag faktiskt. :)

-------
-------

Ser nu ut såhär:

1 2 3 4 5 ... 24 Nästa
Föregående 1 2 3 4 5 ... 24 Nästa
Föregående 1 2 3 4 5 ... 24 Nästa
Föregående 1 2 3 4 5 ... 24 Nästa
Föregående 1 ... 5 6 7 8 9 ... 24 Nästa
Föregående 1 ... 5 6 7 8 9 ... 24 Nästa
Föregående 1 ... 5 6 7 8 9 ... 24 Nästa
Föregående 1 ... 5 6 7 8 9 ... 24 Nästa
Föregående 1 ... 9 10 11 12 13 ... 24 Nästa

tills:

Föregående 1 ... 21 22 23 24


Här kommer även koden!

Index.php:

PHP-kod:

$result mysql_query("SELECT * FROM products WHERE visible = '1'");
$result mysql_query($query);
$items 2// Antal items per sida
$num_rows mysql_num_rows($result);

$nrpage_amount $num_rows/$items;
$page_amount ceil($num_rows/$items);
$page_amount $page_amount-1;

if (isset(
$_GET['p'])) {
$page mysql_real_escape_string($_GET['p']);
} else {
$page 1;
}

$p_num $items*$page;

$result mysql_query("SELECT * FROM products WHERE visible = '1' ORDER BY 'price' ASC LIMIT $p_num , $items");

while(
$product mysql_fetch_array($result)) {
//Här skrivs produkterna ut
};

paging(); 


Function.php:
PHP-kod:

function paging(){
    global 
$num_rows// Antal rader i db (49)
    
global $page// Nuvarande sida
    
global $page_amount// Antal sidor (Antal rader delat på produkter per sida (25))
    
$dottes 0// Räknare för punkter
    
    
if($page_amount != "0"){ // Om det finns fler än 1 sida
        
        
echo "<ul>";
            if(
$page != "1"){ // Om nuvarande sidan inte är första sidan (0 = förstasidan)
                
$prev $page-1;
                echo 
"<li><a href=\"?p=$prev\">F&ouml;reg&aring;ende</a></li>";
                if (
$page 4) {echo '<li><a href="?p=1">1</a></li>';echo "<li>...</li>";}
                
            }
            
            
$first * (int)floor(($page-1) / 4)+ 1;
            
            for (
$p $first$p<$first+&& $p<=$page_amount$p++) {
                if (
$p == $page) {
                    echo 
'<li><div class="curr">'$p'</div></li>';
                } else {
                    echo 
'<li><a href="?p='$p'">'$p'</a></li>';
                }
            }
            
            if (
$page_amount $first >= 5) {
            echo 
'<li>...</li>';
            echo 
'<li><a href="?p='$page_amount'">'$page_amount'</a></li>';
            }
            
            if(
$page $page_amount){ // Om $page (nuvrande sidan) är mindre än $page_amount (antal sidor)
                
$next $page+1;
                echo 
"<li><a href=\"?p=$next\">N&auml;sta</a></li>";
            }
        echo 
"</ul>";
    }



jonssondesign 2012-07-09 12:06

Ser att uthämtningen av produkter blir fel nu. ehm.

Om jag kör med $page = 1; så hämtar den inte ut, lika många produkter som man vill att det ska synas per sida, i början.

Säg att man har 100 produkter.
och vill visa 20 produkter per sida. (5 sidor).

Har jag då $page = 1; så börjar produkt nr 20 på startsidan.
Produkterna 1 - 20 är alltså inte med, så det listas bara 80 av 100 produkter.
Skriver jag dock index.php?p=0
då får jag fram produkterna 1 - 20.

Någon som ser varför detta kommer sig?

$query .= "LIMIT $p_num , $items";
Det verkar som om det är här de ligger.

$p_num = $items*$page; ($p_num = 20*1)

Så den börjar plocka ut produkter efter den 19 raden i databasen. INTE BRA!

Någon med några idéer? :)

Linuus 2012-07-09 12:16

Citat:

Ursprungligen postat av jonssondesign (Inlägg 20444455)
Ser att uthämtningen av produkter blir fel nu. ehm.

Om jag kör med $page = 1; så hämtar den inte ut, lika många produkter som man vill att det ska synas per sida, i början.

Säg att man har 100 produkter.
och vill visa 20 produkter per sida. (5 sidor).

Har jag då $page = 1; så börjar produkt nr 20 på startsidan.
Produkterna 1 - 20 är alltså inte med, så det listas bara 80 av 100 produkter.
Skriver jag dock index.php?p=0
då får jag fram produkterna 1 - 20.

Någon som ser varför detta kommer sig?

$query .= "LIMIT $p_num , $items";
Det verkar som om det är här de ligger.

$p_num = $items*$page; ($p_num = 20*1)

Så den börjar plocka ut produkter efter den 19 raden i databasen. INTE BRA!

Någon med några idéer? :)

Det beror väl bara på att du i koden börjar räkna från 0 och inte 1. Så om $page=0 (sida 1) så blir det ju rätt? Sen är ju $page=1 din sida 2 osv. Räkna med att $page = 1 är din förstasida istället :)

jonny 2012-07-09 12:18

Vad sägs om
PHP-kod:

$p_num $items*($page-1

Du kan låta databasen räkna åt dig också genom att använda SELECT COUNT, så slipper du ladda över alla produkter bara för att räkna dem i php

jonssondesign 2012-07-09 12:45

Smart!

Det fungerade nästa.

Nu börjar den ta ifrån första produkten, super!

Dock så visas inte sista sidan.

Säg att vi har 56 produkter, och vill bara visa 4 per sida (det är 14 sidor).
Då visas bara 13 sidor i sidnumreringen..
Lägger man dock till en ny produkt så att det blir 57 produkter, då visas 14 sidor, även om det egentligen skulle vara 15sidor. (57/4 = 14.25 (upphöjt = 15)). ehm..

jonny 2012-07-09 13:05

Först räknar du ut antal sidor och sen tar du bort en?

Testa att ta bort den här raden
PHP-kod:

$page_amount $page_amount-1


jonssondesign 2012-07-09 13:40

Helt rätt! Testade också detta, och det fungerade perfekt!

Ska jag vara ärlig så har jag testat precis vad vi gjorde nu, bara att jag va så trött att jag skrev: $p_num = $items*$page-1; istället för $p_num = $items*($page-1); Haha!

Enkelt löst iaf! Tack jonny!

Tack även till dig linuus, men jag hade hoppats på att slippa räkna om hela skiten :)

Jag använde denna sidas kod som grund till alltihopp..
http://snipplr.com/view/55519/

Tack igen grabbar!

Lägger ut sidan på feedback senare, så får ni se om ni gillar vad ni har bidragit till ;)

Tack!

PS. som ni ser så ligger $page_amount = $page_amount-1; med i "original"´-koden, hade därför inte tanken på att den tog bort en sida.. :S sorry about that!


Alla tider är GMT +2. Klockan är nu 12:29.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson