MikkelRev Skrevet 17. juni 2010 Del Skrevet 17. juni 2010 (endret) 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§ion_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§ion_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 17. juni 2010 av MikkelRev Lenke til kommentar
TheRealL Skrevet 18. juni 2010 Del Skrevet 18. juni 2010 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§ion_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§ion=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
Crowly Skrevet 19. juni 2010 Del Skrevet 19. juni 2010 (endret) 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 19. juni 2010 av Crowly Lenke til kommentar
MikkelRev Skrevet 19. juni 2010 Forfatter Del Skrevet 19. juni 2010 (endret) 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§ion_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 19. juni 2010 av MikkelRev Lenke til kommentar
Crowly Skrevet 20. juni 2010 Del Skrevet 20. juni 2010 Denne url'en linker til en bestemt artikkel: http://www.truemetal.org/cirithungol/page.php?page_id=1§ion_id=413&page=1&lukket=1#413 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
MikkelRev Skrevet 20. juni 2010 Forfatter Del Skrevet 20. juni 2010 (endret) 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§ion_id=384&page=1#384 Linker til "lesmermodus": page.php?page_id=1§ion_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 20. juni 2010 av MikkelRev Lenke til kommentar
Crowly Skrevet 20. juni 2010 Del Skrevet 20. juni 2010 (endret) 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 20. juni 2010 av Crowly Lenke til kommentar
MikkelRev Skrevet 28. juni 2010 Forfatter Del Skrevet 28. juni 2010 (endret) 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 28. juni 2010 av MikkelRev Lenke til kommentar
Crowly Skrevet 29. juni 2010 Del Skrevet 29. juni 2010 (endret) 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 29. juni 2010 av Crowly Lenke til kommentar
MikkelRev Skrevet 13. juli 2010 Forfatter Del Skrevet 13. juli 2010 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå