Gå til innhold

Pagineringsbom


Anbefalte innlegg

Jeg har en nyhetsside med et pagineringssystem som jeg tok fra en tilfeldig pagination tutorial. Om jeg nå skal linke direkte til en bestemt section (artikkel) ser url'en slik ut: page.php?page_id=1&section_id=413&page=1. Den siste page=1 brukes av pagineringsystemet. Er den feil eller utelatt, vil du ikke komme direkte til artikkelen. Problemet er jo at etterhvert som det kommer flere artikler, vil den havne på page 2, og da blir jo url'en feil!

 

Her er et eksempel:

http://www.truemetal.org/cirithungol/page.php?page_id=1&section_id=413&page=1&lukket=1#413

 

 

Kode

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


$adjacents = 3;
$sql="SELECT id
	FROM section
	WHERE page_id=$page_id
	ORDER BY ".($page_id!=1?"sort, headline, ":"")."updated_time DESC, created_time DESC";
$result=runquery($sql,"newsfeed.php/total_pages");
$total_pages = mysql_num_rows($result);


/* Setup vars for query. */
$targetpage = "page.php"; 	//your file name  (the name of this file)
$limit=15 	//how many items to show per page
if($page) 
	$start = ($page - 1) * $limit; 	//first item to display on this page
else
	$start = 0;		


//Hent alle sections i page
$sql_section="SELECT id, headline, sort, text,
		created_time AS created_time, created_by, updated_time AS updated_time, updated_by
		FROM section
		WHERE page_id=$page_id
		ORDER BY ".($page_id!=1?"sort, headline, ":"")."updated_time DESC, created_time DESC
	LIMIT $start, $limit";
$result_section=runquery($sql_section,"newsfeed.php/list");


/* Setup page vars for display. */
if ($page == 0) $page = 1;					//if no page var is given, default to 1.
$prev = $page - 1;	//previous page is page - 1
$next = $page + 1;	//next page is page + 1
$lastpage = ceil($total_pages/$limit);		//lastpage is = total pages / items per page, rounded up.
$lpm1 = $lastpage - 1;	//last page minus 1

$pagination = "";

       //lister sections her med while($row=....)

if($lastpage > 1)
{	
//html pageselect her på bunnen av siden

Endret av MikkelRev
Lenke til kommentar
Videoannonse
Annonse

Mkay, forklaringen din ga ikke akkurat mye sense. Så jeg skal prøve og komme til bunns i det du sier og deretter så skal jeg gjøre mitt beste for og hjelpe deg. Høres OK ut? Flott.

 

Okay, Først av alt...GET variablene.

I forklaringen din så snakker du om en url som slutter med

?page_id=1&section_id=413&page=1

 

Hva representerer de ulike variablene?

PAGE_ID = ?

SECTION_ID = ?

PAGE = ?

 

Jeg antar at PAGE er til PAGINATION scriptet. Et pagination script har som regel 2 bruksområder.

1) Liste flere artikler på en side, men istede for og liste 250 artikler så viser den feks 20 om gangen

ELLER

2) Ha en artikkel eller lignende med flere sider.

 

Hvem av disse 2 er det du skal bruke ditt pagination script til? Jeg antar 1 ut ifra det du skriver, men selvfølgelig jeg kan ta feil :)

 

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

Grunnen til at jeg spør om dette, er fordi logikken min tilsier at det ikke skal bli feil med URLen. I utgangspunktet så har man en side hvor man lister nyhetsartikler. Der bruker man feks

?action=news&section=1&page=4

Hvor

action = news

section = sub seksjonen i news

page = side 4.

 

Da vil det bli kjørt en SQL query som kan minne om dette

SELECT * FROM `news` ORDER BY `id` DESC LIMIT 40, 20;

(tror LIMIT'n er riktig. Men surrer så ofte med det)

 

SÅ får du en output feks

 

NYHETS HEADER

Lorem ipsum blablabla

LINK: Les Mer (som går videre da til feks ?action=read&id=14)

 

I teorien da så skal det nemlig ikke være noen feil i det hele tatt. Hvis du forstår :)

Lenke til kommentar
Problemet er jo at etterhvert som det kommer flere artikler, vil den havne på page 2, og da blir jo url'en feil!

Når du skal linke til en artikel direkte så bør du bruke annen url med f. eks artikkel id: ?art_id=10 slik at kun den valgte artikkelen vises

