14. september 2005 - 16:00Der er
55 kommentarer og 1 løsning
Hjælp til paging
Hej Eksperter
Jeg er i gang med at lave et design hvor teksten ikke har så meget plads.
Det jeg gerne vil have en af jer til at hjælpe med, er at paging, så når der ikke er mere plads på siden, så laver scriptet selv flere sider… Jeg har set flere eksempler på paging, men ikke lige nogen, hvor man deler tekst op.
Jeg håber at der er en af jer der vil hjælpe mig med at sætte paging ind på denne side:
Hvad mener du med "ikke er mere plads på siden"? Der er jo temmeligt meget plads på en HTML-side.
Hvis du mener at hver HTML-side skal kunne udskrives på en enkelt A4-side, så er opgaven temmelig svær, for ikke at sige umulig. Dette afhænger nemlig bl.a. af opsætningen på den printer som brugeren har (og denne oplysning er jo ikke tilgængelig hos serveren hvor ASP-scriptet køre), samt af den skriftstørrelse brugeren benytter i sin browser. Selv hvis det kunne lade sig gøre så ville det endda også være nogle meget tunge peregninger som ville sænke load-tiden på din side.
Hvis du i stedet blot ønsker at der skal vises f.eks. 20 poster pr. side, så kan det sagtens lade sig gøre.
Nielle > Hvis du klikker på linket, og ser siden, vil de kunne se hvad jeg taler om, grunden til at teksten kan fylde formeget, skyldes at tabellen teksten str i ikke er ret stor..
misimo > Jeg har kigget på scriptet som Knappen har lavet, men det flere links han trægger ud af en database, jeg trækker kun et felt ud, men et felt med for meget tekst til kun at kunne fylde en side...
Jeg skylder også at sige at jeg gerne vil undgå scroll
Hvis I selv sørger for at indsætte <br>-tags på en sådan måde at der gælder at:
1 <br>-tag = 1 linje
- altså sådan forstået at der ikke kommer andre linjeskift ind i teksten, f.eks. pga. at linjerne bliver for lange, så er det ikke helt umuligt at lave en løsning. Det bliver nok ikke nogen 100% fejlfri løsning, men det vil sikkert virker ok i langt de fleste tilfælde.
Løsningen består i at:
1) Trække teksten ud af databasen. 2) Splitte teksen op ved <br>-tags. Dette gøres ved brug af Split-funktionen. 3) Derefter har du teksten i et array – en arraypost pr. tekstlinje. 4) Du skal have defineret en konstant, som angiver hvor mange linjer der kan være på en side; Hvis antallet af poster i arrayet fra 3 overstiger denne konstant, så skal der m.a.o. pages. 5) Denne del burde være rimelig nem at implementere på stort set samme måde som når man laver paging på posterne fra en database – der laves bare paging over et array i stedet for et recordset.
Men hvis jeg ikke bruger <br> tags i databasen, kan man så lave et script, som opdeler teksten i flere sider, ekx. ved at bestemme hvormange linier der maksimalt må være på siden, eller evt. antal tegn...?
Problemet er at du så skal til selv at beregne dig frem til hvor at der bliver indsat linjeskift.
Dette afhænger af skriftstørrelse, de enkelte bogstaver i ordene (”iii” fylder meget mindre end ”www”), og hvor at der er mellemrum i ordene. Desuden skal der tages højde for at nogle ord måske er for brede til at kunne være på en enkelt linje. Alt dette bliver pludseligt til nogle meget besværlige beregninger, og det bliver et rent helvede hvis du så senere ønsker at skifte til en anden skrifttype eller størrelse.
Ved selv at indsætte <br>-tags der hvor der skal skiftes linje, spare du dig alt dette besvær.
Et relateret spørgsmål: Kan du risikere at der skal indgå billeder eller anden grafik midt i din tekst?
Problemet er ikke at bestemme sig til hvor mange linjer der må være pr. side - det er sådan set bare at tælle op og så se hvornår det bliver for mange.
Nej, problemet består i at beregne sig til hvor mange linjer en given blok af tekst vil strække sig over.
Hvor meget er du selv i stand til at kode? Jeg vil meget gerne hjælpe dig rigtig meget, men jeg vil altså ikke kode det alt sammen for dig. Det er hjælp til selvhjælp.
Som sagt ville det være meget simpelt at løse problemet, hvis I selv kunne indsætte <br>-tags der hvor der skulle være linjeskift. Men det er altså en noget større opgave, hvis scriptet selv skal regne sig frem til det. Foruden at programmerings-opgaven altså bliver noget mere omfattende, så har det også den uheldige konsekvens at din side bliver tungere at loade og at serveren bliver langt mere belastet. Jeg synes at det er værd at overveje om det er det værd.
Når du har <br>-tags i din tekst-streng, kan du bruge Split() til at lave et array. Og har du først et array så er det blot at lave Paging på dette. Dette kunne f.eks. gøres over denne skabelon:
<% Tekst = "Den italienske familievirksomhed Leucos blev grundlagt i 1962<br>og har dermed over 40 års erfaring med produktion af belys-<br>ningsprodukter af
meget høj kvalitet.<br><br>Leucos bygger på den århundredgamle, venetianske glasmager-<br>tradition, som har sin oprindelse på øen Murano.<br><br>Lamperne
fra Leucos er designet af Italiens førende arkitekter,<br>Jorge Pensi, Matteo Thun, Renato Toso m.fl.,<br><br>Alle glasskærme er fremstillet i 4 lag
mundblæst glas: ét lag med<br>glassets farve, ét lag opalglas for optimal refleksion af lyset inden<br>i skærmen og til sidst det yderste lag på begge sider,
det klarer<br>krystalglas, der sikre at de flotte farver bevares i uendelig tid.<br><br>Hvis du søger variation i design og typer af belysning, så
er<br>Leucos et godt sted at begynde.<br><br>Hos Leucos går nutidigt design hånd i hånd med den højeste<br>kvalitet i materialer og håndværksmæssig
udførelse, så hver<br>enkelt lampe er et uforligneligt kunstværk."
Dim TekstArr TekstArr = Split(Tekst, "<br>")
' Paging
LinjerPrSide = 8
Offset = Request.QueryString("Offset") If Offset = "" Then Offset = 0 Else Offset = CInt(Offset)
FlereSider = False LinjeNr = 0 For Idx=0 To UBound(TekstArr) LinjeNr = LinjeNr+1
If LinjeNr > Offset+LinjerPrSide Then FlereSider = True Exit For End If
If LinjeNr > Offset Then Response.Write LinjeNr & ": " & TekstArr(Idx) & "<br>" End If Next
If Offset > 0 Then Response.Write "<a href='?Offset=" & Offset-LinjerPrSide & "'>Forrige side</a>" End If
If FlereSider Then Response.Write "<a href='?Offset=" & Offset+LinjerPrSide & "'>Næste side</a>" Else Response.Write "DEBUG: " & LinjeNr & " " & UBound(TekstArr)+1 End If %>
Det ser super ud, jeg sidder lige og prøver at finde hoved og hale i hvor jeg skal sætte de forskellige ting ind, i forhold til det kodning jeg har lavet. (Se spørgsmålet)
Jeg har med vilje lavet det ovenstående script så simpelt som muligt - der er f.eks. ikke noget database indblandet. Pointen er at vi helst lige skal have selve pagingen på plads før at vi pakker det ind i resten af løsningen.
Teksten er i eksemplet hårdkodet ind i scriptet. Den skal selvfølgelig hentes fra databasen. Det kunne se nogenlunde sådan her ud:
<% Set Query = Conn.Execute("SELECT * FROM undersider WHERE emne = '" & emne & "'")
If Not Query.EOF Then Tekst = Query("indhold")
' Her kommer så resten af paging-scriptet. End If %>
Offset = Request.QueryString("Offset") If Offset = "" Then Offset = 0 Else Offset = CInt(Offset)
FlereSider = False LinjeNr = 0 For Idx=0 To UBound(TekstArr) LinjeNr = LinjeNr+1
If LinjeNr > Offset+LinjerPrSide Then FlereSider = True Exit For End If
If LinjeNr > Offset Then Response.Write LinjeNr & ": " & TekstArr(Idx) & "<br>" End If Next If Offset > 0 Then Response.Write "<a href='?emne=" & emne & "&bill=" & bill & "&Offset=" & Offset-LinjerPrSide & "'>Forrige side</a>" End If
If FlereSider Then Response.Write "<a href='?emne=" & emne & "&bill=" & bill & "&Offset=" & Offset+LinjerPrSide & "'>Næste side</a>" End If %></h2> </td> </tr> <tr> <td width="33%" HEIGHT="10" align="left"><<-- Tilbage</td> <td width="33%" HEIGHT="10" align="center">1 2 3 4</td> <td width="34%" HEIGHT="10" align="right">Frem -->></td> </tr> </table>
Tekst = Query("indhold") Dim TekstArr TekstArr = Split(Tekst, "<br>")
LinjerPrSide = 8
Offset = Request.QueryString("Offset") If Offset = "" Then Offset = 0 Else Offset = CInt(Offset)
FlereSider = False LinjeNr = 0 For Idx=0 To UBound(TekstArr) LinjeNr = LinjeNr+1
If LinjeNr > Offset+LinjerPrSide Then FlereSider = True Exit For End If
If LinjeNr > Offset Then Response.Write LinjeNr & ": " & TekstArr(Idx) & "<br>" End If Next If Offset > 0 Then Response.Write "<a href='?emne=" & emne & "&bill=" & bill & "&Offset=" & Offset-LinjerPrSide & "'>Forrige side</a>" End If
If FlereSider Then Response.Write "<a href='?emne=" & emne & "&bill=" & bill & "&Offset=" & Offset+LinjerPrSide & "'>Næste side</a>" End If %></h2> </td> </tr> <tr> <td width="33%" HEIGHT="10" align="left"><<-- Tilbage</td> <td width="33%" HEIGHT="10" align="center">1 2 3 4</td> <td width="34%" HEIGHT="10" align="right">Frem -->></td> </tr> </table>
<% emne = Request.QueryString("emne") bill = Request.QueryString("bill")
Set Query = Conn.Execute("SELECT * FROM undersider WHERE emne = '" & emne & "'") If Not Query.EOF Then %> <table WIDTH="350" HEIGHT="100%" cellspacing="0" cellpadding="0" border="0"> <tr valign="top"> <td id="auto"> <div style="OVERFLOW: auto; HEIGHT: 100%"> <table WIDTH="350" HEIGHT="100%" cellspacing="0" cellpadding="0" border="0" valign="top"> <tr valign="top"> <td width="66%" HEIGHT="30" colspan="2" valign="center"> <h1><% =Query("overskrift") %></h1> </td> <td width="34%" HEIGHT="30" align="right" valign="center"> <a href="java script:history.back(-1)">Tilbage</a> </td> </tr> <tr> <td width="100%" colspan="3"> <h2> <% Tekst = Query("indhold") Dim TekstArr TekstArr = Split(Tekst, "<br>")
LinjerPrSide = 8
Offset = Request.QueryString("Offset") If Offset = "" Then Offset = 0 Else Offset = CInt(Offset)
FlereSider = False LinjeNr = 0 For Idx=0 To UBound(TekstArr) LinjeNr = LinjeNr+1
If LinjeNr > Offset+LinjerPrSide Then FlereSider = True Exit For End If
If LinjeNr > Offset Then Response.Write LinjeNr & ": " & TekstArr(Idx) & "<br>" End If Next
If Offset > 0 Then Response.Write "<a href='?emne=" & emne & "&bill=" & bill & "&Offset=" & Offset-LinjerPrSide & "'>Forrige side</a>" End If
If FlereSider Then Response.Write "<a href='?emne=" & emne & "&bill=" & bill & "&Offset=" & Offset+LinjerPrSide & "'>Næste side</a>" End If %> </h2> </td> </tr> </table> </div> </td> </tr> </table> <% End If %>
Offset = Request.QueryString("Offset") If Offset = "" Then Offset = 0 Else Offset = CInt(Offset)
FlereSider = False LinjeNr = 0 For Idx=0 To UBound(TekstArr) LinjeNr = LinjeNr+1
If LinjeNr > Offset+LinjerPrSide Then FlereSider = True Exit For End If
If LinjeNr > Offset Then Response.Write LinjeNr & ": " & TekstArr(Idx) & "<br>" End If Next
If Offset > 0 Then Response.Write "<a href='?emne=" & emne & "&bill=" & bill & "&Offset=" & Offset-LinjerPrSide & "'>Forrige side</a>" End If
If FlereSider Then Response.Write "<a href='?emne=" & emne & "&bill=" & bill & "&Offset=" & Offset+LinjerPrSide & "'>Næste side</a>" End If %> </h2> </td> </tr> </table> </div> </td> </tr> </table> <% End If %>
Offset = Request.QueryString("Offset") If Offset = "" Then Offset = 0 Else Offset = CInt(Offset)
FlereSider = False LinjeNr = 0 For Idx = 0 To UBound(TekstArr) LinjeNr = LinjeNr+1
If LinjeNr > Offset+LinjerPrSide Then FlereSider = True Exit For End If
If LinjeNr > Offset Then Response.Write LinjeNr & ": " & TekstArr(Idx) & "<br>" End If Next
If Offset > 0 Then Response.Write "<a href='?emne=" & emne & "&bill=" & bill & "&Offset=" & Offset-LinjerPrSide & "'>Forrige side</a>" End If
If FlereSider Then Response.Write "<a href='?emne=" & emne & "&bill=" & bill & "&Offset=" & Offset+LinjerPrSide & "'>Næste side</a>" End If %> </h2> </td> </tr> </table> </div> </td> </tr> </table> <% End If %>
Meget mystisk... for jeg kan tage den kode og kopiere den råt ind i min egen test, hvor den så fungere ved blot at ændre linjen:
Tekst = Query("indhold")
- til at tage teksten fra en streng i stedet for en database.
En mulighed er at du har et ulovligt tegn et eller andet sted - et tegn som ligner et almindelig whitespace og derfor effektivt er usynligt. Du kan prøve at fjerne alle indrykningerne og så se om skriptet pludselig kan køre.
Hvis dette ikke hjælper, er det tid til noget seriøs debugging-kode! Prøv f.eks. med dette sådan at man kan se hvor langt scriptet når før fejlen opstår:
<% Response.Write "DEBUG #1<br>"
Tekst = Query("indhold")
Response.Write "DEBUG #2<br>"
TekstArr = Split(Tekst, "<br>")
Response.Write "DEBUG #3<br>"
LinjerPrSide = 8
Response.Write "DEBUG #4<br>"
Offset = Request.QueryString("Offset")
Response.Write "DEBUG #5<br>"
If Offset = "" Then Offset = 0 Else Offset = CInt(Offset)
Response.Write "DEBUG #6<br>"
FlereSider = False LinjeNr = 0
Response.Write "DEBUG #7<br>"
For Idx = 0 To UBound(TekstArr) Response.Write "DEBUG #8<br>"
LinjeNr = LinjeNr+1
Response.Write "DEBUG #9<br>"
If LinjeNr > Offset+LinjerPrSide Then Response.Write "DEBUG #10<br>"
FlereSider = True Exit For
Response.Write "DEBUG #11<br>" End If
Response.Write "DEBUG #12<br>"
If LinjeNr > Offset Then Response.Write LinjeNr & ": " & TekstArr(Idx) & "<br>" End If
Response.Write "DEBUG #13<br>" Next
Response.Write "DEBUG #14<br>"
If Offset > 0 Then Response.Write "<a href='?emne=" & emne & "&bill=" & bill & "&Offset=" & Offset-LinjerPrSide & "'>Forrige side</a>" End If
Response.Write "DEBUG #15<br>"
If FlereSider Then Response.Write "<a href='?emne=" & emne & "&bill=" & bill & "&Offset=" & Offset+LinjerPrSide & "'>Næste side</a>" End If
Offset = Request.QueryString("Offset") If Offset = "" Then Offset = 0 Else Offset = CInt(Offset)
FlereSider = False LinjeNr = 0 For Idx = 0 To UBound(TekstArr) LinjeNr = LinjeNr+1
If LinjeNr > Offset+LinjerPrSide Then FlereSider = True Exit For End If
If LinjeNr > Offset Then Response.Write LinjeNr & ": " & TekstArr(Idx) & "<br>" End If Next
If Offset > 0 Then Response.Write "<a href='?emne=" & emne & "&bill=" & bill & "&Offset=" & Offset-LinjerPrSide & "'>Forrige side</a>" End If
If FlereSider Then Response.Write "<a href='?emne=" & emne & "&bill=" & bill & "&Offset=" & Offset+LinjerPrSide & "'>Næste side</a>" End If %> </h2> </td> </tr> </table> </div> </td> </tr> </table> <% End If %>
Jeg så lige i 29/09-2005 20:08:17 at du Dim'er UBound. Det skal du ikke... UBound er en funktion som eksistere i forvejen og ved at Dim'e den erstatter du denne funktion med en variabel - hvilket gør at funktionen så ikke kan bruges mere.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.