webForumDet fria alternativet

dela upp text i ett pm-fält till paging...

ASP

10 svar · 672 visningar · startad av Method

Medlem sedan apr. 2001357 inlägg
Frågan#1

Hej,

I ett pm-fält sparar jag en textmassa som presenteras på en sida men textmassan kan ibland vara väldigt stor så jag vill dela upp den i ett pagingscript för att man ska slippa att scrolla på sidan.

då har jag tänkt och använda mig av följande metod

För att lösa detta så har du redan bestämt förutsättningen. 
Du visar en del av ett dokument. 
När du hämtar ut en blob (i detta fall ett memofält) så vet 
du längden på hela textmassan. Den är: 

Length = Len(MinBlob)

Säg att den är 42800 tecken lång. Du har även bestäm att 
10.000 tecken skall visas åt gången och då kan du också få 
reda på hur många virtuella sidor det kan tänkas bli. 

Pages = Length/10000

Är det 42000 tecken så kommer det bli 4,2. För att få till ett 
heltal så får du använda int-kommandot så det blir 5, 
eftersom det skall vara mer än 4. 

Pages = Int(Length/10000)

 
Nu har du kommit så långt att du faktiskt kan bestämma 
vilken sektion du vill visa. Som du säkert vet så används 
MID-funktionen för att läsa ett bestämt antal tecken. 
Vill du har från 10001-20000 så skriver du: 

ThisPage = Mid(MinBlob, 10001, 10000)

Men du vill istället skicka in en sidangivelse och då får vi ta 
reda på vad sida 1,2,3,4 och 5 är. Dvs: 

Page = 1
StartPos = Page * 10000

Om page är 1 så börjar den läsa på 10.000 så därför 
bör du även använda Page 0 som den absolut första 
sidan eftersom 0 * 10000 är 0. 

Så om du nu i din url råkar skicka med test.asp?page=2 
så kanske du kan börja med något i stil med: 

MyPage = Request.QueryString("page")
If MyPage = "" Then MyPage = 0

Set Rst = Con.Execute("Hämta fältet jag skall använda")

If Not Rst.Eof Then
    MyBlob = Rst("MyPage")
    MaxPages = Int(Len(MyBlob)/10000)
End If

Rst.Close

If MaxPages > 0 and len(MyBlob) > 0 Then

   If MyPage <= MaxPages Then
      Pagestart = MyPage * 10000
      CurrentPage = Mid(MyBlob, PageStart, 10000)
   Else
      ' finns inte så många sidor som du angett
   End If
Else
   ' vi har tyvärr inga sidor att visa
End If

Response.Write CurrentPage

Men jag ser en begränsning i att använda denna och det
är att brytningen kan ske mitt i ett ord eller mening om
man bryter efter x antal tecken. kan man bryta efter ett
visst anatal tecken och sen köra på till närmaste punkt
efter det och sen göra brytningen.

Eller har ni någon annan bra metod på hur man skall göra detta?

En annan fråga om man vill dela upp en textmassa i kolumner istället hur gör man då?

Tack för alla tips

Mvh

Jonas

Medlem sedan juli 20003 825 inlägg
#2

om du vill ha det riktigt, riktigt snyggt så kan en variant vara att redan då du skriver in texten dela upp den på olika sidor.

Jag tänker, två tabeller

[text]
ID
name

[subText]
ID
textID
text

Du kopplar alltså flera stycken till samma text (rubrik) så att säga.

***
En annan variant kan vara att leta efter 10.000 tecken, sen backar till två radbrytningar. Då bryts texten mellan två stycken. Det kan vara en variant.

Sen ska du kolla hur mycket text som verkligen ryms på din sida, i just din situation. Det är avsevärt mycket mindre än 10.000 tecken...!!

Det finns för och nackdelar med allt.

Om du lägger in texten manuellt, som jag beskrev ovan, så vet du att det blir snyggt. Annars får du förlita dig på datorn, och det kan bli snyggt... men man vet inte.

En tredje variant kan vara att klippa in en specialare då du vill att det ska byta sida.

[***] <---- specialare
[brytning] <-----specialare

Sök efter denna specialare och bryt sidan där, helt enkelt. Då kan du själv bestämma. Det är kanske bättre att dela upp en lite längre text på två sidor, än att det bara står tre meningar på sista sidan. Som exempel.

***
Jag är lite osäker på hur jag hade gjort. Kanske en kombination. Både räkna tecken, leta efter dubbla vbCRLF , och leta efter specialare... för att få den mest flexibla lösningen.

Medlem sedan apr. 2001357 inlägg
#3

Det är ju helt klart en variant, som du säger så är problemet att man inte vet hur snyggt det blir då textmassorna kan vara olika stora så därför har jag funderat på en "specialare" så att användaren som matar in texten kan justera så det ser bra ut men det finns alltid en risk att det ser illa ut om användaren inte "fixar" till så det ser bra ut, får fundera lite till...

Men helt klart bra tips =) tackar

