terça-feira, 17 de julho de 2012

ASP - Criando um treview



How do I generate a treeview from ASP?

We created this example of traversing the folder structure of a web site or virtual directory. Before you even look at it, there are a few notable limitations. The most important is that, rather than create a recursive function, we limited the scope to nesting two levels deep — both for the purposes of the example and to keep the code relatively short. We also assume that the starting point (defined by vDir) has at least one subfolder *or* one file. Finally, the majority of the formatting functions are buried away in treeviewFunctions.asp, and the code there is not as clean and pretty as it could be.

We updated the code (and the download) on May 27th, 2004 to be Mac- and Mozilla-friendly. Please let us know if you find any bugs.

Some things you might not find in other treeviews, however. Links to folders / files are active, so you can link directly to those images/files (the folders just have a default.asp that confirms the folder exists, in order to avoid "Directory Listing Denied" errors). Also, if you hover over a folder link, it tells you how many subfolders and files it contains, how large it is, and when it was last modified. Likewise, file links have a tooltip telling you their size and when they were last modified.

<img height="215" src=&quot...

You can see this example with a limited set of folders and files at TreeView. The folder and file icons are from Yukon's SQL Server WorkBench, mainly because I am sick of looking at the icons in Windows Explorer. The file icons are all identical; you are more than welcome to customize the file icon based on file extenstion.

Okay, let's stop blabbing and show the code for the main page:

<html>
<head>
<title>TreeView</title>
<link rel=stylesheet href='treeview.css'></link>
</head>
</html>

<script language=javascript src='treeview.js'></script>
<!--#include file='treeviewFunctions.asp'-->

<%
    set fso = CreateObject("Scripting.FileSystemObject")

    vDir = "/foo/"
    root = Server.MapPath(vDir) & "\"
    set fold = fso.getFolder(root)

    ' we'll assume that the starting point is not empty
    ' (has at least one subfolder or one file)
   
    response.write getfoldlink("r0", "r0", fold, vDir)
    if fold.subfolders.count > 0 then
   
        ' counter
        r1c = 0
       
        'loop through all subfolders in starting folder
        for each f in fold.subfolders
       
            ' another counter
            r1c = r1c + 1

            ' concatenate local/relative path once            
            sfoldname = root & f.name & "\"
            fpath = vDir & f.name & "/"
           
            set cfold = fso.getFolder(sfoldname)
            if cfold.subfolders.count > 0 or cfold.files.count > 0 then

                ' we need to make the folder a tree node
                response.Write getfoldlink("r1" & r1c, "r1", cfold, fpath)

                ' reset counter
                r2c = 0
               
                for each sf in cfold.subfolders

                    ' keep track to identify nodes by id
                    r2c = r2c + 1

                    ' concatenate local/relative path once            
                    sfoldname = root & f.name & "\" & sf.name & "\"
                    path = vDir & f.name & "/" & sf.name & "/"

                    ' build an identifier for this node
                    id = "r2" & r1c & "_" & r2c
                   
                    set sfold = fso.getFolder(sfoldname)
                    if sfold.files.count > 0 then
                   
                        ' we need to make the folder a tree node
                        response.Write getfoldlink(id, "r2", sfold, path)
                        for each fil in sfold.files
                            response.write getfilelink("r2a", path, fil)
                        next
                        response.Write "</div>"
                    else

                        ' this folder is not an expandable node
                        response.write getfoldlink("", "r2", sfold, path)
                    end if
                next
                for each fil in cfold.files
               
                    ' show each file in this subfolder
                    response.write getfilelink("r1a", fpath, fil)
                next
                response.Write "</div>"
            else
           
                ' this folder is not an expandable node
                response.Write getfoldlink("", "r1", cfold, fpath)
            end if
        next
    end if
    for each fil in fold.files
   
        ' show the files in the starting folder
        response.write getfilelink("r0a", vDir, fil)
    next
    response.Write "</div>"
   
    set fso = nothing
%>

And treeviewFunctions.asp:

<%
    function getfoldlink(d, c, f, p)
        if d <> "" then
       
            ' needs to be clickable
            getfoldlink = "<a href='#' style='cursor:hand' " & _
                "onclick='flip(""" & d & """);" & _
                "this.blur();return false;'>" & _
                "<img id='i" & d & "' class=" & c & _
                " src=plus.gif vspace=0 hspace=2 border=0>" & _
                "<img src=folder.gif hspace=2 border=0></a> " & _
                "<a target=_blank href=" & p & getsftitle(f) & _
                ">" & f.name & "</a></div><div id='" & d & "'" & _
                " display=none style='display:none'>"
        else
       
            ' can't be clickable
            getfoldlink = "<div><img id='i" & d & "' " & _
                "class=" & c & " src=plus.gif vspace=0 " & _
                "hspace=2 visibility=hidden style='visibility:hidden'>" & _
                "<img src=folder.gif hspace=2> <a " & _
                "target=_blank href=" & p & getsftitle(f) & _
                ">" & f.name & "</a></div>"
        end if
    end function
   
    function getfilelink(c, fold, file)
        getfilelink = "<div><img class=" & c & " src=file.gif" & _
            " hspace=2> <a href=" & fold & file.name & _
            getfiletitle(file) & ">" & file.name & "</a></div>"
    end function
   
    function getfiletitle(file)
        getfiletitle = " title='Size: " & _
            formatnumber(file.size/1024, 2, -1, 0, -1) & _
            " kb" & vbCrLf & getDL(file) & "'"
    end function
   
    function getsftitle(fold)
        getsftitle = " title='" & getsfc(fold) & _
        vbCrLf & getfc(fold) & _
        vbCrLf & getfs(fold) & _
        vbCrLf & getDL(fold) & "'"
    end function
   
    function getDL(o)
        d = o.dateLastModified
        getDL = "Last mod: " & formatdatetime(d, 2) & _
            " " & formatdatetime(d, 3)
    end function
   
    function getfc(fold)
        getfc = fCount(fold.files.count)
    end function

    function getsfc(fold)
        getsfc = sfCount(fold.subfolders.count)
    end function
   
    function getfs(fold)
        getfs = "Size: " & bToMB(fold.size)
    end function

    function bToMB(b)
        bToMB = formatnumber(b/1024/1024, 2, -1, 0, -1) & " MB"
    end function
   
    function fCount(c)
        fCount = formatnumber(c, 0, -1, 0, -1) & " file" & _
            suffix(c)
    end function
       
    function sfCount(c)
        sfCount = formatnumber(c, 0, -1, 0, -1) & _
            " subfolder" & suffix(c)
    end function
   
    function suffix(c)
        if c <> 1 then suffix = "s"
    end function
%>

To run the function yourself, you will also need the js, css, and gif files. You can download the code and images in a zip file from our downloads section.


Other samples

Here are some other web sites with usable samples:

    CodeProject.com

    comobjects.net

    DarkFalz.com

    obout.com

    Planet Source Code

    TreeGen.com

    xefteri.com
 
 
Fonte: http://classicasp.aspfaq.com/general/how-do-i-generate-a-treeview-from-asp.html

Nenhum comentário:

Postar um comentário