Avatar billede riishoj Nybegynder
14. oktober 2005 - 15:50 Der er 22 kommentarer og
1 løsning

Udskrive virtuel sti i stedet for fysisk sti

Jeg har en søgefunktion som som søgeresultat udskriver den absolutte fysiske sti. Jeg vil gerne have udskrevet den virtuelle sti i stedet. Kan det lade sig gøre? Det er vel noget med Replace, men da jeg ikke selv har lavet scriptet, så kan jeg ikke helt gennemskue det.

<%@ Language="VBScript" %>
<% Option Explicit %>
<html>
<head>
<title>ASP 101's Index Server Article - Advanced Search Page</title>
<meta name="description" content="ASP 101's Index Server Article - Advanced Search Page">
<meta name="keywords" content="ASP 101's Index Server Article - Advanced Search Page">
<meta name="author" content="John Peterson">
</head>
<body>

<p>
This is the advanced search page of the sample web content
for ASP 101's Index Server article.
</p>

<form action="advanced.asp" method="get">
    <input type="text" name="query" />
    <input type="submit" value="Search" />
</form>

<p>
<a href="../default.asp">Basic Search</a>
</p>

<p>
Queries that should return results include:
<a href="advanced.asp?query=admin">admin</a> (only in basic),
<a href="advanced.asp?query=asp">asp</a> (> 10),
<a href="advanced.asp?query=component">component</a>,
<a href="advanced.asp?query=cookie">cookie</a>,
<a href="advanced.asp?query=database">database</a>,
<a href="advanced.asp?query=date">date</a>,
<a href="advanced.asp?query=time">time</a>,
<a href="advanced.asp?query=email">email</a>,
<a href="advanced.asp?query=form">form</a>,
<a href="advanced.asp?query=search">search</a>,
etc.
</p>


<%
Dim strQuery  ' The text of our query
Dim objQuery  ' The index server query object
Dim rstResults ' A recordset of results returned from I.S.
Dim objField  ' Field object for loop

' Retreive the query from the querystring
strQuery = Request.QueryString("query")

' If the query isn't blank them proceed
If strQuery <> "" Then
    ' Create our index server object
    Set objQuery = Server.CreateObject("IXSSO.Query")

    ' Set it's properties
    With objQuery
        .Catalog    = "FPSE_search"  ' Catalog to query
        .MaxRecords = 10          ' Max # of records to return
        .SortBy    = "rank [d]"
        .Columns    = "filename, path, vpath, size, write, " _
            & "characterization, DocTitle, DocAuthor, " _
            & "DocKeywords, rank, hitcount"

        ' Build our Query: Hide admin page and FPSE pages
        strQuery = "(" & strQuery & ")" _
            & " AND NOT #filename = *admin*" _
            & " AND NOT #path *\_vti_*"

        ' Uncomment to only look for files modified last 5 days
        'strQuery = strQuery & " AND @write > -5d"

        .Query = strQuery  ' Query text
    End With

    ' To set more complex scopes we use the utility object.
    ' You can call AddScopeToQuery as many times as you need to.
    ' Shallow includes just files in that folder.  Deep includes
    ' subfolders as well.
    '
    Dim objUtility
    Set objUtility = Server.CreateObject("IXSSO.Util")
    objUtility.AddScopeToQuery objQuery, "C:\Inetpub\wwwroot\doc", "shallow"
    'objUtility.AddScopeToQuery objQuery, "c:\inetpub\wwwroot\indexserver\content", "shallow"
    Set objUtility = Nothing

    ' Get a recordset of our results back from Index Server
    Set rstResults = objQuery.CreateRecordset("nonsequential")

    ' Get rid of our Query object
    Set objQuery = Nothing

    ' Check for no records
    If rstResults.EOF Then
        Response.Write "Sorry. No results found."
    Else
        ' Print out # of results
        Response.Write "<p><strong>"
        Response.Write rstResults.RecordCount
        Response.Write "</strong> results found:</p>"

        ' Loop through results       
        Do While Not rstResults.EOF
            ' Loop through Fields
            ' Pretty is as pretty does... good enough:
            %>
            <p>
            <% If rstResults.Fields("doctitle") = "" Then %>
                <strong><a href="<%= PathToVpath(rstResults.Fields("path")) %>"><%= PathToVpath(rstResults.Fields("path")) %></a></strong><br />
            <% Else %>
                <strong><a href="<%= PathToVpath(rstResults.Fields("path")) %>"><%= rstResults.Fields("doctitle") %></a></strong><br />
            <% End If %>
            &nbsp;&nbsp;&nbsp;<em>Author:</em> <%= rstResults.Fields("docauthor") %><br />
            &nbsp;&nbsp;&nbsp;<em>Last Modified:</em> <%= rstResults.Fields("write") %><br />
            &nbsp;&nbsp;&nbsp;<em>Size:</em> <%= rstResults.Fields("size") %> bytes<br />
            &nbsp;&nbsp;&nbsp;<em>Keywords:</em> <%= rstResults.Fields("dockeywords") %><br />
            &nbsp;&nbsp;&nbsp;<em>Description:</em> <%= rstResults.Fields("characterization") %><br />
            </p>
            <hr />
            <%

            ' Move to next result
            rstResults.MoveNext
        Loop

        rstResults.MoveFirst
        Response.Write "<pre>"
        'Response.Write rstResults.GetString()
        Response.Write "</pre>"
    End If

    ' Kill our recordset object   
    Set rstResults = Nothing