// ikke tatt hensyn til sikkerhet osv
$sql="SELECT .... FROM tabell WHERE artikel_id=".$_GET['art_id'];

Endret av Crowly
Lenke til kommentar

Hva representerer de ulike variablene?

PAGE_ID = ?

SECTION_ID = ?

PAGE = ?

Skjønner at det er lett å bli forvirret over page vs page_id, burde ha funnet bedre navn.

page_id = hvilken side i menyen du er på, feks News, Discography, Bio, Members osv.

section_id = post/artikkel

page = sidenummer i forhold til pagineringen, så ja du hadde rett. Se helt nederst på siden, der ser du pagineringen. Foreløpig kun 2 sider.

 

 

Jeg bruker paginering for å ikke vise 250 sections/artikler samtidig, men kun 15 omgangen ($limit=15 i koden).

Slik jeg forstår det, så må page ikke være en del av url'en, ettersom page ikke er statisk, men dynamisk i forhold til hvor mange artikler der er og hvilken side artikkelen havner på.

 

Når du skal linke til en artikel direkte så bør du bruke annen url med f. eks artikkel id: ?art_id=10 slik at kun den valgte artikkelen vises

Denne url'en viser hele nyhetssiden (paginering på bunnen): http://www.truemetal.org/cirithungol/page.php?page_id=1

Denne url'en linker til en bestemt artikkel: http://www.truemetal.org/cirithungol/page.php?page_id=1&section_id=413&page=1&lukket=1#413

 

 

Det er bare at page ikke bør være med i url'en om du/dere skjønner.

Endret av MikkelRev
Lenke til kommentar

Så lenge alle artikler er på en side så vil denne metoden fungere. Så fort den havner på side 2+, så gjør den ikke det (fordi bokmerket finnes ikke), som er kjernen av problemet ditt så vidt jeg har skjønt.

Det du bør gjøre er å ha to spørringer mot databasen, en som drar ut alle artikler som skal være på siden (kun begrenset av hvor mange som vises pr side, denne har du i dag), og en som kun henter ut en enkelt artikkel (den som er valgt, denne må du lage og blir tilsvarende den i min forrige post).

 

Så må du modifisere linken til noe ala dette http://www.truemetal.org/cirithungol/page.php?page_id=20&artikle=413

 

Prinsippet blir det samme som du ser på de fleste nettaviser o.l. På forsiden så ligger alle sakene, og en "les mer" / "les hele saken" osv linker på hver enkelt sak som da fører deg til en side som viser kun den saken.

Lenke til kommentar

Ja et slikt "les mer" system har jeg allerede. Koden for det ligger ikke i koden over, men den er ganske så uavhengig av pagineringen.

 

Linker til "ingressmodus": page.php?page_id=1&section_id=384&page=1#384

Linker til "lesmermodus": page.php?page_id=1&section_id=384&lukket=1&page=1#384

Les mer blir altså bestemt av lukket=1.

 

Det jeg tror jeg trenger er å finne nåværende page til en artikkel basert på artikkel id'en (section_id) også sette $page til riktig verdi. For $_GET["page"] kan kun være satt når du har trykket på pagineringsindexen (nederst på siden). Så hvordan finner jeg page'en til en section basert på id'en (evt en annen kolonne)?

Endret av MikkelRev
Lenke til kommentar

Tror du bør droppe hele tankegangen om hvilken siden artikkelen ligger på, dette blir bare masse ekstra logikk/kode. Hvorfor ikke gjøre det så enkelt som at les mer linken sender deg til en side hvor kun den valgte saken blir vist? Alternativt samme side, men inneholdet endres basert på $_GET parameterne (eller tilsvarende metoder).

 

Du kan f. eks modifisere SELECT'en som henter alle sakene, til kun å hente en bestemt sak hvis gitte parametere er satt. Noe ala dette (ikke gitt at det fungerer helt i din kode, men for å vise hvordan man kan bygge opp sql'en basert på parameter

//Hent alle sections i page
       $sql_section="SELECT id, headline, sort, text,
                       created_time AS created_time, created_by, updated_time AS updated_time, updated_by
                     FROM section
                     WHERE page_id=".$page_id;

        // er $_GET['artikle_id'] satt og er tall så vises kun den valgte saken, hvis ikke så vis normal liste med saker 
        // denne sjekken kan sikkert gjøres mer robust...              
        if (isset($_GET['artikle_id']) AND is_numeric($_GET['artikle_id']))
        {
           $art_id=mysql_real_escape_string($_GET['artikle_id']);
           $sql_section.=" AND id=".$art_id; // order by er ikke nødvendig, er kun er rad som blir returnet
        }
        else
          $sql_section.="\nORDER BY ".($page_id!=1?"sort, headline, ":"")."updated_time DESC, created_time DESC
                         LIMIT $start, $limit";

