Avatar billede chrisjon Nybegynder
16. oktober 2005 - 16:37 Der er 6 kommentarer

FSO - Paging og Skrive indlæg i toppen af txt i min tagwall

Okay lidt længere titel der, men jeg har efterhånden fået lavet min nr 2 tagwall færdig.
Jeg mangler bare at finde ud af hvordan jeg kan liste indlæg lavet i tagwallen så de kommer øverst på min side istedet for at de kommer i bunden.
Desuden skal jeg også have lavet noget paging, så at den deler op efter hvert 10 indlæg eller ligende.

Her er min kode
-------------
Tagwall.asp
-------------

<% Session.LCID=3079 %>
<h1>Gæstebog</h1>
<hr>

<table cellspacing="0" cellpadding="0" class="tagtable">


<%
dim tagfile, tagfilsys, navn, dato, hp, email, tagtekst
set tagfilsys = createobject("scripting.filesystemobject")
set tagfile = _
tagfilsys.opentextfile(Server.MapPath("indhold/tagwall.txt"), 1)


do while not tagfile.atendofstream

navn = tagfile.readline
dato = tagfile.readline
hp = tagfile.readline
email = tagfile.readline
tagtekst = tagfile.readline
tagtekst = Server.HTMLEncode(tagtekst)
navn = Server.HTMLEncode(navn)
dato = Server.HTMLEncode(dato)
hp = Server.HTMLEncode(hp)
email = Server.HTMLEncode(email)


response.write "<tr>"
response.write "<td class='tagnavn'><a href='mailto:" & email &"'>" & navn & "</a>"
response.write "</td>"
response.write "<td class='tagdato'><p>" & dato & "</p>"
response.write "</td>"
response.write "</tr>"
response.write "<tr>"
response.write "<td class='tagtekst' colspan='2' valign='top'><p>" & tagtekst & "</p>"
response.write "</td>"
response.write "</tr>"
response.write "<tr>"
response.write "<td class='taglink' colspan='2'><a href='" & hp & "' target='_blank' title='" & hp & "'>www</a><br>"
response.write "<br></td>"
response.write "</tr>"

loop
tagfile.close
%>


</table>

<br>
<form action="index.asp?indhold=tagit" method="post">
<input type="hidden" Name="Mode" Value="opret">
<table cellspacing="1" cellpadding="0" class="tag_form">
<tr>
<td class="tag_td1" align="left"><p class="p1">Name:</p></td>
<td class="tag_td2" align="right"><input class="tag_cell" type="text" name="navn" value="Dit Navn Her"></td>
</tr>
<tr>
<td class="tag_td1" align="left"><p class="p1">Email:</p></td>
<td class="tag_td2" align="right"><input class="tag_cell" type="text" name="email" value="Din Email Her"></td>
</tr>
<tr>
<td class="tag_td1" align="left"><p class="p1">www:</p></td>
<td class="tag_td2" align="right"><input class="tag_cell" type="text" name="hp" value="http://www"></td>
</tr>
<tr>
<td class="tag_td1" align="left" valign="top"><p class="p1">Text:</p></td>
<td class="tag_td2" align="right"><input class="tag_cell2" type="text" name="tagtekst" value="Og teksten her"></td>
</tr>
<tr>
<td class="tag_cell5" align="center" colspan="2"><br><input class="tag_cell2" type="hidden" name="dato" value="<%  = now  %>"><input class="tagsubmit" type="reset" name="reset" value="Slet"> <input class="tagsubmit" type="submit" name="submit" value="Tag"></td>
</tr>
</table>
</form>
<br>

------------
tag.asp
------------
<%
if request ("mode") = "opret" then

navn_form = Trim(Request.Form("navn"))
dato_form = Trim(Request.Form("dato"))
hp_form = Trim(Request.Form("hp"))
email_form = Trim(Request.Form("email"))
tagtekst_form = Trim(Request.Form("tagtekst"))