Om det är några andra som har förslag på hur man kan lösa det skriv gärna ner dom, man kanske får använda flera metoder för att få till det.

Jag ska nämligen ha minst två olika presentationsmallar av textmassorna...

Mvh

Jonas

Medlem sedan juli 20003 825 inlägg
#4

OK, det är inte du som skriver in texten!? Då får man ha det i åtanke också.

Intressant uppgift!!

Det beror på vilken målgrupp det är. Folk kan vara rätt slöa... inte säkert de orkar dela upp texten. Även om dom vet hur man gör- Så... liksom, dom skiter i det (med full respekt för ditt projekt).

Jag har varierande erfarenheter.

Dock är dator mognaden rätt stor ute i stugor och i lyor.

Jag har ett liknande projekt som faktiskt skulle må bra av om inte all text står på samma sida! :-)

Ska klura lite...!!

***
En fjärde eller femte variant kan vara att de som skriver texten, skriver i ETT fält, sen kan du gå in och redigera i efterhand.

Typ "Convert this text" och då delar texten automatisk upp sig på det sättet du vill i din admin-gränssnitt.

Du som vet hur allt ska vara behöver inte bry dig så mycket om att det ska passa andra. Sen kan du finlira den stora textmassan i efterhand. (Denna kan du sen göra publicerbar för respektive användare. Bara att du tar bort "originalet", ersätter med denna nya omgjorda. Texten är ju fortfarande "deras" så att säga. Omarbetad och anpassad till hemsidan.)

Bara se till att dom inte känner sig övervakade eller censurerade. Då kan det hända att de inte skriver fler texter och det vore en dum grej!

Medlem sedan apr. 2001357 inlägg
#5

Det låter toppen ;) jag funderar lite själv men om man skall ha 2 mallar eller fler är det då bäst att spara vilken presentationsmall dom ska ha i databasen eller?

Mvh

Jonas

Medlem sedan apr. 2001357 inlägg
#6

Hej igen, har funderat lite och kommit fram till att användaren som matar in texten får lägga in bryt-taggar i texten, det är bara ett fåtal som gör inmatningen av texter i databasen.

jag tänkte göra detta med en split för texten kommer delas upp i tre kolumner. Finns det några nackdelar med att använda split istället för regexp?

Mvh

Medlem sedan nov. 20014 054 inlägg
#7

Annars kan man ju faktiskt räkna antalet ord, och säga att det får max finnas 800 ord per sida till exempel.

Eller lägga in som tidigare sakt taggar som specificerar när texten skall delas.

Medlem sedan apr. 2001357 inlägg
#8

jo det är sant, men det ska delas upp i 3 kolumner och då blir det lite krångligare, då vill man ju fördela ut det jämnt i de tre kolumnerna och då blir det genast mer programering.

Så jag tänkte göra det lite enklare ;) för mig själv :P

Medlem sedan nov. 20014 054 inlägg
#9

Method skrev:

jo det är sant, men det ska delas upp i 3 kolumner och då blir det lite krångligare, då vill man ju fördela ut det jämnt i de tre kolumnerna och då blir det genast mer programering.

Så jag tänkte göra det lite enklare ;) för mig själv :P

Ja, man skall ju inte göra det onödigt svårt! :)

Medlem sedan apr. 2001357 inlägg
#10

Jag får fundera om, får inte split att fungera då jag har en regexp funktion som ska byta ut bbcode.

Men jag vill inte klamra stora textmassor med t ex [BRYT][/BRYT] utan vill bara lägga en [BRYT] och all text innan det skall läggas in i $1 och sen ska nästa [BRYT] nläggas i $2 osv så ska man gärna kunna räkna hur många träffar man gör på [BRYT] (hoppas ni fattar vad jag menar)

Tyvärr har jag dålig koll på regexp... :(

så här ser funktionen ut:

Function ReplaceTags(strPattern, strReplace, strText)
  Dim objRX
  set objRX = New RegExp
  objRX.IgnoreCase = True
  objRX.Global = True
  objRX.Pattern = strPattern
  ReplaceTags = objRX.Replace(strText, strReplace)
End Function

Tack på förhand

Medlem sedan apr. 2001357 inlägg
#11

Jag har skrivit ihop en lite kodsnutt som funkar sådär, den letar upp första [bryt]-taggen och formaterar det som tänkt men sen skiter det sig på de andra [bryt]-taggarna som är inlaggda i texten.

vill att den ska göra följande...

Oformaterad text:

en massa text [BRYT] det fortsätter en massa text [BRYT] sen kommer det ännu mera.

Formaterat resultat:

<td align=""left"" valign=""top"">en massa text </td>
<td align=""left"" valign=""top"">det fortsätter en massa text </td>
<td align=""left"" valign=""top"">sen kommer det ännu mera.</td>

Har någon lust att ge mig tips på hur jag får till det?

så här ser funktionen ut:

strText = ReplaceTags("(.*?)\[BRYT\]", "<td align=""left"" valign=""top"">$1</td>", strText)

Tack på förhand

267 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
129 ms — ändringar (db)