// debugging, ta vekk kommentar for å skrive ut/se SELECT'en
//echo nl2br($sql_section);

Endret av Crowly
Lenke til kommentar
  • 2 uker senere...

Da var jeg plutselig hjemme igjen.

 

Tror du bør droppe hele tankegangen om hvilken siden artikkelen ligger på, dette blir bare masse ekstra logikk/kode. Hvorfor ikke gjøre det så enkelt som at les mer linken sender deg til en side hvor kun den valgte saken blir vist?

Det er vel lettest å forklare ved å vise det. Her er en link til direkte til en artikkel i "ingressmodus": http://www.truemetal.org/cirithungol/page.php?page_id=1#403. Den bruker bare <a name> til å gå rett til artikkelen. Jeg har ikke "les mer", men jeg har "Comments" som blir det tilsvarende. Det kan du se når du klikker du på Comments nederst i artikkelen. Når du ser en artikkel i "full modus", dvs inkludert kommentarer, blir alle andre artikklene på samme side minimert. Det vil du se ved at de alle de andre 14 artikklene på samme side nå går fra ingressmodus til å bare bli en link. Det at du slipper å trykke tilbake i nettleseren, men kan gå rett til en annen artikkel når du er i fullmodus, er noe jeg foretrekker å ha. Synes det er en fordel å kunne klikke seg videre istedetfor å gi inntrykk av at man har kommet til sidens endestasjon når man har klikket seg inn på en artikkel.

 

 

Her er koden, en del forenklet:

//pagineringskoden er her oppe, regner bl.a. ut $start.
$limit=15;


//Hent alle sections i page
SELECT id, headline, etc FROM artikkel ... LIMIT $start, $limit;

while(row_artikkel)
{
if(isset($_GET["lukket"]))
{
	if(row[artikkel_id]==GET[artikkel_id])
	{
		//Viser artikkelen i full ("les mer")-modus. Skjer når du klikker Comments-linken/ikonet til artikkelen.
	}
	else
	{
		//viser artikkelen, dvs de resterende 14 artikklene minimert, altså kun som en link.		
	}
}
else
{
	//_GET["lukket"] er ikke satt, dvs ingen artikkel skal vises i full modus. Alle artikkler vises i ingressmodus. Dette er standard.
}
}

Endret av MikkelRev
Lenke til kommentar
Den bruker bare <a name> til å gå rett til artikkelen.

Som krever at artikkelen vises på siden, noe som ikke er gitt, og kjernen av problemet ditt.

 

Det vil du se ved at de alle de andre 14 artikklene på samme side nå går fra ingressmodus til å bare bli en link. Det at du slipper å trykke tilbake i nettleseren, men kan gå rett til en annen artikkel når du er i fullmodus, er noe jeg foretrekker å ha. Synes det er en fordel å kunne klikke seg videre istedetfor å gi inntrykk av at man har kommet til sidens endestasjon når man har klikket seg inn på en artikkel.

Du kan f. eks gjøre det slik at når man velger en artikkel så vises den på toppen av siden, og så vises alle de andre i lukket modus under. Da kan man gå rett til artikkelen og du beholder din preferanse.

 

$sql1=sprintf("SELECT * FROM tabell WHERE artikkel_id=%d",$_GET['art_id']);

// vis valgt artikkel

$sql2=sprintf("SELECT * from tabell WHERE artikkel_id!=%d ORDER BY ... LIMIT %d, %d",$_GET['art_id'],$start,$limit);

// vis resten

 

Enten så må du endre litt på designet (under panseret), eller du må lagre og oppdatere hvilken side hver artikkel ligger på, eller beregne dette før visning av siden. Noe jeg anser som en dårlig (spesielt med tanke på at brukere kan lage bokmerker på artikklene)/unødvendig løsning.

Endret av Crowly
Lenke til kommentar
  • 2 uker senere...

Du kan f. eks gjøre det slik at når man velger en artikkel så vises den på toppen av siden, og så vises alle de andre i lukket modus under. Da kan man gå rett til artikkelen og du beholder din preferanse.

Holder på å gjøre det på denne måten. Takk for forslaget!
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...