If len(tagtekst_form) > 300 Then
Response.Write "<p>Din besked er for lang!,<br><a href='java script:history.back(1)'>Tilbage</a></p>"
ElseIf navn_form = "" Then
Response.Write "<p>Du mangler at skrive dit navn,<br><a href='java script:history.back(1)'>Tilbage</a></p>"
ElseIf tagtekst_form = "" Then
Response.Write "<p>Du mangler at skrive en besked,<br><a href='java script:history.back(1)'>Tilbage</a></p>"
ElseIf hp_form = "" Then
Response.Write "<p>Du mangler at skrive din url,<br><a href='java script:history.back(1)'>Tilbage</a></p>"
ElseIf email_form = "" Then
Response.Write "<p>Du mangler at skrive din email,<br><a href='java script:history.back(1)'>Tilbage</a></p>"
Else

dim fs, wtfile
Set fs = CreateObject("Scripting.FileSystemObject")
Set wtfile = fs.opentextfile(Server.MapPath("indhold/tagwall.txt"), 8)
wtfile.Writeline navn_form
wtfile.Writeline dato_form
wtfile.Writeline hp_form
wtfile.Writeline email_form
wtfile.Writeline tagtekst_form

wtfile.close
Set wtfile=nothing
Set fs=nothing

response.write "<div align='center'><p>Tak fordi du skrev i Gæstebogen, din besked er tilføjet</p><a href='index.asp?indhold=tagwall'>[Tilbage Til Gæstebogen]</div>"

end if
end if
%>
Avatar billede thomas_yde Nybegynder
17. oktober 2005 - 10:07 #1
Jeg vil umiddelbart tro det kræver mere arbejde at få den til at læse sidste først end det gør at implementere en access database eller mysql.

Men som en ide hvis du vil fortsætte med din nuværende løsning vil jeg nok lave et array med et array for hvert gæst der har skrevet.

Så kan du også lave en simpel paging med kun at læse 10 array indgange af gangen.
altså:
o_Arr(0) =  Array(navn,dato...,email)

Så kan du læse o_Arr baglæns.
Avatar billede chrisjon Nybegynder
17. oktober 2005 - 21:00 #2
uhm kan ikke lige helt følge dig der, jeg er lidt lost og sidder fast i det her, men det burde da være muligt på en relativt simpel måde at reverse det.
Avatar billede thesurfer Nybegynder
28. november 2006 - 16:43 #3
Umiddelbart ville jeg sige at du læser filen forkert.
Det er bedre at læse hele filen, end at læse 1 linie ad gangen..

Eksempel:

dim indhold, linie
set tagfile = tagfilsys.opentextfile(Server.MapPath("indhold/tagwall.txt"), 1)

indhold = tagfile.ReadAll

tagfile.close

linie = split(indhold, vbCrLf)

Derfor kan du bruge en løkke, som starter ved sidste index, og går mod første (dvs "reverse"):

dim i
for i = Ubound(linie) to LBound(linie)
' hent sidste værdi først:
  email = Server.HTMLEncode(email)
  hp = Server.HTMLEncode(hp)

' osv.. husk den omvendte rækkefølge..
next

Det kan godt være, at der skal "-1" efter Ubound(..) eller LBound(..).. husker det ikke..



Alternativt kan du jo bare indlæse hele filen, putte det nye indhold foran, og derefter udskrive det hele..

Eksempel:

dim indhold, linie
' Læs indholdet af tag-filen:
set tagfilsys = createobject("scripting.filesystemobject")
set tagfile = tagfilsys.opentextfile(Server.MapPath("indhold/tagwall.txt"), 1)

indhold = tagfile.ReadAll

tagfile.close

linie = split(indhold, vbCrLf)

Nyt indhold:

nyt = navn_form & vbCrLf & dato_form & vbCrLf & hp_form & vbCrLf & email_form & vbCrLf & tagtekst_form

indhold = nyt
for i = LBound(linie) to UBound(linie)
  indhold = indhold & nyt & vbCrLf
next