End If
%>

</body>
</html>

<%
Function PathToVpath(strPath)
    Const strWebRoot = "c:\inetpub\wwwroot\"

    Dim strTemp
   
    strTemp = strPath
   
    strTemp = Replace(strTemp, strWebRoot, "\")
    strTemp = Replace(strTemp, "\", "/")

    PathToVpath = strTemp
End Function
%>
Avatar billede softspot Forsker
14. oktober 2005 - 18:03 #1
I bunden af din kode har du denn funktion:

<%
Function PathToVpath(strPath)
    Const strWebRoot = "c:\inetpub\wwwroot\"

    Dim strTemp
   
    strTemp = strPath
   
    strTemp = Replace(strTemp, strWebRoot, "\")
    strTemp = Replace(strTemp, "\", "/")

    PathToVpath = strTemp
End Function
%>

Den ser i og for sig ok ud, men jeg vil tro at den bare ikke passer til din servers opsætning. Derfor vil jeg anbefale flg. ændring:

<%
Function PathToVpath(strPath)
    Const strWebRoot = Server.MapPath("/")

    Dim strTemp
   
    strTemp = strPath
   
    strTemp = Replace(strTemp, strWebRoot, "\")
    strTemp = Replace(strTemp, "\", "/")

    PathToVpath = strTemp
End Function
%>
Avatar billede softspot Forsker
14. oktober 2005 - 18:04 #2
Ups! Det skal lige laves om til en variabel:

<%
Function PathToVpath(strPath)
    Dim strWebRoot
    Dim strTemp
   
    strWebRoot = Server.MapPath("/")

    strTemp = strPath
   
    strTemp = Replace(strTemp, strWebRoot, "\")
    strTemp = Replace(strTemp, "\", "/")

    PathToVpath = strTemp
End Function
%>
Avatar billede riishoj Nybegynder
14. oktober 2005 - 18:46 #3
Det giver overhovedet ingen forskel. Linket til søgeresultatet bliver stadig udskrevet som den absolutte fysiske sti på serveren. :(
Avatar billede softspot Forsker
14. oktober 2005 - 19:05 #4
Funktionen bliver kaldt, så det er et spørgsmål om hvad der står i feltet path i databasen...? Kan du finde nogle eksempler (som er taget fra databasen)...?
Avatar billede riishoj Nybegynder
14. oktober 2005 - 19:08 #5
Er ikke sikker på, at jeg forstår dit spørgsmål.
Avatar billede softspot Forsker
14. oktober 2005 - 20:23 #6
Næh, det er mig der ikke har forstået hvad det er du arbejder med... :)

Hvad er stien du kan se i din view source (altså den faktisk tekst i href-attributten)?
Avatar billede riishoj Nybegynder
14. oktober 2005 - 20:45 #7
En forfærdelig lang smøre.

c:/program files/ensim/webppliance/sitedata/domains/xxx.dk/root/inetpub/wwwroot/xxx/xxx.htm
 
X'erne er selvfølgelig for at anonymisere mit site!
Avatar billede softspot Forsker
14. oktober 2005 - 21:01 #8
Det kunne også være spændende at finde ud af hvad denne returnerer

Response.Write(Server.MapPath("/"))
Avatar billede riishoj Nybegynder
14. oktober 2005 - 21:30 #9
Den skriver

C:\Program Files\Ensim\WEBppliance\SiteData\Domains\xxx.dk\ROOT\Inetpub\wwwroot
Avatar billede softspot Forsker
14. oktober 2005 - 22:48 #10
Ok, så prøv lige denne her version:

<%
Function PathToVpath(strPath)
    Dim strWebRoot
    Dim strTemp
   
    strWebRoot = Server.MapPath("/")

    strTemp = strPath
   
    strTemp = Replace(strTemp, strWebRoot, "\", 1, -1, 1)
    strTemp = Replace(strTemp, "\", "/")

    PathToVpath = strTemp
End Function
%>
Avatar billede riishoj Nybegynder
14. oktober 2005 - 23:36 #11
Nu tror jeg at du er på vej til noget af det rigtige.
Søgeresultat giver

//doc/kontaktbog.htm

Jeg har kun én fil i den mappe der søges i, nemlig kontaktbog.htm, så det er helt ok, men det skulle jo gerne have været

www.xxx.dk/doc/kontaktbog.htm
Avatar billede riishoj Nybegynder
14. oktober 2005 - 23:44 #12
Jeg stopper for idag, men er tilbage i morgen. Håber du er frisk på at hjælpe mig videre.
Avatar billede softspot Forsker
15. oktober 2005 - 01:29 #13
Hvis du ved det altid skal være www.xxx.dk foran, så kan du enten skrive det direkte i HTML-koden, eller du kan vælge at lægge det i funktionen som vist herunder.

<%
Function PathToVpath(strPath)
    Dim strWebRoot
    Dim strTemp
   
    strWebRoot = Server.MapPath("/")

    strTemp = strPath
   
    strTemp = Replace(strTemp, strWebRoot, "", 1, -1, 1)
    strTemp = Replace(strTemp, "\", "/")

    if left(strTemp, 1) <> "/" then
      strTemp = strTemp & "/"
    end if

    strTemp = "http://www.xxx.dk" & strTemp
    PathToVpath = strTemp
End Function
%>
Avatar billede riishoj Nybegynder
15. oktober 2005 - 09:30 #14
Perfekt! (næsten). Er det muligt at kun vise filnavnet i søgeresultatet, men stadig bevare det som et link. Altså

eks. kontaktbog.htm linker til http://www.xxx.dk/doc/kontaktbog.htm

hvis du forstår hvad jeg mener?
Avatar billede softspot Forsker
15. oktober 2005 - 10:35 #15
Ja, enten angiver du http://www.xxx.dk i href-attributten og fjerner den fra funktionen, eller så sætter du en parameter på funktionen som angiver om adressen skal foranstilles domæne eller ej. Eksempel på det sidste gives herunder:

<%
Function PathToVpath(strPath, showDomain)
  Dim strWebRoot
  Dim strTemp
   
  strWebRoot = Server.MapPath("/")

  strTemp = strPath
   
  strTemp = Replace(strTemp, strWebRoot, "", 1, -1, 1)
  strTemp = Replace(strTemp, "\", "/")

  if left(strTemp, 1) <> "/" then
    strTemp = strTemp & "/"
  end if

  if showDomain then
    strTemp = "http://www.xxx.dk" & strTemp
  end if

  PathToVpath = strTemp
End Function
%>

Og så skal du ændre flg. passage i din side:

<% If rstResults.Fields("doctitle") = "" Then %>
  <strong><a href="<%= PathToVpath(rstResults.Fields("path")) %>"><%= PathToVpath(rstResults.Fields("path")) %></a></strong><br />
<% Else %>
  <strong><a href="<%= PathToVpath(rstResults.Fields("path")) %>"><%= rstResults.Fields("doctitle") %></a></strong><br />
<% End If %>


Til dette:

<% If rstResults.Fields("doctitle") = "" Then %>
  <strong><a href="<%= PathToVpath(rstResults.Fields("path"), true) %>"><%= PathToVpath(rstResults.Fields("path"),false) %></a></strong><br />
<% Else %>
  <strong><a href="<%= PathToVpath(rstResults.Fields("path"),true) %>"><%= rstResults.Fields("doctitle") %></a></strong><br />
<% End If %>
Avatar billede softspot Forsker
15. oktober 2005 - 10:40 #16
OK, jeg skal lære at læse hvad folk skriver! :|

Din funktion skal laves lidt om for at den kun returnerer filnavnet når du ikke vil have domænet med:


<%
Function PathToVpath(strPath, showDomain)
  Dim strWebRoot
  Dim strTemp
   
  strWebRoot = Server.MapPath("/")

  strTemp = strPath
   
  strTemp = Replace(strTemp, strWebRoot, "", 1, -1, 1)
  strTemp = Replace(strTemp, "\", "/")

  if left(strTemp, 1) <> "/" then
    strTemp = strTemp & "/"
  end if

  if showDomain then
    strTemp = "http://www.xxx.dk" & strTemp
  else
    iPos = InStrRev(strTemp,"/")
    if iPos > 0 and iPos < len(strTemp) then
      strTemp = right(strTemp, len(strTemp) - iPos)
    end if
  end if

  PathToVpath = strTemp
End Function
%>
Avatar billede riishoj Nybegynder
15. oktober 2005 - 11:23 #17
Næ, det er vist mig som ikke har udtrykt mig klart nok!
Dit sidste forslag går ikke så godt. Jeg får fejlen


Microsoft VBScript runtime error '800a01c2'

Wrong number of arguments or invalid property assignment: 'PathToVpath'

/doc/advanced.asp, line 109

Linje 109 er slet ikke en del af det du har rodet med. Den ser sådan ud:


<strong><a href="<%= PathToVpath(rstResults.Fields("path")) %>"><%= PathToVpath(rstResults.Fields("path")) %></a></strong><br />
Avatar billede riishoj Nybegynder
15. oktober 2005 - 11:30 #18
Pardon. Jeg havde selvfølgelig ikke fået ændret det sidste du skrev i dit næstsidste indlæg, som jo netop berører bl.a. linje 109. Det har jeg rettet nu, men så får jeg fejlen


Microsoft VBScript runtime error '800a01f4'

Variable is undefined: 'iPos'

/doc/advanced.asp, line 159

Linje 159 ser sådan ud:

iPos = InStrRev(strTemp,"/")
Avatar billede softspot Forsker
15. oktober 2005 - 13:00 #19
Ja, naturligvis :)

Jeg var ikke lige opmærksom på at du kørte med Option Explicit (det er ikke så ofte man oplever sådan fornuftig kodestil ;-)).

Prøv med denne i stedet:

<%
Function PathToVpath(strPath, showDomain)
  Dim strWebRoot
  Dim strTemp
  Dim iPos
 
  strWebRoot = Server.MapPath("/")

  strTemp = strPath
   
  strTemp = Replace(strTemp, strWebRoot, "", 1, -1, 1)
  strTemp = Replace(strTemp, "\", "/")

  if left(strTemp, 1) <> "/" then
    strTemp = strTemp & "/"
  end if

  if showDomain then
    strTemp = "http://www.xxx.dk" & strTemp
  else
    iPos = InStrRev(strTemp,"/")
    if iPos > 0 and iPos < len(strTemp) then
      strTemp = right(strTemp, len(strTemp) - iPos)
    end if
  end if

  PathToVpath = strTemp
End Function
%>
Avatar billede riishoj Nybegynder
15. oktober 2005 - 14:02 #20
Jamen, der er jo helt forrygende. Nu virker det simpelthen som jeg gerne vil have det. 1000 tak for hjælpen. Med hensyn til koden og dens fornuft, så kan jeg desværre ikke tage noget af æren. Omvendt virker det som om du har styr på asp. Send lige et svar og ha' en god weekend.

riishoj
Avatar billede softspot Forsker
15. oktober 2005 - 18:17 #21
Tak for roserne - og velbekomme :)

God weekend til dig også.
Avatar billede riishoj Nybegynder
18. oktober 2005 - 12:21 #22
Undskyld jeg er lidt langsom med dine point, men jeg har holdt lidt ferie i pc-frit område :)
Avatar billede softspot Forsker
18. oktober 2005 - 12:25 #23
Det er helt OK - jeg stod ikke lige akut og manglede dem ;-)

Tak for point :)
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