' fjern den sidste "ny linie" (vbCrLf):
indhold = left(indhold, len(indhold) - 2


' Skriv fil:
dim fs, wtfile
Set fs = CreateObject("Scripting.FileSystemObject")
Set wtfile = fs.opentextfile(Server.MapPath("indhold/tagwall.txt"), 8)
wtfile.Write indhold
wtfile.close
Set wtfile=nothing
Set fs=nothing
Avatar billede thesurfer Nybegynder
28. november 2006 - 16:45 #4
Rettelse:

Umiddelbart ville jeg sige at du læser filen forkert.
Det er bedre at læse hele filen, end at læse 1 linie ad gangen..

Eksempel:

dim indhold, linie
set tagfile = tagfilsys.opentextfile(Server.MapPath("indhold/tagwall.txt"), 1)

indhold = tagfile.ReadAll

tagfile.close

linie = split(indhold, vbCrLf)

Derfor kan du bruge en løkke, som starter ved sidste index, og går mod første (dvs "reverse"):

dim i
for i = Ubound(linie) to LBound(linie)
' hent sidste værdi først:
  email = Server.HTMLEncode(email)
  hp = Server.HTMLEncode(hp)

' osv.. husk den omvendte rækkefølge..
next

Det kan godt være, at der skal "-1" efter Ubound(..) eller LBound(..).. husker det ikke..



Alternativt kan du jo bare indlæse hele filen, putte det nye indhold foran, og derefter udskrive det hele..

Eksempel:

dim indhold, linie
' Læs indholdet af tag-filen:
set tagfilsys = createobject("scripting.filesystemobject")
set tagfile = tagfilsys.opentextfile(Server.MapPath("indhold/tagwall.txt"), 1)

indhold = tagfile.ReadAll

tagfile.close

linie = split(indhold, vbCrLf)

Nyt indhold:

nyt = navn_form & vbCrLf & dato_form & vbCrLf & hp_form & vbCrLf & email_form & vbCrLf & tagtekst_form

indhold = nyt
for i = LBound(linie) to UBound(linie)
  indhold = indhold & linie(i) & vbCrLf
next

' fjern den sidste "ny linie" (vbCrLf):
indhold = left(indhold, len(indhold) - 2 ' jeg mener at vbCrLf fylder 2 tegn ("Cr" og "Lf")


' Skriv fil:
dim fs, wtfile
Set fs = CreateObject("Scripting.FileSystemObject")
Set wtfile = fs.opentextfile(Server.MapPath("indhold/tagwall.txt"), 8)
wtfile.Write indhold
wtfile.close
Set wtfile=nothing
Set fs=nothing


Man kan også skrive wtfile.Write(indhold), men det skulle gerne give samme resultat..

Lige som med Response.Write "test" og Response.Write("test") ..
Avatar billede thesurfer Nybegynder
28. november 2006 - 16:54 #5
Ahh.. jeg fandt en fejl..

Da den læser 1 element ad gangen, skal det bare se sådan ud:

dim i
for i = Ubound(linie) to LBound(linie) step 5
' hent sidste værdi først:

  navn = linie(i - 4)
  dato = linie(i - 3)
  hp = linie(i -2)
  email = linie(i - 1)
  tagtekst = linie(i - 0)

' dette er tabel-output-området

' osv.. husk den omvendte rækkefølge..
next

Jeg har tilføjet "step 5", som håber 5 linier ad gangen, da den jo læser

Det kan godt være, at der er fejl i (i - x), da jeg ikke har testet det..
Avatar billede thesurfer Nybegynder
28. november 2006 - 17:00 #6
Men jeg vil tro, at det er nemmere at skrive filen i omvendt rækkefølge, så den nyeste post altid er øverst.

Jeg skal dog lige advare dig mod brug af txt filer som database..

Med en txt fil, skal du læse filen, og derefter skrive..

Dvs, filen vil bliver overskrevet, med mindre at du bruger "append" (jeg kan ikke huske om "8" er append)..

Det er klart bedre og nemmere at bruge en database, da du så ikke skal tænke på ligende ting, plus at du hurtigt og nemt kan sortere efter dato (og andre felter) stigende og faldende..

Eksempel:

Nyeste øverst: select * from gaestebog order by dato desc
Ældste øverst: select * from gaestebog order by dato asc

Den eneste forskel er "desc" og "asc".. meget nemt, ik? :-)

Læs evt disse lektioner (17-22 omhandler Access-databaser): http://www.html.dk/tutorials/asp/
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester